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 {