libweave: Remove mime_type from HttpClient interface

This simplifies platform side implementation. The implementation will
just submit all headers as is.

BUG=brillo:1250
TEST=`FEATURES=test emerge-gizmo libweave buffet`

Change-Id: Id7f968fab5c18ca30223e456c04d36c2a0becb7e
diff --git a/libweave/include/weave/http_client.h b/libweave/include/weave/http_client.h
index 8263d21..401f1c5 100644
--- a/libweave/include/weave/http_client.h
+++ b/libweave/include/weave/http_client.h
@@ -34,16 +34,14 @@
   virtual std::unique_ptr<Response> SendRequestAndBlock(
       const std::string& method,
       const std::string& url,
-      const std::string& data,
-      const std::string& mime_type,
       const Headers& headers,
+      const std::string& data,
       chromeos::ErrorPtr* error) = 0;
 
   virtual int SendRequest(const std::string& method,
                           const std::string& url,
-                          const std::string& data,
-                          const std::string& mime_type,
                           const Headers& headers,
+                          const std::string& data,
                           const SuccessCallback& success_callback,
                           const ErrorCallback& error_callback) = 0;
 
diff --git a/libweave/include/weave/mock_http_client.h b/libweave/include/weave/mock_http_client.h
index 015ed0b..cb1b96e 100644
--- a/libweave/include/weave/mock_http_client.h
+++ b/libweave/include/weave/mock_http_client.h
@@ -26,27 +26,24 @@
  public:
   ~MockHttpClient() override = default;
 
-  MOCK_METHOD6(MockSendRequest,
+  MOCK_METHOD5(MockSendRequest,
                Response*(const std::string&,
                          const std::string&,
-                         const std::string&,
-                         const std::string&,
                          const Headers&,
+                         const std::string&,
                          chromeos::ErrorPtr*));
 
   std::unique_ptr<Response> SendRequestAndBlock(
       const std::string& method,
       const std::string& url,
-      const std::string& data,
-      const std::string& mime_type,
       const Headers& headers,
+      const std::string& data,
       chromeos::ErrorPtr* error) override;
 
   int SendRequest(const std::string& method,
                   const std::string& url,
-                  const std::string& data,
-                  const std::string& mime_type,
                   const Headers& headers,
+                  const std::string& data,
                   const SuccessCallback& success_callback,
                   const ErrorCallback& error_callback) override;
 };
