blob: 90a2212ca1b3cd6901673617d544d3912ddbb81f [file] [log] [blame]
[email protected]f7c21732013-10-27 09:38:581// Copyright 2013 The Chromium 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 "net/http/http_basic_state.h"
6
dchengc7eeda422015-12-26 03:56:487#include <utility>
8
[email protected]f7c21732013-10-27 09:38:589#include "base/logging.h"
10#include "net/base/io_buffer.h"
11#include "net/http/http_request_info.h"
12#include "net/http/http_response_body_drainer.h"
13#include "net/http/http_stream_parser.h"
14#include "net/http/http_util.h"
15#include "net/socket/client_socket_handle.h"
16#include "url/gurl.h"
17
18namespace net {
19
bnc3faa41e2016-08-18 14:16:1820HttpBasicState::HttpBasicState(std::unique_ptr<ClientSocketHandle> connection,
mmenkea7da6da2016-09-01 21:56:5221 bool using_proxy,
22 bool http_09_on_non_default_ports_enabled)
[email protected]f7c21732013-10-27 09:38:5823 : read_buf_(new GrowableIOBuffer()),
bnc3faa41e2016-08-18 14:16:1824 connection_(std::move(connection)),
[email protected]f7c21732013-10-27 09:38:5825 using_proxy_(using_proxy),
mmenkea7da6da2016-09-01 21:56:5226 http_09_on_non_default_ports_enabled_(
shivanisha0b440852016-10-18 15:48:1527 http_09_on_non_default_ports_enabled) {}
[email protected]f7c21732013-10-27 09:38:5828
29HttpBasicState::~HttpBasicState() {}
30
31int HttpBasicState::Initialize(const HttpRequestInfo* request_info,
32 RequestPriority priority,
tfarina428341112016-09-22 13:38:2033 const NetLogWithSource& net_log,
[email protected]f7c21732013-10-27 09:38:5834 const CompletionCallback& callback) {
35 DCHECK(!parser_.get());
shivanisha0b440852016-10-18 15:48:1536 url_ = request_info->url;
37 request_method_ = request_info->method;
[email protected]f7c21732013-10-27 09:38:5838 parser_.reset(new HttpStreamParser(
39 connection_.get(), request_info, read_buf_.get(), net_log));
mmenkea7da6da2016-09-01 21:56:5240 parser_->set_http_09_on_non_default_ports_enabled(
41 http_09_on_non_default_ports_enabled_);
[email protected]f7c21732013-10-27 09:38:5842 return OK;
43}
44
danakj1fd259a02016-04-16 03:17:0945std::unique_ptr<ClientSocketHandle> HttpBasicState::ReleaseConnection() {
dchengc7eeda422015-12-26 03:56:4846 return std::move(connection_);
[email protected]f7c21732013-10-27 09:38:5847}
48
[email protected]d51365e2013-11-27 10:46:5249scoped_refptr<GrowableIOBuffer> HttpBasicState::read_buf() const {
50 return read_buf_;
51}
52
[email protected]f7c21732013-10-27 09:38:5853void HttpBasicState::DeleteParser() { parser_.reset(); }
54
55std::string HttpBasicState::GenerateRequestLine() const {
56 static const char kSuffix[] = " HTTP/1.1\r\n";
57 const size_t kSuffixLen = arraysize(kSuffix) - 1;
nharper834c49b2015-06-03 23:46:4358 const std::string path =
shivanisha0b440852016-10-18 15:48:1559 using_proxy_ ? HttpUtil::SpecForRequest(url_) : url_.PathForRequest();
[email protected]f7c21732013-10-27 09:38:5860 // Don't use StringPrintf for concatenation because it is very inefficient.
61 std::string request_line;
shivanisha0b440852016-10-18 15:48:1562 const size_t expected_size =
63 request_method_.size() + 1 + path.size() + kSuffixLen;
[email protected]f7c21732013-10-27 09:38:5864 request_line.reserve(expected_size);
shivanisha0b440852016-10-18 15:48:1565 request_line.append(request_method_);
[email protected]f7c21732013-10-27 09:38:5866 request_line.append(1, ' ');
67 request_line.append(path);
68 request_line.append(kSuffix, kSuffixLen);
69 DCHECK_EQ(expected_size, request_line.size());
70 return request_line;
71}
72
73} // namespace net