Buffet: Move buffet over to platform2 from src/platform/buffet.
This change also open-sources buffet. The only change in this CL
is the removal of the Makefile and addition of the buffet.gyp file.
BUG=chromium:355180
TEST=USE=buffet emerge-gizmo platform2
Change-Id: Ibf8d3ac3f38313f82a9c07d79932b6f30130f9c5
diff --git a/buffet/http_utils.cc b/buffet/http_utils.cc
new file mode 100644
index 0000000..a921386
--- /dev/null
+++ b/buffet/http_utils.cc
@@ -0,0 +1,88 @@
+// Copyright 2014 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 "buffet/http_utils.h"
+
+#include <algorithm>
+#include <string.h>
+#include <base/values.h>
+#include <base/json/json_reader.h>
+#include <base/json/json_writer.h>
+
+#include "mime_utils.h"
+
+namespace chromeos {
+namespace http {
+
+std::unique_ptr<Response> Get(char const* url) {
+ Request request(url);
+ return request.GetResponse();
+}
+
+std::string GetAsString(char const* url) {
+ auto resp = Get(url);
+ return resp ? resp->GetDataAsString() : std::string();
+}
+
+std::unique_ptr<Response> Head(char const* url) {
+ Request request(url, request_type::kHead);
+ return request.GetResponse();
+}
+
+std::unique_ptr<Response> PostText(char const* url,
+ char const* data,
+ char const* mime_type) {
+ if (mime_type == nullptr) {
+ mime_type = chromeos::mime::application::kWwwFormUrlEncoded;
+ }
+
+ return PostBinary(url, data, strlen(data), mime_type);
+}
+
+std::unique_ptr<Response> PostBinary(char const* url, void const* data,
+ size_t data_size, char const* mime_type) {
+ if (mime_type == nullptr) {
+ mime_type = chromeos::mime::application::kOctet_stream;
+ }
+
+ Request request(url, request_type::kPost);
+ request.SetContentType(mime_type);
+ request.AddRequestBody(data, data_size);
+ return request.GetResponse();
+}
+
+std::unique_ptr<Response> PostJson(char const* url, base::Value const* json) {
+ std::string data;
+ base::JSONWriter::Write(json, &data);
+ return PostBinary(url, data.c_str(), data.size(), mime::application::kJson);
+}
+
+std::unique_ptr<base::Value> ParseJsonResponse(Response const* response,
+ std::string* error_message) {
+ std::unique_ptr<base::Value> value;
+ if (response) {
+ if (response->IsSuccessful()) {
+ // 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 = mime::RemoveParameters(response->GetContentType());
+ if (content_type == mime::application::kJson ||
+ content_type == mime::text::kPlain) {
+ std::string json = response->GetDataAsString();
+ value.reset(base::JSONReader::ReadAndReturnError(json,
+ base::JSON_PARSE_RFC,
+ nullptr,
+ error_message));
+ }
+ else if (error_message) {
+ *error_message = "Unexpected response content type: " + content_type;
+ }
+ }
+ } else if (error_message) {
+ *error_message = "NULL response.";
+ }
+ return value;
+}
+
+} // namespace http
+} // namespace chromeos