diff --git a/libweave/src/device_registration_info.cc b/libweave/src/device_registration_info.cc
index 229ba91..8bb47c9 100644
--- a/libweave/src/device_registration_info.cc
+++ b/libweave/src/device_registration_info.cc
@@ -41,14 +41,6 @@
 
 namespace {
 
-std::pair<std::string, std::string> BuildAuthHeader(
-    const std::string& access_token_type,
-    const std::string& access_token) {
-  std::string authorization =
-      chromeos::string_utils::Join(" ", access_token_type, access_token);
-  return {"Authorization", authorization};
-}
-
 inline void SetUnexpectedError(chromeos::ErrorPtr* error) {
   chromeos::Error::AddTo(error, FROM_HERE, kErrorDomainGCD,
                          "unexpected_response", "Unexpected GCD error");
@@ -115,18 +107,18 @@
 
   std::unique_ptr<HttpClient::Response> SendAndBlock(
       chromeos::ErrorPtr* error) {
-    return transport_->SendRequestAndBlock(method_, url_, data_, mime_type_,
-                                           headers_, error);
+    return transport_->SendRequestAndBlock(method_, url_, GetFullHeaders(),
+                                           data_, error);
   }
 
   int Send(const HttpClient::SuccessCallback& success_callback,
            const HttpClient::ErrorCallback& error_callback) {
-    return transport_->SendRequest(method_, url_, data_, mime_type_, headers_,
+    return transport_->SendRequest(method_, url_, GetFullHeaders(), data_,
                                    success_callback, error_callback);
   }
 
-  void AddAuthHeader(const std::string& access_token) {
-    headers_.emplace_back(BuildAuthHeader("Bearer", access_token));
+  void SetAccessToken(const std::string& access_token) {
+    access_token_ = access_token;
   }
 
   void SetData(const std::string& data, const std::string& mime_type) {
@@ -136,22 +128,31 @@
 
   void SetFormData(
       const std::vector<std::pair<std::string, std::string>>& data) {
-    data_ = chromeos::data_encoding::WebParamsEncode(data);
-    mime_type_ = http::kWwwFormUrlEncoded;
+    SetData(chromeos::data_encoding::WebParamsEncode(data),
+            http::kWwwFormUrlEncoded);
   }
 
   void SetJsonData(const base::Value& json) {
     std::string data;
-    CHECK(base::JSONWriter::Write(json, &data_));
-    mime_type_ = http::kJsonUtf8;
+    CHECK(base::JSONWriter::Write(json, &data));
+    SetData(data, http::kJsonUtf8);
   }
 
  private:
+  HttpClient::Headers GetFullHeaders() const {
+    HttpClient::Headers headers;
+    if (!access_token_.empty())
+      headers.emplace_back(http::kAuthorization, "Bearer " + access_token_);
+    if (!mime_type_.empty())
+      headers.emplace_back(http::kContentType, mime_type_);
+    return headers;
+  }
+
   std::string method_;
   std::string url_;
   std::string data_;
   std::string mime_type_;
-  std::vector<std::pair<std::string, std::string>> headers_;
+  std::string access_token_;
   HttpClient* transport_{nullptr};
 
   DISALLOW_COPY_AND_ASSIGN(RequestSender);
@@ -676,7 +677,7 @@
 
   RequestSender sender{data->method, data->url, http_client_};
   sender.SetData(data->body, http::kJsonUtf8);
-  sender.AddAuthHeader(access_token_);
+  sender.SetAccessToken(access_token_);
   int request_id =
       sender.Send(base::Bind(&DeviceRegistrationInfo::OnCloudRequestSuccess,
                              AsWeakPtr(), data),
diff --git a/libweave/src/device_registration_info_unittest.cc b/libweave/src/device_registration_info_unittest.cc
index 72db07e..77507cd 100644
--- a/libweave/src/device_registration_info_unittest.cc
+++ b/libweave/src/device_registration_info_unittest.cc
@@ -16,6 +16,7 @@
 
 #include "libweave/src/commands/command_manager.h"
 #include "libweave/src/commands/unittest_utils.h"
+#include "libweave/src/http_constants.h"
 #include "libweave/src/states/mock_state_change_queue_interface.h"
 #include "libweave/src/states/state_manager.h"
 #include "libweave/src/storage_impls.h"
@@ -94,7 +95,7 @@
       .WillRepeatedly(Return(status_code));
   EXPECT_CALL(*response, GetContentType())
       .Times(AtLeast(1))
-      .WillRepeatedly(Return("application/json"));
+      .WillRepeatedly(Return(http::kJsonUtf8));
   EXPECT_CALL(*response, GetData())
       .Times(AtLeast(1))
       .WillRepeatedly(ReturnRefOfCopy(text));
@@ -102,8 +103,16 @@
 }
 
 std::pair<std::string, std::string> GetAuthHeader() {
-  return {std::string{"Authorization"},
-          std::string{"Bearer "} + test_data::kAccessToken};
+  return {http::kAuthorization,
+          std::string("Bearer ") + test_data::kAccessToken};
+}
+
+std::pair<std::string, std::string> GetJsonHeader() {
+  return {http::kContentType, http::kJsonUtf8};
+}
+
+std::pair<std::string, std::string> GetFormHeader() {
+  return {http::kContentType, http::kWwwFormUrlEncoded};
 }
 
 }  // anonymous namespace
@@ -229,10 +238,9 @@
   ReloadConfig();
 
   EXPECT_CALL(http_client_,
-              MockSendRequest("POST", dev_reg_->GetOAuthURL("token"), _,
-                              "application/x-www-form-urlencoded",
-                              HttpClient::Headers{}, _))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+              MockSendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
+                              HttpClient::Headers{GetFormHeader()}, _, _))
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         EXPECT_EQ("refresh_token", GetFormField(data, "grant_type"));
         EXPECT_EQ(test_data::kRefreshToken,
                   GetFormField(data, "refresh_token"));
@@ -258,10 +266,9 @@
   EXPECT_EQ(RegistrationStatus::kConnecting, GetRegistrationStatus());
 
   EXPECT_CALL(http_client_,
-              MockSendRequest("POST", dev_reg_->GetOAuthURL("token"), _,
-                              "application/x-www-form-urlencoded",
-                              HttpClient::Headers{}, _))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+              MockSendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
+                              HttpClient::Headers{GetFormHeader()}, _, _))
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         EXPECT_EQ("refresh_token", GetFormField(data, "grant_type"));
         EXPECT_EQ(test_data::kRefreshToken,
                   GetFormField(data, "refresh_token"));
