changeset 40:43085eac99ff

fix base url
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 31 Jul 2015 13:36:02 +0200
parents 063f1c4d867a
children 9e7f9134f237
files Core/Configuration.cpp Core/Configuration.h Core/Dicom.cpp Core/Dicom.h Core/DicomResults.cpp Core/DicomResults.h Plugin/Plugin.cpp Plugin/QidoRs.cpp Plugin/StowRs.cpp Plugin/WadoRs.cpp
diffstat 10 files changed, 110 insertions(+), 80 deletions(-) [+]
line wrap: on
line diff
--- a/Core/Configuration.cpp	Fri Jul 31 11:20:32 2015 +0200
+++ b/Core/Configuration.cpp	Fri Jul 31 13:36:02 2015 +0200
@@ -76,29 +76,73 @@
     }
 
 
+    bool GetBoolValue(const Json::Value& configuration,
+                      const std::string& key,
+                      bool defaultValue)
+    {
+      if (configuration.type() != Json::objectValue ||
+          !configuration.isMember(key) ||
+          configuration[key].type() != Json::booleanValue)
+      {
+        return defaultValue;
+      }
+      else
+      {
+        return configuration[key].asBool();
+      }
+    }
+
+
+    std::string GetRoot(const Json::Value& configuration)
+    {
+      std::string root;
+
+      if (configuration.isMember("DicomWeb"))
+      {
+        root = GetStringValue(configuration["DicomWeb"], "Root", "");
+      }
+
+      if (root.empty())
+      {
+        root = "/dicom-web/";
+      }
+
+      // Make sure the root URI starts and ends with a slash
+      if (root[0] != '/')
+      {
+        root = "/" + root;
+      }
+    
+      if (root[root.length() - 1] != '/')
+      {
+        root += "/";
+      }
+
+      return root;
+    }
+
+
     std::string  GetBaseUrl(const Json::Value& configuration,
                             const OrthancPluginHttpRequest* request)
     {
       std::string host;
+      bool ssl = false;
 
-      if (configuration.isMember("DicomWeb") &&
-          configuration["DicomWeb"].type() == Json::objectValue)
+      if (configuration.isMember("DicomWeb"))
       {
         host = GetStringValue(configuration["DicomWeb"], "Host", "");
-        if (!host.empty())
-        {
-          return host;
-        }
+        ssl = GetBoolValue(configuration["DicomWeb"], "Ssl", false);
       }
 
-      if (LookupHttpHeader(host, request, "host"))
+      if (host.empty() &&
+          !LookupHttpHeader(host, request, "host"))
       {
-        return "http://" + host;
+        // Should never happen: The "host" header should always be present
+        // in HTTP requests. Provide a default value anyway.
+        host = "localhost:8042";
       }
 
-      // Should never happen: The "host" header should always be present
-      // in HTTP requests. Provide a default value anyway.
-      return "http://localhost:8042/";
+      return (ssl ? "https://" : "http://") + host + GetRoot(configuration);
     }
   }
 }
--- a/Core/Configuration.h	Fri Jul 31 11:20:32 2015 +0200
+++ b/Core/Configuration.h	Fri Jul 31 13:36:02 2015 +0200
@@ -34,7 +34,13 @@
                                const std::string& key,
                                const std::string& defaultValue);
     
-    std::string  GetBaseUrl(const Json::Value& configuration,
-                            const OrthancPluginHttpRequest* request);
+    bool GetBoolValue(const Json::Value& configuration,
+                      const std::string& key,
+                      bool defaultValue);
+
+    std::string GetRoot(const Json::Value& configuration);
+
+    std::string GetBaseUrl(const Json::Value& configuration,
+                           const OrthancPluginHttpRequest* request);
   }
 }
--- a/Core/Dicom.cpp	Fri Jul 31 11:20:32 2015 +0200
+++ b/Core/Dicom.cpp	Fri Jul 31 13:36:02 2015 +0200
@@ -230,7 +230,8 @@
   }
 
 
-  static std::string GetBulkUriRoot(const gdcm::DataSet& dicom)
+  static std::string GetBulkUriRoot(const std::string& wadoBase,
+                                    const gdcm::DataSet& dicom)
   {
     std::string study, series, instance;
 
@@ -242,7 +243,7 @@
     }
     else
     {
-      return "/wado-rs/studies/" + study + "/series/" + series + "/instances/" + instance + "/bulk/";
+      return wadoBase + "studies/" + study + "/series/" + series + "/instances/" + instance + "/bulk/";
     }
   }
 
