blob: 383f6d4fdfbe8d0f71d999e64cdfd82499ba042c [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
Alex Vakulenkoaf23b322014-05-08 16:25:45 -070013namespace buffet {
Alex Vakulenkob3aac252014-05-07 17:35:24 -070014namespace http {
15namespace fake {
Alex Vakulenko9cd5e272014-04-25 17:26:11 -070016
17Connection::Connection(const std::string& url, const std::string& method,
18 std::shared_ptr<http::Transport> transport) :
19 http::Connection(transport), request_(url, method) {
20 VLOG(1) << "fake::Connection created: " << method;
21}
22
23Connection::~Connection() {
24 VLOG(1) << "fake::Connection destroyed";
25}
26
Alex Vakulenkob3aac252014-05-07 17:35:24 -070027bool Connection::SendHeaders(const HeaderList& headers, ErrorPtr* error) {
Alex Vakulenko9cd5e272014-04-25 17:26:11 -070028 request_.AddHeaders(headers);
29 return true;
30}
31
Alex Vakulenkob3aac252014-05-07 17:35:24 -070032bool Connection::WriteRequestData(const void* data, size_t size,
33 ErrorPtr* error) {
Alex Vakulenko9cd5e272014-04-25 17:26:11 -070034 request_.AddData(data, size);
35 return true;
36}
37
Alex Vakulenkob3aac252014-05-07 17:35:24 -070038bool Connection::FinishRequest(ErrorPtr* error) {
Alex Vakulenko9cd5e272014-04-25 17:26:11 -070039 request_.AddHeaders({{request_header::kContentLength,
Alex Vakulenko96c84d32014-06-06 11:07:32 -070040 string_utils::ToString(request_.GetData().size())}});
Alex Vakulenkob3aac252014-05-07 17:35:24 -070041 fake::Transport* transport = static_cast<fake::Transport*>(transport_.get());
Alex Vakulenko9cd5e272014-04-25 17:26:11 -070042 CHECK(transport) << "Expecting a fake transport";
43 auto handler = transport->GetHandler(request_.GetURL(), request_.GetMethod());
44 if (handler.is_null()) {
Alex Vakulenko8e34d392014-04-29 11:02:56 -070045 LOG(ERROR) << "Received unexpected " << request_.GetMethod()
46 << " request at " << request_.GetURL();
Alex Vakulenko9cd5e272014-04-25 17:26:11 -070047 response_.ReplyText(status_code::NotFound,
48 "<html><body>Not found</body></html>",
49 mime::text::kHtml);
50 } else {
51 handler.Run(request_, &response_);
52 }
53 return true;
54}
55
56int Connection::GetResponseStatusCode() const {
57 return response_.GetStatusCode();
58}
59
60std::string Connection::GetResponseStatusText() const {
61 return response_.GetStatusText();
62}
63
64std::string Connection::GetProtocolVersion() const {
65 return response_.GetProtocolVersion();
66}
67
68std::string Connection::GetResponseHeader(
69 const std::string& header_name) const {
70 return response_.GetHeader(header_name);
71}
72
73uint64_t Connection::GetResponseDataSize() const {
Alex Vakulenko28b31f52014-04-28 12:40:05 -070074 // HEAD requests must not return body.
75 return (request_.GetMethod() != request_type::kHead) ?
76 response_.GetData().size() : 0;
Alex Vakulenko9cd5e272014-04-25 17:26:11 -070077}
78
79bool Connection::ReadResponseData(void* data, size_t buffer_size,
Alex Vakulenkob3aac252014-05-07 17:35:24 -070080 size_t* size_read, ErrorPtr* error) {
Alex Vakulenko9cd5e272014-04-25 17:26:11 -070081 size_t size_to_read = GetResponseDataSize() - response_data_ptr_;
82 if (size_to_read > buffer_size)
83 size_to_read = buffer_size;
Alex Vakulenko28b31f52014-04-28 12:40:05 -070084 if (size_to_read > 0)
85 memcpy(data, response_.GetData().data() + response_data_ptr_, size_to_read);
Alex Vakulenko9cd5e272014-04-25 17:26:11 -070086 if (size_read)
87 *size_read = size_to_read;
88 response_data_ptr_ += size_to_read;
89 return true;
90}
91
Alex Vakulenkob3aac252014-05-07 17:35:24 -070092} // namespace fake
93} // namespace http
Alex Vakulenkoaf23b322014-05-08 16:25:45 -070094} // namespace buffet