Mercurial > hg > orthanc
changeset 1443:895ab369d63c
refactoring: OrthancHttpHandler
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 01 Jul 2015 11:30:19 +0200 |
parents | 4ff8dd753d79 |
children | b2b09a3dbd8e |
files | Core/HttpServer/MongooseServer.cpp Core/HttpServer/MongooseServer.h OrthancServer/OrthancHttpHandler.cpp OrthancServer/OrthancHttpHandler.h OrthancServer/main.cpp |
diffstat | 5 files changed, 97 insertions(+), 89 deletions(-) [+] |
line wrap: on
line diff
--- a/Core/HttpServer/MongooseServer.cpp Wed Jul 01 11:08:23 2015 +0200 +++ b/Core/HttpServer/MongooseServer.cpp Wed Jul 01 11:30:19 2015 +0200 @@ -552,6 +552,7 @@ const struct mg_request_info *request) { MongooseServer* that = reinterpret_cast<MongooseServer*>(request->user_data); + MongooseOutputStream stream(connection); HttpOutput output(stream, that->IsKeepAliveEnabled()); @@ -680,61 +681,60 @@ } - // Loop over the candidate handlers for this URI LOG(INFO) << EnumerationToString(method) << " " << Toolbox::FlattenUri(uri); + bool found = false; - for (MongooseServer::Handlers::const_iterator it = - that->GetHandlers().begin(); it != that->GetHandlers().end() && !found; ++it) + try { + if (that->HasHandler()) + { + found = that->GetHandler().Handle(output, method, uri, headers, argumentsGET, body); + } + } + catch (OrthancException& e) + { + // Using this candidate handler results in an exception + LOG(ERROR) << "Exception in the HTTP handler: " << e.What(); + try { - found = (*it)->Handle(output, method, uri, headers, argumentsGET, body); - } - catch (OrthancException& e) - { - // Using this candidate handler results in an exception - LOG(ERROR) << "Exception in the HTTP handler: " << e.What(); - - try + switch (e.GetErrorCode()) { - switch (e.GetErrorCode()) - { - case ErrorCode_InexistentFile: - case ErrorCode_InexistentItem: - case ErrorCode_UnknownResource: - output.SendStatus(HttpStatus_404_NotFound); - break; + case ErrorCode_InexistentFile: + case ErrorCode_InexistentItem: + case ErrorCode_UnknownResource: + output.SendStatus(HttpStatus_404_NotFound); + break; - case ErrorCode_BadRequest: - case ErrorCode_UriSyntax: - output.SendStatus(HttpStatus_400_BadRequest); - break; + case ErrorCode_BadRequest: + case ErrorCode_UriSyntax: + output.SendStatus(HttpStatus_400_BadRequest); + break; - default: - output.SendStatus(HttpStatus_500_InternalServerError); - } + default: + output.SendStatus(HttpStatus_500_InternalServerError); } - catch (OrthancException&) - { - // An exception here reflects the fact that an exception was - // triggered after the status code was sent by the HTTP handler. - } - - return; + } + catch (OrthancException&) + { + // An exception here reflects the fact that an exception was + // triggered after the status code was sent by the HTTP handler. } - catch (boost::bad_lexical_cast&) - { - LOG(ERROR) << "Exception in the HTTP handler: Bad lexical cast"; - output.SendStatus(HttpStatus_400_BadRequest); - return; - } - catch (std::runtime_error&) - { - LOG(ERROR) << "Exception in the HTTP handler: Presumably a bad JSON request"; - output.SendStatus(HttpStatus_400_BadRequest); - return; - } + + return; + } + catch (boost::bad_lexical_cast&) + { + LOG(ERROR) << "Exception in the HTTP handler: Bad lexical cast"; + output.SendStatus(HttpStatus_400_BadRequest); + return; + } + catch (std::runtime_error&) + { + LOG(ERROR) << "Exception in the HTTP handler: Presumably a bad JSON request"; + output.SendStatus(HttpStatus_400_BadRequest); + return; } if (!found) @@ -789,6 +789,7 @@ MongooseServer::MongooseServer() : pimpl_(new PImpl) { pimpl_->context_ = NULL; + handler_ = NULL; remoteAllowed_ = false; authentication_ = false; ssl_ = false; @@ -811,7 +812,6 @@ MongooseServer::~MongooseServer() { Stop(); - ClearHandlers(); } @@ -876,20 +876,6 @@ } - void MongooseServer::RegisterHandler(IHttpHandler& handler) - { - Stop(); - - handlers_.push_back(&handler); - } - - - void MongooseServer::ClearHandlers() - { - Stop(); - } - - void MongooseServer::ClearUsers() { Stop(); @@ -963,4 +949,22 @@ { return registeredUsers_.find(basic) != registeredUsers_.end(); } + + + void MongooseServer::Register(IHttpHandler& handler) + { + Stop(); + handler_ = &handler; + } + + + IHttpHandler& MongooseServer::GetHandler() const + { + if (handler_ == NULL) + { + throw OrthancException(ErrorCode_InternalError); + } + + return *handler_; + } }
--- a/Core/HttpServer/MongooseServer.h Wed Jul 01 11:08:23 2015 +0200 +++ b/Core/HttpServer/MongooseServer.h Wed Jul 01 11:30:19 2015 +0200 @@ -59,15 +59,12 @@ class MongooseServer { - public: - typedef std::list<IHttpHandler*> Handlers; - private: // http://stackoverflow.com/questions/311166/stdauto-ptr-or-boostshared-ptr-for-pimpl-idiom struct PImpl; boost::shared_ptr<PImpl> pimpl_; - Handlers handlers_; + IHttpHandler *handler_; typedef std::set<std::string> RegisteredUsers; RegisteredUsers registeredUsers_; @@ -103,8 +100,6 @@ void RegisterUser(const char* username, const char* password); - void RegisterHandler(IHttpHandler& handler); - bool IsAuthenticationEnabled() const { return authentication_; @@ -147,15 +142,17 @@ void SetIncomingHttpRequestFilter(IIncomingHttpRequestFilter& filter); - void ClearHandlers(); - ChunkStore& GetChunkStore(); bool IsValidBasicHttpAuthentication(const std::string& basic) const; - const Handlers& GetHandlers() const + void Register(IHttpHandler& handler); + + bool HasHandler() const { - return handlers_; + return handler_ != NULL; } + + IHttpHandler& GetHandler() const; }; }
--- a/OrthancServer/OrthancHttpHandler.cpp Wed Jul 01 11:08:23 2015 +0200 +++ b/OrthancServer/OrthancHttpHandler.cpp Wed Jul 01 11:30:19 2015 +0200 @@ -57,8 +57,8 @@ } - void OrthancHttpHandler::RegisterHandler(IHttpHandler& handler, - bool isOrthancRestApi) + void OrthancHttpHandler::Register(IHttpHandler& handler, + bool isOrthancRestApi) { handlers_.push_back(&handler);
--- a/OrthancServer/OrthancHttpHandler.h Wed Jul 01 11:08:23 2015 +0200 +++ b/OrthancServer/OrthancHttpHandler.h Wed Jul 01 11:30:19 2015 +0200 @@ -56,8 +56,8 @@ const GetArguments& getArguments, const std::string& body); - void RegisterHandler(IHttpHandler& handler, - bool isOrthancRestApi); + void Register(IHttpHandler& handler, + bool isOrthancRestApi); bool HasOrthancRestApi() const {
--- a/OrthancServer/main.cpp Wed Jul 01 11:08:23 2015 +0200 +++ b/OrthancServer/main.cpp Wed Jul 01 11:30:19 2015 +0200 @@ -51,6 +51,7 @@ #include "ServerToolbox.h" #include "../Plugins/Engine/OrthancPlugins.h" #include "FromDcmtkBridge.h" +#include "OrthancHttpHandler.h" using namespace Orthanc; @@ -433,6 +434,27 @@ context->GetIndex().SetMaximumStorageSize(0); } + + OrthancHttpHandler httpHandler; + +#if ENABLE_PLUGINS == 1 + OrthancRestApi restApi(*context); + plugins.SetServerContext(*context); + httpHandler.Register(plugins, false); + context->SetPlugins(plugins); +#endif + +#if ORTHANC_STANDALONE == 1 + EmbeddedResourceHttpHandler staticResources("/app", EmbeddedResources::ORTHANC_EXPLORER); +#else + FilesystemHttpHandler staticResources("/app", ORTHANC_PATH "/OrthancExplorer"); +#endif + + httpHandler.Register(staticResources, false); + httpHandler.Register(restApi, true); + + + MyDicomServerFactory serverFactory(*context); bool isReset = false; @@ -471,22 +493,7 @@ httpServer.SetSslEnabled(false); } - OrthancRestApi restApi(*context); - -#if ORTHANC_STANDALONE == 1 - EmbeddedResourceHttpHandler staticResources("/app", EmbeddedResources::ORTHANC_EXPLORER); -#else - FilesystemHttpHandler staticResources("/app", ORTHANC_PATH "/OrthancExplorer"); -#endif - -#if ENABLE_PLUGINS == 1 - plugins.SetServerContext(*context); - httpServer.RegisterHandler(plugins); - context->SetPlugins(plugins); -#endif - - httpServer.RegisterHandler(staticResources); - httpServer.RegisterHandler(restApi); + httpServer.Register(httpHandler); #if ENABLE_PLUGINS == 1