Mercurial > hg > orthanc-stone
annotate Framework/Oracle/WebAssemblyOracle.cpp @ 956:a7351ad54960
Made IsContextLost automatically set the flag by checking with the emscripten
WebGL wrapper + added a LOT of logging messages right before throwing
ErrorCode_BadSequenceOfCalls exceptions + increased the http request timeouts
from 60 to 600 sec (big datasets in some recent customer use cases) + added
IsContext lost through the Viewport/Context layer (to make it reachable from
external API) + the same for the underlying device context (for debug)
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Wed, 21 Aug 2019 16:16:30 +0200 |
parents | f75f6cb69c1b |
children | 13e078adfb94 |
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 | |
240 LOG(ERROR) << "Fetching " << fetch->url << " failed, HTTP failure status code: " << fetch->status; | |
241 | |
242 /** | |
243 * TODO - The following code leads to an infinite recursion, at | |
244 * least with Firefox running on incognito mode => WHY? | |
245 **/ | |
246 //emscripten_fetch_close(fetch); // Also free data on failure. | |
247 } | |
248 }; | |
249 | |
250 | |
251 | |
252 class WebAssemblyOracle::FetchCommand : public boost::noncopyable | |
253 { | |
254 private: | |
255 WebAssemblyOracle& oracle_; | |
256 const IObserver& receiver_; | |
257 std::auto_ptr<IOracleCommand> command_; | |
258 Orthanc::HttpMethod method_; | |
259 std::string uri_; | |
260 std::string body_; | |
261 HttpHeaders headers_; | |
262 unsigned int timeout_; | |
263 std::string expectedContentType_; | |
264 | |
265 public: | |
266 FetchCommand(WebAssemblyOracle& oracle, | |
267 const IObserver& receiver, | |
268 IOracleCommand* command) : | |
269 oracle_(oracle), | |
270 receiver_(receiver), | |
271 command_(command), | |
272 method_(Orthanc::HttpMethod_Get), | |
273 timeout_(0) | |
274 { | |
275 if (command == NULL) | |
276 { | |
277 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
278 } | |
279 } | |
280 | |
281 void SetMethod(Orthanc::HttpMethod method) | |
282 { | |
283 method_ = method; | |
284 } | |
285 | |
286 void SetUri(const std::string& uri) | |
287 { | |
831
d71cf8504159
handling of GET arguments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
825
diff
changeset
|
288 uri_ = oracle_.orthancRoot_ + uri; |
825 | 289 } |
290 | |
291 void SetBody(std::string& body /* will be swapped */) | |
292 { | |
293 body_.swap(body); | |
294 } | |
295 | |
296 void SetHttpHeaders(const HttpHeaders& headers) | |
297 { | |
298 headers_ = headers; | |
299 } | |
300 | |
301 void SetTimeout(unsigned int timeout) | |
302 { | |
303 timeout_ = timeout; | |
304 } | |
305 | |
306 void Execute() | |
307 { | |
308 if (command_.get() == NULL) | |
309 { | |
310 // 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
|
311 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
|
312 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
825 | 313 } |
314 | |
315 emscripten_fetch_attr_t attr; | |
316 emscripten_fetch_attr_init(&attr); | |
317 | |
318 const char* method; | |
319 | |
320 switch (method_) | |
321 { | |
322 case Orthanc::HttpMethod_Get: | |
323 method = "GET"; | |
324 break; | |
325 | |
326 case Orthanc::HttpMethod_Post: | |
327 method = "POST"; | |
328 break; | |
329 | |
330 case Orthanc::HttpMethod_Delete: | |
331 method = "DELETE"; | |
332 break; | |
333 | |
334 case Orthanc::HttpMethod_Put: | |
335 method = "PUT"; | |
336 break; | |
337 | |
338 default: | |
339 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
340 } | |
341 | |
342 strcpy(attr.requestMethod, method); | |
343 | |
344 attr.attributes = EMSCRIPTEN_FETCH_LOAD_TO_MEMORY; | |
345 attr.onsuccess = FetchContext::SuccessCallback; | |
346 attr.onerror = FetchContext::FailureCallback; | |
347 attr.timeoutMSecs = timeout_ * 1000; | |
348 | |
349 std::vector<const char*> headers; | |
350 headers.reserve(2 * headers_.size() + 1); | |
351 | |
352 std::string expectedContentType; | |
353 | |
354 for (HttpHeaders::const_iterator it = headers_.begin(); it != headers_.end(); ++it) | |
355 { | |
356 std::string key; | |
357 Orthanc::Toolbox::ToLowerCase(key, it->first); | |
358 | |
359 if (key == "accept") | |
360 { | |
361 expectedContentType = it->second; | |
362 } | |
363 | |
364 if (key != "accept-encoding") // Web browsers forbid the modification of this HTTP header | |
365 { | |
366 headers.push_back(it->first.c_str()); | |
367 headers.push_back(it->second.c_str()); | |
368 } | |
369 } | |
370 | |
371 headers.push_back(NULL); // Termination of the array of HTTP headers | |
372 | |
373 attr.requestHeaders = &headers[0]; | |
374 | |
841
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
375 char* requestData = NULL; |
825 | 376 if (!body_.empty()) |
841
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
377 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
|
378 |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
379 try |
825 | 380 { |
841
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
381 if (!body_.empty()) |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
382 { |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
383 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
|
384 attr.requestDataSize = body_.size(); |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
385 attr.requestData = requestData; |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
386 } |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
387 attr.userData = new FetchContext(oracle_, receiver_, command_.release(), expectedContentType); |
825 | 388 |
841
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
389 // 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
|
390 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
|
391 } |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
392 catch(...) |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
393 { |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
394 if(requestData != NULL) |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
395 free(requestData); |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
396 throw; |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
397 } |
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
831
diff
changeset
|
398 } |
825 | 399 }; |
400 | |
401 void WebAssemblyOracle::Execute(const IObserver& receiver, | |
402 OrthancRestApiCommand* command) | |
403 { | |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
404 try |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
405 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
406 //LOG(TRACE) << "*********** WebAssemblyOracle::Execute."; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
407 //LOG(TRACE) << "WebAssemblyOracle::Execute | command = " << command; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
408 FetchCommand fetch(*this, receiver, command); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
409 |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
410 fetch.SetMethod(command->GetMethod()); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
411 fetch.SetUri(command->GetUri()); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
412 fetch.SetHttpHeaders(command->GetHttpHeaders()); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
413 fetch.SetTimeout(command->GetTimeout()); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
414 |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
415 if (command->GetMethod() == Orthanc::HttpMethod_Post || |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
416 command->GetMethod() == Orthanc::HttpMethod_Put) |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
417 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
418 std::string body; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
419 command->SwapBody(body); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
420 fetch.SetBody(body); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
421 } |
825 | 422 |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
423 fetch.Execute(); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
424 //LOG(TRACE) << "*********** successful end of WebAssemblyOracle::Execute."; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
425 } |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
426 catch (const Orthanc::OrthancException& e) |
825 | 427 { |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
428 if (e.HasDetails()) |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
429 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
430 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
|
431 } |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
432 else |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
433 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
434 LOG(ERROR) << "OrthancException in WebAssemblyOracle::Execute: " << e.What(); |
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 //LOG(TRACE) << "*********** failing end of WebAssemblyOracle::Execute."; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
437 throw; |
825 | 438 } |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
439 catch (const std::exception& e) |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
440 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
441 LOG(ERROR) << "std::exception in WebAssemblyOracle::Execute: " << e.what(); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
442 // LOG(TRACE) << "*********** failing end of WebAssemblyOracle::Execute."; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
443 throw; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
444 } |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
445 catch (...) |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
446 { |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
447 LOG(ERROR) << "Unknown exception in WebAssemblyOracle::Execute"; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
448 // LOG(TRACE) << "*********** failing end of WebAssemblyOracle::Execute."; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
449 throw; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
450 } |
825 | 451 } |
452 | |
453 | |
454 void WebAssemblyOracle::Execute(const IObserver& receiver, | |
455 GetOrthancImageCommand* command) | |
456 { | |
457 FetchCommand fetch(*this, receiver, command); | |
458 | |
459 fetch.SetUri(command->GetUri()); | |
460 fetch.SetHttpHeaders(command->GetHttpHeaders()); | |
461 fetch.SetTimeout(command->GetTimeout()); | |
462 | |
463 fetch.Execute(); | |
464 } | |
465 | |
466 | |
467 void WebAssemblyOracle::Execute(const IObserver& receiver, | |
468 GetOrthancWebViewerJpegCommand* command) | |
469 { | |
470 FetchCommand fetch(*this, receiver, command); | |
471 | |
472 fetch.SetUri(command->GetUri()); | |
473 fetch.SetHttpHeaders(command->GetHttpHeaders()); | |
474 fetch.SetTimeout(command->GetTimeout()); | |
475 | |
476 fetch.Execute(); | |
477 } | |
478 | |
479 | |
480 | |
481 void WebAssemblyOracle::Schedule(const IObserver& receiver, | |
482 IOracleCommand* command) | |
483 { | |
484 std::auto_ptr<IOracleCommand> protection(command); | |
485 | |
486 if (command == NULL) | |
487 { | |
488 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
489 } | |
490 | |
491 switch (command->GetType()) | |
492 { | |
493 case IOracleCommand::Type_OrthancRestApi: | |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
494 //// 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
|
495 //{ |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
496 // const IObserver* pReceiver = &receiver; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
497 // LOG(TRACE) << "WebAssemblyOracle::Schedule | pReceiver is " << pReceiver; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
498 // LOG(TRACE) << "WebAssemblyOracle::Schedule | command = " << command; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
499 // OrthancRestApiCommand* rac = dynamic_cast<OrthancRestApiCommand*>(protection.get()); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
500 // LOG(TRACE) << "WebAssemblyOracle::Schedule | typed command = " << rac; |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
501 // LOG(TRACE) << "WebAssemblyOracle::Schedule" << rac->GetUri(); |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
502 //} |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
503 //// END OF BLOCK TO REMOVE |
825 | 504 Execute(receiver, dynamic_cast<OrthancRestApiCommand*>(protection.release())); |
505 break; | |
506 | |
507 case IOracleCommand::Type_GetOrthancImage: | |
933
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
508 //// 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
|
509 //{ |
f75f6cb69c1b
Commented-out traces for debug
Benjamin Golinvaux <bgo@osimis.io>
parents:
843
diff
changeset
|
510 // GetOrthancImageCommand* rac = dynamic_cast<GetOrthancImageCommand*>(protection.get()); |
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<GetOrthancImageCommand*>(protection.release())); |
515 break; | |
516 | |
517 case IOracleCommand::Type_GetOrthancWebViewerJpeg: | |
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 // GetOrthancWebViewerJpegCommand* rac = dynamic_cast<GetOrthancWebViewerJpegCommand*>(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<GetOrthancWebViewerJpegCommand*>(protection.release())); |
525 break; | |
526 | |
527 case IOracleCommand::Type_Sleep: | |
528 { | |
529 unsigned int timeoutMS = dynamic_cast<SleepOracleCommand*>(command)->GetDelay(); | |
530 emscripten_set_timeout(TimeoutContext::Callback, timeoutMS, | |
531 new TimeoutContext(*this, receiver, protection.release())); | |
532 break; | |
533 } | |
534 | |
535 default: | |
536 LOG(ERROR) << "Command type not implemented by the WebAssembly Oracle: " << command->GetType(); | |
537 } | |
538 } | |
539 } |