// Copyright 2015 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "buffet/http_transport_client.h" #include #include #include #include #include #include #include "buffet/weave_error_conversion.h" namespace buffet { namespace { using weave::provider::HttpClient; // The number of seconds each HTTP request will be allowed before timing out. const int kRequestTimeoutSeconds = 30; class ResponseImpl : public HttpClient::Response { public: ~ResponseImpl() override = default; explicit ResponseImpl(std::unique_ptr response) : response_{std::move(response)}, data_{response_->ExtractDataAsString()} {} // HttpClient::Response implementation int GetStatusCode() const override { return response_->GetStatusCode(); } std::string GetContentType() const override { return response_->GetContentType(); } std::string GetData() const override { return data_; } private: std::unique_ptr response_; std::string data_; DISALLOW_COPY_AND_ASSIGN(ResponseImpl); }; void OnSuccessCallback(const HttpClient::SendRequestCallback& callback, int id, std::unique_ptr response) { callback.Run(std::unique_ptr{new ResponseImpl{ std::move(response)}}, nullptr); } void OnErrorCallback(const HttpClient::SendRequestCallback& callback, int id, const brillo::Error* brillo_error) { weave::ErrorPtr error; ConvertError(*brillo_error, &error); callback.Run(nullptr, std::move(error)); } } // anonymous namespace HttpTransportClient::HttpTransportClient() : transport_{brillo::http::Transport::CreateDefault()} { transport_->SetDefaultTimeout( base::TimeDelta::FromSeconds(kRequestTimeoutSeconds)); } HttpTransportClient::~HttpTransportClient() {} void HttpTransportClient::SendRequest(Method method, const std::string& url, const Headers& headers, const std::string& data, const SendRequestCallback& callback) { brillo::http::Request request(url, weave::EnumToString(method), transport_); request.AddHeaders(headers); if (!data.empty()) { auto stream = brillo::MemoryStream::OpenCopyOf(data, nullptr); CHECK(stream->GetRemainingSize()); brillo::ErrorPtr cromeos_error; if (!request.AddRequestBody(std::move(stream), &cromeos_error)) { weave::ErrorPtr error; ConvertError(*cromeos_error, &error); transport_->RunCallbackAsync( FROM_HERE, base::Bind(callback, nullptr, base::Passed(&error))); return; } } request.GetResponse(base::Bind(&OnSuccessCallback, callback), base::Bind(&OnErrorCallback, callback)); } } // namespace buffet