changeset 516:05f2e83dc050

added 'PublicRoot' configuration
author Alain Mazy <am@osimis.io>
date Thu, 05 May 2022 12:05:57 +0200
parents baf2b0c3ef0e
children 1070bec135fd
files NEWS Plugin/Configuration.cpp Plugin/Configuration.h Plugin/Plugin.cpp Plugin/QidoRs.cpp Plugin/StowRs.cpp Plugin/StowRs.h Plugin/WadoRs.cpp Plugin/WadoRsRetrieveFrames.cpp
diffstat 9 files changed, 42 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/NEWS	Mon Apr 25 16:28:07 2022 +0200
+++ b/NEWS	Thu May 05 12:05:57 2022 +0200
@@ -30,7 +30,11 @@
       ],
       "Patient": []
     }
-
+* New configuration "PublicRoot" that is used in RetrieveUrl tags
+  and location information.  This is useful if, e.g, your Orthanc is
+  behind a reverse-proxy and has another base endpoint than the "Root"
+  one.  Note that, if using a reverse-proxy, make sure to set the "host"
+  and "proto" correctly in the "Forwarded" HTTP headers.
 
 
 Version 1.7 (2021-08-31)
--- a/Plugin/Configuration.cpp	Mon Apr 25 16:28:07 2022 +0200
+++ b/Plugin/Configuration.cpp	Thu May 05 12:05:57 2022 +0200
@@ -362,11 +362,10 @@
       return configuration_->GetUnsignedIntegerValue(key, defaultValue);
     }
 
-
-    std::string GetDicomWebRoot()
+    std::string GetRootPath(const char* configName, const char* defaultValue)
     {
       assert(configuration_.get() != NULL);
-      std::string root = configuration_->GetStringValue("Root", "/dicom-web/");
+      std::string root = configuration_->GetStringValue(configName, defaultValue);
 
       // Make sure the root URI starts and ends with a slash
       if (root.size() == 0 ||
@@ -383,7 +382,17 @@
       return root;
     }
 
-    
+    std::string GetDicomWebRoot()
+    {
+      return GetRootPath("Root", "/dicom-web/");
+    }
+
+    std::string GetPublicRoot()
+    {
+      std::string root = GetDicomWebRoot();
+      return GetRootPath("PublicRoot", root.c_str());
+    }
+
     std::string GetOrthancApiRoot()
     {
       std::string root = Configuration::GetDicomWebRoot();
@@ -476,7 +485,7 @@
     }
 
 
-    std::string GetBaseUrl(const HttpClient::HttpHeaders& headers)
+    std::string GetBasePublicUrl(const HttpClient::HttpHeaders& headers)
     {
       assert(configuration_.get() != NULL);
       std::string host = configuration_->GetStringValue("Host", "");
@@ -530,11 +539,10 @@
         host = "localhost:8042";
       }
 
-      return (https ? "https://" : "http://") + host + GetDicomWebRoot();
+      return (https ? "https://" : "http://") + host + GetPublicRoot();
     }
 
-
-    std::string GetBaseUrl(const OrthancPluginHttpRequest* request)
+    std::string GetBasePublicUrl(const OrthancPluginHttpRequest* request)
     {
       HttpClient::HttpHeaders headers;
 
@@ -549,7 +557,7 @@
         headers["Host"] = value;
       }
 
-      return GetBaseUrl(headers);
+      return GetBasePublicUrl(headers);
     }
 
 
--- a/Plugin/Configuration.h	Mon Apr 25 16:28:07 2022 +0200
+++ b/Plugin/Configuration.h	Thu May 05 12:05:57 2022 +0200
@@ -105,14 +105,17 @@
 
     std::string GetDicomWebRoot();
 
+    std::string GetPublicRoot();
+
     std::string GetOrthancApiRoot();
 
     std::string GetWadoRoot();
       
-    std::string GetBaseUrl(const std::map<std::string, std::string>& headers);
+    std::string GetBasePublicUrl(const std::map<std::string, std::string>& headers);
 
     // TODO => REMOVE
-    std::string GetBaseUrl(const OrthancPluginHttpRequest* request);
+    std::string GetBasePublicUrl(const OrthancPluginHttpRequest* request);
+
 
     std::string GetWadoUrl(const std::string& wadoBase,
                            const std::string& studyInstanceUid,
--- a/Plugin/Plugin.cpp	Mon Apr 25 16:28:07 2022 +0200
+++ b/Plugin/Plugin.cpp	Thu May 05 12:05:57 2022 +0200
@@ -627,6 +627,9 @@
         
         std::string uri = root + "app/client/index.html";
         OrthancPluginSetRootUri(context, uri.c_str());
+
+        std::string publicUrlRoot = OrthancPlugins::Configuration::GetPublicRoot();
+        OrthancPlugins::LogWarning("DICOMWeb PublicRoot: " + publicUrlRoot);
       }
       else
       {
--- a/Plugin/QidoRs.cpp	Mon Apr 25 16:28:07 2022 +0200
+++ b/Plugin/QidoRs.cpp	Thu May 05 12:05:57 2022 +0200
@@ -345,7 +345,7 @@
 
     void ExtractFields(Orthanc::DicomMap& result,
                        const Orthanc::DicomMap& source,
-                       const std::string& wadoBase,
+                       const std::string& wadoBasePublicUrl,
                        Orthanc::ResourceType level) const
     {
       std::set<Orthanc::DicomTag> fields;
@@ -363,7 +363,7 @@
       }
 
       // Set the retrieve URL for WADO-RS
-      std::string url = (wadoBase + "studies/" +
+      std::string url = (wadoBasePublicUrl + "studies/" +
                          source.GetStringValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, "", false));
 
       if (level == Orthanc::ResourceType_Series || 
@@ -405,7 +405,7 @@
     throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
   }
 
-  std::string wadoBase = OrthancPlugins::Configuration::GetBaseUrl(request);
+  std::string wadoBasePublicUrl = OrthancPlugins::Configuration::GetBasePublicUrl(request);
 
   OrthancPlugins::DicomWebFormatter::HttpWriter writer(
     output, OrthancPlugins::Configuration::IsXmlExpected(request));
@@ -422,7 +422,7 @@
 
     Orthanc::DicomMap target;
 
-    matcher.ExtractFields(target, source, wadoBase, level);
+    matcher.ExtractFields(target, source, wadoBasePublicUrl, level);
     writer.AddOrthancMap(target);
   }
   writer.Send();
