http_stream_factory_impl.h revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
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. 4 5#ifndef NET_HTTP_HTTP_STREAM_FACTORY_IMPL_H_ 6#define NET_HTTP_HTTP_STREAM_FACTORY_IMPL_H_ 7 8#include <map> 9#include <set> 10#include <vector> 11 12#include "base/memory/ref_counted.h" 13#include "net/base/host_port_pair.h" 14#include "net/base/net_log.h" 15#include "net/http/http_pipelined_host_pool.h" 16#include "net/http/http_stream_factory.h" 17#include "net/proxy/proxy_server.h" 18#include "net/socket/ssl_client_socket.h" 19#include "net/spdy/spdy_session_key.h" 20 21namespace net { 22 23class HttpNetworkSession; 24class HttpPipelinedHost; 25class SpdySession; 26 27class NET_EXPORT_PRIVATE HttpStreamFactoryImpl : 28 public HttpStreamFactory, 29 public HttpPipelinedHostPool::Delegate { 30 public: 31 explicit HttpStreamFactoryImpl(HttpNetworkSession* session); 32 virtual ~HttpStreamFactoryImpl(); 33 34 // HttpStreamFactory interface 35 virtual HttpStreamRequest* RequestStream( 36 const HttpRequestInfo& info, 37 RequestPriority priority, 38 const SSLConfig& server_ssl_config, 39 const SSLConfig& proxy_ssl_config, 40 HttpStreamRequest::Delegate* delegate, 41 const BoundNetLog& net_log) OVERRIDE; 42 43 virtual void PreconnectStreams(int num_streams, 44 const HttpRequestInfo& info, 45 RequestPriority priority, 46 const SSLConfig& server_ssl_config, 47 const SSLConfig& proxy_ssl_config) OVERRIDE; 48 virtual base::Value* PipelineInfoToValue() const OVERRIDE; 49 virtual const HostMappingRules* GetHostMappingRules() const OVERRIDE; 50 51 // HttpPipelinedHostPool::Delegate interface 52 virtual void OnHttpPipelinedHostHasAdditionalCapacity( 53 HttpPipelinedHost* host) OVERRIDE; 54 55 private: 56 class Request; 57 class Job; 58 59 typedef std::set<Request*> RequestSet; 60 typedef std::vector<Request*> RequestVector; 61 typedef std::map<SpdySessionKey, RequestSet> SpdySessionRequestMap; 62 typedef std::map<HttpPipelinedHost::Key, 63 RequestVector> HttpPipeliningRequestMap; 64 65 PortAlternateProtocolPair GetAlternateProtocolRequestFor( 66 const GURL& original_url, 67 GURL* alternate_url) const; 68 69 // Detaches |job| from |request|. 70 void OrphanJob(Job* job, const Request* request); 71 72 // Called when a SpdySession is ready. It will find appropriate Requests and 73 // fulfill them. |direct| indicates whether or not |spdy_session| uses a 74 // proxy. 75 void OnSpdySessionReady(scoped_refptr<SpdySession> spdy_session, 76 bool direct, 77 const SSLConfig& used_ssl_config, 78 const ProxyInfo& used_proxy_info, 79 bool was_npn_negotiated, 80 NextProto protocol_negotiated, 81 bool using_spdy, 82 const BoundNetLog& net_log); 83 84 // Called when the Job detects that the endpoint indicated by the 85 // Alternate-Protocol does not work. Lets the factory update 86 // HttpAlternateProtocols with the failure and resets the SPDY session key. 87 void OnBrokenAlternateProtocol(const Job*, const HostPortPair& origin); 88 89 // Invoked when an orphaned Job finishes. 90 void OnOrphanedJobComplete(const Job* job); 91 92 // Invoked when the Job finishes preconnecting sockets. 93 void OnPreconnectsComplete(const Job* job); 94 95 // Called when the Preconnect completes. Used for testing. 96 virtual void OnPreconnectsCompleteInternal() {} 97 98 void AbortPipelinedRequestsWithKey(const Job* job, 99 const HttpPipelinedHost::Key& key, 100 int status, 101 const SSLConfig& used_ssl_config); 102 103 HttpNetworkSession* const session_; 104 105 // All Requests are handed out to clients. By the time HttpStreamFactoryImpl 106 // is destroyed, all Requests should be deleted (which should remove them from 107 // |request_map_|. The Requests will delete the corresponding job. 108 std::map<const Job*, Request*> request_map_; 109 110 SpdySessionRequestMap spdy_session_request_map_; 111 HttpPipeliningRequestMap http_pipelining_request_map_; 112 113 HttpPipelinedHostPool http_pipelined_host_pool_; 114 115 // These jobs correspond to jobs orphaned by Requests and now owned by 116 // HttpStreamFactoryImpl. Since they are no longer tied to Requests, they will 117 // not be canceled when Requests are canceled. Therefore, in 118 // ~HttpStreamFactoryImpl, it is possible for some jobs to still exist in this 119 // set. Leftover jobs will be deleted when the factory is destroyed. 120 std::set<const Job*> orphaned_job_set_; 121 122 // These jobs correspond to preconnect requests and have no associated Request 123 // object. They're owned by HttpStreamFactoryImpl. Leftover jobs will be 124 // deleted when the factory is destroyed. 125 std::set<const Job*> preconnect_job_set_; 126 127 DISALLOW_COPY_AND_ASSIGN(HttpStreamFactoryImpl); 128}; 129 130} // namespace net 131 132#endif // NET_HTTP_HTTP_STREAM_FACTORY_IMPL_H_ 133