summaryrefslogtreecommitdiffstats
path: root/net/http/http_pipelined_host.h
blob: 24b6e3ad3a130d9ddbbf7c9404ad3fae246533d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// 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.

#ifndef NET_HTTP_HTTP_PIPELINED_HOST_H_
#define NET_HTTP_HTTP_PIPELINED_HOST_H_
#pragma once

#include "net/base/host_port_pair.h"
#include "net/base/net_export.h"
#include "net/http/http_pipelined_connection.h"
#include "net/http/http_pipelined_host_capability.h"

namespace base {
class Value;
}

namespace net {

class BoundNetLog;
class ClientSocketHandle;
class HostPortPair;
class HttpPipelinedStream;
class ProxyInfo;
struct SSLConfig;

// Manages all of the pipelining state for specific host with active pipelined
// HTTP requests. Manages connection jobs, constructs pipelined streams, and
// assigns requests to the least loaded pipelined connection.
class NET_EXPORT_PRIVATE HttpPipelinedHost {
 public:
  class NET_EXPORT_PRIVATE Key {
   public:
    Key(const HostPortPair& origin);

    // The host and port associated with this key.
    const HostPortPair& origin() const { return origin_; }

    bool operator<(const Key& rhs) const;

   private:
    const HostPortPair origin_;
  };

  class Delegate {
   public:
    // Called when a pipelined host has no outstanding requests on any of its
    // pipelined connections.
    virtual void OnHostIdle(HttpPipelinedHost* host) = 0;

    // Called when a pipelined host has newly available pipeline capacity, like
    // when a request completes.
    virtual void OnHostHasAdditionalCapacity(HttpPipelinedHost* host) = 0;

    // Called when a host determines if pipelining can be used.
    virtual void OnHostDeterminedCapability(
        HttpPipelinedHost* host,
        HttpPipelinedHostCapability capability) = 0;
  };

  class Factory {
   public:
    virtual ~Factory() {}

    // Returns a new HttpPipelinedHost.
    virtual HttpPipelinedHost* CreateNewHost(
        Delegate* delegate, const Key& key,
        HttpPipelinedConnection::Factory* factory,
        HttpPipelinedHostCapability capability,
        bool force_pipelining) = 0;
  };

  virtual ~HttpPipelinedHost() {}

  // Constructs a new pipeline on |connection| and returns a new
  // HttpPipelinedStream that uses it.
  virtual HttpPipelinedStream* CreateStreamOnNewPipeline(
      ClientSocketHandle* connection,
      const SSLConfig& used_ssl_config,
      const ProxyInfo& used_proxy_info,
      const BoundNetLog& net_log,
      bool was_npn_negotiated,
      SSLClientSocket::NextProto protocol_negotiated) = 0;

  // Tries to find an existing pipeline with capacity for a new request. If
  // successful, returns a new stream on that pipeline. Otherwise, returns NULL.
  virtual HttpPipelinedStream* CreateStreamOnExistingPipeline() = 0;

  // Returns true if we have a pipelined connection that can accept new
  // requests.
  virtual bool IsExistingPipelineAvailable() const = 0;

  // Returns a Key that uniquely identifies this host.
  virtual const Key& GetKey() const = 0;

  // Creates a Value summary of this host's pipelines. Caller assumes
  // ownership of the returned Value.
  virtual base::Value* PipelineInfoToValue() const = 0;
};

}  // namespace net

#endif  // NET_HTTP_HTTP_PIPELINED_HOST_H_