1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Use of this source code is governed by a BSD-style license that can be 3dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// found in the LICENSE file. 4dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#ifndef NET_HTTP_HTTP_STREAM_FACTORY_IMPL_H_ 6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#define NET_HTTP_HTTP_STREAM_FACTORY_IMPL_H_ 7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <map> 9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <set> 10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "net/base/host_port_pair.h" 13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/http/http_stream_factory.h" 14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/net_log.h" 15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/proxy/proxy_server.h" 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace net { 18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass HttpNetworkSession; 20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass SpdySession; 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass HttpStreamFactoryImpl : public HttpStreamFactory { 23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public: 24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen explicit HttpStreamFactoryImpl(HttpNetworkSession* session); 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual ~HttpStreamFactoryImpl(); 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // HttpStreamFactory Interface 28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual HttpStreamRequest* RequestStream( 29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const HttpRequestInfo& info, 30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const SSLConfig& ssl_config, 31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen HttpStreamRequest::Delegate* delegate, 32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const BoundNetLog& net_log); 33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void PreconnectStreams(int num_streams, 35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const HttpRequestInfo& info, 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const SSLConfig& ssl_config, 37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const BoundNetLog& net_log); 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void AddTLSIntolerantServer(const HostPortPair& server); 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool IsTLSIntolerantServer(const HostPortPair& server) const; 40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private: 42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen class Request; 43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen class Job; 44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen typedef std::set<Request*> RequestSet; 46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen typedef std::map<HostPortProxyPair, RequestSet> SpdySessionRequestMap; 47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool GetAlternateProtocolRequestFor(const GURL& original_url, 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL* alternate_url) const; 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Detaches |job| from |request|. 52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void OrphanJob(Job* job, const Request* request); 53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Called when a SpdySession is ready. It will find appropriate Requests and 55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // fulfill them. |direct| indicates whether or not |spdy_session| uses a 56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // proxy. 57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void OnSpdySessionReady(scoped_refptr<SpdySession> spdy_session, 58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool direct, 59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const SSLConfig& used_ssl_config, 60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const ProxyInfo& used_proxy_info, 61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool was_npn_negotiated, 62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool using_spdy, 63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const NetLog::Source& source); 64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Called when the Job detects that the endpoint indicated by the 66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Alternate-Protocol does not work. Lets the factory update 67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // HttpAlternateProtocols with the failure and resets the SPDY session key. 68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void OnBrokenAlternateProtocol(const Job*, const HostPortPair& origin); 69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Invoked when an orphaned Job finishes. 71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void OnOrphanedJobComplete(const Job* job); 72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Invoked when the Job finishes preconnecting sockets. 74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void OnPreconnectsComplete(const Job* job); 75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Called when the Preconnect completes. Used for testing. 77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void OnPreconnectsCompleteInternal() {} 78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen HttpNetworkSession* const session_; 80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::set<HostPortPair> tls_intolerant_servers_; 82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // All Requests are handed out to clients. By the time HttpStreamFactoryImpl 84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // is destroyed, all Requests should be deleted (which should remove them from 85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // |request_map_|. The Requests will delete the corresponding job. 86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::map<const Job*, Request*> request_map_; 87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SpdySessionRequestMap spdy_session_request_map_; 89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // These jobs correspond to jobs orphaned by Requests and now owned by 91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // HttpStreamFactoryImpl. Since they are no longer tied to Requests, they will 92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // not be canceled when Requests are canceled. Therefore, in 93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // ~HttpStreamFactoryImpl, it is possible for some jobs to still exist in this 94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // set. Leftover jobs will be deleted when the factory is destroyed. 95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::set<const Job*> orphaned_job_set_; 96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // These jobs correspond to preconnect requests and have no associated Request 98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // object. They're owned by HttpStreamFactoryImpl. Leftover jobs will be 99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // deleted when the factory is destroyed. 100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::set<const Job*> preconnect_job_set_; 101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DISALLOW_COPY_AND_ASSIGN(HttpStreamFactoryImpl); 103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}; 104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} // namespace net 106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif // NET_HTTP_HTTP_STREAM_FACTORY_IMPL_H_ 108