Allow fallback from https to http for component update checks.

Component updater relies on its custom message signing protocol to
guarantee the integrity of update checks.

As a failover mechanism and to improve the update success rates,
fallback to HTTP is allowed. This is similar to
what Google Update (Omaha) has been doing.

BUG=590070

Review URL: https://codereview.chromium.org/1740333002

Cr-Commit-Position: refs/heads/master@{#384993}
diff --git a/components/update_client/request_sender.h b/components/update_client/request_sender.h
index ddf5cca..b5daaa2e 100644
--- a/components/update_client/request_sender.h
+++ b/components/update_client/request_sender.h
@@ -5,6 +5,8 @@
 #ifndef COMPONENTS_UPDATE_CLIENT_REQUEST_SENDER_H_
 #define COMPONENTS_UPDATE_CLIENT_REQUEST_SENDER_H_
 
+#include <stdint.h>
+
 #include <string>
 #include <vector>
 
@@ -35,8 +37,13 @@
 class RequestSender : public net::URLFetcherDelegate {
  public:
   // If |error| is 0, then the response is provided in the |response| parameter.
-  using RequestSenderCallback =
-      base::Callback<void(int error, const std::string& response)>;
+  // |retry_after_sec| contains the value of the X-Retry-After response header,
+  // when the response was received from a cryptographically secure URL. The
+  // range for this value is [-1, 86400]. If |retry_after_sec| is -1 it means
+  // that the header could not be found, or trusted, or had an invalid value.
+  // The upper bound represents a delay of one day.
+  using RequestSenderCallback = base::Callback<
+      void(int error, const std::string& response, int retry_after_sec)>;
 
   static int kErrorResponseNotTrusted;
 
@@ -57,9 +64,15 @@
   // Decodes and returns the public key used by CUP.
   static std::string GetKey(const char* key_bytes_base64);
 
-  // Returns the Etag of the server response or an empty string if the
-  // Etag is not available.
-  static std::string GetServerETag(const net::URLFetcher* source);
+  // Returns the string value of a header of the server response or an empty
+  // string if the header is not available.
+  static std::string GetStringHeaderValue(const net::URLFetcher* source,
+                                          const char* header_name);
+
+  // Returns the integral value of a header of the server response or -1 if
+  // if the header is not available or a conversion error has occured.
+  static int64_t GetInt64HeaderValue(const net::URLFetcher* source,
+                                     const char* header_name);
 
   // Overrides for URLFetcherDelegate.
   void OnURLFetchComplete(const net::URLFetcher* source) override;
@@ -67,19 +80,20 @@
   // Implements the error handling and url fallback mechanism.
   void SendInternal();
 
-  // Called when SendInternal complets. |response_body|and |response_etag|
+  // Called when SendInternal completes. |response_body| and |response_etag|
   // contain the body and the etag associated with the HTTP response.
   void SendInternalComplete(int error,
                             const std::string& response_body,
-                            const std::string& response_etag);
+                            const std::string& response_etag,
+                            int retry_after_sec);
 
   // Helper function to handle a non-continuable error in Send.
-  void HandleSendError(int error);
+  void HandleSendError(int error, int retry_after_sec);
 
   base::ThreadChecker thread_checker_;
 
   const scoped_refptr<Configurator> config_;
-  bool use_signing_;
+  bool use_signing_;  // True if CUP signing is used.
   std::vector<GURL> urls_;
   std::string request_body_;
   RequestSenderCallback request_sender_callback_;