summaryrefslogtreecommitdiff
path: root/chromium/net/quic/quic_stream_factory.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/quic/quic_stream_factory.h')
-rw-r--r--chromium/net/quic/quic_stream_factory.h183
1 files changed, 183 insertions, 0 deletions
diff --git a/chromium/net/quic/quic_stream_factory.h b/chromium/net/quic/quic_stream_factory.h
new file mode 100644
index 00000000000..963a60369ac
--- /dev/null
+++ b/chromium/net/quic/quic_stream_factory.h
@@ -0,0 +1,183 @@
+// 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_QUIC_QUIC_STREAM_FACTORY_H_
+#define NET_QUIC_QUIC_STREAM_FACTORY_H_
+
+#include <map>
+#include <string>
+
+#include "base/memory/weak_ptr.h"
+#include "net/base/address_list.h"
+#include "net/base/completion_callback.h"
+#include "net/base/host_port_pair.h"
+#include "net/base/net_log.h"
+#include "net/base/network_change_notifier.h"
+#include "net/proxy/proxy_server.h"
+#include "net/quic/quic_config.h"
+#include "net/quic/quic_crypto_stream.h"
+#include "net/quic/quic_http_stream.h"
+#include "net/quic/quic_protocol.h"
+
+namespace net {
+
+class CertVerifier;
+class ClientSocketFactory;
+class HostResolver;
+class QuicClock;
+class QuicClientSession;
+class QuicCryptoClientStreamFactory;
+class QuicRandom;
+class QuicStreamFactory;
+
+// Encapsulates a pending request for a QuicHttpStream.
+// If the request is still pending when it is destroyed, it will
+// cancel the request with the factory.
+class NET_EXPORT_PRIVATE QuicStreamRequest {
+ public:
+ explicit QuicStreamRequest(QuicStreamFactory* factory);
+ ~QuicStreamRequest();
+
+ // For http, |is_https| is false and |cert_verifier| can be null.
+ int Request(const HostPortProxyPair& host_port_proxy_pair,
+ bool is_https,
+ CertVerifier* cert_verifier,
+ const BoundNetLog& net_log,
+ const CompletionCallback& callback);
+
+ void OnRequestComplete(int rv);
+
+ scoped_ptr<QuicHttpStream> ReleaseStream();
+
+ void set_stream(scoped_ptr<QuicHttpStream> stream);
+
+ const BoundNetLog& net_log() const{
+ return net_log_;
+ }
+
+ private:
+ QuicStreamFactory* factory_;
+ HostPortProxyPair host_port_proxy_pair_;
+ bool is_https_;
+ CertVerifier* cert_verifier_;
+ BoundNetLog net_log_;
+ CompletionCallback callback_;
+ scoped_ptr<QuicHttpStream> stream_;
+
+ DISALLOW_COPY_AND_ASSIGN(QuicStreamRequest);
+};
+
+// A factory for creating new QuicHttpStreams on top of a pool of
+// QuicClientSessions.
+class NET_EXPORT_PRIVATE QuicStreamFactory
+ : public NetworkChangeNotifier::IPAddressObserver {
+ public:
+ QuicStreamFactory(
+ HostResolver* host_resolver,
+ ClientSocketFactory* client_socket_factory,
+ QuicCryptoClientStreamFactory* quic_crypto_client_stream_factory,
+ QuicRandom* random_generator,
+ QuicClock* clock);
+ virtual ~QuicStreamFactory();
+
+ // Creates a new QuicHttpStream to |host_port_proxy_pair| which will be
+ // owned by |request|. |is_https| specifies if the protocol is https or not.
+ // |cert_verifier| is used by ProofVerifier for verifying the certificate
+ // chain and signature. For http, this can be null. If a matching session
+ // already exists, this method will return OK. If no matching session exists,
+ // this will return ERR_IO_PENDING and will invoke OnRequestComplete
+ // asynchronously.
+ int Create(const HostPortProxyPair& host_port_proxy_pair,
+ bool is_https,
+ CertVerifier* cert_verifier,
+ const BoundNetLog& net_log,
+ QuicStreamRequest* request);
+
+ // Returns a newly created QuicHttpStream owned by the caller, if a
+ // matching session already exists. Returns NULL otherwise.
+ scoped_ptr<QuicHttpStream> CreateIfSessionExists(
+ const HostPortProxyPair& host_port_proxy_pair,
+ const BoundNetLog& net_log);
+
+ // Called by a session when it becomes idle.
+ void OnIdleSession(QuicClientSession* session);
+
+ // Called by a session after it shuts down.
+ void OnSessionClose(QuicClientSession* session);
+
+ // Cancels a pending request.
+ void CancelRequest(QuicStreamRequest* request);
+
+ // Closes all current sessions.
+ void CloseAllSessions(int error);
+
+ base::Value* QuicStreamFactoryInfoToValue() const;
+
+ // NetworkChangeNotifier::IPAddressObserver methods:
+
+ // Until the servers support roaming, close all connections when the local
+ // IP address changes.
+ virtual void OnIPAddressChanged() OVERRIDE;
+
+ private:
+ class Job;
+
+ typedef std::map<HostPortProxyPair, QuicClientSession*> SessionMap;
+ typedef std::set<HostPortProxyPair> AliasSet;
+ typedef std::map<QuicClientSession*, AliasSet> SessionAliasMap;
+ typedef std::set<QuicClientSession*> SessionSet;
+ typedef std::map<HostPortProxyPair, QuicCryptoClientConfig*> CryptoConfigMap;
+ typedef std::map<HostPortProxyPair, Job*> JobMap;
+ typedef std::map<QuicStreamRequest*, Job*> RequestMap;
+ typedef std::set<QuicStreamRequest*> RequestSet;
+ typedef std::map<Job*, RequestSet> JobRequestsMap;
+
+ void OnJobComplete(Job* job, int rv);
+ bool HasActiveSession(const HostPortProxyPair& host_port_proxy_pair);
+ bool HasActiveJob(const HostPortProxyPair& host_port_proxy_pair);
+ QuicClientSession* CreateSession(
+ const HostPortProxyPair& host_port_proxy_pair,
+ bool is_https,
+ CertVerifier* cert_verifier,
+ const AddressList& address_list,
+ const BoundNetLog& net_log);
+ void ActivateSession(const HostPortProxyPair& host_port_proxy_pair,
+ QuicClientSession* session);
+
+ QuicCryptoClientConfig* GetOrCreateCryptoConfig(
+ const HostPortProxyPair& host_port_proxy_pair);
+
+ HostResolver* host_resolver_;
+ ClientSocketFactory* client_socket_factory_;
+ QuicCryptoClientStreamFactory* quic_crypto_client_stream_factory_;
+ QuicRandom* random_generator_;
+ scoped_ptr<QuicClock> clock_;
+
+ // Contains owning pointers to all sessions that currently exist.
+ SessionSet all_sessions_;
+ // Contains non-owning pointers to currently active session
+ // (not going away session, once they're implemented).
+ SessionMap active_sessions_;
+ SessionAliasMap session_aliases_;
+
+ // Contains owning pointers to QuicCryptoClientConfig. QuicCryptoClientConfig
+ // contains configuration and cached state about servers.
+ // TODO(rtenneti): Persist all_crypto_configs_ to disk and decide when to
+ // clear the data in the map.
+ CryptoConfigMap all_crypto_configs_;
+
+ QuicConfig config_;
+
+ JobMap active_jobs_;
+ JobRequestsMap job_requests_map_;
+ RequestMap active_requests_;
+
+ base::WeakPtrFactory<QuicStreamFactory> weak_factory_;
+
+ DISALLOW_COPY_AND_ASSIGN(QuicStreamFactory);
+};
+
+} // namespace net
+
+#endif // NET_QUIC_QUIC_STREAM_FACTORY_H_