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));