// 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_HTTP_HTTP_STREAM_FACTORY_IMPL_H_ #define NET_HTTP_HTTP_STREAM_FACTORY_IMPL_H_ #include #include #include #include #include "base/gtest_prod_util.h" #include "base/macros.h" #include "base/memory/ref_counted.h" #include "net/base/host_port_pair.h" #include "net/base/net_export.h" #include "net/base/privacy_mode.h" #include "net/base/request_priority.h" #include "net/http/http_stream_factory.h" #include "net/log/net_log_source.h" #include "net/proxy/proxy_server.h" #include "net/socket/ssl_client_socket.h" #include "net/spdy/chromium/spdy_session_key.h" namespace net { class HttpNetworkSession; class ProxyInfo; class NetLogWithSource; class NET_EXPORT_PRIVATE HttpStreamFactoryImpl : public HttpStreamFactory { public: class NET_EXPORT_PRIVATE Job; class NET_EXPORT_PRIVATE JobController; class NET_EXPORT_PRIVATE JobFactory; class NET_EXPORT_PRIVATE Request; // RequestStream may only be called if |for_websockets| is false. // RequestWebSocketHandshakeStream may only be called if |for_websockets| // is true. HttpStreamFactoryImpl(HttpNetworkSession* session, bool for_websockets); ~HttpStreamFactoryImpl() override; // HttpStreamFactory interface std::unique_ptr RequestStream( const HttpRequestInfo& info, RequestPriority priority, const SSLConfig& server_ssl_config, const SSLConfig& proxy_ssl_config, HttpStreamRequest::Delegate* delegate, bool enable_ip_based_pooling, bool enable_alternative_services, const NetLogWithSource& net_log) override; std::unique_ptr RequestWebSocketHandshakeStream( const HttpRequestInfo& info, RequestPriority priority, const SSLConfig& server_ssl_config, const SSLConfig& proxy_ssl_config, HttpStreamRequest::Delegate* delegate, WebSocketHandshakeStreamBase::CreateHelper* create_helper, bool enable_ip_based_pooling, bool enable_alternative_services, const NetLogWithSource& net_log) override; std::unique_ptr RequestBidirectionalStreamImpl( const HttpRequestInfo& info, RequestPriority priority, const SSLConfig& server_ssl_config, const SSLConfig& proxy_ssl_config, HttpStreamRequest::Delegate* delegate, bool enable_ip_based_pooling, bool enable_alternative_services, const NetLogWithSource& net_log) override; void PreconnectStreams(int num_streams, const HttpRequestInfo& info) override; const HostMappingRules* GetHostMappingRules() const override; void DumpMemoryStats(base::trace_event::ProcessMemoryDump* pmd, const std::string& parent_absolute_name) const override; enum JobType { MAIN, ALTERNATIVE, PRECONNECT, }; private: FRIEND_TEST_ALL_PREFIXES(HttpStreamFactoryImplRequestTest, SetPriority); FRIEND_TEST_ALL_PREFIXES(HttpStreamFactoryImplRequestTest, DelayMainJob); friend class HttpStreamFactoryImplPeer; typedef std::set> JobControllerSet; // |PreconnectingProxyServer| holds information of a connection to a single // proxy server. struct PreconnectingProxyServer { PreconnectingProxyServer(ProxyServer proxy_server, PrivacyMode privacy_mode); // Needed to be an element of std::set. bool operator<(const PreconnectingProxyServer& other) const; bool operator==(const PreconnectingProxyServer& other) const; const ProxyServer proxy_server; const PrivacyMode privacy_mode; }; // Values must not be changed or reused. Keep in sync with identically named // enum in histograms.xml. enum AlternativeServiceType { NO_ALTERNATIVE_SERVICE = 0, QUIC_SAME_DESTINATION = 1, QUIC_DIFFERENT_DESTINATION = 2, NOT_QUIC_SAME_DESTINATION = 3, NOT_QUIC_DIFFERENT_DESTINATION = 4, MAX_ALTERNATIVE_SERVICE_TYPE }; std::unique_ptr RequestStreamInternal( const HttpRequestInfo& info, RequestPriority priority, const SSLConfig& server_ssl_config, const SSLConfig& proxy_ssl_config, HttpStreamRequest::Delegate* delegate, WebSocketHandshakeStreamBase::CreateHelper* create_helper, HttpStreamRequest::StreamType stream_type, bool enable_ip_based_pooling, bool enable_alternative_services, const NetLogWithSource& net_log); // Called when the Job detects that the endpoint indicated by the // Alternate-Protocol does not work. Lets the factory update // HttpAlternateProtocols with the failure and resets the SPDY session key. void OnBrokenAlternateProtocol(const Job*, const HostPortPair& origin); // Called when the Preconnect completes. Used for testing. virtual void OnPreconnectsCompleteInternal() {} // Called when the JobController finishes service. Delete the JobController // from |job_controller_set_|. void OnJobControllerComplete(JobController* controller); // Returns true if a connection to the proxy server contained in |proxy_info| // that has privacy mode |privacy_mode| can be skipped by a job controlled by // |controller|. bool OnInitConnection(const JobController& controller, const ProxyInfo& proxy_info, PrivacyMode privacy_mode); // Notifies |this| that a stream to the proxy server contained in |proxy_info| // with privacy mode |privacy_mode| is ready. void OnStreamReady(const ProxyInfo& proxy_info, PrivacyMode privacy_mode); // Returns true if |proxy_info| contains a proxy server that supports request // priorities. bool ProxyServerSupportsPriorities(const ProxyInfo& proxy_info) const; // Adds the count of JobControllers that are not completed to UMA histogram if // the count is a multiple of 100: 100, 200, 400, etc. Break down // JobControllers count based on the type of JobController. void AddJobControllerCountToHistograms(); HttpNetworkSession* const session_; // All Requests/Preconnects are assigned with a JobController to manage // serving Job(s). JobController might outlive Request when Request // is served while there's some working Job left. JobController will be // deleted from |job_controller_set_| when it determines the completion of // its work. JobControllerSet job_controller_set_; // Factory used by job controllers for creating jobs. std::unique_ptr job_factory_; // Set of proxy servers that support request priorities to which subsequent // preconnects should be skipped. std::set preconnecting_proxy_servers_; const bool for_websockets_; // The count of JobControllers that was most recently logged to histograms. size_t last_logged_job_controller_count_; DISALLOW_COPY_AND_ASSIGN(HttpStreamFactoryImpl); }; } // namespace net #endif // NET_HTTP_HTTP_STREAM_FACTORY_IMPL_H_