--- a/Plugin/StowRs.cpp	Mon Apr 25 16:28:07 2022 +0200
+++ b/Plugin/StowRs.cpp	Thu May 05 12:05:57 2022 +0200
@@ -32,7 +32,7 @@
                          const std::string& expectedStudy) :
     context_(context),
     xml_(Configuration::IsXmlExpected(headers)),
-    wadoBase_(Configuration::GetBaseUrl(headers)),
+    wadoBasePublicUrl_(Configuration::GetBasePublicUrl(headers)),
     expectedStudy_(expectedStudy),
     isFirst_(true),
     result_(Json::objectValue),
@@ -173,7 +173,7 @@
     {
       if (isFirst_)
       {
-        std::string url = wadoBase_ + "studies/" + studyInstanceUid;
+        std::string url = wadoBasePublicUrl_ + "studies/" + studyInstanceUid;
         result_[DICOM_TAG_RETRIEVE_URL.Format()] = url;
         isFirst_ = false;
       }
@@ -184,7 +184,7 @@
 
       if (ok)
       {
-        std::string url = (wadoBase_ + 
+        std::string url = (wadoBasePublicUrl_ + 
                            "studies/" + studyInstanceUid +
                            "/series/" + seriesInstanceUid +
                            "/instances/" + sopInstanceUid);
--- a/Plugin/StowRs.h	Mon Apr 25 16:28:07 2022 +0200
+++ b/Plugin/StowRs.h	Thu May 05 12:05:57 2022 +0200
@@ -35,7 +35,7 @@
   private:
     OrthancPluginContext*  context_;
     bool                   xml_;
-    std::string            wadoBase_;
+    std::string            wadoBasePublicUrl_;
     std::string            expectedStudy_;
     bool                   isFirst_;
     Json::Value            result_;
--- a/Plugin/WadoRs.cpp	Mon Apr 25 16:28:07 2022 +0200
+++ b/Plugin/WadoRs.cpp	Thu May 05 12:05:57 2022 +0200
@@ -1127,7 +1127,7 @@
         for (std::list<Identifier>::const_iterator b = instances.begin(); b != instances.end(); ++b)
         {
           WriteInstanceMetadata(writer, mode, cache, b->GetOrthancId(), studyInstanceUid, a->GetDicomUid(),
-                                b->GetDicomUid(), OrthancPlugins::Configuration::GetBaseUrl(request));
+                                b->GetDicomUid(), OrthancPlugins::Configuration::GetBasePublicUrl(request));
         }
       }
 
@@ -1166,7 +1166,7 @@
       for (std::list<Identifier>::const_iterator a = instances.begin(); a != instances.end(); ++a)
       {
         WriteInstanceMetadata(writer, mode, cache, a->GetOrthancId(), studyInstanceUid, seriesInstanceUid,
-                              a->GetDicomUid(), OrthancPlugins::Configuration::GetBaseUrl(request));
+                              a->GetDicomUid(), OrthancPlugins::Configuration::GetBasePublicUrl(request));
       }
 
       writer.Send();
@@ -1193,7 +1193,7 @@
     {
       OrthancPlugins::DicomWebFormatter::HttpWriter writer(output, isXml);
       WriteInstanceMetadata(writer, OrthancPlugins::MetadataMode_Full, cache, orthancId, studyInstanceUid,
-                            seriesInstanceUid, sopInstanceUid, OrthancPlugins::Configuration::GetBaseUrl(request));
+                            seriesInstanceUid, sopInstanceUid, OrthancPlugins::Configuration::GetBasePublicUrl(request));
       writer.Send();      
     }
   }
--- a/Plugin/WadoRsRetrieveFrames.cpp	Mon Apr 25 16:28:07 2022 +0200
+++ b/Plugin/WadoRsRetrieveFrames.cpp	Thu May 05 12:05:57 2022 +0200
@@ -409,7 +409,7 @@
     OrthancPluginErrorCode error;
 
 #if HAS_SEND_MULTIPART_ITEM_2 == 1
-    const std::string base = OrthancPlugins::Configuration::GetBaseUrl(request);
+    const std::string base = OrthancPlugins::Configuration::GetBasePublicUrl(request);
     std::string location = (
       OrthancPlugins::Configuration::GetWadoUrl(base, studyInstanceUid, seriesInstanceUid, sopInstanceUid) +
       "frames/" + boost::lexical_cast<std::string>(*frame + 1));