@@ -512,6 +513,7 @@
 
 
   void GenerateSingleDicomAnswer(std::string& result,
+                                 const std::string& wadoBase,
                                  const gdcm::Dict& dictionary,
                                  const gdcm::File* file,  // Can be NULL
                                  const gdcm::DataSet& dicom,
@@ -521,7 +523,7 @@
     std::string bulkUriRoot;
     if (isBulkAccessible)
     {
-      bulkUriRoot = GetBulkUriRoot(dicom);
+      bulkUriRoot = GetBulkUriRoot(wadoBase, dicom);
     }
 
     if (isXml)
@@ -547,13 +549,14 @@
 
   void AnswerDicom(OrthancPluginContext* context,
                    OrthancPluginRestOutput* output,
+                   const std::string& wadoBase,
                    const gdcm::Dict& dictionary,
                    const gdcm::DataSet& dicom,
                    bool isXml,
                    bool isBulkAccessible)
   {
     std::string answer;
-    GenerateSingleDicomAnswer(answer, dictionary, NULL, dicom, isXml, isBulkAccessible);
+    GenerateSingleDicomAnswer(answer, wadoBase, dictionary, NULL, dicom, isXml, isBulkAccessible);
     OrthancPluginAnswerBuffer(context, output, answer.c_str(), answer.size(), 
                               isXml ? "application/dicom+xml" : "application/json");
   }
--- a/Core/Dicom.h	Fri Jul 31 11:20:32 2015 +0200
+++ b/Core/Dicom.h	Fri Jul 31 13:36:02 2015 +0200
@@ -81,6 +81,7 @@
 
 
   void GenerateSingleDicomAnswer(std::string& result,
+                                 const std::string& wadoBase,
                                  const gdcm::Dict& dictionary,
                                  const gdcm::File* file,  // Can be NULL
                                  const gdcm::DataSet& dicom,
@@ -89,6 +90,7 @@
 
   void AnswerDicom(OrthancPluginContext* context,
                    OrthancPluginRestOutput* output,
+                   const std::string& wadoBase,
                    const gdcm::Dict& dictionary,
                    const gdcm::DataSet& dicom,
                    bool isXml,
--- a/Core/DicomResults.cpp	Fri Jul 31 11:20:32 2015 +0200
+++ b/Core/DicomResults.cpp	Fri Jul 31 13:36:02 2015 +0200
@@ -26,11 +26,13 @@
 {
   DicomResults::DicomResults(OrthancPluginContext* context,
                              OrthancPluginRestOutput* output,
+                             const std::string& wadoBase,
                              const gdcm::Dict& dictionary,
                              bool isXml,
                              bool isBulkAccessible) :
     context_(context),
     output_(output),
+    wadoBase_(wadoBase),
     dictionary_(dictionary),
     isFirst_(true),
     isXml_(isXml),
@@ -52,7 +54,7 @@
     if (isXml_)
     {
       std::string answer;
-      GenerateSingleDicomAnswer(answer, dictionary_, file, dicom, true, isBulkAccessible_);
+      GenerateSingleDicomAnswer(answer, wadoBase_, dictionary_, file, dicom, true, isBulkAccessible_);
 
       if (OrthancPluginSendMultipartItem(context_, output_, answer.c_str(), answer.size()) != 0)
       {
@@ -67,7 +69,7 @@
       }
 
       std::string item;
-      GenerateSingleDicomAnswer(item, dictionary_, file, dicom, false, isBulkAccessible_);
+      GenerateSingleDicomAnswer(item, wadoBase_, dictionary_, file, dicom, false, isBulkAccessible_);
       jsonWriter_.AddChunk(item);
     }
 
--- a/Core/DicomResults.h	Fri Jul 31 11:20:32 2015 +0200
+++ b/Core/DicomResults.h	Fri Jul 31 13:36:02 2015 +0200
@@ -34,6 +34,7 @@
   private:
     OrthancPluginContext*     context_;
     OrthancPluginRestOutput*  output_;
+    std::string               wadoBase_;
     const gdcm::Dict&         dictionary_;
     ChunkedBuffer             jsonWriter_;  // Used for JSON output
     bool                      isFirst_; 
@@ -46,6 +47,7 @@
   public:
     DicomResults(OrthancPluginContext* context,
                  OrthancPluginRestOutput* output,
+                 const std::string& wadoBase,
                  const gdcm::Dict& dictionary,
                  bool isXml,
                  bool isBulkAccessible);
--- a/Plugin/Plugin.cpp	Fri Jul 31 11:20:32 2015 +0200
+++ b/Plugin/Plugin.cpp	Fri Jul 31 13:36:02 2015 +0200
@@ -37,8 +37,6 @@
 Json::Value configuration_;
 const gdcm::Dict* dictionary_ = NULL;
 
-static std::string root_ = "/dicom-web/";
-
 
 static int32_t SwitchStudies(OrthancPluginRestOutput* output,
                              const char* url,
@@ -82,11 +80,12 @@
 }
 
 
-static void Register(const std::string& uri,
+static void Register(const std::string& root,
+                     const std::string& uri,
                      OrthancPluginRestCallback callback)
 {
   assert(!uri.empty() && uri[0] != '/');
-  std::string s = root_ + uri;
+  std::string s = root + uri;
   OrthancPluginRegisterRestCallback(context_, s.c_str(), callback);
 }
 
@@ -131,58 +130,28 @@
       return -1;
     }
 
-    if (configuration_.isMember("DicomWeb") &&
-        configuration_["DicomWeb"].isMember("Root"))
-    {
-      if (configuration_["DicomWeb"]["Root"].type() == Json::stringValue)
-      {
-        root_ = configuration_["DicomWeb"]["Root"].asString();
-      }
-      else
-      {
-        OrthancPluginLogError(context_, "Bad data type for DicomWeb::Root inside the configuration file");
-        return -1;
-      }
-    }
-
-    // Make sure the root URI starts and ends with a slash
-    if (root_.empty())
-    {
-      root_ = "/";
-    }
-    else
-    {
-      if (root_[0] != '/')
-      {
-        root_ = "/" + root_;
-      }
-    
-      if (root_[root_.length() - 1] != '/')
-      {
-        root_ += "/";
-      }
-    }
+    std::string root = OrthancPlugins::Configuration::GetRoot(configuration_);
 
     {
-      std::string message = "URI to the DICOMweb REST API: " + root_;
+      std::string message = "URI to the DICOMweb REST API: " + root;
       OrthancPluginLogWarning(context_, message.c_str());
     }
 
     OrthancPluginSetDescription(context_, "Implementation of DICOM Web (QIDO-RS, STOW-RS and WADO-RS).");
 
-    Register("instances", SearchForInstances);    
-    Register("series", SearchForSeries);    
-    Register("studies", SwitchStudies);
-    Register("studies/([^/]*)", SwitchStudy);
-    Register("studies/([^/]*)/instances", SearchForInstances);    
-    Register("studies/([^/]*)/metadata", RetrieveStudyMetadata);
-    Register("studies/([^/]*)/series", SearchForSeries);    
-    Register("studies/([^/]*)/series/([^/]*)", RetrieveDicomSeries);
-    Register("studies/([^/]*)/series/([^/]*)/instances", SearchForInstances);    
-    Register("studies/([^/]*)/series/([^/]*)/instances/([^/]*)", RetrieveDicomInstance);
-    Register("studies/([^/]*)/series/([^/]*)/instances/([^/]*)/bulk/(.*)", RetrieveBulkData);
-    Register("studies/([^/]*)/series/([^/]*)/instances/([^/]*)/metadata", RetrieveInstanceMetadata);
-    Register("studies/([^/]*)/series/([^/]*)/metadata", RetrieveSeriesMetadata);
+    Register(root, "instances", SearchForInstances);    
+    Register(root, "series", SearchForSeries);    
+    Register(root, "studies", SwitchStudies);
+    Register(root, "studies/([^/]*)", SwitchStudy);
+    Register(root, "studies/([^/]*)/instances", SearchForInstances);    
+    Register(root, "studies/([^/]*)/metadata", RetrieveStudyMetadata);
+    Register(root, "studies/([^/]*)/series", SearchForSeries);    
+    Register(root, "studies/([^/]*)/series/([^/]*)", RetrieveDicomSeries);
+    Register(root, "studies/([^/]*)/series/([^/]*)/instances", SearchForInstances);    
+    Register(root, "studies/([^/]*)/series/([^/]*)/instances/([^/]*)", RetrieveDicomInstance);
+    Register(root, "studies/([^/]*)/series/([^/]*)/instances/([^/]*)/bulk/(.*)", RetrieveBulkData);
+    Register(root, "studies/([^/]*)/series/([^/]*)/instances/([^/]*)/metadata", RetrieveInstanceMetadata);
+    Register(root, "studies/([^/]*)/series/([^/]*)/metadata", RetrieveSeriesMetadata);
 
     return 0;
   }
--- a/Plugin/QidoRs.cpp	Fri Jul 31 11:20:32 2015 +0200
+++ b/Plugin/QidoRs.cpp	Fri Jul 31 13:36:02 2015 +0200
@@ -318,7 +318,7 @@
       limit_(0),
       includeAllFields_(false)
     {
-      for (int32_t i = 0; i < request->getCount; i++)
+      for (uint32_t i = 0; i < request->getCount; i++)
       {
         std::string key(request->getKeys[i]);
         std::string value(request->getValues[i]);
@@ -470,7 +470,7 @@
       }
 
       // Set the retrieve URL for WADO-RS
-      std::string url = (wadoBase + "/studies/" + 
+      std::string url = (wadoBase + "studies/" + 
                          dicom.GetTagWithDefault(OrthancPlugins::DICOM_TAG_STUDY_INSTANCE_UID, "", true));
 
       if (level == QueryLevel_Series || level == QueryLevel_Instance)
@@ -744,9 +744,9 @@
   std::list<std::string> resources;
   candidates.Flatten(resources);
 
-  std::string wadoBase = OrthancPlugins::Configuration::GetBaseUrl(configuration_, request) + "/wado-rs";
+  std::string wadoBase = OrthancPlugins::Configuration::GetBaseUrl(configuration_, request);
 
-  OrthancPlugins::DicomResults results(context_, output, *dictionary_, IsXmlExpected(request), true);
+  OrthancPlugins::DicomResults results(context_, output, wadoBase, *dictionary_, IsXmlExpected(request), true);
 
   for (std::list<std::string>::const_iterator
          it = resources.begin(); it != resources.end(); it++)
--- a/Plugin/StowRs.cpp	Fri Jul 31 11:20:32 2015 +0200
+++ b/Plugin/StowRs.cpp	Fri Jul 31 13:36:02 2015 +0200
@@ -86,7 +86,7 @@
 {
   try
   {
-    const std::string wadoBase = OrthancPlugins::Configuration::GetBaseUrl(configuration_, request) + "/wado-rs";
+    const std::string wadoBase = OrthancPlugins::Configuration::GetBaseUrl(configuration_, request);
 
 
     if (request->method != OrthancPluginHttpMethod_Post)
@@ -192,7 +192,7 @@
       {
         if (isFirst)
         {
-          std::string url = wadoBase + "/studies/" + studyInstanceUid;
+          std::string url = wadoBase + "studies/" + studyInstanceUid;
           SetTag(result, OrthancPlugins::DICOM_TAG_RETRIEVE_URL, gdcm::VR::UT, url);
           isFirst = false;
         }
@@ -204,7 +204,7 @@
         if (ok)
         {
           std::string url = (wadoBase + 
-                             "/studies/" + studyInstanceUid +
+                             "studies/" + studyInstanceUid +
                              "/series/" + dicom.GetTagWithDefault(OrthancPlugins::DICOM_TAG_SERIES_INSTANCE_UID, "", true) +
                              "/instances/" + sopInstanceUid);
 
@@ -223,7 +223,7 @@
     SetSequenceTag(result, OrthancPlugins::DICOM_TAG_FAILED_SOP_SEQUENCE, failed);
     SetSequenceTag(result, OrthancPlugins::DICOM_TAG_REFERENCED_SOP_SEQUENCE, success);
 
-    OrthancPlugins::AnswerDicom(context_, output, *dictionary_, result, isXml, false);
+    OrthancPlugins::AnswerDicom(context_, output, wadoBase, *dictionary_, result, isXml, false);
 
     return 0;
   }
--- a/Plugin/WadoRs.cpp	Fri Jul 31 11:20:32 2015 +0200
+++ b/Plugin/WadoRs.cpp	Fri Jul 31 13:36:02 2015 +0200
@@ -203,6 +203,7 @@
 
 
 static void AnswerMetadata(OrthancPluginRestOutput* output,
+                           const OrthancPluginHttpRequest* request,
                            const std::string& resource,
                            bool isInstance,
                            bool isXml)
@@ -228,7 +229,8 @@
     }
   }
 
-  OrthancPlugins::DicomResults results(context_, output, *dictionary_, isXml, true);
+  const std::string wadoBase = OrthancPlugins::Configuration::GetBaseUrl(configuration_, request);
+  OrthancPlugins::DicomResults results(context_, output, wadoBase, *dictionary_, isXml, true);
   
   for (std::list<std::string>::const_iterator
          it = files.begin(); it != files.end(); ++it)
@@ -486,7 +488,7 @@
     std::string uri;
     if (LocateStudy(output, uri, request))
     {
-      AnswerMetadata(output, uri, false, isXml);
+      AnswerMetadata(output, request, uri, false, isXml);
     }
 
     return 0;
@@ -515,7 +517,7 @@
     std::string uri;
     if (LocateSeries(output, uri, request))
     {
-      AnswerMetadata(output, uri, false, isXml);
+      AnswerMetadata(output, request, uri, false, isXml);
     }
 
     return 0;
@@ -544,7 +546,7 @@
     std::string uri;
     if (LocateInstance(output, uri, request))
     {
-      AnswerMetadata(output, uri, true, isXml);
+      AnswerMetadata(output, request, uri, true, isXml);
     }
 
     return 0;