Mercurial > hg > orthanc
annotate OrthancServer/Sources/OrthancRestApi/OrthancRestApi.cpp @ 4555:456ed3fcff81 db-changes
cont
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 03 Mar 2021 17:13:41 +0100 |
parents | a3c6678aa7b1 |
children | 569d9ef165b1 |
rev | line source |
---|---|
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1 /** |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2 * Orthanc - A Lightweight, RESTful DICOM Store |
1900 | 3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
1288
6e7e5ed91c2d
upgrade to year 2015
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1103
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
4437
d9473bd5ed43
upgrade to year 2021
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4424
diff
changeset
|
5 * Copyright (C) 2017-2021 Osimis S.A., Belgium |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
6 * |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
7 * This program is free software: you can redistribute it and/or |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 * modify it under the terms of the GNU General Public License as |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
9 * published by the Free Software Foundation, either version 3 of the |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
10 * License, or (at your option) any later version. |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 * |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 * In addition, as a special exception, the copyright holders of this |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 * program give permission to link the code of its release with the |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 * OpenSSL project's "OpenSSL" library (or with modified versions of it |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
15 * that use the same license as the "OpenSSL" library), and distribute |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
16 * the linked executables. You must obey the GNU General Public License |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
17 * in all respects for all of the code used other than "OpenSSL". If you |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
18 * modify file(s) with this exception, you may extend this exception to |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
19 * your version of the file(s), but you are not obligated to do so. If |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
20 * you do not wish to do so, delete this exception statement from your |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
21 * version. If you delete this exception statement from all source files |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
22 * in the program, then also delete it here. |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
23 * |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
24 * This program is distributed in the hope that it will be useful, but |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
25 * WITHOUT ANY WARRANTY; without even the implied warranty of |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
27 * General Public License for more details. |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
28 * |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
29 * You should have received a copy of the GNU General Public License |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
30 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
31 **/ |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
32 |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
33 |
831
84513f2ee1f3
pch for unit tests and server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
824
diff
changeset
|
34 #include "../PrecompiledHeadersServer.h" |
230 | 35 #include "OrthancRestApi.h" |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
36 |
4045 | 37 #include "../../../OrthancFramework/Sources/Compression/GzipCompressor.h" |
4357
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
38 #include "../../../OrthancFramework/Sources/Compression/ZipReader.h" |
4045 | 39 #include "../../../OrthancFramework/Sources/Logging.h" |
40 #include "../../../OrthancFramework/Sources/MetricsRegistry.h" | |
41 #include "../../../OrthancFramework/Sources/SerializationToolbox.h" | |
4505
97d103b57cd1
removed cached dicom summary from DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
42 #include "../OrthancConfiguration.h" |
1437
02f5a3f5c0a0
access to the REST API from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
43 #include "../ServerContext.h" |
796
e7b1ca0f1e04
creation of dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
751
diff
changeset
|
44 |
3689
e85bfba2d307
"/instances": Support "Content-Encoding: gzip" to upload gzip-compressed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
45 #include <boost/algorithm/string/predicate.hpp> |
e85bfba2d307
"/instances": Support "Content-Encoding: gzip" to upload gzip-compressed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
46 |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
47 namespace Orthanc |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
48 { |
2899
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
49 static void SetupResourceAnswer(Json::Value& result, |
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
50 const std::string& publicId, |
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
51 ResourceType resourceType, |
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
52 StoreStatus status) |
796
e7b1ca0f1e04
creation of dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
751
diff
changeset
|
53 { |
2899
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
54 result = Json::objectValue; |
796
e7b1ca0f1e04
creation of dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
751
diff
changeset
|
55 |
e7b1ca0f1e04
creation of dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
751
diff
changeset
|
56 if (status != StoreStatus_Failure) |
e7b1ca0f1e04
creation of dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
751
diff
changeset
|
57 { |
e7b1ca0f1e04
creation of dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
751
diff
changeset
|
58 result["ID"] = publicId; |
1564
1b7def486e62
creation of DICOM series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1486
diff
changeset
|
59 result["Path"] = GetBasePath(resourceType, publicId); |
796
e7b1ca0f1e04
creation of dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
751
diff
changeset
|
60 } |
2899
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
61 |
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
62 result["Status"] = EnumerationToString(status); |
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
63 } |
796
e7b1ca0f1e04
creation of dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
751
diff
changeset
|
64 |
2899
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
65 |
4357
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
66 static void SetupResourceAnswer(Json::Value& result, |
4519 | 67 const DicomInstanceToStore& instance, |
4357
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
68 StoreStatus status, |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
69 const std::string& instanceId) |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
70 { |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
71 SetupResourceAnswer(result, instanceId, ResourceType_Instance, status); |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
72 |
4505
97d103b57cd1
removed cached dicom summary from DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
73 DicomMap summary; |
4507
b4c58795f3a8
widening the use of DicomTransferSyntax enum
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4505
diff
changeset
|
74 instance.GetSummary(summary); |
4505
97d103b57cd1
removed cached dicom summary from DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
75 |
97d103b57cd1
removed cached dicom summary from DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
76 DicomInstanceHasher hasher(summary); |
97d103b57cd1
removed cached dicom summary from DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
77 result["ParentPatient"] = hasher.HashPatient(); |
97d103b57cd1
removed cached dicom summary from DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
78 result["ParentStudy"] = hasher.HashStudy(); |
97d103b57cd1
removed cached dicom summary from DicomInstanceToStore
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
79 result["ParentSeries"] = hasher.HashSeries(); |
4357
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
80 } |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
81 |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
82 |
2899
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
83 void OrthancRestApi::AnswerStoredInstance(RestApiPostCall& call, |
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
84 DicomInstanceToStore& instance, |
3912
7610af1532c3
prototyping automated transcoding of incoming DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3848
diff
changeset
|
85 StoreStatus status, |
7610af1532c3
prototyping automated transcoding of incoming DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3848
diff
changeset
|
86 const std::string& instanceId) const |
2899
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
87 { |
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
88 Json::Value result; |
4357
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
89 SetupResourceAnswer(result, instance, status, instanceId); |
2899
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
90 call.GetOutput().AnswerJson(result); |
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
91 } |
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
92 |
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
93 |
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
94 void OrthancRestApi::AnswerStoredResource(RestApiPostCall& call, |
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
95 const std::string& publicId, |
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
96 ResourceType resourceType, |
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
97 StoreStatus status) const |
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
98 { |
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
99 Json::Value result; |
5dd649de253d
POST-ing a DICOM file to "/instances" also answers the patient/study/series ID
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2867
diff
changeset
|
100 SetupResourceAnswer(result, publicId, resourceType, status); |
796
e7b1ca0f1e04
creation of dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
751
diff
changeset
|
101 call.GetOutput().AnswerJson(result); |
e7b1ca0f1e04
creation of dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
751
diff
changeset
|
102 } |
e7b1ca0f1e04
creation of dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
751
diff
changeset
|
103 |
e7b1ca0f1e04
creation of dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
751
diff
changeset
|
104 |
1103
bec1eccf976c
Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1063
diff
changeset
|
105 void OrthancRestApi::ResetOrthanc(RestApiPostCall& call) |
bec1eccf976c
Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1063
diff
changeset
|
106 { |
4403 | 107 if (call.IsDocumentation()) |
108 { | |
109 call.GetDocumentation() | |
110 .SetTag("System") | |
111 .SetSummary("Restart Orthanc"); | |
112 return; | |
113 } | |
114 | |
1730
bc34c69b594a
New URI "/tools/shutdown" to stop Orthanc from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1572
diff
changeset
|
115 OrthancRestApi::GetApi(call).leaveBarrier_ = true; |
1103
bec1eccf976c
Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1063
diff
changeset
|
116 OrthancRestApi::GetApi(call).resetRequestReceived_ = true; |
2908
9d277f8ad698
new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2905
diff
changeset
|
117 call.GetOutput().AnswerBuffer("{}", MimeType_Json); |
1103
bec1eccf976c
Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1063
diff
changeset
|
118 } |
bec1eccf976c
Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1063
diff
changeset
|
119 |
bec1eccf976c
Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1063
diff
changeset
|
120 |
1730
bc34c69b594a
New URI "/tools/shutdown" to stop Orthanc from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1572
diff
changeset
|
121 void OrthancRestApi::ShutdownOrthanc(RestApiPostCall& call) |
bc34c69b594a
New URI "/tools/shutdown" to stop Orthanc from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1572
diff
changeset
|
122 { |
4403 | 123 if (call.IsDocumentation()) |
124 { | |
125 call.GetDocumentation() | |
126 .SetTag("System") | |
127 .SetSummary("Shutdown Orthanc"); | |
128 return; | |
129 } | |
130 | |
1730
bc34c69b594a
New URI "/tools/shutdown" to stop Orthanc from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1572
diff
changeset
|
131 OrthancRestApi::GetApi(call).leaveBarrier_ = true; |
2908
9d277f8ad698
new enumeration: MimeType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2905
diff
changeset
|
132 call.GetOutput().AnswerBuffer("{}", MimeType_Json); |
1730
bc34c69b594a
New URI "/tools/shutdown" to stop Orthanc from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1572
diff
changeset
|
133 LOG(WARNING) << "Shutdown request received"; |
bc34c69b594a
New URI "/tools/shutdown" to stop Orthanc from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1572
diff
changeset
|
134 } |
bc34c69b594a
New URI "/tools/shutdown" to stop Orthanc from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1572
diff
changeset
|
135 |
bc34c69b594a
New URI "/tools/shutdown" to stop Orthanc from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1572
diff
changeset
|
136 |
1103
bec1eccf976c
Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1063
diff
changeset
|
137 |
bec1eccf976c
Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1063
diff
changeset
|
138 |
796
e7b1ca0f1e04
creation of dicom files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
751
diff
changeset
|
139 |
216
e5d5d4a9a326
refactored upload of dicom through http
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
215
diff
changeset
|
140 // Upload of DICOM files through HTTP --------------------------------------- |
e5d5d4a9a326
refactored upload of dicom through http
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
215
diff
changeset
|
141 |
974 | 142 static void UploadDicomFile(RestApiPostCall& call) |
216
e5d5d4a9a326
refactored upload of dicom through http
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
215
diff
changeset
|
143 { |
4399
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
144 if (call.GetRequestOrigin() == RequestOrigin_Documentation) |
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
145 { |
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
146 Json::Value sample = Json::objectValue; |
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
147 sample["ID"] = "19816330-cb02e1cf-df3a8fe8-bf510623-ccefe9f5"; |
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
148 sample["ParentPatient"] = "ef9d77db-eb3b2bef-9b31fd3e-bf42ae46-dbdb0cc3"; |
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
149 sample["ParentSeries"] = "3774320f-ccda46d8-69ee8641-9e791cbf-3ecbbcc6"; |
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
150 sample["ParentStudy"] = "66c8e41e-ac3a9029-0b85e42a-8195ee0a-92c2e62e"; |
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
151 sample["Path"] = "/instances/19816330-cb02e1cf-df3a8fe8-bf510623-ccefe9f5"; |
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
152 sample["Status"] = "Success"; |
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
153 |
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
154 call.GetDocumentation() |
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
155 .SetTag("Instances") |
4403 | 156 .SetSummary("Upload DICOM instances") |
4399
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
157 .AddRequestType(MimeType_Dicom, "DICOM file to be uploaded") |
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
158 .AddRequestType(MimeType_Zip, "ZIP archive containing DICOM files (new in Orthanc 1.8.2)") |
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
159 .AddAnswerType(MimeType_Json, "Information about the uploaded instance, " |
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
160 "or list of information for each uploaded instance in the case of ZIP archive") |
4404 | 161 .SetAnswerField("ID", RestApiCallDocumentation::Type_String, "Orthanc identifier of the new instance") |
162 .SetAnswerField("Path", RestApiCallDocumentation::Type_String, "Path to the new instance in the REST API") | |
163 .SetAnswerField("Status", RestApiCallDocumentation::Type_String, "Can be `Success`, `AlreadyStored`, `Failure`, or `FilteredOut` (removed by some `NewInstanceFilter`)") | |
4413 | 164 .SetAnswerField("ParentPatient", RestApiCallDocumentation::Type_String, "Orthanc identifier of the parent patient") |
165 .SetAnswerField("ParentStudy", RestApiCallDocumentation::Type_String, "Orthanc identifier of the parent study") | |
166 .SetAnswerField("ParentSeries", RestApiCallDocumentation::Type_String, "Orthanc identifier of the parent series") | |
4399
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
167 .SetSample(sample); |
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
168 return; |
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
169 } |
80fd140b12ba
New command-line option: "--openapi" to write the OpenAPI documentation of the REST API to a file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4378
diff
changeset
|
170 |
746
478f4f9de9eb
getting rid of macros
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
745
diff
changeset
|
171 ServerContext& context = OrthancRestApi::GetContext(call); |
216
e5d5d4a9a326
refactored upload of dicom through http
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
215
diff
changeset
|
172 |
4294
0923247e69f6
log categories: rest -> http + added lua & jobs
Alain Mazy <alain@mazy.be>
parents:
4272
diff
changeset
|
173 CLOG(INFO, HTTP) << "Receiving a DICOM file of " << call.GetBodySize() << " bytes through HTTP"; |
3491
22bdb9c91ebf
Log an explicit error if uploading an empty DICOM file using REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
174 |
1446
8dc80ba768aa
refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1437
diff
changeset
|
175 if (call.GetBodySize() == 0) |
291
4d7469f72a0b
embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
285
diff
changeset
|
176 { |
3491
22bdb9c91ebf
Log an explicit error if uploading an empty DICOM file using REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
177 throw OrthancException(ErrorCode_BadFileFormat, |
22bdb9c91ebf
Log an explicit error if uploading an empty DICOM file using REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3401
diff
changeset
|
178 "Received an empty DICOM file"); |
291
4d7469f72a0b
embedding of dicom dictionaries
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
285
diff
changeset
|
179 } |
216
e5d5d4a9a326
refactored upload of dicom through http
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
215
diff
changeset
|
180 |
4357
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
181 if (ZipReader::IsZipMemoryBuffer(call.GetBodyData(), call.GetBodySize())) |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
182 { |
4374
79ef2b6d8e76
there will be a 1.8.2 release before 1.9.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4357
diff
changeset
|
183 // New in Orthanc 1.8.2 |
4357
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
184 std::unique_ptr<ZipReader> reader(ZipReader::CreateFromMemory(call.GetBodyData(), call.GetBodySize())); |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
185 |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
186 Json::Value answer = Json::arrayValue; |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
187 |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
188 std::string filename, content; |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
189 while (reader->ReadNextFile(filename, content)) |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
190 { |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
191 if (!content.empty()) |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
192 { |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
193 LOG(INFO) << "Uploading DICOM file from ZIP archive: " << filename; |
4508
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4507
diff
changeset
|
194 |
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4507
diff
changeset
|
195 std::unique_ptr<DicomInstanceToStore> toStore(DicomInstanceToStore::CreateFromBuffer(content)); |
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4507
diff
changeset
|
196 toStore->SetOrigin(DicomInstanceOrigin::FromRest(call)); |
4357
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
197 |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
198 std::string publicId; |
3689
e85bfba2d307
"/instances": Support "Content-Encoding: gzip" to upload gzip-compressed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
199 |
4357
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
200 try |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
201 { |
4508
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4507
diff
changeset
|
202 StoreStatus status = context.Store(publicId, *toStore, StoreInstanceMode_Default); |
3841
be7df7fe3d80
avoid one memcpy of the DICOM buffer on "POST /instances"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
203 |
4357
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
204 Json::Value info; |
4508
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4507
diff
changeset
|
205 SetupResourceAnswer(info, *toStore, status, publicId); |
4357
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
206 answer.append(info); |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
207 } |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
208 catch (OrthancException& e) |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
209 { |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
210 if (e.GetErrorCode() == ErrorCode_BadFileFormat) |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
211 { |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
212 LOG(ERROR) << "Cannot import non-DICOM file from ZIP archive: " << filename; |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
213 } |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
214 else |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
215 { |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
216 throw; |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
217 } |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
218 } |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
219 } |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
220 } |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
221 |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
222 call.GetOutput().AnswerJson(answer); |
3689
e85bfba2d307
"/instances": Support "Content-Encoding: gzip" to upload gzip-compressed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
223 } |
e85bfba2d307
"/instances": Support "Content-Encoding: gzip" to upload gzip-compressed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
224 else |
e85bfba2d307
"/instances": Support "Content-Encoding: gzip" to upload gzip-compressed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
225 { |
4357
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
226 // The lifetime of "dicom" must be longer than "toStore", as the |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
227 // latter can possibly store a reference to the former (*) |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
228 std::string dicom; |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
229 |
4508
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4507
diff
changeset
|
230 std::unique_ptr<DicomInstanceToStore> toStore; |
1005
84b6d7bca6db
refactoring of ServerContext::Store
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
974
diff
changeset
|
231 |
4357
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
232 if (boost::iequals(call.GetHttpHeader("content-encoding", ""), "gzip")) |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
233 { |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
234 GzipCompressor compressor; |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
235 compressor.Uncompress(dicom, call.GetBodyData(), call.GetBodySize()); |
4508
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4507
diff
changeset
|
236 toStore.reset(DicomInstanceToStore::CreateFromBuffer(dicom)); // (*) |
4357
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
237 } |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
238 else |
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
239 { |
4508
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4507
diff
changeset
|
240 toStore.reset(DicomInstanceToStore::CreateFromBuffer(call.GetBodyData(), call.GetBodySize())); |
4357
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
241 } |
216
e5d5d4a9a326
refactored upload of dicom through http
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
215
diff
changeset
|
242 |
4508
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4507
diff
changeset
|
243 toStore->SetOrigin(DicomInstanceOrigin::FromRest(call)); |
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4507
diff
changeset
|
244 |
4357
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
245 std::string publicId; |
4508
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4507
diff
changeset
|
246 StoreStatus status = context.Store(publicId, *toStore, StoreInstanceMode_Default); |
4357
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
247 |
4508
8f9090b137f1
Optimization in C-STORE SCP by avoiding an unnecessary DICOM parsing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4507
diff
changeset
|
248 OrthancRestApi::GetApi(call).AnswerStoredInstance(call, *toStore, status, publicId); |
4357
886bc367aeb2
"/instances" can be used to import ZIP archives provided in the POST body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4330
diff
changeset
|
249 } |
216
e5d5d4a9a326
refactored upload of dicom through http
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
215
diff
changeset
|
250 } |
215
c07170f3f4f7
refactoring of access to images in REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
251 |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
252 |
304 | 253 |
213
4ce7fdcc8879
access to tags, simplified-tags and file of an instance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
212
diff
changeset
|
254 // Registration of the various REST handlers -------------------------------- |
4ce7fdcc8879
access to tags, simplified-tags and file of an instance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
212
diff
changeset
|
255 |
4378
9e2fc6911ac8
adding option to disable orthance explorer when http server is enabled
Andrew Wallis <andrew.wallis@varian.com>>
parents:
4374
diff
changeset
|
256 OrthancRestApi::OrthancRestApi(ServerContext& context, |
9e2fc6911ac8
adding option to disable orthance explorer when http server is enabled
Andrew Wallis <andrew.wallis@varian.com>>
parents:
4374
diff
changeset
|
257 bool orthancExplorerEnabled) : |
1103
bec1eccf976c
Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1063
diff
changeset
|
258 context_(context), |
1730
bc34c69b594a
New URI "/tools/shutdown" to stop Orthanc from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1572
diff
changeset
|
259 leaveBarrier_(false), |
3176
784bbb03fb54
new metrics: orthanc_rest_api_active_requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3175
diff
changeset
|
260 resetRequestReceived_(false), |
784bbb03fb54
new metrics: orthanc_rest_api_active_requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3175
diff
changeset
|
261 activeRequests_(context.GetMetricsRegistry(), |
784bbb03fb54
new metrics: orthanc_rest_api_active_requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3175
diff
changeset
|
262 "orthanc_rest_api_active_requests", |
784bbb03fb54
new metrics: orthanc_rest_api_active_requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3175
diff
changeset
|
263 MetricsType_MaxOver10Seconds) |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
264 { |
4378
9e2fc6911ac8
adding option to disable orthance explorer when http server is enabled
Andrew Wallis <andrew.wallis@varian.com>>
parents:
4374
diff
changeset
|
265 RegisterSystem(orthancExplorerEnabled); |
751
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
750
diff
changeset
|
266 |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
750
diff
changeset
|
267 RegisterChanges(); |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
750
diff
changeset
|
268 RegisterResources(); |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
750
diff
changeset
|
269 RegisterModalities(); |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
750
diff
changeset
|
270 RegisterAnonymizeModify(); |
5197fd35333c
refactoring of OrthancRestApi
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
750
diff
changeset
|
271 RegisterArchive(); |
211 | 272 |
216
e5d5d4a9a326
refactored upload of dicom through http
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
215
diff
changeset
|
273 Register("/instances", UploadDicomFile); |
1063
0332e6e8c679
Fix automated generation of the list of resource children in the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1005
diff
changeset
|
274 |
0332e6e8c679
Fix automated generation of the list of resource children in the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1005
diff
changeset
|
275 // Auto-generated directories |
0332e6e8c679
Fix automated generation of the list of resource children in the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1005
diff
changeset
|
276 Register("/tools", RestApi::AutoListChildren); |
1103
bec1eccf976c
Hot restart of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1063
diff
changeset
|
277 Register("/tools/reset", ResetOrthanc); |
1730
bc34c69b594a
New URI "/tools/shutdown" to stop Orthanc from the REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1572
diff
changeset
|
278 Register("/tools/shutdown", ShutdownOrthanc); |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
279 } |
1437
02f5a3f5c0a0
access to the REST API from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
280 |
02f5a3f5c0a0
access to the REST API from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
281 |
3175
574890d14c92
new metrics: orthanc_store_dicom_duration_ms, orthanc_storage_[create|read|remove]_duration_ms
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
282 bool OrthancRestApi::Handle(HttpOutput& output, |
574890d14c92
new metrics: orthanc_store_dicom_duration_ms, orthanc_storage_[create|read|remove]_duration_ms
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
283 RequestOrigin origin, |
574890d14c92
new metrics: orthanc_store_dicom_duration_ms, orthanc_storage_[create|read|remove]_duration_ms
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
284 const char* remoteIp, |
574890d14c92
new metrics: orthanc_store_dicom_duration_ms, orthanc_storage_[create|read|remove]_duration_ms
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
285 const char* username, |
574890d14c92
new metrics: orthanc_store_dicom_duration_ms, orthanc_storage_[create|read|remove]_duration_ms
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
286 HttpMethod method, |
574890d14c92
new metrics: orthanc_store_dicom_duration_ms, orthanc_storage_[create|read|remove]_duration_ms
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
287 const UriComponents& uri, |
4330
a01b1c9cbef4
moving generic type definitions from IHttpHandler to HttpToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4294
diff
changeset
|
288 const HttpToolbox::Arguments& headers, |
a01b1c9cbef4
moving generic type definitions from IHttpHandler to HttpToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4294
diff
changeset
|
289 const HttpToolbox::GetArguments& getArguments, |
3401 | 290 const void* bodyData, |
3175
574890d14c92
new metrics: orthanc_store_dicom_duration_ms, orthanc_storage_[create|read|remove]_duration_ms
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
291 size_t bodySize) |
574890d14c92
new metrics: orthanc_store_dicom_duration_ms, orthanc_storage_[create|read|remove]_duration_ms
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
292 { |
574890d14c92
new metrics: orthanc_store_dicom_duration_ms, orthanc_storage_[create|read|remove]_duration_ms
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
293 MetricsRegistry::Timer timer(context_.GetMetricsRegistry(), "orthanc_rest_api_duration_ms"); |
3176
784bbb03fb54
new metrics: orthanc_rest_api_active_requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3175
diff
changeset
|
294 MetricsRegistry::ActiveCounter counter(activeRequests_); |
3175
574890d14c92
new metrics: orthanc_store_dicom_duration_ms, orthanc_storage_[create|read|remove]_duration_ms
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
295 |
574890d14c92
new metrics: orthanc_store_dicom_duration_ms, orthanc_storage_[create|read|remove]_duration_ms
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
296 return RestApi::Handle(output, origin, remoteIp, username, method, |
574890d14c92
new metrics: orthanc_store_dicom_duration_ms, orthanc_storage_[create|read|remove]_duration_ms
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
297 uri, headers, getArguments, bodyData, bodySize); |
574890d14c92
new metrics: orthanc_store_dicom_duration_ms, orthanc_storage_[create|read|remove]_duration_ms
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
298 } |
574890d14c92
new metrics: orthanc_store_dicom_duration_ms, orthanc_storage_[create|read|remove]_duration_ms
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
299 |
574890d14c92
new metrics: orthanc_store_dicom_duration_ms, orthanc_storage_[create|read|remove]_duration_ms
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
300 |
1437
02f5a3f5c0a0
access to the REST API from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
301 ServerContext& OrthancRestApi::GetContext(RestApiCall& call) |
02f5a3f5c0a0
access to the REST API from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
302 { |
02f5a3f5c0a0
access to the REST API from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
303 return GetApi(call).context_; |
02f5a3f5c0a0
access to the REST API from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
304 } |
02f5a3f5c0a0
access to the REST API from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
305 |
02f5a3f5c0a0
access to the REST API from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
306 |
02f5a3f5c0a0
access to the REST API from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
307 ServerIndex& OrthancRestApi::GetIndex(RestApiCall& call) |
02f5a3f5c0a0
access to the REST API from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
308 { |
02f5a3f5c0a0
access to the REST API from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
309 return GetContext(call).GetIndex(); |
02f5a3f5c0a0
access to the REST API from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
310 } |
2867 | 311 |
312 | |
313 | |
314 static const char* KEY_PERMISSIVE = "Permissive"; | |
315 static const char* KEY_PRIORITY = "Priority"; | |
316 static const char* KEY_SYNCHRONOUS = "Synchronous"; | |
317 static const char* KEY_ASYNCHRONOUS = "Asynchronous"; | |
2965
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
318 |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
319 |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
320 bool OrthancRestApi::IsSynchronousJobRequest(bool isDefaultSynchronous, |
2966 | 321 const Json::Value& body) |
2965
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
322 { |
2966 | 323 if (body.type() != Json::objectValue) |
324 { | |
325 return isDefaultSynchronous; | |
326 } | |
327 else if (body.isMember(KEY_SYNCHRONOUS)) | |
2965
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
328 { |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
329 return SerializationToolbox::ReadBoolean(body, KEY_SYNCHRONOUS); |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
330 } |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
331 else if (body.isMember(KEY_ASYNCHRONOUS)) |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
332 { |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
333 return !SerializationToolbox::ReadBoolean(body, KEY_ASYNCHRONOUS); |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
334 } |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
335 else |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
336 { |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
337 return isDefaultSynchronous; |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
338 } |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
339 } |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
340 |
2970
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2966
diff
changeset
|
341 |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2966
diff
changeset
|
342 unsigned int OrthancRestApi::GetJobRequestPriority(const Json::Value& body) |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2966
diff
changeset
|
343 { |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2966
diff
changeset
|
344 if (body.type() != Json::objectValue || |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2966
diff
changeset
|
345 !body.isMember(KEY_PRIORITY)) |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2966
diff
changeset
|
346 { |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2966
diff
changeset
|
347 return 0; // Default priority |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2966
diff
changeset
|
348 } |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2966
diff
changeset
|
349 else |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2966
diff
changeset
|
350 { |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2966
diff
changeset
|
351 return SerializationToolbox::ReadInteger(body, KEY_PRIORITY); |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2966
diff
changeset
|
352 } |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2966
diff
changeset
|
353 } |
eea66afed0db
remove redundancies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2966
diff
changeset
|
354 |
2965
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
355 |
2976
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
356 void OrthancRestApi::SubmitGenericJob(RestApiOutput& output, |
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
357 ServerContext& context, |
2965
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
358 IJob* job, |
2976
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
359 bool synchronous, |
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
360 int priority) |
2965
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
361 { |
3712
2a170a8f1faf
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3689
diff
changeset
|
362 std::unique_ptr<IJob> raii(job); |
2965
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
363 |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
364 if (job == NULL) |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
365 { |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
366 throw OrthancException(ErrorCode_NullPointer); |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
367 } |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
368 |
2976
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
369 if (synchronous) |
2965
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
370 { |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
371 Json::Value successContent; |
3240
e44e0127e553
Fix issue #134 (/patient/modify gives 500, should really be 400)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3176
diff
changeset
|
372 context.GetJobsEngine().GetRegistry().SubmitAndWait |
e44e0127e553
Fix issue #134 (/patient/modify gives 500, should really be 400)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3176
diff
changeset
|
373 (successContent, raii.release(), priority); |
e44e0127e553
Fix issue #134 (/patient/modify gives 500, should really be 400)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3176
diff
changeset
|
374 |
e44e0127e553
Fix issue #134 (/patient/modify gives 500, should really be 400)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3176
diff
changeset
|
375 // Success in synchronous execution |
e44e0127e553
Fix issue #134 (/patient/modify gives 500, should really be 400)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3176
diff
changeset
|
376 output.AnswerJson(successContent); |
2965
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
377 } |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
378 else |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
379 { |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
380 // Asynchronous mode: Submit the job, but don't wait for its completion |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
381 std::string id; |
2976
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
382 context.GetJobsEngine().GetRegistry().Submit |
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
383 (id, raii.release(), priority); |
2965
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
384 |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
385 Json::Value v; |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
386 v["ID"] = id; |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
387 v["Path"] = "/jobs/" + id; |
2976
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
388 output.AnswerJson(v); |
2965
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
389 } |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
390 } |
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
391 |
2867 | 392 |
2976
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
393 void OrthancRestApi::SubmitGenericJob(RestApiPostCall& call, |
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
394 IJob* job, |
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
395 bool isDefaultSynchronous, |
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
396 const Json::Value& body) const |
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
397 { |
3712
2a170a8f1faf
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3689
diff
changeset
|
398 std::unique_ptr<IJob> raii(job); |
2976
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
399 |
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
400 if (body.type() != Json::objectValue) |
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
401 { |
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
402 throw OrthancException(ErrorCode_BadFileFormat); |
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
403 } |
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
404 |
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
405 bool synchronous = IsSynchronousJobRequest(isDefaultSynchronous, body); |
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
406 int priority = GetJobRequestPriority(body); |
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
407 |
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
408 SubmitGenericJob(call.GetOutput(), context_, raii.release(), synchronous, priority); |
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
409 } |
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
410 |
cb5d75143da0
Asynchronous generation of ZIP archives and DICOM medias
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2970
diff
changeset
|
411 |
2867 | 412 void OrthancRestApi::SubmitCommandsJob(RestApiPostCall& call, |
413 SetOfCommandsJob* job, | |
414 bool isDefaultSynchronous, | |
415 const Json::Value& body) const | |
416 { | |
3712
2a170a8f1faf
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3689
diff
changeset
|
417 std::unique_ptr<SetOfCommandsJob> raii(job); |
2867 | 418 |
419 if (body.type() != Json::objectValue) | |
420 { | |
421 throw OrthancException(ErrorCode_BadFileFormat); | |
422 } | |
423 | |
424 job->SetDescription("REST API"); | |
425 | |
426 if (body.isMember(KEY_PERMISSIVE)) | |
427 { | |
428 job->SetPermissive(SerializationToolbox::ReadBoolean(body, KEY_PERMISSIVE)); | |
429 } | |
430 else | |
431 { | |
432 job->SetPermissive(false); | |
433 } | |
434 | |
2965
9c0b0a6d8b54
MediaArchiveSize configuration option
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2908
diff
changeset
|
435 SubmitGenericJob(call, raii.release(), isDefaultSynchronous, body); |
2867 | 436 } |
4419 | 437 |
438 | |
439 void OrthancRestApi::DocumentSubmitGenericJob(RestApiPostCall& call) | |
440 { | |
441 call.GetDocumentation() | |
442 .SetRequestField(KEY_SYNCHRONOUS, RestApiCallDocumentation::Type_Boolean, | |
443 "If `true`, run the job in synchronous mode, which means that the HTTP answer will directly " | |
444 "contain the result of the job. This is the default, easy behavior, but it is *not* desirable for " | |
445 "long jobs, as it might lead to network timeouts.", false) | |
446 .SetRequestField(KEY_ASYNCHRONOUS, RestApiCallDocumentation::Type_Boolean, | |
447 "If `true`, run the job in asynchronous mode, which means that the REST API call will immediately " | |
448 "return, reporting the identifier of a job. Prefer this flavor wherever possible.", false) | |
449 .SetRequestField(KEY_PRIORITY, RestApiCallDocumentation::Type_Number, | |
450 "In asynchronous mode, the priority of the job. The lower the value, the higher the priority.", false) | |
451 .SetAnswerField("ID", RestApiCallDocumentation::Type_String, "In asynchronous mode, identifier of the job") | |
452 .SetAnswerField("Path", RestApiCallDocumentation::Type_String, "In asynchronous mode, path to access the job in the REST API"); | |
453 } | |
454 | |
455 | |
456 void OrthancRestApi::DocumentSubmitCommandsJob(RestApiPostCall& call) | |
457 { | |
458 DocumentSubmitGenericJob(call); | |
459 call.GetDocumentation() | |
460 .SetRequestField(KEY_PERMISSIVE, RestApiCallDocumentation::Type_Boolean, | |
461 "If `true`, ignore errors during the individual steps of the job.", false); | |
462 } | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
463 } |