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 = &empty;
 
-  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() {