Mercurial > hg > orthanc-stone
annotate Framework/Oracle/GenericOracleRunner.cpp @ 1098:17660df24c36 broker
simplification of IOracleRunner
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 25 Oct 2019 13:01:24 +0200 |
parents | e6d2ff8f1ab4 |
children | 98cdfe5768a4 |
rev | line source |
---|---|
1077 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
5 * Copyright (C) 2017-2019 Osimis S.A., Belgium | |
6 * | |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU Affero General Public License | |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 **/ | |
20 | |
21 | |
22 #include "GenericOracleRunner.h" | |
23 | |
24 #include "CustomOracleCommand.h" | |
25 #include "GetOrthancImageCommand.h" | |
26 #include "GetOrthancWebViewerJpegCommand.h" | |
27 #include "HttpCommand.h" | |
28 #include "OracleCommandExceptionMessage.h" | |
29 #include "OrthancRestApiCommand.h" | |
30 | |
31 #include <Core/Compression/GzipCompressor.h> | |
32 #include <Core/HttpClient.h> | |
33 #include <Core/OrthancException.h> | |
34 #include <Core/Toolbox.h> | |
35 | |
36 namespace OrthancStone | |
37 { | |
38 static void CopyHttpHeaders(Orthanc::HttpClient& client, | |
39 const Orthanc::HttpClient::HttpHeaders& headers) | |
40 { | |
41 for (Orthanc::HttpClient::HttpHeaders::const_iterator | |
42 it = headers.begin(); it != headers.end(); it++ ) | |
43 { | |
44 client.AddHeader(it->first, it->second); | |
45 } | |
46 } | |
47 | |
48 | |
49 static void DecodeAnswer(std::string& answer, | |
50 const Orthanc::HttpClient::HttpHeaders& headers) | |
51 { | |
52 Orthanc::HttpCompression contentEncoding = Orthanc::HttpCompression_None; | |
53 | |
54 for (Orthanc::HttpClient::HttpHeaders::const_iterator it = headers.begin(); | |
55 it != headers.end(); ++it) | |
56 { | |
57 std::string s; | |
58 Orthanc::Toolbox::ToLowerCase(s, it->first); | |
59 | |
60 if (s == "content-encoding") | |
61 { | |
62 if (it->second == "gzip") | |
63 { | |
64 contentEncoding = Orthanc::HttpCompression_Gzip; | |
65 } | |
66 else | |
67 { | |
68 throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol, | |
69 "Unsupported HTTP Content-Encoding: " + it->second); | |
70 } | |
71 | |
72 break; | |
73 } | |
74 } | |
75 | |
76 if (contentEncoding == Orthanc::HttpCompression_Gzip) | |
77 { | |
78 std::string compressed; | |
79 answer.swap(compressed); | |
80 | |
81 Orthanc::GzipCompressor compressor; | |
82 compressor.Uncompress(answer, compressed.c_str(), compressed.size()); | |
83 | |
84 LOG(INFO) << "Uncompressing gzip Encoding: from " << compressed.size() | |
85 << " to " << answer.size() << " bytes"; | |
86 } | |
87 } | |
88 | |
89 | |
1098
17660df24c36
simplification of IOracleRunner
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1079
diff
changeset
|
90 static IMessage* Execute(const HttpCommand& command) |
1077 | 91 { |
92 Orthanc::HttpClient client; | |
93 client.SetUrl(command.GetUrl()); | |
94 client.SetMethod(command.GetMethod()); | |
95 client.SetTimeout(command.GetTimeout()); | |
96 | |
97 CopyHttpHeaders(client, command.GetHttpHeaders()); | |
98 | |
1079
e6d2ff8f1ab4
credentials in HttpCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1077
diff
changeset
|
99 if (command.HasCredentials()) |
e6d2ff8f1ab4
credentials in HttpCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1077
diff
changeset
|
100 { |
e6d2ff8f1ab4
credentials in HttpCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1077
diff
changeset
|
101 client.SetCredentials(command.GetUsername().c_str(), command.GetPassword().c_str()); |
e6d2ff8f1ab4
credentials in HttpCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1077
diff
changeset
|
102 } |
e6d2ff8f1ab4
credentials in HttpCommand
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1077
diff
changeset
|
103 |
1077 | 104 if (command.GetMethod() == Orthanc::HttpMethod_Post || |
105 command.GetMethod() == Orthanc::HttpMethod_Put) | |
106 { | |
107 client.SetBody(command.GetBody()); | |
108 } | |
109 | |
110 std::string answer; | |
111 Orthanc::HttpClient::HttpHeaders answerHeaders; | |
112 client.ApplyAndThrowException(answer, answerHeaders); | |
113 | |
114 DecodeAnswer(answer, answerHeaders); | |
115 | |
1098
17660df24c36
simplification of IOracleRunner
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1079
diff
changeset
|
116 return new HttpCommand::SuccessMessage(command, answerHeaders, answer); |
1077 | 117 } |
118 | |
119 | |
1098
17660df24c36
simplification of IOracleRunner
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1079
diff
changeset
|
120 static IMessage* Execute(const Orthanc::WebServiceParameters& orthanc, |
17660df24c36
simplification of IOracleRunner
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1079
diff
changeset
|
121 const OrthancRestApiCommand& command) |
1077 | 122 { |
123 Orthanc::HttpClient client(orthanc, command.GetUri()); | |
124 client.SetMethod(command.GetMethod()); | |
125 client.SetTimeout(command.GetTimeout()); | |
126 | |
127 CopyHttpHeaders(client, command.GetHttpHeaders()); | |
128 | |
129 if (command.GetMethod() == Orthanc::HttpMethod_Post || | |
130 command.GetMethod() == Orthanc::HttpMethod_Put) | |
131 { | |
132 client.SetBody(command.GetBody()); | |
133 } | |
134 | |
135 std::string answer; | |
136 Orthanc::HttpClient::HttpHeaders answerHeaders; | |
137 client.ApplyAndThrowException(answer, answerHeaders); | |
138 | |
139 DecodeAnswer(answer, answerHeaders); | |
140 | |
1098
17660df24c36
simplification of IOracleRunner
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1079
diff
changeset
|
141 return new OrthancRestApiCommand::SuccessMessage(command, answerHeaders, answer); |
1077 | 142 } |
143 | |
144 | |
1098
17660df24c36
simplification of IOracleRunner
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1079
diff
changeset
|
145 static IMessage* Execute(const Orthanc::WebServiceParameters& orthanc, |
17660df24c36
simplification of IOracleRunner
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1079
diff
changeset
|
146 const GetOrthancImageCommand& command) |
1077 | 147 { |
148 Orthanc::HttpClient client(orthanc, command.GetUri()); | |
149 client.SetTimeout(command.GetTimeout()); | |
150 | |
151 CopyHttpHeaders(client, command.GetHttpHeaders()); | |
152 | |
153 std::string answer; | |
154 Orthanc::HttpClient::HttpHeaders answerHeaders; | |
155 client.ApplyAndThrowException(answer, answerHeaders); | |
156 | |
157 DecodeAnswer(answer, answerHeaders); | |
158 | |
1098
17660df24c36
simplification of IOracleRunner
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1079
diff
changeset
|
159 return command.ProcessHttpAnswer(answer, answerHeaders); |
1077 | 160 } |
161 | |
162 | |
1098
17660df24c36
simplification of IOracleRunner
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1079
diff
changeset
|
163 static IMessage* Execute(const Orthanc::WebServiceParameters& orthanc, |
17660df24c36
simplification of IOracleRunner
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1079
diff
changeset
|
164 const GetOrthancWebViewerJpegCommand& command) |
1077 | 165 { |
166 Orthanc::HttpClient client(orthanc, command.GetUri()); | |
167 client.SetTimeout(command.GetTimeout()); | |
168 | |
169 CopyHttpHeaders(client, command.GetHttpHeaders()); | |
170 | |
171 std::string answer; | |
172 Orthanc::HttpClient::HttpHeaders answerHeaders; | |
173 client.ApplyAndThrowException(answer, answerHeaders); | |
174 | |
175 DecodeAnswer(answer, answerHeaders); | |
176 | |
1098
17660df24c36
simplification of IOracleRunner
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1079
diff
changeset
|
177 return command.ProcessHttpAnswer(answer); |
1077 | 178 } |
179 | |
180 | |
1098
17660df24c36
simplification of IOracleRunner
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1079
diff
changeset
|
181 IMessage* GenericOracleRunner::Run(IOracleCommand& command) |
1077 | 182 { |
183 try | |
184 { | |
185 switch (command.GetType()) | |
186 { | |
187 case IOracleCommand::Type_Sleep: | |
188 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadParameterType, | |
189 "Sleep command cannot be executed by the runner"); | |
190 | |
191 case IOracleCommand::Type_Http: | |
1098
17660df24c36
simplification of IOracleRunner
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1079
diff
changeset
|
192 return Execute(dynamic_cast<const HttpCommand&>(command)); |
1077 | 193 |
194 case IOracleCommand::Type_OrthancRestApi: | |
1098
17660df24c36
simplification of IOracleRunner
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1079
diff
changeset
|
195 return Execute(orthanc_, dynamic_cast<const OrthancRestApiCommand&>(command)); |
1077 | 196 |
197 case IOracleCommand::Type_GetOrthancImage: | |
1098
17660df24c36
simplification of IOracleRunner
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1079
diff
changeset
|
198 return Execute(orthanc_, dynamic_cast<const GetOrthancImageCommand&>(command)); |
1077 | 199 |
200 case IOracleCommand::Type_GetOrthancWebViewerJpeg: | |
1098
17660df24c36
simplification of IOracleRunner
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1079
diff
changeset
|
201 return Execute(orthanc_, dynamic_cast<const GetOrthancWebViewerJpegCommand&>(command)); |
1077 | 202 |
203 case IOracleCommand::Type_Custom: | |
1098
17660df24c36
simplification of IOracleRunner
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1079
diff
changeset
|
204 return dynamic_cast<CustomOracleCommand&>(command).Execute(*this); |
1077 | 205 |
206 default: | |
207 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
208 } | |
209 } | |
210 catch (Orthanc::OrthancException& e) | |
211 { | |
212 LOG(ERROR) << "Exception within the oracle: " << e.What(); | |
1098
17660df24c36
simplification of IOracleRunner
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1079
diff
changeset
|
213 return new OracleCommandExceptionMessage(command, e); |
1077 | 214 } |
215 catch (...) | |
216 { | |
217 LOG(ERROR) << "Threaded exception within the oracle"; | |
1098
17660df24c36
simplification of IOracleRunner
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1079
diff
changeset
|
218 return new OracleCommandExceptionMessage(command, Orthanc::ErrorCode_InternalError); |
1077 | 219 } |
220 } | |
221 } |