1 // Copyright (c) 2011 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_stream.h"
6
7 #include "base/stringprintf.h"
8 #include "net/base/io_buffer.h"
9 #include "net/base/net_errors.h"
10 #include "net/http/http_request_headers.h"
11 #include "net/http/http_request_info.h"
12 #include "net/http/http_stream_parser.h"
13 #include "net/http/http_util.h"
14 #include "net/socket/client_socket_handle.h"
15
16 namespace net {
17
HttpBasicStream(ClientSocketHandle * connection,HttpStreamParser * parser,bool using_proxy)18 HttpBasicStream::HttpBasicStream(ClientSocketHandle* connection,
19 HttpStreamParser* parser,
20 bool using_proxy)
21 : read_buf_(new GrowableIOBuffer()),
22 parser_(parser),
23 connection_(connection),
24 using_proxy_(using_proxy),
25 request_info_(NULL) {
26 }
27
~HttpBasicStream()28 HttpBasicStream::~HttpBasicStream() {}
29
InitializeStream(const HttpRequestInfo * request_info,const BoundNetLog & net_log,CompletionCallback * callback)30 int HttpBasicStream::InitializeStream(const HttpRequestInfo* request_info,
31 const BoundNetLog& net_log,
32 CompletionCallback* callback) {
33 DCHECK(!parser_.get());
34 request_info_ = request_info;
35 parser_.reset(new HttpStreamParser(connection_.get(), request_info,
36 read_buf_, net_log));
37 return OK;
38 }
39
40
SendRequest(const HttpRequestHeaders & headers,UploadDataStream * request_body,HttpResponseInfo * response,CompletionCallback * callback)41 int HttpBasicStream::SendRequest(const HttpRequestHeaders& headers,
42 UploadDataStream* request_body,
43 HttpResponseInfo* response,
44 CompletionCallback* callback) {
45 DCHECK(parser_.get());
46 DCHECK(request_info_);
47 const std::string path = using_proxy_ ?
48 HttpUtil::SpecForRequest(request_info_->url) :
49 HttpUtil::PathForRequest(request_info_->url);
50 request_line_ = base::StringPrintf("%s %s HTTP/1.1\r\n",
51 request_info_->method.c_str(),
52 path.c_str());
53 return parser_->SendRequest(request_line_, headers, request_body, response,
54 callback);
55 }
56
GetUploadProgress() const57 uint64 HttpBasicStream::GetUploadProgress() const {
58 return parser_->GetUploadProgress();
59 }
60
ReadResponseHeaders(CompletionCallback * callback)61 int HttpBasicStream::ReadResponseHeaders(CompletionCallback* callback) {
62 return parser_->ReadResponseHeaders(callback);
63 }
64
GetResponseInfo() const65 const HttpResponseInfo* HttpBasicStream::GetResponseInfo() const {
66 return parser_->GetResponseInfo();
67 }
68
ReadResponseBody(IOBuffer * buf,int buf_len,CompletionCallback * callback)69 int HttpBasicStream::ReadResponseBody(IOBuffer* buf, int buf_len,
70 CompletionCallback* callback) {
71 return parser_->ReadResponseBody(buf, buf_len, callback);
72 }
73
Close(bool not_reusable)74 void HttpBasicStream::Close(bool not_reusable) {
75 parser_->Close(not_reusable);
76 }
77
RenewStreamForAuth()78 HttpStream* HttpBasicStream::RenewStreamForAuth() {
79 DCHECK(IsResponseBodyComplete());
80 DCHECK(!IsMoreDataBuffered());
81 parser_.reset();
82 return new HttpBasicStream(connection_.release(), NULL, using_proxy_);
83 }
84
IsResponseBodyComplete() const85 bool HttpBasicStream::IsResponseBodyComplete() const {
86 return parser_->IsResponseBodyComplete();
87 }
88
CanFindEndOfResponse() const89 bool HttpBasicStream::CanFindEndOfResponse() const {
90 return parser_->CanFindEndOfResponse();
91 }
92
IsMoreDataBuffered() const93 bool HttpBasicStream::IsMoreDataBuffered() const {
94 return parser_->IsMoreDataBuffered();
95 }
96
IsConnectionReused() const97 bool HttpBasicStream::IsConnectionReused() const {
98 return parser_->IsConnectionReused();
99 }
100
SetConnectionReused()101 void HttpBasicStream::SetConnectionReused() {
102 parser_->SetConnectionReused();
103 }
104
IsConnectionReusable() const105 bool HttpBasicStream::IsConnectionReusable() const {
106 return parser_->IsConnectionReusable();
107 }
108
GetSSLInfo(SSLInfo * ssl_info)109 void HttpBasicStream::GetSSLInfo(SSLInfo* ssl_info) {
110 parser_->GetSSLInfo(ssl_info);
111 }
112
GetSSLCertRequestInfo(SSLCertRequestInfo * cert_request_info)113 void HttpBasicStream::GetSSLCertRequestInfo(
114 SSLCertRequestInfo* cert_request_info) {
115 parser_->GetSSLCertRequestInfo(cert_request_info);
116 }
117
IsSpdyHttpStream() const118 bool HttpBasicStream::IsSpdyHttpStream() const {
119 return false;
120 }
121
122 } // namespace net
123