Mercurial > hg > orthanc
diff Core/HttpServer/MongooseServer.cpp @ 895:7e8cde5905fd plugins
allow superposition of REST handlers
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 16 Jun 2014 17:47:58 +0200 |
parents | a811bdf8b8eb |
children | c4053ac5db04 |
line wrap: on
line diff
--- a/Core/HttpServer/MongooseServer.cpp Mon Jun 16 17:31:09 2014 +0200 +++ b/Core/HttpServer/MongooseServer.cpp Mon Jun 16 17:47:58 2014 +0200 @@ -255,18 +255,17 @@ - HttpHandler* MongooseServer::FindHandler(const UriComponents& forUri) const + void MongooseServer::FindHandlers(std::list<HttpHandler*>& result, + const UriComponents& forUri) const { for (Handlers::const_iterator it = handlers_.begin(); it != handlers_.end(); ++it) { if ((*it)->IsServedUri(forUri)) { - return *it; + result.push_back(*it); } } - - return NULL; } @@ -703,31 +702,40 @@ } - HttpHandler* handler = that->FindHandler(uri); - if (handler) + std::list<HttpHandler*> handlers; + that->FindHandlers(handlers, uri); + + bool found = false; + + for (std::list<HttpHandler*>::const_iterator + it = handlers.begin(); it != handlers.end() && !found; it++) { try { LOG(INFO) << EnumerationToString(method) << " " << Toolbox::FlattenUri(uri); - handler->Handle(output, method, uri, headers, argumentsGET, body); + found = (*it)->Handle(output, method, uri, headers, argumentsGET, body); } catch (OrthancException& e) { LOG(ERROR) << "MongooseServer Exception [" << e.What() << "]"; - output.SendHeader(HttpStatus_500_InternalServerError); + output.SendHeader(HttpStatus_500_InternalServerError); + found = true; } catch (boost::bad_lexical_cast&) { LOG(ERROR) << "MongooseServer Exception: Bad lexical cast"; output.SendHeader(HttpStatus_400_BadRequest); + found = true; } catch (std::runtime_error&) { LOG(ERROR) << "MongooseServer Exception: Presumably a bad JSON request"; output.SendHeader(HttpStatus_400_BadRequest); + found = true; } } - else + + if (!found) { output.SendHeader(HttpStatus_404_NotFound); }