# HG changeset patch # User Sebastien Jodogne # Date 1403264722 -7200 # Node ID 306afd58a0b3f5ab8972e015b45ec61395da34fe # Parent 28a52982196ebf5c5997386118137e1148ead771 fix build diff -r 28a52982196e -r 306afd58a0b3 Core/HttpServer/HttpOutput.cpp --- a/Core/HttpServer/HttpOutput.cpp Fri Jun 20 13:38:19 2014 +0200 +++ b/Core/HttpServer/HttpOutput.cpp Fri Jun 20 13:45:22 2014 +0200 @@ -42,38 +42,6 @@ namespace Orthanc { - class HttpOutput::StateMachine : public boost::noncopyable - { - protected: - enum State - { - State_WaitingHttpStatus, - State_WritingHeader, - State_WritingBody - }; - - private: - IHttpOutputStream& stream_; - State state_; - - public: - HttpStateMachine() : - state_(State_WaitingHttpStatus) - { - } - - void SendHttpStatus(HttpStatus status); - - void SendHeaderData(const void* buffer, size_t length); - - void SendHeaderString(const std::string& str); - - void SendBodyData(const void* buffer, size_t length); - - void SendBodyString(const std::string& str); - }; - - void HttpOutput::StateMachine::SendHttpStatus(HttpStatus status) { if (state_ != State_WaitingHttpStatus) @@ -81,7 +49,7 @@ throw OrthancException(ErrorCode_BadSequenceOfCalls); } - OnHttpStatusReceived(status); + stream_.OnHttpStatusReceived(status); state_ = State_WritingHeader; std::string s = "HTTP/1.1 " + @@ -89,7 +57,7 @@ " " + std::string(EnumerationToString(status)) + "\r\n"; - Send(true, &s[0], s.size()); + stream_.Send(true, &s[0], s.size()); } void HttpOutput::StateMachine::SendHeaderData(const void* buffer, size_t length) @@ -99,7 +67,7 @@ throw OrthancException(ErrorCode_BadSequenceOfCalls); } - Send(true, buffer, length); + stream_.Send(true, buffer, length); } void HttpOutput::StateMachine::SendHeaderString(const std::string& str) @@ -120,13 +88,13 @@ if (state_ == State_WritingHeader) { // Close the HTTP header before writing the body - Send(true, "\r\n", 2); + stream_.Send(true, "\r\n", 2); state_ = State_WritingBody; } if (length > 0) { - Send(false, buffer, length); + stream_.Send(false, buffer, length); } } @@ -176,7 +144,7 @@ void HttpOutput::SendOkHeader(const Header& header) { - stream_.SendHttpStatus(HttpStatus_200_Ok); + stateMachine_.SendHttpStatus(HttpStatus_200_Ok); std::string s; for (Header::const_iterator @@ -185,14 +153,14 @@ s += it->first + ": " + it->second + "\r\n"; } - stream_.SendHeaderString(s); + stateMachine_.SendHeaderString(s); } void HttpOutput::SendMethodNotAllowedError(const std::string& allowed) { - stream_.SendHttpStatus(HttpStatus_405_MethodNotAllowed); - stream_.SendHeaderString("Allow: " + allowed + "\r\n"); + stateMachine_.SendHttpStatus(HttpStatus_405_MethodNotAllowed); + stateMachine_.SendHeaderString("Allow: " + allowed + "\r\n"); } @@ -206,7 +174,7 @@ throw OrthancException("Please use the dedicated methods to this HTTP status code in HttpOutput"); } - stream_.SendHttpStatus(status); + stateMachine_.SendHttpStatus(status); } @@ -265,15 +233,15 @@ void HttpOutput::Redirect(const std::string& path) { - stream_.SendHttpStatus(HttpStatus_301_MovedPermanently); - stream_.SendHeaderString("Location: " + path + "\r\n"); + stateMachine_.SendHttpStatus(HttpStatus_301_MovedPermanently); + stateMachine_.SendHeaderString("Location: " + path + "\r\n"); } void HttpOutput::SendUnauthorized(const std::string& realm) { - stream_.SendHttpStatus(HttpStatus_401_Unauthorized); - stream_.SendHeaderString("WWW-Authenticate: Basic realm=\"" + realm + "\"\r\n"); + stateMachine_.SendHttpStatus(HttpStatus_401_Unauthorized); + stateMachine_.SendHeaderString("WWW-Authenticate: Basic realm=\"" + realm + "\"\r\n"); } } diff -r 28a52982196e -r 306afd58a0b3 Core/HttpServer/HttpOutput.h --- a/Core/HttpServer/HttpOutput.h Fri Jun 20 13:38:19 2014 +0200 +++ b/Core/HttpServer/HttpOutput.h Fri Jun 20 13:45:22 2014 +0200 @@ -48,7 +48,7 @@ class StateMachine : public boost::noncopyable { - protected: + private: enum State { State_WaitingHttpStatus, @@ -56,13 +56,12 @@ State_WritingBody }; - private: IHttpOutputStream& stream_; State state_; public: - HttpStateMachine(IHttpOutputStream& stream) : - stream_(stream) + StateMachine(IHttpOutputStream& stream) : + stream_(stream), state_(State_WaitingHttpStatus) { } @@ -103,12 +102,12 @@ void SendBodyData(const void* buffer, size_t length) { - stream_.SendBodyData(buffer, length); + stateMachine_.SendBodyData(buffer, length); } void SendBodyString(const std::string& str) { - stream_.SendBodyString(str); + stateMachine_.SendBodyString(str); } void SendMethodNotAllowedError(const std::string& allowed); diff -r 28a52982196e -r 306afd58a0b3 Core/HttpServer/MongooseServer.cpp --- a/Core/HttpServer/MongooseServer.cpp Fri Jun 20 13:38:19 2014 +0200 +++ b/Core/HttpServer/MongooseServer.cpp Fri Jun 20 13:45:22 2014 +0200 @@ -68,12 +68,16 @@ namespace { // Anonymous namespace to avoid clashes between compilation modules - class MongooseOutputStream : public HttpOutputStream + class MongooseOutputStream : public IHttpOutputStream { private: struct mg_connection* connection_; - protected: + public: + MongooseOutputStream(struct mg_connection* connection) : connection_(connection) + { + } + virtual void Send(bool isHeader, const void* buffer, size_t length) { if (length > 0) @@ -82,9 +86,9 @@ } } - public: - MongooseOutputStream(struct mg_connection* connection) : connection_(connection) + virtual void OnHttpStatusReceived(HttpStatus status) { + // Ignore this } };