libweave: Remove dependency on chromeos/http* and chromeos/mime Code relates with http_constants.*. CL is part of effort to remove dependency on chromeos. BUG=brillo:1250 TEST='FEATURES=test emerge-gizmo libweave buffet' Change-Id: I52e4e301178a379fbcce684ce11a008da721c1bb
diff --git a/libweave/libweave.gyp b/libweave/libweave.gyp index ba7e026..527c246 100644 --- a/libweave/libweave.gyp +++ b/libweave/libweave.gyp
@@ -34,6 +34,7 @@ 'src/commands/user_role.cc', 'src/device_manager.cc', 'src/device_registration_info.cc', + 'src/http_constants.cc', 'src/notification/notification_parser.cc', 'src/notification/pull_channel.cc', 'src/notification/xml_node.cc',
diff --git a/libweave/src/device_registration_info.cc b/libweave/src/device_registration_info.cc index bcebaba..229ba91 100644 --- a/libweave/src/device_registration_info.cc +++ b/libweave/src/device_registration_info.cc
@@ -19,7 +19,6 @@ #include <chromeos/data_encoding.h> #include <chromeos/errors/error_codes.h> #include <chromeos/key_value_store.h> -#include <chromeos/mime_utils.h> #include <chromeos/strings/string_utils.h> #include <chromeos/url_utils.h> #include <weave/http_client.h> @@ -29,6 +28,7 @@ #include "libweave/src/commands/command_definition.h" #include "libweave/src/commands/command_manager.h" #include "libweave/src/commands/schema_constants.h" +#include "libweave/src/http_constants.h" #include "libweave/src/notification/xmpp_channel.h" #include "libweave/src/states/state_manager.h" #include "libweave/src/utils.h" @@ -41,17 +41,6 @@ namespace { -const int kHttpStatusContinue = 100; -const int kHttpStatusBadRequest = 400; -const int kHttpStatusDenied = 401; -const int kHttpStatusForbidden = 403; -const int kHttpStatusInternalServerError = 500; - -const char kGet[] = "GET"; -const char kPatch[] = "PATCH"; -const char kPost[] = "POST"; -const char kPut[] = "PUT"; - std::pair<std::string, std::string> BuildAuthHeader( const std::string& access_token_type, const std::string& access_token) { @@ -148,15 +137,13 @@ void SetFormData( const std::vector<std::pair<std::string, std::string>>& data) { data_ = chromeos::data_encoding::WebParamsEncode(data); - mime_type_ = chromeos::mime::application::kWwwFormUrlEncoded; + mime_type_ = http::kWwwFormUrlEncoded; } void SetJsonData(const base::Value& json) { std::string data; CHECK(base::JSONWriter::Write(json, &data_)); - mime_type_ = chromeos::mime::AppendParameter( - chromeos::mime::application::kJson, - chromeos::mime::parameters::kCharset, "utf-8"); + mime_type_ = http::kJsonUtf8; } private: @@ -176,9 +163,10 @@ // Make sure we have a correct content type. Do not try to parse // binary files, or HTML output. Limit to application/json and text/plain. auto content_type = - chromeos::mime::RemoveParameters(response.GetContentType()); - if (content_type != chromeos::mime::application::kJson && - content_type != chromeos::mime::text::kPlain) { + chromeos::string_utils::SplitAtFirst(response.GetContentType(), ";") + .first; + + if (content_type != http::kJson && content_type != http::kPlain) { chromeos::Error::AddTo(error, FROM_HERE, chromeos::errors::json::kDomain, "non_json_content_type", "Unexpected response content type: " + content_type); @@ -213,7 +201,7 @@ bool IsSuccessful(const HttpClient::Response& response) { int code = response.GetStatusCode(); - return code >= kHttpStatusContinue && code < kHttpStatusBadRequest; + return code >= http::kContinue && code < http::kBadRequest; } } // anonymous namespace @@ -322,7 +310,7 @@ chromeos::ErrorPtr* error) { int code = response.GetStatusCode(); auto resp = ParseJsonResponse(response, error); - if (resp && code >= kHttpStatusBadRequest) { + if (resp && code >= http::kBadRequest) { std::string error_code, error_message; if (!resp->GetString("error", &error_code)) { error_code = "unexpected_response"; @@ -373,7 +361,7 @@ auto shared_error_callback = std::make_shared<CloudRequestErrorCallback>(error_callback); - RequestSender sender{kPost, GetOAuthURL("token"), http_client_}; + RequestSender sender{http::kPost, GetOAuthURL("token"), http_client_}; sender.SetFormData({ {"refresh_token", config_->refresh_token()}, {"client_id", config_->client_id()}, @@ -535,7 +523,7 @@ void DeviceRegistrationInfo::GetDeviceInfo( const CloudRequestCallback& success_callback, const CloudRequestErrorCallback& error_callback) { - DoCloudRequest(weave::kGet, GetDeviceURL(), nullptr, success_callback, + DoCloudRequest(http::kGet, GetDeviceURL(), nullptr, success_callback, error_callback); } @@ -554,7 +542,7 @@ auto url = GetServiceURL("registrationTickets/" + ticket_id, {{"key", config_->api_key()}}); - RequestSender sender{kPatch, url, http_client_}; + RequestSender sender{http::kPatch, url, http_client_}; sender.SetJsonData(req_json); auto response = sender.SendAndBlock(error); @@ -570,7 +558,7 @@ url = GetServiceURL("registrationTickets/" + ticket_id + "/finalize", {{"key", config_->api_key()}}); - response = RequestSender{kPost, url, http_client_}.SendAndBlock(error); + response = RequestSender{http::kPost, url, http_client_}.SendAndBlock(error); if (!response) return std::string(); json_resp = ParseJsonResponse(*response, error); @@ -598,7 +586,7 @@ UpdateDeviceInfoTimestamp(*device_draft_response); // Now get access_token and refresh_token - RequestSender sender2{kPost, GetOAuthURL("token"), http_client_}; + RequestSender sender2{http::kPost, GetOAuthURL("token"), http_client_}; sender2.SetFormData( {{"code", auth_code}, {"client_id", config_->client_id()}, @@ -686,13 +674,8 @@ return; } - using chromeos::mime::application::kJson; - using chromeos::mime::parameters::kCharset; - const std::string mime_type = - chromeos::mime::AppendParameter(kJson, kCharset, "utf-8"); - RequestSender sender{data->method, data->url, http_client_}; - sender.SetData(data->body, mime_type); + sender.SetData(data->body, http::kJsonUtf8); sender.AddAuthHeader(access_token_); int request_id = sender.Send(base::Bind(&DeviceRegistrationInfo::OnCloudRequestSuccess, @@ -709,7 +692,7 @@ int status_code = response.GetStatusCode(); VLOG(1) << "Response for cloud request with ID " << request_id << " received with status code " << status_code; - if (status_code == kHttpStatusDenied) { + if (status_code == http::kDenied) { cloud_backoff_entry_->InformOfRequest(true); RefreshAccessToken( base::Bind(&DeviceRegistrationInfo::OnAccessTokenRefreshed, AsWeakPtr(), @@ -719,7 +702,7 @@ return; } - if (status_code >= kHttpStatusInternalServerError) { + if (status_code >= http::kInternalServerError) { // Request was valid, but server failed, retry. // TODO(antonm): Reconsider status codes, maybe only some require // retry. @@ -738,7 +721,7 @@ if (!IsSuccessful(response)) { ParseGCDError(json_resp.get(), &error); - if (status_code == kHttpStatusForbidden && + if (status_code == http::kForbidden && error->HasError(kErrorDomainGCDServer, "rateLimitExceeded")) { // If we exceeded server quota, retry the request later. RetryCloudRequest(data); @@ -885,7 +868,7 @@ const base::DictionaryValue& command_patch, const base::Closure& on_success, const base::Closure& on_error) { - DoCloudRequest(weave::kPatch, GetServiceURL("commands/" + command_id), + DoCloudRequest(http::kPatch, GetServiceURL("commands/" + command_id), &command_patch, base::Bind(&IgnoreCloudResultWithCallback, on_success), base::Bind(&IgnoreCloudErrorWithCallback, on_error)); @@ -962,7 +945,7 @@ {}, {{"lastUpdateTimeMs", last_device_resource_updated_timestamp_}}); DoCloudRequest( - weave::kPut, url, device_resource.get(), + http::kPut, url, device_resource.get(), base::Bind(&DeviceRegistrationInfo::OnUpdateDeviceResourceSuccess, AsWeakPtr()), base::Bind(&DeviceRegistrationInfo::OnUpdateDeviceResourceError, @@ -1043,7 +1026,7 @@ const base::Callback<void(const base::ListValue&)>& on_success, const CloudRequestErrorCallback& on_failure) { DoCloudRequest( - weave::kGet, + http::kGet, GetServiceURL("commands/queue", {{"deviceId", config_->device_id()}}), nullptr, base::Bind(&HandleFetchCommandsResult, on_success), on_failure); } @@ -1079,7 +1062,7 @@ std::unique_ptr<base::DictionaryValue> cmd_copy{command_dict->DeepCopy()}; cmd_copy->SetString("state", "aborted"); // TODO(wiley) We could consider handling this error case more gracefully. - DoCloudRequest(weave::kPut, GetServiceURL("commands/" + command_id), + DoCloudRequest(http::kPut, GetServiceURL("commands/" + command_id), cmd_copy.get(), base::Bind(&IgnoreCloudResult), base::Bind(&IgnoreCloudError)); } else { @@ -1171,7 +1154,7 @@ device_state_update_pending_ = true; DoCloudRequest( - weave::kPost, GetDeviceURL("patchState"), &body, + http::kPost, GetDeviceURL("patchState"), &body, base::Bind(&DeviceRegistrationInfo::OnPublishStateSuccess, AsWeakPtr(), update_id), base::Bind(&DeviceRegistrationInfo::OnPublishStateError, AsWeakPtr()));
diff --git a/libweave/src/device_registration_info_unittest.cc b/libweave/src/device_registration_info_unittest.cc index d76d9eb..72db07e 100644 --- a/libweave/src/device_registration_info_unittest.cc +++ b/libweave/src/device_registration_info_unittest.cc
@@ -11,7 +11,6 @@ #include <base/values.h> #include <chromeos/bind_lambda.h> #include <chromeos/key_value_store.h> -#include <chromeos/mime_utils.h> #include <gtest/gtest.h> #include <weave/mock_http_client.h>
diff --git a/libweave/src/http_constants.cc b/libweave/src/http_constants.cc new file mode 100644 index 0000000..c409c1a --- /dev/null +++ b/libweave/src/http_constants.cc
@@ -0,0 +1,24 @@ +// Copyright 2015 The Chromium OS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "libweave/src/http_constants.h" + +namespace weave { +namespace http { + +const char kGet[] = "GET"; +const char kPatch[] = "PATCH"; +const char kPost[] = "POST"; +const char kPut[] = "PUT"; + +const char kAuthorization[] = "Authorization"; +const char kContentType[] = "Content-Type"; + +const char kJson[] = "application/json"; +const char kJsonUtf8[] = "application/json; charset=utf-8"; +const char kPlain[] = "text/plain"; +const char kWwwFormUrlEncoded[] = "application/x-www-form-urlencoded"; + +} // namespace http +} // namespace weave
diff --git a/libweave/src/http_constants.h b/libweave/src/http_constants.h new file mode 100644 index 0000000..f219a3c --- /dev/null +++ b/libweave/src/http_constants.h
@@ -0,0 +1,37 @@ +// Copyright 2015 The Chromium OS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef LIBWEAVE_SRC_HTTP_CONSTANTS_H_ +#define LIBWEAVE_SRC_HTTP_CONSTANTS_H_ + +namespace weave { +namespace http { + +const int kContinue = 100; +const int kOk = 200; +const int kBadRequest = 400; +const int kDenied = 401; +const int kForbidden = 403; +const int kNotFound = 404; +const int kInternalServerError = 500; +const int kServiceUnavailable = 503; +const int kNotSupported = 501; + +extern const char kGet[]; +extern const char kPatch[]; +extern const char kPost[]; +extern const char kPut[]; + +extern const char kAuthorization[]; +extern const char kContentType[]; + +extern const char kJson[]; +extern const char kJsonUtf8[]; +extern const char kPlain[]; +extern const char kWwwFormUrlEncoded[]; + +} // namespace http +} // namespace weave + +#endif // LIBWEAVE_SRC_HTTP_CONSTANTS_H_
diff --git a/libweave/src/privet/privet_handler.cc b/libweave/src/privet/privet_handler.cc index 25f8008..04fc8d2 100644 --- a/libweave/src/privet/privet_handler.cc +++ b/libweave/src/privet/privet_handler.cc
@@ -15,10 +15,10 @@ #include <base/strings/string_number_conversions.h> #include <base/strings/stringprintf.h> #include <base/values.h> -#include <chromeos/http/http_request.h> #include <chromeos/strings/string_utils.h> #include <weave/enum_to_string.h> +#include "libweave/src/http_constants.h" #include "libweave/src/privet/cloud_delegate.h" #include "libweave/src/privet/constants.h" #include "libweave/src/privet/device_delegate.h" @@ -126,25 +126,24 @@ const char* const reason; int code; } kReasonToCode[] = { - {errors::kInvalidClientCommitment, chromeos::http::status_code::Forbidden}, - {errors::kInvalidFormat, chromeos::http::status_code::BadRequest}, - {errors::kMissingAuthorization, chromeos::http::status_code::Denied}, - {errors::kInvalidAuthorization, chromeos::http::status_code::Denied}, - {errors::kInvalidAuthorizationScope, - chromeos::http::status_code::Forbidden}, - {errors::kAuthorizationExpired, chromeos::http::status_code::Forbidden}, - {errors::kCommitmentMismatch, chromeos::http::status_code::Forbidden}, - {errors::kUnknownSession, chromeos::http::status_code::NotFound}, - {errors::kInvalidAuthCode, chromeos::http::status_code::Forbidden}, - {errors::kInvalidAuthMode, chromeos::http::status_code::BadRequest}, - {errors::kInvalidRequestedScope, chromeos::http::status_code::BadRequest}, - {errors::kAccessDenied, chromeos::http::status_code::Forbidden}, - {errors::kInvalidParams, chromeos::http::status_code::BadRequest}, - {errors::kSetupUnavailable, chromeos::http::status_code::BadRequest}, - {errors::kDeviceBusy, chromeos::http::status_code::ServiceUnavailable}, - {errors::kInvalidState, chromeos::http::status_code::InternalServerError}, - {errors::kNotFound, chromeos::http::status_code::NotFound}, - {errors::kNotImplemented, chromeos::http::status_code::NotSupported}, + {errors::kInvalidClientCommitment, http::kForbidden}, + {errors::kInvalidFormat, http::kBadRequest}, + {errors::kMissingAuthorization, http::kDenied}, + {errors::kInvalidAuthorization, http::kDenied}, + {errors::kInvalidAuthorizationScope, http::kForbidden}, + {errors::kAuthorizationExpired, http::kForbidden}, + {errors::kCommitmentMismatch, http::kForbidden}, + {errors::kUnknownSession, http::kNotFound}, + {errors::kInvalidAuthCode, http::kForbidden}, + {errors::kInvalidAuthMode, http::kBadRequest}, + {errors::kInvalidRequestedScope, http::kBadRequest}, + {errors::kAccessDenied, http::kForbidden}, + {errors::kInvalidParams, http::kBadRequest}, + {errors::kSetupUnavailable, http::kBadRequest}, + {errors::kDeviceBusy, http::kServiceUnavailable}, + {errors::kInvalidState, http::kInternalServerError}, + {errors::kNotFound, http::kNotFound}, + {errors::kNotImplemented, http::kNotSupported}, }; AuthScope AuthScopeFromString(const std::string& scope, AuthScope auto_scope) { @@ -202,7 +201,7 @@ void ReturnError(const chromeos::Error& error, const PrivetHandler::RequestCallback& callback) { - int code = chromeos::http::status_code::InternalServerError; + int code = http::kInternalServerError; for (const auto& it : kReasonToCode) { if (error.HasError(errors::kDomain, it.reason)) { code = it.code; @@ -216,7 +215,7 @@ void OnCommandRequestSucceeded(const PrivetHandler::RequestCallback& callback, const base::DictionaryValue& output) { - callback.Run(chromeos::http::status_code::Ok, output); + callback.Run(http::kOk, output); } void OnCommandRequestFailed(const PrivetHandler::RequestCallback& callback, @@ -523,7 +522,7 @@ output.SetInteger(kInfoUptimeKey, device_->GetUptime().InSeconds()); - callback.Run(chromeos::http::status_code::Ok, output); + callback.Run(http::kOk, output); } void PrivetHandler::HandlePairingStart(const base::DictionaryValue& input, @@ -563,7 +562,7 @@ base::DictionaryValue output; output.SetString(kPairingSessionIdKey, id); output.SetString(kPairingDeviceCommitmentKey, commitment); - callback.Run(chromeos::http::status_code::Ok, output); + callback.Run(http::kOk, output); } void PrivetHandler::HandlePairingConfirm(const base::DictionaryValue& input, @@ -586,7 +585,7 @@ base::DictionaryValue output; output.SetString(kPairingFingerprintKey, fingerprint); output.SetString(kPairingSignatureKey, signature); - callback.Run(chromeos::http::status_code::Ok, output); + callback.Run(http::kOk, output); } void PrivetHandler::HandlePairingCancel(const base::DictionaryValue& input, @@ -600,7 +599,7 @@ return ReturnError(*error, callback); base::DictionaryValue output; - callback.Run(chromeos::http::status_code::Ok, output); + callback.Run(http::kOk, output); } void PrivetHandler::HandleAuth(const base::DictionaryValue& input, @@ -661,7 +660,7 @@ output.SetString(kAuthTokenTypeKey, kAuthorizationHeaderPrefix); output.SetInteger(kAuthExpiresInKey, kAccessTokenExpirationSeconds); output.SetString(kAuthScopeKey, EnumToString(requested_auth_scope)); - callback.Run(chromeos::http::status_code::Ok, output); + callback.Run(http::kOk, output); } void PrivetHandler::HandleSetupStart(const base::DictionaryValue& input, @@ -768,7 +767,7 @@ } } - callback.Run(chromeos::http::status_code::Ok, output); + callback.Run(http::kOk, output); } void PrivetHandler::HandleState(const base::DictionaryValue& input, @@ -779,7 +778,7 @@ output.Set(kStateKey, defs); output.SetString(kFingerprintKey, base::IntToString(state_fingerprint_)); - callback.Run(chromeos::http::status_code::Ok, output); + callback.Run(http::kOk, output); } void PrivetHandler::HandleCommandDefs(const base::DictionaryValue& input, @@ -791,7 +790,7 @@ output.SetString(kFingerprintKey, base::IntToString(command_defs_fingerprint_)); - callback.Run(chromeos::http::status_code::Ok, output); + callback.Run(http::kOk, output); } void PrivetHandler::HandleCommandsExecute(const base::DictionaryValue& input,
diff --git a/libweave/src/privet/privet_handler_unittest.cc b/libweave/src/privet/privet_handler_unittest.cc index 5ce3caf..d9877a1 100644 --- a/libweave/src/privet/privet_handler_unittest.cc +++ b/libweave/src/privet/privet_handler_unittest.cc
@@ -14,7 +14,6 @@ #include <base/run_loop.h> #include <base/strings/string_util.h> #include <base/values.h> -#include <chromeos/http/http_request.h> #include <gmock/gmock.h> #include <gtest/gtest.h> @@ -182,15 +181,15 @@ void HandlerCallback(int status, const base::DictionaryValue& output) { output_.MergeDictionary(&output); if (!output_.HasKey("error")) { - EXPECT_EQ(chromeos::http::status_code::Ok, status); + EXPECT_EQ(200, status); return; } - EXPECT_NE(chromeos::http::status_code::Ok, status); + EXPECT_NE(200, status); output_.SetInteger("error.http_status", status); } static void HandlerNoFound(int status, const base::DictionaryValue&) { - EXPECT_EQ(status, 404); + EXPECT_EQ(404, status); } base::MessageLoop message_loop_;
diff --git a/libweave/src/privet/privet_manager.cc b/libweave/src/privet/privet_manager.cc index 2f35fd9..c5b2fb8 100644 --- a/libweave/src/privet/privet_manager.cc +++ b/libweave/src/privet/privet_manager.cc
@@ -17,14 +17,13 @@ #include <base/strings/string_number_conversions.h> #include <base/values.h> #include <chromeos/flag_helper.h> -#include <chromeos/http/http_request.h> #include <chromeos/key_value_store.h> -#include <chromeos/mime_utils.h> #include <chromeos/strings/string_utils.h> #include <chromeos/syslog_logging.h> #include <weave/network.h> #include "libweave/src/device_registration_info.h" +#include "libweave/src/http_constants.h" #include "libweave/src/privet/cloud_delegate.h" #include "libweave/src/privet/constants.h" #include "libweave/src/privet/device_delegate.h" @@ -112,8 +111,7 @@ void Manager::PrivetRequestHandler( const HttpServer::Request& request, const HttpServer::OnReplyCallback& callback) { - std::string auth_header = - request.GetFirstHeader(chromeos::http::request_header::kAuthorization); + std::string auth_header = request.GetFirstHeader(http::kAuthorization); if (auth_header.empty() && disable_security_) auth_header = "Privet anonymous"; std::string data(request.GetData().begin(), request.GetData().end()); @@ -123,9 +121,11 @@ std::unique_ptr<base::Value> value; const base::DictionaryValue* dictionary = ∅ - std::string content_type = chromeos::mime::RemoveParameters( - request.GetFirstHeader(chromeos::http::request_header::kContentType)); - if (content_type == chromeos::mime::application::kJson) { + std::string content_type = + chromeos::string_utils::SplitAtFirst( + request.GetFirstHeader(http::kContentType), ";") + .first; + if (content_type == http::kJson) { value.reset(base::JSONReader::Read(data).release()); if (value) value->GetAsDictionary(&dictionary); @@ -144,13 +144,12 @@ std::string data; base::JSONWriter::WriteWithOptions( output, base::JSONWriter::OPTIONS_PRETTY_PRINT, &data); - callback.Run(status, data, chromeos::mime::application::kJson); + callback.Run(status, data, http::kJson); } void Manager::HelloWorldHandler(const HttpServer::Request& request, const HttpServer::OnReplyCallback& callback) { - callback.Run(chromeos::http::status_code::Ok, "Hello, world!", - chromeos::mime::text::kPlain); + callback.Run(http::kOk, "Hello, world!", http::kPlain); } void Manager::OnChanged() {