comparison OrthancServer/OrthancRestApi/OrthancRestApi.cpp @ 3689:e85bfba2d307

"/instances": Support "Content-Encoding: gzip" to upload gzip-compressed DICOM files
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 25 Feb 2020 11:07:56 +0100
parents 94f4a18a79cc
children 2a170a8f1faf
comparison
equal deleted inserted replaced
3688:9c091747483a 3689:e85bfba2d307
32 32
33 33
34 #include "../PrecompiledHeadersServer.h" 34 #include "../PrecompiledHeadersServer.h"
35 #include "OrthancRestApi.h" 35 #include "OrthancRestApi.h"
36 36
37 #include "../../Core/Compression/GzipCompressor.h"
37 #include "../../Core/Logging.h" 38 #include "../../Core/Logging.h"
38 #include "../../Core/MetricsRegistry.h" 39 #include "../../Core/MetricsRegistry.h"
39 #include "../../Core/SerializationToolbox.h" 40 #include "../../Core/SerializationToolbox.h"
40 #include "../ServerContext.h" 41 #include "../ServerContext.h"
42
43 #include <boost/algorithm/string/predicate.hpp>
41 44
42 namespace Orthanc 45 namespace Orthanc
43 { 46 {
44 static void SetupResourceAnswer(Json::Value& result, 47 static void SetupResourceAnswer(Json::Value& result,
45 const std::string& publicId, 48 const std::string& publicId,
116 { 119 {
117 throw OrthancException(ErrorCode_BadFileFormat, 120 throw OrthancException(ErrorCode_BadFileFormat,
118 "Received an empty DICOM file"); 121 "Received an empty DICOM file");
119 } 122 }
120 123
121 // TODO Remove unneccessary memcpy 124 std::string dicom;
122 std::string postData; 125
123 call.BodyToString(postData); 126 if (boost::iequals(call.GetHttpHeader("content-encoding", ""), "gzip"))
127 {
128 GzipCompressor compressor;
129 compressor.Uncompress(dicom, call.GetBodyData(), call.GetBodySize());
130 }
131 else
132 {
133 // TODO Remove unneccessary memcpy
134 call.BodyToString(dicom);
135 }
124 136
125 DicomInstanceToStore toStore; 137 DicomInstanceToStore toStore;
126 toStore.SetOrigin(DicomInstanceOrigin::FromRest(call)); 138 toStore.SetOrigin(DicomInstanceOrigin::FromRest(call));
127 toStore.SetBuffer(postData); 139 toStore.SetBuffer(dicom);
128 140
129 std::string publicId; 141 std::string publicId;
130 StoreStatus status = context.Store(publicId, toStore); 142 StoreStatus status = context.Store(publicId, toStore);
131 143
132 OrthancRestApi::GetApi(call).AnswerStoredInstance(call, toStore, status); 144 OrthancRestApi::GetApi(call).AnswerStoredInstance(call, toStore, status);