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)#ifndef NET_HTTP_HTTP_PIPELINED_HOST_FORCED_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_HTTP_HTTP_PIPELINED_HOST_FORCED_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/host_port_pair.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_export.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_pipelined_connection.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_pipelined_host.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_pipelined_host_capability.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BoundNetLog;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClientSocketHandle;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpPipelinedStream;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProxyInfo;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct SSLConfig;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Manages a single pipelined connection for requests to a host that are forced
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to use pipelining. Note that this is normally not used. It is intended to
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test the user's connection for pipelining compatibility.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE HttpPipelinedHostForced
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public HttpPipelinedHost,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public HttpPipelinedConnection::Delegate {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpPipelinedHostForced(HttpPipelinedHost::Delegate* delegate,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const Key& key,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          HttpPipelinedConnection::Factory* factory);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~HttpPipelinedHostForced();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HttpPipelinedHost interface
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual HttpPipelinedStream* CreateStreamOnNewPipeline(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ClientSocketHandle* connection,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const SSLConfig& used_ssl_config,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ProxyInfo& used_proxy_info,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const BoundNetLog& net_log,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool was_npn_negotiated,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NextProto protocol_negotiated) OVERRIDE;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual HttpPipelinedStream* CreateStreamOnExistingPipeline() OVERRIDE;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsExistingPipelineAvailable() const OVERRIDE;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const Key& GetKey() const OVERRIDE;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual base::Value* PipelineInfoToValue() const OVERRIDE;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HttpPipelinedConnection::Delegate interface
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnPipelineHasCapacity(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpPipelinedConnection* pipeline) OVERRIDE;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnPipelineFeedback(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpPipelinedConnection* pipeline,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpPipelinedConnection::Feedback feedback) OVERRIDE;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when a pipeline is empty and there are no pending requests. Closes
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the connection.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPipelineEmpty(HttpPipelinedConnection* pipeline);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpPipelinedHost::Delegate* delegate_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Key key_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpPipelinedConnection> pipeline_;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpPipelinedConnection::Factory> factory_;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HttpPipelinedHostForced);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_HTTP_HTTP_PIPELINED_HOST_FORCED_H_
84