# HG changeset patch # User Sebastien Jodogne # Date 1560010232 -7200 # Node ID 7e3989d2ea5aae91bc8bf135c9bb2a85f1e7ec5a # Parent 0222a9afa866b11f01c8c77ddf5f030abf11461f dropping old StowCallback() diff -r 0222a9afa866 -r 7e3989d2ea5a Plugin/Plugin.cpp --- a/Plugin/Plugin.cpp Sat Jun 08 17:47:01 2019 +0200 +++ b/Plugin/Plugin.cpp Sat Jun 08 18:10:32 2019 +0200 @@ -43,9 +43,7 @@ break; case OrthancPluginHttpMethod_Post: - // This is STOW-RS - StowCallback(output, url, request); - break; + // This is STOW-RS: This should have been processed by the MultipartRestCallback default: OrthancPluginSendMethodNotAllowed(OrthancPlugins::GetGlobalContext(), output, "GET,POST"); @@ -66,9 +64,7 @@ break; case OrthancPluginHttpMethod_Post: - // This is STOW-RS - StowCallback(output, url, request); - break; + // This is STOW-RS: This should have been processed by the MultipartRestCallback default: OrthancPluginSendMethodNotAllowed(OrthancPlugins::GetGlobalContext(), output, "GET,POST"); @@ -311,7 +307,6 @@ OrthancPlugins::Configuration::Initialize(); //OrthancPluginRegisterOnChangeCallback(context, OnChangeCallback); // TODO => REMOVE - stowServer_.Register("/toto"); // TODO => REMOVE // Initialize GDCM OrthancPlugins::GdcmParsedDicomFile::Initialize(); @@ -324,6 +319,9 @@ OrthancPlugins::LogWarning("URI to the DICOMweb REST API: " + root); + stowServer_.Register(root + "studies"); + stowServer_.Register(root + "studies/([^/]*)"); + OrthancPlugins::RegisterRestCallback(root + "instances", true); OrthancPlugins::RegisterRestCallback(root + "series", true); OrthancPlugins::RegisterRestCallback(root + "studies", true); diff -r 0222a9afa866 -r 7e3989d2ea5a Plugin/StowRs.cpp --- a/Plugin/StowRs.cpp Sat Jun 08 17:47:01 2019 +0200 +++ b/Plugin/StowRs.cpp Sat Jun 08 18:10:32 2019 +0200 @@ -24,198 +24,6 @@ #include "Configuration.h" #include "DicomWebFormatter.h" -#include -#include - - -void StowCallback(OrthancPluginRestOutput* output, - const char* url, - const OrthancPluginHttpRequest* request) -{ - OrthancPluginContext* context = OrthancPlugins::GetGlobalContext(); - - const std::string wadoBase = OrthancPlugins::Configuration::GetBaseUrl(request); - - if (request->method != OrthancPluginHttpMethod_Post) - { - OrthancPluginSendMethodNotAllowed(context, output, "POST"); - return; - } - - std::string expectedStudy; - if (request->groupsCount == 1) - { - expectedStudy = request->groups[0]; - } - - if (expectedStudy.empty()) - { - OrthancPlugins::LogInfo("STOW-RS request without study"); - } - else - { - OrthancPlugins::LogInfo("STOW-RS request restricted to study UID " + expectedStudy); - } - - std::string header; - if (!OrthancPlugins::LookupHttpHeader(header, request, "content-type")) - { - OrthancPlugins::LogError("No content type in the HTTP header of a STOW-RS request"); - OrthancPluginSendHttpStatusCode(context, output, 400 /* Bad request */); - return; - } - - std::string application; - std::map attributes; - OrthancPlugins::ParseContentType(application, attributes, header); - - if (application != "multipart/related" || - attributes.find("type") == attributes.end() || - attributes.find("boundary") == attributes.end()) - { - OrthancPlugins::LogError("Unable to parse the content type of a STOW-RS request (" + application + ")"); - OrthancPluginSendHttpStatusCode(context, output, 400 /* Bad request */); - return; - } - - - std::string boundary = attributes["boundary"]; - - if (attributes["type"] != "application/dicom") - { - OrthancPlugins::LogError("The STOW-RS plugin currently only supports application/dicom"); - OrthancPluginSendHttpStatusCode(context, output, 415 /* Unsupported media type */); - return; - } - - - bool isFirst = true; - - Json::Value result = Json::objectValue; - Json::Value success = Json::arrayValue; - Json::Value failed = Json::arrayValue; - - std::vector items; - OrthancPlugins::ParseMultipartBody(items, request->body, request->bodySize, boundary); - - for (size_t i = 0; i < items.size(); i++) - { - OrthancPlugins::LogInfo("Detected multipart item with content type \"" + - items[i].contentType_ + "\" of size " + - boost::lexical_cast(items[i].size_)); - } - - for (size_t i = 0; i < items.size(); i++) - { - if (!items[i].contentType_.empty() && - items[i].contentType_ != "application/dicom") - { - OrthancPlugins::LogError("The STOW-RS request contains a part that is not " - "\"application/dicom\" (it is: \"" + items[i].contentType_ + "\")"); - OrthancPluginSendHttpStatusCode(context, output, 415 /* Unsupported media type */); - return; - } - - Json::Value dicom; - - try - { - OrthancPlugins::OrthancString s; - s.Assign(OrthancPluginDicomBufferToJson(context, items[i].data_, items[i].size_, - OrthancPluginDicomToJsonFormat_Short, - OrthancPluginDicomToJsonFlags_None, 256)); - s.ToJson(dicom); - } - catch (Orthanc::OrthancException&) - { - // Bad DICOM file => TODO add to error - OrthancPlugins::LogWarning("STOW-RS cannot parse an incoming DICOM file"); - continue; - } - - if (dicom.type() != Json::objectValue || - !dicom.isMember(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID.Format()) || - !dicom.isMember(Orthanc::DICOM_TAG_SOP_CLASS_UID.Format()) || - !dicom.isMember(Orthanc::DICOM_TAG_SOP_INSTANCE_UID.Format()) || - !dicom.isMember(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID.Format()) || - dicom[Orthanc::DICOM_TAG_SERIES_INSTANCE_UID.Format()].type() != Json::stringValue || - dicom[Orthanc::DICOM_TAG_SOP_CLASS_UID.Format()].type() != Json::stringValue || - dicom[Orthanc::DICOM_TAG_SOP_INSTANCE_UID.Format()].type() != Json::stringValue || - dicom[Orthanc::DICOM_TAG_STUDY_INSTANCE_UID.Format()].type() != Json::stringValue) - { - OrthancPlugins::LogWarning("STOW-RS: Missing a mandatory tag in incoming DICOM file"); - continue; - } - - const std::string seriesInstanceUid = dicom[Orthanc::DICOM_TAG_SERIES_INSTANCE_UID.Format()].asString(); - const std::string sopClassUid = dicom[Orthanc::DICOM_TAG_SOP_CLASS_UID.Format()].asString(); - const std::string sopInstanceUid = dicom[Orthanc::DICOM_TAG_SOP_INSTANCE_UID.Format()].asString(); - const std::string studyInstanceUid = dicom[Orthanc::DICOM_TAG_STUDY_INSTANCE_UID.Format()].asString(); - - Json::Value item = Json::objectValue; - item[OrthancPlugins::DICOM_TAG_REFERENCED_SOP_CLASS_UID.Format()] = sopClassUid; - item[OrthancPlugins::DICOM_TAG_REFERENCED_SOP_INSTANCE_UID.Format()] = sopInstanceUid; - - if (!expectedStudy.empty() && - studyInstanceUid != expectedStudy) - { - OrthancPlugins::LogInfo("STOW-RS request restricted to study [" + expectedStudy + - "]: Ignoring instance from study [" + studyInstanceUid + "]"); - - /*item[OrthancPlugins::DICOM_TAG_WARNING_REASON.Format()] = - boost::lexical_cast(0xB006); // Elements discarded - success.append(item);*/ - } - else - { - if (isFirst) - { - std::string url = wadoBase + "studies/" + studyInstanceUid; - result[OrthancPlugins::DICOM_TAG_RETRIEVE_URL.Format()] = url; - isFirst = false; - } - - OrthancPlugins::MemoryBuffer tmp; - bool ok = tmp.RestApiPost("/instances", items[i].data_, items[i].size_, false); - tmp.Clear(); - - if (ok) - { - std::string url = (wadoBase + - "studies/" + studyInstanceUid + - "/series/" + seriesInstanceUid + - "/instances/" + sopInstanceUid); - - item[OrthancPlugins::DICOM_TAG_RETRIEVE_URL.Format()] = url; - success.append(item); - } - else - { - OrthancPlugins::LogError("Orthanc was unable to store instance through STOW-RS request"); - item[OrthancPlugins::DICOM_TAG_FAILURE_REASON.Format()] = - boost::lexical_cast(0x0110); // Processing failure - failed.append(item); - } - } - } - - result[OrthancPlugins::DICOM_TAG_FAILED_SOP_SEQUENCE.Format()] = failed; - result[OrthancPlugins::DICOM_TAG_REFERENCED_SOP_SEQUENCE.Format()] = success; - - const bool isXml = OrthancPlugins::Configuration::IsXmlExpected(request); - std::string answer; - - { - OrthancPlugins::DicomWebFormatter::Locker locker(OrthancPluginDicomWebBinaryMode_Ignore, ""); - locker.Apply(answer, context, result, isXml); - } - - OrthancPluginAnswerBuffer(context, output, answer.c_str(), answer.size(), - isXml ? "application/dicom+xml" : "application/dicom+json"); -} - - - namespace OrthancPlugins { diff -r 0222a9afa866 -r 7e3989d2ea5a Plugin/StowRs.h --- a/Plugin/StowRs.h Sat Jun 08 17:47:01 2019 +0200 +++ b/Plugin/StowRs.h Sat Jun 08 18:10:32 2019 +0200 @@ -21,16 +21,8 @@ #pragma once -#include "Configuration.h" - #include - -void StowCallback(OrthancPluginRestOutput* output, - const char* url, - const OrthancPluginHttpRequest* request); - - namespace OrthancPlugins { class StowServer : public MultipartRestCallback