blob: 6a1c3b9e817b69cecd56176f7a39777dc002e2fd [file] [log] [blame]
Alex Vakulenko9cd5e272014-04-25 17:26:11 -07001// Copyright 2014 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_connection_fake.h"
6
7#include <base/logging.h>
8
9#include "buffet/http_request.h"
10#include "buffet/mime_utils.h"
11#include "buffet/string_utils.h"
12
13using namespace chromeos;
14using namespace chromeos::http::fake;
15
16Connection::Connection(const std::string& url, const std::string& method,
17 std::shared_ptr<http::Transport> transport) :
18 http::Connection(transport), request_(url, method) {
19 VLOG(1) << "fake::Connection created: " << method;
20}
21
22Connection::~Connection() {
23 VLOG(1) << "fake::Connection destroyed";
24}
25
26bool Connection::SendHeaders(const HeaderList& headers) {
27 request_.AddHeaders(headers);
28 return true;
29}
30
31bool Connection::WriteRequestData(const void* data, size_t size) {
32 request_.AddData(data, size);
33 return true;
34}
35
36bool Connection::FinishRequest() {
37 request_.AddHeaders({{request_header::kContentLength,
38 std::to_string(request_.GetData().size())}});
39 fake::Transport* transport = dynamic_cast<fake::Transport*>(transport_.get());
40 CHECK(transport) << "Expecting a fake transport";
41 auto handler = transport->GetHandler(request_.GetURL(), request_.GetMethod());
42 if (handler.is_null()) {
Alex Vakulenko8e34d392014-04-29 11:02:56 -070043 LOG(ERROR) << "Received unexpected " << request_.GetMethod()
44 << " request at " << request_.GetURL();
Alex Vakulenko9cd5e272014-04-25 17:26:11 -070045 response_.ReplyText(status_code::NotFound,
46 "<html><body>Not found</body></html>",
47 mime::text::kHtml);
48 } else {
49 handler.Run(request_, &response_);
50 }
51 return true;
52}
53
54int Connection::GetResponseStatusCode() const {
55 return response_.GetStatusCode();
56}
57
58std::string Connection::GetResponseStatusText() const {
59 return response_.GetStatusText();
60}
61
62std::string Connection::GetProtocolVersion() const {
63 return response_.GetProtocolVersion();
64}
65
66std::string Connection::GetResponseHeader(
67 const std::string& header_name) const {
68 return response_.GetHeader(header_name);
69}
70
71uint64_t Connection::GetResponseDataSize() const {
Alex Vakulenko28b31f52014-04-28 12:40:05 -070072 // HEAD requests must not return body.
73 return (request_.GetMethod() != request_type::kHead) ?
74 response_.GetData().size() : 0;
Alex Vakulenko9cd5e272014-04-25 17:26:11 -070075}
76
77bool Connection::ReadResponseData(void* data, size_t buffer_size,
78 size_t* size_read) {
79 size_t size_to_read = GetResponseDataSize() - response_data_ptr_;
80 if (size_to_read > buffer_size)
81 size_to_read = buffer_size;
Alex Vakulenko28b31f52014-04-28 12:40:05 -070082 if (size_to_read > 0)
83 memcpy(data, response_.GetData().data() + response_data_ptr_, size_to_read);
Alex Vakulenko9cd5e272014-04-25 17:26:11 -070084 if (size_read)
85 *size_read = size_to_read;
86 response_data_ptr_ += size_to_read;
87 return true;
88}
89
90std::string Connection::GetErrorMessage() const {
91 return std::string();
92}