@@ -287,10 +294,9 @@
   EXPECT_EQ(RegistrationStatus::kConnecting, GetRegistrationStatus());
 
   EXPECT_CALL(http_client_,
-              MockSendRequest("POST", dev_reg_->GetOAuthURL("token"), _,
-                              "application/x-www-form-urlencoded",
-                              HttpClient::Headers{}, _))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+              MockSendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
+                              HttpClient::Headers{GetFormHeader()}, _, _))
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         EXPECT_EQ("refresh_token", GetFormField(data, "grant_type"));
         EXPECT_EQ(test_data::kRefreshToken,
                   GetFormField(data, "refresh_token"));
@@ -316,10 +322,10 @@
   SetAccessToken();
 
   EXPECT_CALL(http_client_,
-              MockSendRequest("GET", dev_reg_->GetDeviceURL(), _,
-                              "application/json; charset=utf-8",
-                              HttpClient::Headers{GetAuthHeader()}, _))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+              MockSendRequest(
+                  http::kGet, dev_reg_->GetDeviceURL(),
+                  HttpClient::Headers{GetAuthHeader(), GetJsonHeader()}, _, _))
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         base::DictionaryValue json;
         json.SetString("channel.supportedType", "xmpp");
         json.SetString("deviceKind", "vendor");
@@ -385,11 +391,11 @@
 
   std::string ticket_url = dev_reg_->GetServiceURL("registrationTickets/") +
                            test_data::kClaimTicketId;
-  EXPECT_CALL(http_client_,
-              MockSendRequest(
-                  "PATCH", ticket_url + "?key=" + test_data::kApiKey, _,
-                  "application/json; charset=utf-8", HttpClient::Headers{}, _))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+  EXPECT_CALL(
+      http_client_,
+      MockSendRequest(http::kPatch, ticket_url + "?key=" + test_data::kApiKey,
+                      HttpClient::Headers{GetJsonHeader()}, _, _))
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         auto json = unittests::CreateDictionaryValue(data);
         EXPECT_NE(nullptr, json.get());
         std::string value;
@@ -455,9 +461,9 @@
       })));
 
   EXPECT_CALL(http_client_,
-              MockSendRequest(
-                  "POST", ticket_url + "/finalize?key=" + test_data::kApiKey,
-                  "", _, HttpClient::Headers{}, _))
+              MockSendRequest(http::kPost, ticket_url + "/finalize?key=" +
+                                               test_data::kApiKey,
+                              HttpClient::Headers{}, _, _))
       .WillOnce(InvokeWithoutArgs([]() {
         base::DictionaryValue json;
         json.SetString("id", test_data::kClaimTicketId);
@@ -474,10 +480,9 @@
       }));
 
   EXPECT_CALL(http_client_,
-              MockSendRequest("POST", dev_reg_->GetOAuthURL("token"), _,
-                              "application/x-www-form-urlencoded",
-                              HttpClient::Headers{}, _))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+              MockSendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
+                              HttpClient::Headers{GetFormHeader()}, _, _))
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         EXPECT_EQ("authorization_code", GetFormField(data, "grant_type"));
         EXPECT_EQ(test_data::kRobotAccountAuthCode, GetFormField(data, "code"));
         EXPECT_EQ(test_data::kClientId, GetFormField(data, "client_id"));
