diff options
Diffstat (limited to 'chromium/net/http/http_basic_stream.cc')
-rw-r--r-- | chromium/net/http/http_basic_stream.cc | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/chromium/net/http/http_basic_stream.cc b/chromium/net/http/http_basic_stream.cc new file mode 100644 index 00000000000..c30e17d6203 --- /dev/null +++ b/chromium/net/http/http_basic_stream.cc @@ -0,0 +1,134 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/http/http_basic_stream.h" + +#include "base/strings/stringprintf.h" +#include "net/base/io_buffer.h" +#include "net/base/net_errors.h" +#include "net/http/http_request_headers.h" +#include "net/http/http_request_info.h" +#include "net/http/http_response_body_drainer.h" +#include "net/http/http_stream_parser.h" +#include "net/http/http_util.h" +#include "net/socket/client_socket_handle.h" + +namespace net { + +HttpBasicStream::HttpBasicStream(ClientSocketHandle* connection, + HttpStreamParser* parser, + bool using_proxy) + : read_buf_(new GrowableIOBuffer()), + parser_(parser), + connection_(connection), + using_proxy_(using_proxy), + request_info_(NULL) { +} + +HttpBasicStream::~HttpBasicStream() {} + +int HttpBasicStream::InitializeStream( + const HttpRequestInfo* request_info, + RequestPriority priority, + const BoundNetLog& net_log, + const CompletionCallback& callback) { + DCHECK(!parser_.get()); + request_info_ = request_info; + parser_.reset(new HttpStreamParser( + connection_.get(), request_info, read_buf_.get(), net_log)); + return OK; +} + + +int HttpBasicStream::SendRequest(const HttpRequestHeaders& headers, + HttpResponseInfo* response, + const CompletionCallback& callback) { + DCHECK(parser_.get()); + DCHECK(request_info_); + const std::string path = using_proxy_ ? + HttpUtil::SpecForRequest(request_info_->url) : + HttpUtil::PathForRequest(request_info_->url); + request_line_ = base::StringPrintf("%s %s HTTP/1.1\r\n", + request_info_->method.c_str(), + path.c_str()); + return parser_->SendRequest(request_line_, headers, response, callback); +} + +UploadProgress HttpBasicStream::GetUploadProgress() const { + return parser_->GetUploadProgress(); +} + +int HttpBasicStream::ReadResponseHeaders(const CompletionCallback& callback) { + return parser_->ReadResponseHeaders(callback); +} + +const HttpResponseInfo* HttpBasicStream::GetResponseInfo() const { + return parser_->GetResponseInfo(); +} + +int HttpBasicStream::ReadResponseBody(IOBuffer* buf, int buf_len, + const CompletionCallback& callback) { + return parser_->ReadResponseBody(buf, buf_len, callback); +} + +void HttpBasicStream::Close(bool not_reusable) { + parser_->Close(not_reusable); +} + +HttpStream* HttpBasicStream::RenewStreamForAuth() { + DCHECK(IsResponseBodyComplete()); + DCHECK(!parser_->IsMoreDataBuffered()); + parser_.reset(); + return new HttpBasicStream(connection_.release(), NULL, using_proxy_); +} + +bool HttpBasicStream::IsResponseBodyComplete() const { + return parser_->IsResponseBodyComplete(); +} + +bool HttpBasicStream::CanFindEndOfResponse() const { + return parser_->CanFindEndOfResponse(); +} + +bool HttpBasicStream::IsConnectionReused() const { + return parser_->IsConnectionReused(); +} + +void HttpBasicStream::SetConnectionReused() { + parser_->SetConnectionReused(); +} + +bool HttpBasicStream::IsConnectionReusable() const { + return parser_->IsConnectionReusable(); +} + +bool HttpBasicStream::GetLoadTimingInfo( + LoadTimingInfo* load_timing_info) const { + return connection_->GetLoadTimingInfo(IsConnectionReused(), load_timing_info); +} + +void HttpBasicStream::GetSSLInfo(SSLInfo* ssl_info) { + parser_->GetSSLInfo(ssl_info); +} + +void HttpBasicStream::GetSSLCertRequestInfo( + SSLCertRequestInfo* cert_request_info) { + parser_->GetSSLCertRequestInfo(cert_request_info); +} + +bool HttpBasicStream::IsSpdyHttpStream() const { + return false; +} + +void HttpBasicStream::Drain(HttpNetworkSession* session) { + HttpResponseBodyDrainer* drainer = new HttpResponseBodyDrainer(this); + drainer->Start(session); + // |drainer| will delete itself. +} + +void HttpBasicStream::SetPriority(RequestPriority priority) { + // TODO(akalin): Plumb this through to |connection_|. +} + +} // namespace net |