15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_pipelined_stream.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_pipelined_connection_impl.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_request_headers.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_request_info.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_util.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpPipelinedStream::HttpPipelinedStream(HttpPipelinedConnectionImpl* pipeline,
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int pipeline_id)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : pipeline_(pipeline),
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pipeline_id_(pipeline_id),
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_info_(NULL) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpPipelinedStream::~HttpPipelinedStream() {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pipeline_->OnStreamDeleted(pipeline_id_);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int HttpPipelinedStream::InitializeStream(
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const HttpRequestInfo* request_info,
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RequestPriority priority,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BoundNetLog& net_log,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CompletionCallback& callback) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_info_ = request_info;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pipeline_->InitializeParser(pipeline_id_, request_info, net_log);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OK;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int HttpPipelinedStream::SendRequest(const HttpRequestHeaders& headers,
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     HttpResponseInfo* response,
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const CompletionCallback& callback) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(pipeline_id_);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(request_info_);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(simonjam): Proxy support will be needed here.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string path = HttpUtil::PathForRequest(request_info_->url);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string request_line_ = base::StringPrintf("%s %s HTTP/1.1\r\n",
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 request_info_->method.c_str(),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 path.c_str());
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return pipeline_->SendRequest(pipeline_id_, request_line_, headers, response,
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                callback);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UploadProgress HttpPipelinedStream::GetUploadProgress() const {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pipeline_->GetUploadProgress(pipeline_id_);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int HttpPipelinedStream::ReadResponseHeaders(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CompletionCallback& callback) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pipeline_->ReadResponseHeaders(pipeline_id_, callback);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const HttpResponseInfo* HttpPipelinedStream::GetResponseInfo() const {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pipeline_->GetResponseInfo(pipeline_id_);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int HttpPipelinedStream::ReadResponseBody(IOBuffer* buf, int buf_len,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const CompletionCallback& callback) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pipeline_->ReadResponseBody(pipeline_id_, buf, buf_len, callback);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpPipelinedStream::Close(bool not_reusable) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pipeline_->Close(pipeline_id_, not_reusable);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpStream* HttpPipelinedStream::RenewStreamForAuth() {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pipeline_->usable()) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return pipeline_->CreateNewStream();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HttpPipelinedStream::IsResponseBodyComplete() const {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pipeline_->IsResponseBodyComplete(pipeline_id_);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HttpPipelinedStream::CanFindEndOfResponse() const {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pipeline_->CanFindEndOfResponse(pipeline_id_);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HttpPipelinedStream::IsConnectionReused() const {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pipeline_->IsConnectionReused(pipeline_id_);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpPipelinedStream::SetConnectionReused() {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pipeline_->SetConnectionReused(pipeline_id_);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HttpPipelinedStream::IsConnectionReusable() const {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pipeline_->usable();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool HttpPipelinedStream::GetLoadTimingInfo(
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoadTimingInfo* load_timing_info) const {
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return pipeline_->GetLoadTimingInfo(pipeline_id_, load_timing_info);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpPipelinedStream::GetSSLInfo(SSLInfo* ssl_info) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pipeline_->GetSSLInfo(pipeline_id_, ssl_info);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpPipelinedStream::GetSSLCertRequestInfo(
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SSLCertRequestInfo* cert_request_info) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pipeline_->GetSSLCertRequestInfo(pipeline_id_, cert_request_info);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HttpPipelinedStream::IsSpdyHttpStream() const {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpPipelinedStream::Drain(HttpNetworkSession* session) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pipeline_->Drain(this, session);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SSLConfig& HttpPipelinedStream::used_ssl_config() const {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pipeline_->used_ssl_config();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ProxyInfo& HttpPipelinedStream::used_proxy_info() const {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pipeline_->used_proxy_info();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const BoundNetLog& HttpPipelinedStream::net_log() const {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pipeline_->net_log();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HttpPipelinedStream::was_npn_negotiated() const {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pipeline_->was_npn_negotiated();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NextProto HttpPipelinedStream::protocol_negotiated() const {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pipeline_->protocol_negotiated();
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
145