Mercurial > hg > orthanc-stone
annotate Framework/Oracle/WebAssemblyOracle.cpp @ 959:13e078adfb94 toa2019082301
Better error log in fetch failure callback +
timeout 600sec in OrthancRestApiCommand +
guard against dead controller access in PanSceneTracker +
relaxed DicomStructureSet AddReferenceSlice method to accept extraneous adds
of the same slice (while trying to understand how it happens in the first place)
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Fri, 23 Aug 2019 14:16:45 +0200 |
parents | a7351ad54960 |
children | 91f827272c1f |
rev | line source |
---|---|
825 | 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 "WebAssemblyOracle.h" | |
23 | |
24 #include "SleepOracleCommand.h" | |
25 | |
26 #include <Core/OrthancException.h> | |
27 #include <Core/Toolbox.h> | |
28 | |
29 #include <emscripten.h> | |
30 #include <emscripten/html5.h> | |
31 #include <emscripten/fetch.h> | |
32 | |
33 | |
34 namespace OrthancStone | |
35 { | |
36 class WebAssemblyOracle::TimeoutContext | |
37 { | |
38 private: | |
39 WebAssemblyOracle& oracle_; | |
40 const IObserver& receiver_; | |
41 std::auto_ptr<SleepOracleCommand> command_; | |
42 | |
43 public: | |
44 TimeoutContext(WebAssemblyOracle& oracle, | |
45 const IObserver& receiver, | |
46 IOracleCommand* command) : | |
47 oracle_(oracle), | |
48 receiver_(receiver) | |
49 { | |
50 if (command == NULL) | |
51 { | |
52 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
53 } | |
54 else | |
55 { | |
56 command_.reset(dynamic_cast<SleepOracleCommand*>(command)); | |
57 } | |
58 } | |
59 | |
60 void EmitMessage() | |
61 { | |
62 SleepOracleCommand::TimeoutMessage message(*command_); | |
63 oracle_.EmitMessage(receiver_, message); | |
64 } | |
65 | |
66 static void Callback(void *userData) | |
67 { | |
68 std::auto_ptr<TimeoutContext> context(reinterpret_cast<TimeoutContext*>(userData)); | |
69 context->EmitMessage(); | |
70 } | |
71 }; | |
72 | |
73 | |
74 class WebAssemblyOracle::Emitter : public IMessageEmitter | |
75 { | |
76 private: | |
77 WebAssemblyOracle& oracle_; | |
78 | |
79 public: | |
80 Emitter(WebAssemblyOracle& oracle) : | |
81 oracle_(oracle) | |
82 { | |
83 } | |
84 | |
85 virtual void EmitMessage(const IObserver& receiver, | |
86 const IMessage& message) | |
87 { | |
88 oracle_.EmitMessage(receiver, message); | |
89 } | |
90 }; | |
91 | |
92 | |
93 class WebAssemblyOracle::FetchContext : public boost::noncopyable | |
94 { | |
95 private: | |
96 Emitter emitter_; | |
97 const IObserver& receiver_; | |
98 std::auto_ptr<IOracleCommand> command_; | |
99 std::string expectedContentType_; | |
100 | |
101 public: | |
102 FetchContext(WebAssemblyOracle& oracle, | |
103 const IObserver& receiver, | |
104 IOracleCommand* command, | |
105 const std::string& expectedContentType) : | |
106 emitter_(oracle), | |
107 receiver_(receiver), | |
108 command_(command), | |
109 expectedContentType_(expectedContentType) | |
110 { | |
111 if (command == NULL) | |
112 { | |
113 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
114 } | |
115 } | |
116 | |
117 const std::string& GetExpectedContentType() const | |
118 { | |
119 return expectedContentType_; | |
120 } | |
121 | |
122 void EmitMessage(const IMessage& message) | |
123 { | |
124 emitter_.EmitMessage(receiver_, message); | |
125 } | |
126 | |
127 IMessageEmitter& GetEmitter() | |
128 { | |
129 return emitter_; | |
130 } | |
131 | |
132 const IObserver& GetReceiver() const | |
133 { | |
134 return receiver_; | |
135 } | |
136 | |
137 IOracleCommand& GetCommand() const | |
138 { | |
139 return *command_; | |
140 } | |
141 | |
142 template <typename T> | |
143 const T& GetTypedCommand() const | |
144 { | |
145 return dynamic_cast<T&>(*command_); | |
146 } | |
147 | |
148 static void SuccessCallback(emscripten_fetch_t *fetch) | |
149 { | |
150 /** | |
151 * Firstly, make a local copy of the fetched information, and | |
152 * free data associated with the fetch. | |
153 **/ | |
154 | |
155 std::auto_ptr<FetchContext> context(reinterpret_cast<FetchContext*>(fetch->userData)); | |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
156 if (fetch->userData == NULL) |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
157 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
158 LOG(ERROR) << "WebAssemblyOracle::FetchContext::SuccessCallback fetch->userData is NULL!!!!!!!"; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
159 } |
825 | 160 |
161 std::string answer; | |
162 if (fetch->numBytes > 0) | |
163 { | |
164 answer.assign(fetch->data, fetch->numBytes); | |
165 } | |
166 | |
167 /** | |
168 * TODO - HACK - As of emscripten-1.38.31, the fetch API does | |
169 * not contain a way to retrieve the HTTP headers of the | |
170 * answer. We make the assumption that the "Content-Type" header | |
171 * of the response is the same as the "Accept" header of the | |
172 * query. This should be fixed in future versions of emscripten. | |
173 * https://github.com/emscripten-core/emscripten/pull/8486 | |
174 **/ | |
175 | |
176 HttpHeaders headers; | |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
177 if (fetch->userData != NULL) |
825 | 178 { |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
179 if (!context->GetExpectedContentType().empty()) |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
180 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
181 headers["Content-Type"] = context->GetExpectedContentType(); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
182 } |
825 | 183 } |
184 | |
185 emscripten_fetch_close(fetch); | |
186 | |
187 | |
188 /** | |
189 * Secondly, use the retrieved data. | |
190 **/ | |
191 | |
192 try | |
193 { | |
194 if (context.get() == NULL) | |
195 { | |
196 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
197 } | |
198 else | |
199 { | |
200 switch (context->GetCommand().GetType()) | |
201 { | |
202 case IOracleCommand::Type_OrthancRestApi: | |
203 { | |
204 OrthancRestApiCommand::SuccessMessage message | |
205 (context->GetTypedCommand<OrthancRestApiCommand>(), headers, answer); | |
206 context->EmitMessage(message); | |
207 break; | |
208 } | |
209 | |
210 case IOracleCommand::Type_GetOrthancImage: | |
211 { | |
212 context->GetTypedCommand<GetOrthancImageCommand>().ProcessHttpAnswer | |
213 (context->GetEmitter(), context->GetReceiver(), answer, headers); | |
214 break; | |
215 } | |
216 | |
217 case IOracleCommand::Type_GetOrthancWebViewerJpeg: | |
218 { | |
219 context->GetTypedCommand<GetOrthancWebViewerJpegCommand>().ProcessHttpAnswer | |
220 (context->GetEmitter(), context->GetReceiver(), answer); | |
221 break; | |
222 } | |
223 | |
224 default: | |
225 LOG(ERROR) << "Command type not implemented by the WebAssembly Oracle: " | |
226 << context->GetCommand().GetType(); | |
227 } | |
228 } | |
229 } | |
230 catch (Orthanc::OrthancException& e) | |
231 { | |
232 LOG(ERROR) << "Error while processing a fetch answer in the oracle: " << e.What(); | |
233 } | |
234 } | |
235 | |
236 static void FailureCallback(emscripten_fetch_t *fetch) | |
237 { | |
238 std::auto_ptr<FetchContext> context(reinterpret_cast<FetchContext*>(fetch->userData)); | |
239 | |
959
13e078adfb94
Better error log in fetch failure callback +
Benjamin Golinvaux <bgo@osimis.io>
parents:
956
diff
changeset
|
240 const size_t kEmscriptenStatusTextSize = sizeof(emscripten_fetch_t::statusText); |
13e078adfb94
Better error log in fetch failure callback +
Benjamin Golinvaux <bgo@osimis.io>
parents:
956
diff
changeset
|
241 char message[kEmscriptenStatusTextSize + 1]; |
13e078adfb94
Better error log in fetch failure callback +
Benjamin Golinvaux <bgo@osimis.io>
parents:
956
diff
changeset
|
242 memcpy(message, fetch->statusText, kEmscriptenStatusTextSize); |
13e078adfb94
Better error log in fetch failure callback +
Benjamin Golinvaux <bgo@osimis.io>
parents:
956
diff
changeset
|
243 message[kEmscriptenStatusTextSize] = 0; |
13e078adfb94
Better error log in fetch failure callback +
Benjamin Golinvaux <bgo@osimis.io>
parents:
956
diff
changeset
|
244 |
13e078adfb94
Better error log in fetch failure callback +
Benjamin Golinvaux <bgo@osimis.io>
parents:
956
diff
changeset
|
245 LOG(ERROR) << "Fetching " << fetch->url |
13e078adfb94
Better error log in fetch failure callback +
Benjamin Golinvaux <bgo@osimis.io>
parents:
956
diff
changeset
|
246 << " failed, HTTP failure status code: " << fetch->status |
13e078adfb94
Better error log in fetch failure callback +
Benjamin Golinvaux <bgo@osimis.io>
parents:
956
diff
changeset
|
247 << " | statusText = " << message |
13e078adfb94
Better error log in fetch failure callback +
Benjamin Golinvaux <bgo@osimis.io>
parents:
956
diff
changeset
|
248 << " | numBytes = " << fetch->numBytes |
13e078adfb94
Better error log in fetch failure callback +
Benjamin Golinvaux <bgo@osimis.io>
parents:
956
diff
changeset
|
249 << " | totalBytes = " << fetch->totalBytes |
13e078adfb94
Better error log in fetch failure callback +
Benjamin Golinvaux <bgo@osimis.io>
parents:
956
diff
changeset
|
250 << " | readyState = " << fetch->readyState; |
825 | 251 |
252 /** | |
253 * TODO - The following code leads to an infinite recursion, at | |
254 * least with Firefox running on incognito mode => WHY? | |
255 **/ | |
959
13e078adfb94
Better error log in fetch failure callback +
Benjamin Golinvaux <bgo@osimis.io>
parents:
956
diff
changeset
|
256 emscripten_fetch_close(fetch); // Also free data on failure. |
825 | 257 } |
258 }; | |
259 | |
260 | |
261 | |
262 class WebAssemblyOracle::FetchCommand : public boost::noncopyable | |
263 { | |
264 private: | |
265 WebAssemblyOracle& oracle_; | |
266 const IObserver& receiver_; | |
267 std::auto_ptr<IOracleCommand> command_; | |
268 Orthanc::HttpMethod method_; | |
269 std::string uri_; | |
270 std::string body_; | |
271 HttpHeaders headers_; | |
272 unsigned int timeout_; | |
273 std::string expectedContentType_; | |
274 | |
275 public: | |
276 FetchCommand(WebAssemblyOracle& oracle, | |
277 const IObserver& receiver, | |
278 IOracleCommand* command) : | |
279 oracle_(oracle), | |
280 receiver_(receiver), | |
281 command_(command), | |
282 method_(Orthanc::HttpMethod_Get), | |
283 timeout_(0) | |
284 { | |
285 if (command == NULL) | |
286 { | |
287 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
288 } | |
289 } | |
290 | |
291 void SetMethod(Orthanc::HttpMethod method) | |
292 { | |
293 method_ = method; | |
294 } | |
295 | |
296 void SetUri(const std::string& uri) | |
297 { | |
831
d71cf8504159
handling of GET arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
825
diff
changeset
|
298 uri_ = oracle_.orthancRoot_ + uri; |
825 | 299 } |
300 | |
301 void SetBody(std::string& body /* will be swapped */) | |
302 { | |
303 body_.swap(body); | |
304 } | |
305 | |
306 void SetHttpHeaders(const HttpHeaders& headers) | |
307 { | |
308 headers_ = headers; | |
309 } | |
310 | |
311 void SetTimeout(unsigned int timeout) | |
312 { | |
313 timeout_ = timeout; | |
314 } | |
315 | |
316 void Execute() | |
317 { | |
318 if (command_.get() == NULL) | |
319 { | |
320 // Cannot call Execute() twice | |
956
a7351ad54960
Made IsContextLost automatically set the flag by checking with the emscripten
Benjamin Golinvaux <bgo@osimis.io>
parents:
933
diff
changeset
|
321 LOG(ERROR) << "WebAssemblyOracle::Execute(): (command_.get() == NULL)"; |
a7351ad54960
Made IsContextLost automatically set the flag by checking with the emscripten
Benjamin Golinvaux <bgo@osimis.io>
parents:
933
diff
changeset
|
322 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
825 | 323 } |
324 | |
325 emscripten_fetch_attr_t attr; | |
326 emscripten_fetch_attr_init(&attr); | |
327 | |
328 const char* method; | |
329 | |
330 switch (method_) | |
331 { | |
332 case Orthanc::HttpMethod_Get: | |
333 method = "GET"; | |
334 break; | |
335 | |
336 case Orthanc::HttpMethod_Post: | |
337 method = "POST"; | |
338 break; | |
339 | |
340 case Orthanc::HttpMethod_Delete: | |
341 method = "DELETE"; | |
342 break; | |
343 | |
344 case Orthanc::HttpMethod_Put: | |
345 method = "PUT"; | |
346 break; | |
347 | |
348 default: | |
349 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
350 } | |
351 | |
352 strcpy(attr.requestMethod, method); | |
353 | |
354 attr.attributes = EMSCRIPTEN_FETCH_LOAD_TO_MEMORY; | |
355 attr.onsuccess = FetchContext::SuccessCallback; | |
356 attr.onerror = FetchContext::FailureCallback; | |
357 attr.timeoutMSecs = timeout_ * 1000; | |
358 | |
359 std::vector<const char*> headers; | |
360 headers.reserve(2 * headers_.size() + 1); | |
361 | |
362 std::string expectedContentType; | |
363 | |
364 for (HttpHeaders::const_iterator it = headers_.begin(); it != headers_.end(); ++it) | |
365 { | |
366 std::string key; | |
367 Orthanc::Toolbox::ToLowerCase(key, it->first); | |
368 | |
369 if (key == "accept") | |
370 { | |
371 expectedContentType = it->second; | |
372 } | |
373 | |
374 if (key != "accept-encoding") // Web browsers forbid the modification of this HTTP header | |
375 { | |
376 headers.push_back(it->first.c_str()); | |
377 headers.push_back(it->second.c_str()); | |
378 } | |
379 } | |
380 | |
381 headers.push_back(NULL); // Termination of the array of HTTP headers | |
382 | |
383 attr.requestHeaders = &headers[0]; | |
384 | |
841
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
385 char* requestData = NULL; |
825 | 386 if (!body_.empty()) |
841
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
387 requestData = reinterpret_cast<char*>(malloc(body_.size())); |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
388 |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
389 try |
825 | 390 { |
841
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
391 if (!body_.empty()) |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
392 { |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
393 memcpy(requestData, &(body_[0]), body_.size()); |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
394 attr.requestDataSize = body_.size(); |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
395 attr.requestData = requestData; |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
396 } |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
397 attr.userData = new FetchContext(oracle_, receiver_, command_.release(), expectedContentType); |
825 | 398 |
841
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
399 // Must be the last call to prevent memory leak on error |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
400 emscripten_fetch(&attr, uri_.c_str()); |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
401 } |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
402 catch(...) |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
403 { |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
404 if(requestData != NULL) |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
405 free(requestData); |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
406 throw; |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
407 } |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
408 } |
825 | 409 }; |
410 | |
411 void WebAssemblyOracle::Execute(const IObserver& receiver, | |
412 OrthancRestApiCommand* command) | |
413 { | |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
414 try |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
415 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
416 //LOG(TRACE) << "*********** WebAssemblyOracle::Execute."; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
417 //LOG(TRACE) << "WebAssemblyOracle::Execute | command = " << command; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
418 FetchCommand fetch(*this, receiver, command); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
419 |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
420 fetch.SetMethod(command->GetMethod()); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
421 fetch.SetUri(command->GetUri()); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
422 fetch.SetHttpHeaders(command->GetHttpHeaders()); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
423 fetch.SetTimeout(command->GetTimeout()); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
424 |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
425 if (command->GetMethod() == Orthanc::HttpMethod_Post || |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
426 command->GetMethod() == Orthanc::HttpMethod_Put) |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
427 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
428 std::string body; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
429 command->SwapBody(body); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
430 fetch.SetBody(body); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
431 } |
825 | 432 |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
433 fetch.Execute(); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
434 //LOG(TRACE) << "*********** successful end of WebAssemblyOracle::Execute."; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
435 } |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
436 catch (const Orthanc::OrthancException& e) |
825 | 437 { |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
438 if (e.HasDetails()) |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
439 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
440 LOG(ERROR) << "OrthancException in WebAssemblyOracle::Execute: " << e.What() << " Details: " << e.GetDetails(); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
441 } |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
442 else |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
443 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
444 LOG(ERROR) << "OrthancException in WebAssemblyOracle::Execute: " << e.What(); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
445 } |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
446 //LOG(TRACE) << "*********** failing end of WebAssemblyOracle::Execute."; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
447 throw; |
825 | 448 } |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
449 catch (const std::exception& e) |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
450 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
451 LOG(ERROR) << "std::exception in WebAssemblyOracle::Execute: " << e.what(); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
452 // LOG(TRACE) << "*********** failing end of WebAssemblyOracle::Execute."; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
453 throw; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
454 } |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
455 catch (...) |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
456 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
457 LOG(ERROR) << "Unknown exception in WebAssemblyOracle::Execute"; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
458 // LOG(TRACE) << "*********** failing end of WebAssemblyOracle::Execute."; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
459 throw; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
460 } |
825 | 461 } |
462 | |
463 | |
464 void WebAssemblyOracle::Execute(const IObserver& receiver, | |
465 GetOrthancImageCommand* command) | |
466 { | |
467 FetchCommand fetch(*this, receiver, command); | |
468 | |
469 fetch.SetUri(command->GetUri()); | |
470 fetch.SetHttpHeaders(command->GetHttpHeaders()); | |
471 fetch.SetTimeout(command->GetTimeout()); | |
472 | |
473 fetch.Execute(); | |
474 } | |
475 | |
476 | |
477 void WebAssemblyOracle::Execute(const IObserver& receiver, | |
478 GetOrthancWebViewerJpegCommand* command) | |
479 { | |
480 FetchCommand fetch(*this, receiver, command); | |
481 | |
482 fetch.SetUri(command->GetUri()); | |
483 fetch.SetHttpHeaders(command->GetHttpHeaders()); | |
484 fetch.SetTimeout(command->GetTimeout()); | |
485 | |
486 fetch.Execute(); | |
487 } | |
488 | |
489 | |
490 | |
491 void WebAssemblyOracle::Schedule(const IObserver& receiver, | |
492 IOracleCommand* command) | |
493 { | |
494 std::auto_ptr<IOracleCommand> protection(command); | |
495 | |
496 if (command == NULL) | |
497 { | |
498 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
499 } | |
500 | |
501 switch (command->GetType()) | |
502 { | |
503 case IOracleCommand::Type_OrthancRestApi: | |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
504 //// DIAGNOSTIC. PLEASE REMOVE IF IT HAS BEEN COMMITTED BY MISTAKE |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
505 //{ |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
506 // const IObserver* pReceiver = &receiver; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
507 // LOG(TRACE) << "WebAssemblyOracle::Schedule | pReceiver is " << pReceiver; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
508 // LOG(TRACE) << "WebAssemblyOracle::Schedule | command = " << command; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
509 // OrthancRestApiCommand* rac = dynamic_cast<OrthancRestApiCommand*>(protection.get()); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
510 // LOG(TRACE) << "WebAssemblyOracle::Schedule | typed command = " << rac; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
511 // LOG(TRACE) << "WebAssemblyOracle::Schedule" << rac->GetUri(); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
512 //} |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
513 //// END OF BLOCK TO REMOVE |
825 | 514 Execute(receiver, dynamic_cast<OrthancRestApiCommand*>(protection.release())); |
515 break; | |
516 | |
517 case IOracleCommand::Type_GetOrthancImage: | |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
518 //// DIAGNOSTIC. PLEASE REMOVE IF IT HAS BEEN COMMITTED BY MISTAKE |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
519 //{ |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
520 // GetOrthancImageCommand* rac = dynamic_cast<GetOrthancImageCommand*>(protection.get()); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
521 // LOG(TRACE) << "WebAssemblyOracle::Schedule" << rac->GetUri(); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
522 //} |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
523 //// END OF BLOCK TO REMOVE |
825 | 524 Execute(receiver, dynamic_cast<GetOrthancImageCommand*>(protection.release())); |
525 break; | |
526 | |
527 case IOracleCommand::Type_GetOrthancWebViewerJpeg: | |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
528 //// DIAGNOSTIC. PLEASE REMOVE IF IT HAS BEEN COMMITTED BY MISTAKE |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
529 //{ |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
530 // GetOrthancWebViewerJpegCommand* rac = dynamic_cast<GetOrthancWebViewerJpegCommand*>(protection.get()); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
531 // LOG(TRACE) << "WebAssemblyOracle::Schedule" << rac->GetUri(); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
532 //} |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
533 //// END OF BLOCK TO REMOVE |
825 | 534 Execute(receiver, dynamic_cast<GetOrthancWebViewerJpegCommand*>(protection.release())); |
535 break; | |
536 | |
537 case IOracleCommand::Type_Sleep: | |
538 { | |
539 unsigned int timeoutMS = dynamic_cast<SleepOracleCommand*>(command)->GetDelay(); | |
540 emscripten_set_timeout(TimeoutContext::Callback, timeoutMS, | |
541 new TimeoutContext(*this, receiver, protection.release())); | |
542 break; | |
543 } | |
544 | |
545 default: | |
546 LOG(ERROR) << "Command type not implemented by the WebAssembly Oracle: " << command->GetType(); | |
547 } | |
548 } | |
549 } |