1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef NET_QUIC_QUIC_STREAM_FACTORY_H_
6 #define NET_QUIC_QUIC_STREAM_FACTORY_H_
13 #include "base/logging.h"
14 #include "base/memory/weak_ptr.h"
15 #include "net/base/address_list.h"
16 #include "net/base/completion_callback.h"
17 #include "net/base/host_port_pair.h"
18 #include "net/base/net_log.h"
19 #include "net/base/network_change_notifier.h"
20 #include "net/cert/cert_database.h"
21 #include "net/proxy/proxy_server.h"
22 #include "net/quic/quic_config.h"
23 #include "net/quic/quic_crypto_stream.h"
24 #include "net/quic/quic_http_stream.h"
25 #include "net/quic/quic_protocol.h"
30 class ChannelIDService
;
31 class ClientSocketFactory
;
33 class HttpServerProperties
;
35 class QuicClientSession
;
36 class QuicConnectionHelper
;
37 class QuicCryptoClientStreamFactory
;
39 class QuicServerInfoFactory
;
41 class QuicStreamFactory
;
42 class TransportSecurityState
;
45 class QuicStreamFactoryPeer
;
48 // Encapsulates a pending request for a QuicHttpStream.
49 // If the request is still pending when it is destroyed, it will
50 // cancel the request with the factory.
51 class NET_EXPORT_PRIVATE QuicStreamRequest
{
53 explicit QuicStreamRequest(QuicStreamFactory
* factory
);
56 // For http, |is_https| is false.
57 int Request(const HostPortPair
& host_port_pair
,
59 PrivacyMode privacy_mode
,
60 base::StringPiece method
,
61 const BoundNetLog
& net_log
,
62 const CompletionCallback
& callback
);
64 void OnRequestComplete(int rv
);
66 scoped_ptr
<QuicHttpStream
> ReleaseStream();
68 void set_stream(scoped_ptr
<QuicHttpStream
> stream
);
70 const BoundNetLog
& net_log() const{
75 QuicStreamFactory
* factory_
;
76 HostPortPair host_port_pair_
;
79 CompletionCallback callback_
;
80 scoped_ptr
<QuicHttpStream
> stream_
;
82 DISALLOW_COPY_AND_ASSIGN(QuicStreamRequest
);
85 // A factory for creating new QuicHttpStreams on top of a pool of
86 // QuicClientSessions.
87 class NET_EXPORT_PRIVATE QuicStreamFactory
88 : public NetworkChangeNotifier::IPAddressObserver
,
89 public CertDatabase::Observer
{
92 HostResolver
* host_resolver
,
93 ClientSocketFactory
* client_socket_factory
,
94 base::WeakPtr
<HttpServerProperties
> http_server_properties
,
95 CertVerifier
* cert_verifier
,
96 ChannelIDService
* channel_id_service
,
97 TransportSecurityState
* transport_security_state
,
98 QuicCryptoClientStreamFactory
* quic_crypto_client_stream_factory
,
99 QuicRandom
* random_generator
,
101 size_t max_packet_length
,
102 const std::string
& user_agent_id
,
103 const QuicVersionVector
& supported_versions
,
104 bool enable_port_selection
,
105 bool enable_time_based_loss_detection
,
106 const QuicTagVector
& connection_options
);
107 virtual ~QuicStreamFactory();
109 // Creates a new QuicHttpStream to |host_port_pair| which will be
110 // owned by |request|. |is_https| specifies if the protocol is https or not.
111 // If a matching session already exists, this method will return OK. If no
112 // matching session exists, this will return ERR_IO_PENDING and will invoke
113 // OnRequestComplete asynchronously.
114 int Create(const HostPortPair
& host_port_pair
,
116 PrivacyMode privacy_mode
,
117 base::StringPiece method
,
118 const BoundNetLog
& net_log
,
119 QuicStreamRequest
* request
);
121 // Called by a session when it becomes idle.
122 void OnIdleSession(QuicClientSession
* session
);
124 // Called by a session when it is going away and no more streams should be
126 void OnSessionGoingAway(QuicClientSession
* session
);
128 // Called by a session after it shuts down.
129 void OnSessionClosed(QuicClientSession
* session
);
131 // Called by a session whose connection has timed out.
132 void OnSessionConnectTimeout(QuicClientSession
* session
);
134 // Cancels a pending request.
135 void CancelRequest(QuicStreamRequest
* request
);
137 // Closes all current sessions.
138 void CloseAllSessions(int error
);
140 base::Value
* QuicStreamFactoryInfoToValue() const;
142 // Delete all cached state objects in |crypto_config_|.
143 void ClearCachedStatesInCryptoConfig();
145 // NetworkChangeNotifier::IPAddressObserver methods:
147 // Until the servers support roaming, close all connections when the local
148 // IP address changes.
149 virtual void OnIPAddressChanged() OVERRIDE
;
151 // CertDatabase::Observer methods:
153 // We close all sessions when certificate database is changed.
154 virtual void OnCertAdded(const X509Certificate
* cert
) OVERRIDE
;
155 virtual void OnCACertChanged(const X509Certificate
* cert
) OVERRIDE
;
157 bool require_confirmation() const { return require_confirmation_
; }
159 void set_require_confirmation(bool require_confirmation
) {
160 require_confirmation_
= require_confirmation
;
163 QuicConnectionHelper
* helper() { return helper_
.get(); }
165 bool enable_port_selection() const { return enable_port_selection_
; }
167 bool has_quic_server_info_factory() {
168 return quic_server_info_factory_
!= NULL
;
171 void set_quic_server_info_factory(
172 QuicServerInfoFactory
* quic_server_info_factory
) {
173 DCHECK(!quic_server_info_factory_
);
174 quic_server_info_factory_
= quic_server_info_factory
;
179 friend class test::QuicStreamFactoryPeer
;
181 // The key used to find session by ip. Includes
182 // the ip address, port, and scheme.
183 struct NET_EXPORT_PRIVATE IpAliasKey
{
185 IpAliasKey(IPEndPoint ip_endpoint
, bool is_https
);
188 IPEndPoint ip_endpoint
;
191 // Needed to be an element of std::set.
192 bool operator<(const IpAliasKey
&other
) const;
193 bool operator==(const IpAliasKey
&other
) const;
196 typedef std::map
<QuicServerId
, QuicClientSession
*> SessionMap
;
197 typedef std::map
<QuicClientSession
*, QuicServerId
> SessionIdMap
;
198 typedef std::set
<QuicServerId
> AliasSet
;
199 typedef std::map
<QuicClientSession
*, AliasSet
> SessionAliasMap
;
200 typedef std::set
<QuicClientSession
*> SessionSet
;
201 typedef std::map
<IpAliasKey
, SessionSet
> IPAliasMap
;
202 typedef std::map
<QuicServerId
, QuicCryptoClientConfig
*> CryptoConfigMap
;
203 typedef std::map
<QuicServerId
, Job
*> JobMap
;
204 typedef std::map
<QuicStreamRequest
*, Job
*> RequestMap
;
205 typedef std::set
<QuicStreamRequest
*> RequestSet
;
206 typedef std::map
<Job
*, RequestSet
> JobRequestsMap
;
208 // Returns a newly created QuicHttpStream owned by the caller, if a
209 // matching session already exists. Returns NULL otherwise.
210 scoped_ptr
<QuicHttpStream
> CreateIfSessionExists(const QuicServerId
& key
,
211 const BoundNetLog
& net_log
);
213 bool OnResolution(const QuicServerId
& server_id
,
214 const AddressList
& address_list
);
215 void OnJobComplete(Job
* job
, int rv
);
216 bool HasActiveSession(const QuicServerId
& server_id
) const;
217 bool HasActiveJob(const QuicServerId
& server_id
) const;
218 int CreateSession(const QuicServerId
& server_id
,
219 scoped_ptr
<QuicServerInfo
> quic_server_info
,
220 const AddressList
& address_list
,
221 const BoundNetLog
& net_log
,
222 QuicClientSession
** session
);
223 void ActivateSession(const QuicServerId
& key
,
224 QuicClientSession
* session
);
226 // Initializes the cached state associated with |server_id| in
227 // |crypto_config_| with the information in |server_info|.
228 void InitializeCachedStateInCryptoConfig(
229 const QuicServerId
& server_id
,
230 const scoped_ptr
<QuicServerInfo
>& server_info
);
232 void ProcessGoingAwaySession(QuicClientSession
* session
,
233 const QuicServerId
& server_id
,
234 bool was_session_active
);
236 bool require_confirmation_
;
237 HostResolver
* host_resolver_
;
238 ClientSocketFactory
* client_socket_factory_
;
239 base::WeakPtr
<HttpServerProperties
> http_server_properties_
;
240 TransportSecurityState
* transport_security_state_
;
241 QuicServerInfoFactory
* quic_server_info_factory_
;
242 QuicCryptoClientStreamFactory
* quic_crypto_client_stream_factory_
;
243 QuicRandom
* random_generator_
;
244 scoped_ptr
<QuicClock
> clock_
;
245 const size_t max_packet_length_
;
247 // The helper used for all connections.
248 scoped_ptr
<QuicConnectionHelper
> helper_
;
250 // Contains owning pointers to all sessions that currently exist.
251 SessionIdMap all_sessions_
;
252 // Contains non-owning pointers to currently active session
253 // (not going away session, once they're implemented).
254 SessionMap active_sessions_
;
255 // Map from session to set of aliases that this session is known by.
256 SessionAliasMap session_aliases_
;
257 // Map from IP address to sessions which are connected to this address.
258 IPAliasMap ip_aliases_
;
260 // Origins which have gone away recently.
261 AliasSet gone_away_aliases_
;
263 const QuicConfig config_
;
264 QuicCryptoClientConfig crypto_config_
;
267 JobRequestsMap job_requests_map_
;
268 RequestMap active_requests_
;
270 QuicVersionVector supported_versions_
;
272 // Determine if we should consistently select a client UDP port. If false,
273 // then we will just let the OS select a random client port for each new
275 bool enable_port_selection_
;
277 // Each profile will (probably) have a unique port_seed_ value. This value is
278 // used to help seed a pseudo-random number generator (PortSuggester) so that
279 // we consistently (within this profile) suggest the same ephemeral port when
280 // we re-connect to any given server/port. The differences between profiles
281 // (probablistically) prevent two profiles from colliding in their ephemeral
285 base::WeakPtrFactory
<QuicStreamFactory
> weak_factory_
;
287 DISALLOW_COPY_AND_ASSIGN(QuicStreamFactory
);
292 #endif // NET_QUIC_QUIC_STREAM_FACTORY_H_