Mercurial > hg > orthanc-dicomweb
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));