libchromeos: Add request ID to async http I/O methods/callbacks Methods to start an asynchronous I/O operation now return a request ID which can be used to cancel the request by calling Transport::CancelRequest(request_id). Also, the request ID is now passed as a parameter to success and error callback, so they can distunguish between different responses queued simultaneously. The actual implementation of generating valid request IDs and canceling the request will come in a follow-up CL which implements the actual real asynchronous I/O using CURL's multi-interface. BUG=chromium:427963 TEST=FEATURES=test emerge-link libchromeos buffet Change-Id: I40fdaf430c59bcfdf985382e846f1492be143951 Reviewed-on: https://chromium-review.googlesource.com/241183 Tested-by: Alex Vakulenko <avakulenko@chromium.org> Reviewed-by: Christopher Wiley <wiley@chromium.org> Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/device_registration_info.cc b/buffet/device_registration_info.cc index 994f7ad..0b95c90 100644 --- a/buffet/device_registration_info.cc +++ b/buffet/device_registration_info.cc
@@ -515,22 +515,24 @@ const chromeos::http::ErrorCallback& error_callback) { auto on_failure = [method, url, data, mime_type, headers, transport, num_retries, - success_callback, error_callback](const chromeos::Error* error) { + success_callback, error_callback](int request_id, + const chromeos::Error* error) { if (num_retries > 0) { SendRequestWithRetries(method, url, data, mime_type, headers, transport, num_retries - 1, success_callback, error_callback); } else { - error_callback.Run(error); + error_callback.Run(request_id, error); } }; auto on_success = - [on_failure, success_callback, error_callback](ResponsePtr response) { + [on_failure, success_callback, error_callback](int request_id, + ResponsePtr response) { int status_code = response->GetStatusCode(); if (status_code >= chromeos::http::status_code::Continue && status_code < chromeos::http::status_code::BadRequest) { - success_callback.Run(response.Pass()); + success_callback.Run(request_id, response.Pass()); return; } @@ -548,9 +550,9 @@ // TODO(antonm): Reconsider status codes, maybe only some require // retry. // TODO(antonm): Support Retry-After header. - on_failure(error.get()); + on_failure(request_id, error.get()); } else { - error_callback.Run(error.get()); + error_callback.Run(request_id, error.get()); } }; @@ -581,7 +583,8 @@ chromeos::mime::parameters::kCharset, "utf-8")}; - auto request_cb = [success_callback, error_callback](ResponsePtr response) { + auto request_cb = + [success_callback, error_callback](int request_id, ResponsePtr response) { chromeos::ErrorPtr error; std::unique_ptr<base::DictionaryValue> json_resp{ @@ -594,16 +597,23 @@ success_callback.Run(*json_resp); }; + auto error_cb = + [error_callback](int request_id, const chromeos::Error* error) { + error_callback.Run(error); + }; + auto transport = transport_; - auto error_callackback_with_reauthorization = base::Bind( - [method, url, data, mime_type, transport, request_cb, error_callback] - (DeviceRegistrationInfo* self, const chromeos::Error* error) { + auto error_callackback_with_reauthorization = + base::Bind([method, url, data, mime_type, transport, request_cb, error_cb] + (DeviceRegistrationInfo* self, + int request_id, + const chromeos::Error* error) { if (error->HasError(chromeos::errors::http::kDomain, std::to_string(chromeos::http::status_code::Denied))) { chromeos::ErrorPtr reauthorization_error; if (!self->ValidateAndRefreshAccessToken(&reauthorization_error)) { // TODO(antonm): Check if the device has been actually removed. - error_callback.Run(reauthorization_error.get()); + error_cb(request_id, reauthorization_error.get()); return; } SendRequestWithRetries(method, url, @@ -611,9 +621,9 @@ {self->GetAuthorizationHeader()}, transport, 7, - base::Bind(request_cb), error_callback); + base::Bind(request_cb), base::Bind(error_cb)); } else { - error_callback.Run(error); + error_cb(request_id, error); } }, base::Unretained(this));