blob: ab06e36fddff17d06b5709b10b770bd3d865d3c3 [file] [log] [blame]
Vitaly Buka00882b72015-08-06 00:32:11 -07001// Copyright 2015 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "buffet/http_transport_client.h"
6
7#include <base/bind.h>
8#include <chromeos/errors/error.h>
9#include <chromeos/http/http_request.h>
10#include <chromeos/http/http_utils.h>
Vitaly Buka86852562015-08-06 11:06:25 -070011#include <chromeos/streams/memory_stream.h>
Vitaly Buka00882b72015-08-06 00:32:11 -070012
Vitaly Buka4f771532015-08-14 14:58:39 -070013#include "buffet/weave_error_conversion.h"
14
Vitaly Buka00882b72015-08-06 00:32:11 -070015namespace buffet {
16
17namespace {
18
19// The number of seconds each HTTP request will be allowed before timing out.
20const int kRequestTimeoutSeconds = 30;
21
22class ResponseImpl : public weave::HttpClient::Response {
23 public:
24 ~ResponseImpl() override = default;
25 explicit ResponseImpl(std::unique_ptr<chromeos::http::Response> response)
26 : response_{std::move(response)},
27 data_{response_->ExtractDataAsString()} {}
28
29 // weave::HttpClient::Response implementation
30 int GetStatusCode() const override { return response_->GetStatusCode(); }
31
32 std::string GetContentType() const override {
33 return response_->GetContentType();
34 }
35
36 const std::string& GetData() const override { return data_; }
37
38 private:
39 std::unique_ptr<chromeos::http::Response> response_;
40 std::string data_;
41 DISALLOW_COPY_AND_ASSIGN(ResponseImpl);
42};
43
44void OnSuccessCallback(
45 const weave::HttpClient::SuccessCallback& success_callback,
46 int id,
47 std::unique_ptr<chromeos::http::Response> response) {
48 success_callback.Run(id, ResponseImpl{std::move(response)});
49}
50
51void OnErrorCallback(const weave::HttpClient::ErrorCallback& error_callback,
52 int id,
Vitaly Buka4f771532015-08-14 14:58:39 -070053 const chromeos::Error* chromeos_error) {
54 weave::ErrorPtr error;
55 ConvertError(*chromeos_error, &error);
56 error_callback.Run(id, error.get());
Vitaly Buka00882b72015-08-06 00:32:11 -070057}
58
59} // anonymous namespace
60
61HttpTransportClient::HttpTransportClient()
62 : transport_{chromeos::http::Transport::CreateDefault()} {
63 transport_->SetDefaultTimeout(
64 base::TimeDelta::FromSeconds(kRequestTimeoutSeconds));
65}
66
67HttpTransportClient::~HttpTransportClient() {}
68
69std::unique_ptr<weave::HttpClient::Response>
70HttpTransportClient::SendRequestAndBlock(const std::string& method,
71 const std::string& url,
Vitaly Buka00882b72015-08-06 00:32:11 -070072 const Headers& headers,
Vitaly Buka6d5f22d2015-08-06 11:06:25 -070073 const std::string& data,
Vitaly Buka4f771532015-08-14 14:58:39 -070074 weave::ErrorPtr* error) {
Vitaly Buka86852562015-08-06 11:06:25 -070075 chromeos::http::Request request(url, method, transport_);
76 request.AddHeaders(headers);
77 if (!data.empty()) {
Vitaly Buka4f771532015-08-14 14:58:39 -070078 chromeos::ErrorPtr cromeos_error;
79 if (!request.AddRequestBody(data.data(), data.size(), &cromeos_error)) {
80 ConvertError(*cromeos_error, error);
Vitaly Buka86852562015-08-06 11:06:25 -070081 return nullptr;
Vitaly Buka4f771532015-08-14 14:58:39 -070082 }
Vitaly Buka86852562015-08-06 11:06:25 -070083 }
Alex Vakulenkof4e81022015-08-12 14:25:36 -070084
Vitaly Buka4f771532015-08-14 14:58:39 -070085 chromeos::ErrorPtr cromeos_error;
86 auto response = request.GetResponseAndBlock(&cromeos_error);
87 if (!response) {
88 ConvertError(*cromeos_error, error);
Alex Vakulenkof4e81022015-08-12 14:25:36 -070089 return nullptr;
Vitaly Buka4f771532015-08-14 14:58:39 -070090 }
Alex Vakulenkof4e81022015-08-12 14:25:36 -070091
92 return std::unique_ptr<weave::HttpClient::Response>{
93 new ResponseImpl{std::move(response)}};
Vitaly Buka00882b72015-08-06 00:32:11 -070094}
95
96int HttpTransportClient::SendRequest(const std::string& method,
97 const std::string& url,
Vitaly Buka00882b72015-08-06 00:32:11 -070098 const Headers& headers,
Vitaly Buka6d5f22d2015-08-06 11:06:25 -070099 const std::string& data,
Vitaly Buka00882b72015-08-06 00:32:11 -0700100 const SuccessCallback& success_callback,
101 const ErrorCallback& error_callback) {
Vitaly Buka86852562015-08-06 11:06:25 -0700102 chromeos::http::Request request(url, method, transport_);
103 request.AddHeaders(headers);
104 if (!data.empty()) {
105 auto stream = chromeos::MemoryStream::OpenCopyOf(data, nullptr);
106 CHECK_GT(stream->GetRemainingSize(), 0);
Vitaly Buka4f771532015-08-14 14:58:39 -0700107 chromeos::ErrorPtr cromeos_error;
108 if (!request.AddRequestBody(std::move(stream), &cromeos_error)) {
109 weave::ErrorPtr error;
110 ConvertError(*cromeos_error, &error);
Vitaly Buka86852562015-08-06 11:06:25 -0700111 transport_->RunCallbackAsync(
112 FROM_HERE,
113 base::Bind(error_callback, 0, base::Owned(error.release())));
114 return 0;
115 }
116 }
117 return request.GetResponse(base::Bind(&OnSuccessCallback, success_callback),
118 base::Bind(&OnErrorCallback, error_callback));
Vitaly Buka00882b72015-08-06 00:32:11 -0700119}
120
121} // namespace buffet