Home | History | Annotate | Download | only in http
      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 
     13 namespace net {
     14 
     15 HttpBasicStream::HttpBasicStream(ClientSocketHandle* connection,
     16                                  bool using_proxy)
     17     : state_(connection, using_proxy) {}
     18 
     19 HttpBasicStream::~HttpBasicStream() {}
     20 
     21 int 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 
     29 int 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 
     37 UploadProgress HttpBasicStream::GetUploadProgress() const {
     38   return parser()->GetUploadProgress();
     39 }
     40 
     41 int HttpBasicStream::ReadResponseHeaders(const CompletionCallback& callback) {
     42   return parser()->ReadResponseHeaders(callback);
     43 }
     44 
     45 int HttpBasicStream::ReadResponseBody(IOBuffer* buf,
     46                                       int buf_len,
     47                                       const CompletionCallback& callback) {
     48   return parser()->ReadResponseBody(buf, buf_len, callback);
     49 }
     50 
     51 void HttpBasicStream::Close(bool not_reusable) {
     52   parser()->Close(not_reusable);
     53 }
     54 
     55 HttpStream* HttpBasicStream::RenewStreamForAuth() {
     56   DCHECK(IsResponseBodyComplete());
     57   DCHECK(!parser()->IsMoreDataBuffered());
     58   // The HttpStreamParser object still has a pointer to the connection. Just to
     59   // be extra-sure it doesn't touch the connection again, delete it here rather
     60   // than leaving it until the destructor is called.
     61   state_.DeleteParser();
     62   return new HttpBasicStream(state_.ReleaseConnection().release(),
     63                              state_.using_proxy());
     64 }
     65 
     66 bool HttpBasicStream::IsResponseBodyComplete() const {
     67   return parser()->IsResponseBodyComplete();
     68 }
     69 
     70 bool HttpBasicStream::CanFindEndOfResponse() const {
     71   return parser()->CanFindEndOfResponse();
     72 }
     73 
     74 bool HttpBasicStream::IsConnectionReused() const {
     75   return parser()->IsConnectionReused();
     76 }
     77 
     78 void HttpBasicStream::SetConnectionReused() { parser()->SetConnectionReused(); }
     79 
     80 bool HttpBasicStream::IsConnectionReusable() const {
     81   return parser()->IsConnectionReusable();
     82 }
     83 
     84 int64 HttpBasicStream::GetTotalReceivedBytes() const {
     85   if (parser())
     86     return parser()->received_bytes();
     87   return 0;
     88 }
     89 
     90 bool HttpBasicStream::GetLoadTimingInfo(
     91     LoadTimingInfo* load_timing_info) const {
     92   return state_.connection()->GetLoadTimingInfo(IsConnectionReused(),
     93                                                 load_timing_info);
     94 }
     95 
     96 void HttpBasicStream::GetSSLInfo(SSLInfo* ssl_info) {
     97   parser()->GetSSLInfo(ssl_info);
     98 }
     99 
    100 void HttpBasicStream::GetSSLCertRequestInfo(
    101     SSLCertRequestInfo* cert_request_info) {
    102   parser()->GetSSLCertRequestInfo(cert_request_info);
    103 }
    104 
    105 bool HttpBasicStream::IsSpdyHttpStream() const { return false; }
    106 
    107 void HttpBasicStream::Drain(HttpNetworkSession* session) {
    108   HttpResponseBodyDrainer* drainer = new HttpResponseBodyDrainer(this);
    109   drainer->Start(session);
    110   // |drainer| will delete itself.
    111 }
    112 
    113 void HttpBasicStream::SetPriority(RequestPriority priority) {
    114   // TODO(akalin): Plumb this through to |connection_|.
    115 }
    116 
    117 }  // namespace net
    118