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