comparison Framework/Toolbox/OrthancApiClient.cpp @ 434:3a8bcc45c221 am-vsol-upgrade

moved the HTTP cache from OrthancApiClient to BaseWebService (not implemented yet in WASM)
author am@osimis.io
date Mon, 03 Dec 2018 18:03:30 +0100
parents b85f635f1eb5
children a750f11892ec
comparison
equal deleted inserted replaced
433:8999823db8b8 434:3a8bcc45c221
165 } 165 }
166 } 166 }
167 }; 167 };
168 168
169 169
170 class OrthancApiClient::CachedHttpRequestSuccessMessage
171 {
172 protected:
173 std::string uri_;
174 void* answer_;
175 size_t answerSize_;
176 IWebService::HttpHeaders answerHeaders_;
177
178 public:
179 CachedHttpRequestSuccessMessage(const IWebService::HttpRequestSuccessMessage& message) :
180 uri_(message.GetUri()),
181 answerSize_(message.GetAnswerSize()),
182 answerHeaders_(message.GetAnswerHttpHeaders())
183 {
184 answer_ = malloc(answerSize_);
185 memcpy(answer_, message.GetAnswer(), answerSize_);
186 }
187
188 ~CachedHttpRequestSuccessMessage()
189 {
190 free(answer_);
191 }
192
193 const std::string& GetUri() const
194 {
195 return uri_;
196 }
197
198 const void* GetAnswer() const
199 {
200 return answer_;
201 }
202
203 size_t GetAnswerSize() const
204 {
205 return answerSize_;
206 }
207
208 const IWebService::HttpHeaders& GetAnswerHttpHeaders() const
209 {
210 return answerHeaders_;
211 }
212
213 };
214
215
216 OrthancApiClient::OrthancApiClient(MessageBroker& broker, 170 OrthancApiClient::OrthancApiClient(MessageBroker& broker,
217 IWebService& web, 171 IWebService& web,
218 const std::string& baseUrl) : 172 const std::string& baseUrl) :
219 IObservable(broker), 173 IObservable(broker),
220 IObserver(broker), 174 IObserver(broker),
221 web_(web), 175 web_(web),
222 baseUrl_(baseUrl), 176 baseUrl_(baseUrl)
223 cacheEnabled_(true)
224 { 177 {
225 } 178 }
226 179
227 180
228 void OrthancApiClient::GetJsonAsync( 181 void OrthancApiClient::GetJsonAsync(
230 MessageHandler<JsonResponseReadyMessage>* successCallback, 183 MessageHandler<JsonResponseReadyMessage>* successCallback,
231 MessageHandler<IWebService::HttpRequestErrorMessage>* failureCallback, 184 MessageHandler<IWebService::HttpRequestErrorMessage>* failureCallback,
232 Orthanc::IDynamicObject* payload) 185 Orthanc::IDynamicObject* payload)
233 { 186 {
234 IWebService::HttpHeaders emptyHeaders; 187 IWebService::HttpHeaders emptyHeaders;
235 if (cacheEnabled_) 188 web_.GetAsync(baseUrl_ + uri,
236 { 189 emptyHeaders,
237 HandleFromCache(baseUrl_ + uri, 190 new WebServicePayload(successCallback, failureCallback, payload),
238 emptyHeaders, 191 new Callable<OrthancApiClient, IWebService::HttpRequestSuccessMessage>
239 new WebServicePayload(successCallback, failureCallback, payload)); 192 (*this, &OrthancApiClient::NotifyHttpSuccess),
240 } 193 new Callable<OrthancApiClient, IWebService::HttpRequestErrorMessage>
241 else 194 (*this, &OrthancApiClient::NotifyHttpError));
242 {
243 web_.GetAsync(baseUrl_ + uri,
244 emptyHeaders,
245 new WebServicePayload(successCallback, failureCallback, payload),
246 new Callable<OrthancApiClient, IWebService::HttpRequestSuccessMessage>
247 (*this, &OrthancApiClient::NotifyHttpSuccess),
248 new Callable<OrthancApiClient, IWebService::HttpRequestErrorMessage>
249 (*this, &OrthancApiClient::NotifyHttpError));
250 }
251 } 195 }
252 196
253 197
254 void OrthancApiClient::GetBinaryAsync( 198 void OrthancApiClient::GetBinaryAsync(
255 const std::string& uri, 199 const std::string& uri,
260 { 204 {
261 IWebService::HttpHeaders headers; 205 IWebService::HttpHeaders headers;
262 headers["Accept"] = contentType; 206 headers["Accept"] = contentType;
263 GetBinaryAsync(uri, headers, successCallback, failureCallback, payload); 207 GetBinaryAsync(uri, headers, successCallback, failureCallback, payload);
264 } 208 }
265
266
267 void OrthancApiClient::HandleFromCache(const std::string& uri,
268 const IWebService::HttpHeaders& headers,
269 Orthanc::IDynamicObject* payload // takes ownership
270 )
271 {
272 if (cache_.find(uri) == cache_.end())
273 {
274 web_.GetAsync(uri, headers,
275 payload, // ownership is transfered
276 new Callable<OrthancApiClient, IWebService::HttpRequestSuccessMessage>
277 (*this, &OrthancApiClient::CacheAndNotifyHttpSuccess),
278 new Callable<OrthancApiClient, IWebService::HttpRequestErrorMessage>
279 (*this, &OrthancApiClient::NotifyHttpError));
280 }
281 else
282 {
283 std::auto_ptr<Orthanc::IDynamicObject> payloadRaii(payload); // make sure payload is deleted whatever happens
284
285 const OrthancApiClient::CachedHttpRequestSuccessMessage& cachedMessage = *(cache_[uri]);
286 IWebService::HttpRequestSuccessMessage successMessage(cachedMessage.GetUri(),
287 cachedMessage.GetAnswer(),
288 cachedMessage.GetAnswerSize(),
289 cachedMessage.GetAnswerHttpHeaders(),
290 payloadRaii.get());
291 NotifyHttpSuccess(successMessage);
292 }
293
294 }
295
296 209
297 void OrthancApiClient::GetBinaryAsync( 210 void OrthancApiClient::GetBinaryAsync(
298 const std::string& uri, 211 const std::string& uri,
299 const IWebService::HttpHeaders& headers, 212 const IWebService::HttpHeaders& headers,
300 MessageHandler<BinaryResponseReadyMessage>* successCallback, 213 MessageHandler<BinaryResponseReadyMessage>* successCallback,
301 MessageHandler<IWebService::HttpRequestErrorMessage>* failureCallback, 214 MessageHandler<IWebService::HttpRequestErrorMessage>* failureCallback,
302 Orthanc::IDynamicObject* payload) 215 Orthanc::IDynamicObject* payload)
303 { 216 {
304 // printf("GET [%s] [%s]\n", baseUrl_.c_str(), uri.c_str()); 217 // printf("GET [%s] [%s]\n", baseUrl_.c_str(), uri.c_str());
305 218
306 if (cacheEnabled_) 219 web_.GetAsync(baseUrl_ + uri, headers,
307 { 220 new WebServicePayload(successCallback, failureCallback, payload),
308 HandleFromCache(baseUrl_ + uri, 221 new Callable<OrthancApiClient, IWebService::HttpRequestSuccessMessage>
309 headers, 222 (*this, &OrthancApiClient::NotifyHttpSuccess),
310 new WebServicePayload(successCallback, failureCallback, payload)); 223 new Callable<OrthancApiClient, IWebService::HttpRequestErrorMessage>
311 } 224 (*this, &OrthancApiClient::NotifyHttpError));
312 else
313 {
314 web_.GetAsync(baseUrl_ + uri, headers,
315 new WebServicePayload(successCallback, failureCallback, payload),
316 new Callable<OrthancApiClient, IWebService::HttpRequestSuccessMessage>
317 (*this, &OrthancApiClient::NotifyHttpSuccess),
318 new Callable<OrthancApiClient, IWebService::HttpRequestErrorMessage>
319 (*this, &OrthancApiClient::NotifyHttpError));
320 }
321 } 225 }
322 226
323 227
324 void OrthancApiClient::PostBinaryAsyncExpectJson( 228 void OrthancApiClient::PostBinaryAsyncExpectJson(
325 const std::string& uri, 229 const std::string& uri,
390 { 294 {
391 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); 295 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
392 } 296 }
393 } 297 }
394 298
395 void OrthancApiClient::CacheAndNotifyHttpSuccess(const IWebService::HttpRequestSuccessMessage& message)
396 {
397 cache_[message.GetUri()] = boost::shared_ptr<CachedHttpRequestSuccessMessage>(new CachedHttpRequestSuccessMessage(message));
398 NotifyHttpSuccess(message);
399 }
400
401 void OrthancApiClient::NotifyHttpError(const IWebService::HttpRequestErrorMessage& message) 299 void OrthancApiClient::NotifyHttpError(const IWebService::HttpRequestErrorMessage& message)
402 { 300 {
403 if (message.HasPayload()) 301 if (message.HasPayload())
404 { 302 {
405 dynamic_cast<const WebServicePayload&>(message.GetPayload()).HandleFailure(message); 303 dynamic_cast<const WebServicePayload&>(message.GetPayload()).HandleFailure(message);