@@ -561,10 +566,10 @@
   ASSERT_NE(nullptr, command);
 
   EXPECT_CALL(http_client_,
-              MockSendRequest("PATCH", command_url, _,
-                              "application/json; charset=utf-8",
-                              HttpClient::Headers{GetAuthHeader()}, _))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+              MockSendRequest(
+                  http::kPatch, command_url,
+                  HttpClient::Headers{GetAuthHeader(), GetJsonHeader()}, _, _))
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         EXPECT_JSON_EQ(R"({"results":{"status":"Ok"}})",
                        *CreateDictionaryValue(data));
         base::DictionaryValue json;
@@ -575,16 +580,16 @@
   Mock::VerifyAndClearExpectations(&http_client_);
 
   EXPECT_CALL(http_client_,
-              MockSendRequest("PATCH", command_url, _,
-                              "application/json; charset=utf-8",
-                              HttpClient::Headers{GetAuthHeader()}, _))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+              MockSendRequest(
+                  http::kPatch, command_url,
+                  HttpClient::Headers{GetAuthHeader(), GetJsonHeader()}, _, _))
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         EXPECT_JSON_EQ(R"({"state":"inProgress"})",
                        *CreateDictionaryValue(data));
         base::DictionaryValue json;
         return ReplyWithJson(200, json);
       })))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         EXPECT_JSON_EQ(R"({"progress":{"progress":18}})",
                        *CreateDictionaryValue(data));
         base::DictionaryValue json;
@@ -595,10 +600,10 @@
   Mock::VerifyAndClearExpectations(&http_client_);
 
   EXPECT_CALL(http_client_,
-              MockSendRequest("PATCH", command_url, _,
-                              "application/json; charset=utf-8",
-                              HttpClient::Headers{GetAuthHeader()}, _))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+              MockSendRequest(
+                  http::kPatch, command_url,
+                  HttpClient::Headers{GetAuthHeader(), GetJsonHeader()}, _, _))
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         EXPECT_JSON_EQ(R"({"state":"cancelled"})",
                        *CreateDictionaryValue(data));
         base::DictionaryValue json;
diff --git a/libweave/src/mock_http_client.cc b/libweave/src/mock_http_client.cc
index d4307a4..1f223a9 100644
--- a/libweave/src/mock_http_client.cc
+++ b/libweave/src/mock_http_client.cc
@@ -13,24 +13,22 @@
 std::unique_ptr<HttpClient::Response> MockHttpClient::SendRequestAndBlock(
     const std::string& method,
     const std::string& url,
-    const std::string& data,
-    const std::string& mime_type,
     const Headers& headers,
+    const std::string& data,
     chromeos::ErrorPtr* error) {
   return std::unique_ptr<Response>{
-      MockSendRequest(method, url, data, mime_type, headers, error)};
+      MockSendRequest(method, url, headers, data, error)};
 }
 
 int MockHttpClient::SendRequest(const std::string& method,
                                 const std::string& url,
-                                const std::string& data,
-                                const std::string& mime_type,
                                 const Headers& headers,
+                                const std::string& data,
                                 const SuccessCallback& success_callback,
                                 const ErrorCallback& error_callback) {
   chromeos::ErrorPtr error;
   std::unique_ptr<Response> response{
-      MockSendRequest(method, url, data, mime_type, headers, &error)};
+      MockSendRequest(method, url, headers, data, &error)};
   if (response) {
     success_callback.Run(0, *response);
   } else {