12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef NET_QUIC_QUIC_STREAM_FACTORY_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define NET_QUIC_QUIC_STREAM_FACTORY_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <list>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <vector>
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/logging.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/address_list.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/completion_callback.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/host_port_pair.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_log.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/network_change_notifier.h"
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/cert/cert_database.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/proxy/proxy_server.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/quic_config.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/quic_crypto_stream.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/quic_http_stream.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/quic_protocol.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass CertVerifier;
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ChannelIDService;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ClientSocketFactory;
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass HostResolver;
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class HttpServerProperties;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class QuicClock;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class QuicClientSession;
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class QuicConnectionHelper;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class QuicCryptoClientStreamFactory;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class QuicRandom;
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class QuicServerInfoFactory;
40e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass QuicServerId;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class QuicStreamFactory;
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TransportSecurityState;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace test {
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class QuicStreamFactoryPeer;
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace test
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Encapsulates a pending request for a QuicHttpStream.
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// If the request is still pending when it is destroyed, it will
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// cancel the request with the factory.
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NET_EXPORT_PRIVATE QuicStreamRequest {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicStreamRequest(QuicStreamFactory* factory);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~QuicStreamRequest();
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // For http, |is_https| is false.
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int Request(const HostPortPair& host_port_pair,
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              bool is_https,
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              PrivacyMode privacy_mode,
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              base::StringPiece method,
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              const BoundNetLog& net_log,
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              const CompletionCallback& callback);
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnRequestComplete(int rv);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<QuicHttpStream> ReleaseStream();
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_stream(scoped_ptr<QuicHttpStream> stream);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const BoundNetLog& net_log() const{
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return net_log_;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicStreamFactory* factory_;
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HostPortPair host_port_pair_;
777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool is_https_;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BoundNetLog net_log_;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CompletionCallback callback_;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<QuicHttpStream> stream_;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicStreamRequest);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A factory for creating new QuicHttpStreams on top of a pool of
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// QuicClientSessions.
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class NET_EXPORT_PRIVATE QuicStreamFactory
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : public NetworkChangeNotifier::IPAddressObserver,
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      public CertDatabase::Observer {
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicStreamFactory(
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      HostResolver* host_resolver,
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ClientSocketFactory* client_socket_factory,
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      base::WeakPtr<HttpServerProperties> http_server_properties,
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      CertVerifier* cert_verifier,
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ChannelIDService* channel_id_service,
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      TransportSecurityState* transport_security_state,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicCryptoClientStreamFactory* quic_crypto_client_stream_factory,
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuicRandom* random_generator,
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      QuicClock* clock,
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      size_t max_packet_length,
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const std::string& user_agent_id,
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const QuicVersionVector& supported_versions,
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      bool enable_port_selection,
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      bool enable_time_based_loss_detection,
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bool always_require_handshake_confirmation,
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bool disable_connection_pooling,
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const QuicTagVector& connection_options);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~QuicStreamFactory();
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Creates a new QuicHttpStream to |host_port_pair| which will be
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // owned by |request|. |is_https| specifies if the protocol is https or not.
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // If a matching session already exists, this method will return OK.  If no
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // matching session exists, this will return ERR_IO_PENDING and will invoke
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // OnRequestComplete asynchronously.
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int Create(const HostPortPair& host_port_pair,
1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch             bool is_https,
118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch             PrivacyMode privacy_mode,
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             base::StringPiece method,
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             const BoundNetLog& net_log,
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             QuicStreamRequest* request);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called by a session when it becomes idle.
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnIdleSession(QuicClientSession* session);
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Called by a session when it is going away and no more streams should be
1278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // created on it.
1288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void OnSessionGoingAway(QuicClientSession* session);
1298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called by a session after it shuts down.
1318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void OnSessionClosed(QuicClientSession* session);
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Called by a session whose connection has timed out.
13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OnSessionConnectTimeout(QuicClientSession* session);
13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Cancels a pending request.
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CancelRequest(QuicStreamRequest* request);
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Closes all current sessions.
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CloseAllSessions(int error);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Value* QuicStreamFactoryInfoToValue() const;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Delete all cached state objects in |crypto_config_|.
1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void ClearCachedStatesInCryptoConfig();
1460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // NetworkChangeNotifier::IPAddressObserver methods:
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Until the servers support roaming, close all connections when the local
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // IP address changes.
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnIPAddressChanged() OVERRIDE;
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // CertDatabase::Observer methods:
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // We close all sessions when certificate database is changed.
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void OnCertAdded(const X509Certificate* cert) OVERRIDE;
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void OnCACertChanged(const X509Certificate* cert) OVERRIDE;
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool require_confirmation() const {
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return require_confirmation_;
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void set_require_confirmation(bool require_confirmation);
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  QuicConnectionHelper* helper() { return helper_.get(); }
1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool enable_port_selection() const { return enable_port_selection_; }
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bool has_quic_server_info_factory() {
17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return quic_server_info_factory_ != NULL;
17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void set_quic_server_info_factory(
174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      QuicServerInfoFactory* quic_server_info_factory) {
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DCHECK(!quic_server_info_factory_);
176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    quic_server_info_factory_ = quic_server_info_factory;
177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class Job;
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  friend class test::QuicStreamFactoryPeer;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The key used to find session by ip. Includes
184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // the ip address, port, and scheme.
185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct NET_EXPORT_PRIVATE IpAliasKey {
186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    IpAliasKey();
187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    IpAliasKey(IPEndPoint ip_endpoint, bool is_https);
188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ~IpAliasKey();
189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    IPEndPoint ip_endpoint;
191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    bool is_https;
192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Needed to be an element of std::set.
194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    bool operator<(const IpAliasKey &other) const;
195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    bool operator==(const IpAliasKey &other) const;
196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
198e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  typedef std::map<QuicServerId, QuicClientSession*> SessionMap;
199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  typedef std::map<QuicClientSession*, QuicServerId> SessionIdMap;
200e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  typedef std::set<QuicServerId> AliasSet;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::map<QuicClientSession*, AliasSet> SessionAliasMap;
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::set<QuicClientSession*> SessionSet;
203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  typedef std::map<IpAliasKey, SessionSet> IPAliasMap;
204e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  typedef std::map<QuicServerId, QuicCryptoClientConfig*> CryptoConfigMap;
205e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  typedef std::map<QuicServerId, Job*> JobMap;
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::map<QuicStreamRequest*, Job*> RequestMap;
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::set<QuicStreamRequest*> RequestSet;
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::map<Job*, RequestSet> JobRequestsMap;
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns a newly created QuicHttpStream owned by the caller, if a
211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // matching session already exists.  Returns NULL otherwise.
212e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  scoped_ptr<QuicHttpStream> CreateIfSessionExists(const QuicServerId& key,
213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                   const BoundNetLog& net_log);
214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
215e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bool OnResolution(const QuicServerId& server_id,
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    const AddressList& address_list);
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnJobComplete(Job* job, int rv);
218e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bool HasActiveSession(const QuicServerId& server_id) const;
219e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bool HasActiveJob(const QuicServerId& server_id) const;
220e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  int CreateSession(const QuicServerId& server_id,
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    scoped_ptr<QuicServerInfo> quic_server_info,
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    const AddressList& address_list,
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    const BoundNetLog& net_log,
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    QuicClientSession** session);
225e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void ActivateSession(const QuicServerId& key,
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       QuicClientSession* session);
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
228e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Initializes the cached state associated with |server_id| in
229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // |crypto_config_| with the information in |server_info|.
2305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void InitializeCachedStateInCryptoConfig(
2315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const QuicServerId& server_id,
2325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const scoped_ptr<QuicServerInfo>& server_info);
23323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void ProcessGoingAwaySession(QuicClientSession* session,
235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               const QuicServerId& server_id,
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               bool was_session_active);
237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool require_confirmation_;
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HostResolver* host_resolver_;
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClientSocketFactory* client_socket_factory_;
2413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::WeakPtr<HttpServerProperties> http_server_properties_;
24203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  TransportSecurityState* transport_security_state_;
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicServerInfoFactory* quic_server_info_factory_;
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicCryptoClientStreamFactory* quic_crypto_client_stream_factory_;
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicRandom* random_generator_;
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<QuicClock> clock_;
247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const size_t max_packet_length_;
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // The helper used for all connections.
2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<QuicConnectionHelper> helper_;
2511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Contains owning pointers to all sessions that currently exist.
253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SessionIdMap all_sessions_;
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Contains non-owning pointers to currently active session
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (not going away session, once they're implemented).
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SessionMap active_sessions_;
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Map from session to set of aliases that this session is known by.
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SessionAliasMap session_aliases_;
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Map from IP address to sessions which are connected to this address.
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IPAliasMap ip_aliases_;
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Origins which have gone away recently.
263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AliasSet gone_away_aliases_;
264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const QuicConfig config_;
266effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  QuicCryptoClientConfig crypto_config_;
267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JobMap active_jobs_;
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JobRequestsMap job_requests_map_;
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RequestMap active_requests_;
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicVersionVector supported_versions_;
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Determine if we should consistently select a client UDP port. If false,
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // then we will just let the OS select a random client port for each new
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // connection.
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool enable_port_selection_;
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Set if we always require handshake confirmation. If true, this will
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // introduce at least one RTT for the handshake before the client sends data.
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool always_require_handshake_confirmation_;
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Set if we do not want connection pooling.
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool disable_connection_pooling_;
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Each profile will (probably) have a unique port_seed_ value.  This value is
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // used to help seed a pseudo-random number generator (PortSuggester) so that
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // we consistently (within this profile) suggest the same ephemeral port when
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // we re-connect to any given server/port.  The differences between profiles
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // (probablistically) prevent two profiles from colliding in their ephemeral
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // port requests.
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  uint64 port_seed_;
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Local address of socket that was created in CreateSession.
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  IPEndPoint local_address_;
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool check_persisted_supports_quic_;
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::WeakPtrFactory<QuicStreamFactory> weak_factory_;
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicStreamFactory);
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace net
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // NET_QUIC_QUIC_STREAM_FACTORY_H_
306