blob: 9ebb5e32d866ee7c31ac007f112050d688cffd19 [file] [log] [blame]
[email protected]5f9205f2012-06-14 19:55:231// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]0877e3d2009-10-17 22:29:572// 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_stream.h"
6
danakj1fd259a02016-04-16 03:17:097#include <memory>
8
[email protected]b94f92d2010-10-27 16:45:209#include "net/http/http_request_info.h"
[email protected]5a60c8b2011-10-19 20:14:2910#include "net/http/http_response_body_drainer.h"
[email protected]277d5942010-08-11 21:02:3511#include "net/http/http_stream_parser.h"
[email protected]4d4a5162010-09-21 22:44:0412#include "net/socket/client_socket_handle.h"
[email protected]277d5942010-08-11 21:02:3513
[email protected]0877e3d2009-10-17 22:29:5714namespace net {
15
[email protected]b94f92d2010-10-27 16:45:2016HttpBasicStream::HttpBasicStream(ClientSocketHandle* connection,
17 bool using_proxy)
[email protected]f7c21732013-10-27 09:38:5818 : state_(connection, using_proxy) {}
[email protected]0877e3d2009-10-17 22:29:5719
[email protected]d100e44f2011-01-26 22:47:1120HttpBasicStream::~HttpBasicStream() {}
21
[email protected]f7c21732013-10-27 09:38:5822int HttpBasicStream::InitializeStream(const HttpRequestInfo* request_info,
23 RequestPriority priority,
24 const BoundNetLog& net_log,
25 const CompletionCallback& callback) {
26 state_.Initialize(request_info, priority, net_log, callback);
[email protected]c638a85a2010-07-29 18:41:4027 return OK;
28}
29
[email protected]b94f92d2010-10-27 16:45:2030int HttpBasicStream::SendRequest(const HttpRequestHeaders& headers,
[email protected]a7e41312009-12-16 23:18:1431 HttpResponseInfo* response,
[email protected]49639fa2011-12-20 23:22:4132 const CompletionCallback& callback) {
[email protected]f7c21732013-10-27 09:38:5833 DCHECK(parser());
34 return parser()->SendRequest(
35 state_.GenerateRequestLine(), headers, response, callback);
[email protected]0877e3d2009-10-17 22:29:5736}
37
[email protected]196d18a2012-08-30 03:47:3138UploadProgress HttpBasicStream::GetUploadProgress() const {
[email protected]f7c21732013-10-27 09:38:5839 return parser()->GetUploadProgress();
[email protected]0877e3d2009-10-17 22:29:5740}
41
[email protected]49639fa2011-12-20 23:22:4142int HttpBasicStream::ReadResponseHeaders(const CompletionCallback& callback) {
[email protected]f7c21732013-10-27 09:38:5843 return parser()->ReadResponseHeaders(callback);
[email protected]0877e3d2009-10-17 22:29:5744}
45
[email protected]f7c21732013-10-27 09:38:5846int HttpBasicStream::ReadResponseBody(IOBuffer* buf,
47 int buf_len,
[email protected]49639fa2011-12-20 23:22:4148 const CompletionCallback& callback) {
[email protected]f7c21732013-10-27 09:38:5849 return parser()->ReadResponseBody(buf, buf_len, callback);
[email protected]0877e3d2009-10-17 22:29:5750}
51
[email protected]8e6441ca2010-08-19 05:56:3852void HttpBasicStream::Close(bool not_reusable) {
[email protected]f7c21732013-10-27 09:38:5853 parser()->Close(not_reusable);
[email protected]8e6441ca2010-08-19 05:56:3854}
55
[email protected]697ef4c2010-10-14 16:38:5856HttpStream* HttpBasicStream::RenewStreamForAuth() {
57 DCHECK(IsResponseBodyComplete());
[email protected]f7c21732013-10-27 09:38:5858 DCHECK(!parser()->IsMoreDataBuffered());
[email protected]b0c35142013-11-02 03:37:0659 // The HttpStreamParser object still has a pointer to the connection. Just to
60 // be extra-sure it doesn't touch the connection again, delete it here rather
61 // than leaving it until the destructor is called.
[email protected]f7c21732013-10-27 09:38:5862 state_.DeleteParser();
63 return new HttpBasicStream(state_.ReleaseConnection().release(),
64 state_.using_proxy());
[email protected]697ef4c2010-10-14 16:38:5865}
66
[email protected]0877e3d2009-10-17 22:29:5767bool HttpBasicStream::IsResponseBodyComplete() const {
[email protected]f7c21732013-10-27 09:38:5868 return parser()->IsResponseBodyComplete();
[email protected]0877e3d2009-10-17 22:29:5769}
70
[email protected]8e6441ca2010-08-19 05:56:3871bool HttpBasicStream::IsConnectionReused() const {
[email protected]f7c21732013-10-27 09:38:5872 return parser()->IsConnectionReused();
[email protected]8e6441ca2010-08-19 05:56:3873}
74
[email protected]f7c21732013-10-27 09:38:5875void HttpBasicStream::SetConnectionReused() { parser()->SetConnectionReused(); }
[email protected]8e6441ca2010-08-19 05:56:3876
mmenkebd84c392015-09-02 14:12:3477bool HttpBasicStream::CanReuseConnection() const {
78 return parser()->CanReuseConnection();
[email protected]2d0a4f92011-05-05 16:38:4679}
80
sclittle4de1bab92015-09-22 21:28:2481int64_t HttpBasicStream::GetTotalReceivedBytes() const {
[email protected]b8015c42013-12-24 15:18:1982 if (parser())
83 return parser()->received_bytes();
84 return 0;
[email protected]bc92bc972013-12-13 08:32:5985}
86
sclittlebe1ccf62015-09-02 19:40:3687int64_t HttpBasicStream::GetTotalSentBytes() const {
88 if (parser())
89 return parser()->sent_bytes();
90 return 0;
91}
92
[email protected]b258e0792013-01-12 07:11:5993bool HttpBasicStream::GetLoadTimingInfo(
94 LoadTimingInfo* load_timing_info) const {
[email protected]f7c21732013-10-27 09:38:5895 return state_.connection()->GetLoadTimingInfo(IsConnectionReused(),
96 load_timing_info);
[email protected]b258e0792013-01-12 07:11:5997}
98
[email protected]8e6441ca2010-08-19 05:56:3899void HttpBasicStream::GetSSLInfo(SSLInfo* ssl_info) {
[email protected]f7c21732013-10-27 09:38:58100 parser()->GetSSLInfo(ssl_info);
[email protected]8e6441ca2010-08-19 05:56:38101}
102
103void HttpBasicStream::GetSSLCertRequestInfo(
104 SSLCertRequestInfo* cert_request_info) {
[email protected]f7c21732013-10-27 09:38:58105 parser()->GetSSLCertRequestInfo(cert_request_info);
[email protected]8e6441ca2010-08-19 05:56:38106}
107
ttuttled9dbc652015-09-29 20:00:59108bool HttpBasicStream::GetRemoteEndpoint(IPEndPoint* endpoint) {
109 if (!state_.connection() || !state_.connection()->socket())
110 return false;
111
112 return state_.connection()->socket()->GetPeerAddress(endpoint) == OK;
113}
114
nharperb7441ef2016-01-25 23:54:14115Error HttpBasicStream::GetSignedEKMForTokenBinding(crypto::ECPrivateKey* key,
116 std::vector<uint8_t>* out) {
117 return parser()->GetSignedEKMForTokenBinding(key, out);
118}
119
[email protected]5a60c8b2011-10-19 20:14:29120void HttpBasicStream::Drain(HttpNetworkSession* session) {
121 HttpResponseBodyDrainer* drainer = new HttpResponseBodyDrainer(this);
122 drainer->Start(session);
123 // |drainer| will delete itself.
124}
125
zhongyi2ed4a6a2016-02-26 19:45:42126void HttpBasicStream::PopulateNetErrorDetails(NetErrorDetails* details) {
127 details->connection_info = HttpResponseInfo::CONNECTION_INFO_HTTP1;
zhongyica364fbb2015-12-12 03:39:12128 return;
129}
130
[email protected]e86839fd2013-08-14 18:29:03131void HttpBasicStream::SetPriority(RequestPriority priority) {
132 // TODO(akalin): Plumb this through to |connection_|.
133}
134
[email protected]0877e3d2009-10-17 22:29:57135} // namespace net