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);
       }