buffet: Introduce a helper method to do cloud API request.

For now this helper is somewhat naive and it requires a lot of
love to reach production quality.

Eventually it will go away from device_registration_info.

BUG=chromium:420580
TEST=cros_workon_make buffet --test && manual testing.

Change-Id: Iada36af6ea6b0be4c5af6c318818e3ad0682625e
Reviewed-on: https://chromium-review.googlesource.com/221075
Reviewed-by: Christopher Wiley <wiley@chromium.org>
Tested-by: Anton Muhin <antonm@chromium.org>
Commit-Queue: Anton Muhin <antonm@chromium.org>
diff --git a/buffet/device_registration_info.h b/buffet/device_registration_info.h
index 6a82ffa..8292ea6 100644
--- a/buffet/device_registration_info.h
+++ b/buffet/device_registration_info.h
@@ -10,6 +10,7 @@
 #include <string>
 #include <utility>
 
+#include <base/callback.h>
 #include <base/macros.h>
 #include <base/time/time.h>
 #include <chromeos/data_encoding.h>
@@ -120,6 +121,23 @@
   // Makes sure the access token is available and up-to-date.
   bool ValidateAndRefreshAccessToken(chromeos::ErrorPtr* error);
 
+  using CloudRequestCallback =
+      base::Callback<void(const base::DictionaryValue&)>;
+  using CloudRequestErroback =
+      base::Callback<void(const chromeos::Error& error)>;
+
+  // Do a HTTPS request to cloud services.
+  // Handles many cases like reauthorization, 5xx HTTP response codes
+  // and device removal.  It is a recommended way to do cloud API
+  // requests.
+  // TODO(antonm): Consider moving into some other class.
+  void DoCloudRequest(
+      const char* method,
+      const std::string& url,
+      const base::DictionaryValue* body,
+      CloudRequestCallback callback,
+      CloudRequestErroback errorback);
+
   // Builds Cloud API devices collection REST resouce which matches
   // current state of the device including command definitions
   // for all supported commands and current device state.