1// Copyright (c) 2012 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/memory/scoped_ptr.h" 8#include "net/http/http_request_info.h" 9#include "net/http/http_response_body_drainer.h" 10#include "net/http/http_stream_parser.h" 11#include "net/socket/client_socket_handle.h" 12 13namespace net { 14 15HttpBasicStream::HttpBasicStream(ClientSocketHandle* connection, 16 bool using_proxy) 17 : state_(connection, using_proxy) {} 18 19HttpBasicStream::~HttpBasicStream() {} 20 21int HttpBasicStream::InitializeStream(const HttpRequestInfo* request_info, 22 RequestPriority priority, 23 const BoundNetLog& net_log, 24 const CompletionCallback& callback) { 25 state_.Initialize(request_info, priority, net_log, callback); 26 return OK; 27} 28 29int HttpBasicStream::SendRequest(const HttpRequestHeaders& headers, 30 HttpResponseInfo* response, 31 const CompletionCallback& callback) { 32 DCHECK(parser()); 33 return parser()->SendRequest( 34 state_.GenerateRequestLine(), headers, response, callback); 35} 36 37UploadProgress HttpBasicStream::GetUploadProgress() const { 38 return parser()->GetUploadProgress(); 39} 40 41int HttpBasicStream::ReadResponseHeaders(const CompletionCallback& callback) { 42 return parser()->ReadResponseHeaders(callback); 43} 44 45const HttpResponseInfo* HttpBasicStream::GetResponseInfo() const { 46 return parser()->GetResponseInfo(); 47} 48 49int HttpBasicStream::ReadResponseBody(IOBuffer* buf, 50 int buf_len, 51 const CompletionCallback& callback) { 52 return parser()->ReadResponseBody(buf, buf_len, callback); 53} 54 55void HttpBasicStream::Close(bool not_reusable) { 56 parser()->Close(not_reusable); 57} 58 59HttpStream* HttpBasicStream::RenewStreamForAuth() { 60 DCHECK(IsResponseBodyComplete()); 61 DCHECK(!parser()->IsMoreDataBuffered()); 62 // The HttpStreamParser object still has a pointer to the connection. Just to 63 // be extra-sure it doesn't touch the connection again, delete it here rather 64 // than leaving it until the destructor is called. 65 state_.DeleteParser(); 66 return new HttpBasicStream(state_.ReleaseConnection().release(), 67 state_.using_proxy()); 68} 69 70bool HttpBasicStream::IsResponseBodyComplete() const { 71 return parser()->IsResponseBodyComplete(); 72} 73 74bool HttpBasicStream::CanFindEndOfResponse() const { 75 return parser()->CanFindEndOfResponse(); 76} 77 78bool HttpBasicStream::IsConnectionReused() const { 79 return parser()->IsConnectionReused(); 80} 81 82void HttpBasicStream::SetConnectionReused() { parser()->SetConnectionReused(); } 83 84bool HttpBasicStream::IsConnectionReusable() const { 85 return parser()->IsConnectionReusable(); 86} 87 88int64 HttpBasicStream::GetTotalReceivedBytes() const { 89 return parser()->received_bytes(); 90} 91 92bool HttpBasicStream::GetLoadTimingInfo( 93 LoadTimingInfo* load_timing_info) const { 94 return state_.connection()->GetLoadTimingInfo(IsConnectionReused(), 95 load_timing_info); 96} 97 98void HttpBasicStream::GetSSLInfo(SSLInfo* ssl_info) { 99 parser()->GetSSLInfo(ssl_info); 100} 101 102void HttpBasicStream::GetSSLCertRequestInfo( 103 SSLCertRequestInfo* cert_request_info) { 104 parser()->GetSSLCertRequestInfo(cert_request_info); 105} 106 107bool HttpBasicStream::IsSpdyHttpStream() const { return false; } 108 109void HttpBasicStream::Drain(HttpNetworkSession* session) { 110 HttpResponseBodyDrainer* drainer = new HttpResponseBodyDrainer(this); 111 drainer->Start(session); 112 // |drainer| will delete itself. 113} 114 115void HttpBasicStream::SetPriority(RequestPriority priority) { 116 // TODO(akalin): Plumb this through to |connection_|. 117} 118 119} // namespace net 120