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