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 CHROME_BROWSER_IO_THREAD_H_ 6 #define CHROME_BROWSER_IO_THREAD_H_ 7 8 #include <string> 9 #include <vector> 10 11 #include "base/basictypes.h" 12 #include "base/compiler_specific.h" 13 #include "base/memory/ref_counted.h" 14 #include "base/memory/scoped_ptr.h" 15 #include "base/memory/weak_ptr.h" 16 #include "base/prefs/pref_member.h" 17 #include "base/strings/string_piece.h" 18 #include "base/time/time.h" 19 #include "chrome/browser/net/chrome_network_delegate.h" 20 #include "chrome/browser/net/ssl_config_service_manager.h" 21 #include "content/public/browser/browser_thread.h" 22 #include "content/public/browser/browser_thread_delegate.h" 23 #include "net/base/network_change_notifier.h" 24 #include "net/http/http_network_session.h" 25 #include "net/socket/next_proto.h" 26 27 class ChromeNetLog; 28 class PrefProxyConfigTracker; 29 class PrefService; 30 class PrefRegistrySimple; 31 class SystemURLRequestContextGetter; 32 33 namespace base { 34 class CommandLine; 35 } 36 37 namespace chrome_browser_net { 38 class DnsProbeService; 39 } 40 41 namespace data_reduction_proxy { 42 class DataReductionProxyAuthRequestHandler; 43 class DataReductionProxyDelegate; 44 class DataReductionProxyParams; 45 } 46 47 namespace extensions { 48 class EventRouterForwarder; 49 } 50 51 namespace net { 52 class CertVerifier; 53 class ChannelIDService; 54 class CookieStore; 55 class CTVerifier; 56 class FtpTransactionFactory; 57 class HostMappingRules; 58 class HostResolver; 59 class HttpAuthHandlerFactory; 60 class HttpServerProperties; 61 class HttpTransactionFactory; 62 class HttpUserAgentSettings; 63 class NetworkDelegate; 64 class ProxyConfigService; 65 class ProxyService; 66 class SSLConfigService; 67 class TransportSecurityState; 68 class URLRequestContext; 69 class URLRequestContextGetter; 70 class URLRequestJobFactory; 71 class URLRequestThrottlerManager; 72 class URLSecurityManager; 73 } // namespace net 74 75 namespace policy { 76 class PolicyService; 77 } // namespace policy 78 79 namespace test { 80 class IOThreadPeer; 81 } // namespace test 82 83 // Contains state associated with, initialized and cleaned up on, and 84 // primarily used on, the IO thread. 85 // 86 // If you are looking to interact with the IO thread (e.g. post tasks 87 // to it or check if it is the current thread), see 88 // content::BrowserThread. 89 class IOThread : public content::BrowserThreadDelegate { 90 public: 91 struct Globals { 92 template <typename T> 93 class Optional { 94 public: 95 Optional() : set_(false) {} 96 97 void set(T value) { 98 set_ = true; 99 value_ = value; 100 } 101 void CopyToIfSet(T* value) const { 102 if (set_) { 103 *value = value_; 104 } 105 } 106 107 private: 108 bool set_; 109 T value_; 110 }; 111 112 class SystemRequestContextLeakChecker { 113 public: 114 explicit SystemRequestContextLeakChecker(Globals* globals); 115 ~SystemRequestContextLeakChecker(); 116 117 private: 118 Globals* const globals_; 119 }; 120 121 Globals(); 122 ~Globals(); 123 124 // The "system" NetworkDelegate, used for Profile-agnostic network events. 125 scoped_ptr<net::NetworkDelegate> system_network_delegate; 126 scoped_ptr<net::HostResolver> host_resolver; 127 scoped_ptr<net::CertVerifier> cert_verifier; 128 // The ChannelIDService must outlive the HttpTransactionFactory. 129 scoped_ptr<net::ChannelIDService> system_channel_id_service; 130 // This TransportSecurityState doesn't load or save any state. It's only 131 // used to enforce pinning for system requests and will only use built-in 132 // pins. 133 scoped_ptr<net::TransportSecurityState> transport_security_state; 134 scoped_ptr<net::CTVerifier> cert_transparency_verifier; 135 scoped_refptr<net::SSLConfigService> ssl_config_service; 136 scoped_ptr<net::HttpAuthHandlerFactory> http_auth_handler_factory; 137 scoped_ptr<net::HttpServerProperties> http_server_properties; 138 scoped_ptr<net::ProxyService> proxy_script_fetcher_proxy_service; 139 scoped_ptr<net::HttpTransactionFactory> 140 proxy_script_fetcher_http_transaction_factory; 141 scoped_ptr<net::FtpTransactionFactory> 142 proxy_script_fetcher_ftp_transaction_factory; 143 scoped_ptr<net::URLRequestJobFactory> 144 proxy_script_fetcher_url_request_job_factory; 145 scoped_ptr<net::URLRequestThrottlerManager> throttler_manager; 146 scoped_ptr<net::URLSecurityManager> url_security_manager; 147 // TODO(willchan): Remove proxy script fetcher context since it's not 148 // necessary now that I got rid of refcounting URLRequestContexts. 149 // 150 // The first URLRequestContext is |system_url_request_context|. We introduce 151 // |proxy_script_fetcher_context| for the second context. It has a direct 152 // ProxyService, since we always directly connect to fetch the PAC script. 153 scoped_ptr<net::URLRequestContext> proxy_script_fetcher_context; 154 scoped_ptr<net::ProxyService> system_proxy_service; 155 scoped_ptr<net::HttpTransactionFactory> system_http_transaction_factory; 156 scoped_ptr<net::URLRequestJobFactory> system_url_request_job_factory; 157 scoped_ptr<net::URLRequestContext> system_request_context; 158 SystemRequestContextLeakChecker system_request_context_leak_checker; 159 // |system_cookie_store| and |system_channel_id_service| are shared 160 // between |proxy_script_fetcher_context| and |system_request_context|. 161 scoped_refptr<net::CookieStore> system_cookie_store; 162 #if defined(ENABLE_EXTENSIONS) 163 scoped_refptr<extensions::EventRouterForwarder> 164 extension_event_router_forwarder; 165 #endif 166 scoped_ptr<net::HostMappingRules> host_mapping_rules; 167 scoped_ptr<net::HttpUserAgentSettings> http_user_agent_settings; 168 bool enable_ssl_connect_job_waiting; 169 bool ignore_certificate_errors; 170 uint16 testing_fixed_http_port; 171 uint16 testing_fixed_https_port; 172 Optional<bool> enable_tcp_fast_open_for_ssl; 173 174 Optional<size_t> initial_max_spdy_concurrent_streams; 175 Optional<bool> force_spdy_single_domain; 176 Optional<bool> enable_spdy_compression; 177 Optional<bool> enable_spdy_ping_based_connection_checking; 178 Optional<net::NextProto> spdy_default_protocol; 179 net::NextProtoVector next_protos; 180 Optional<string> trusted_spdy_proxy; 181 Optional<bool> force_spdy_over_ssl; 182 Optional<bool> force_spdy_always; 183 std::set<net::HostPortPair> forced_spdy_exclusions; 184 Optional<bool> use_alternate_protocols; 185 Optional<double> alternate_protocol_probability_threshold; 186 Optional<bool> enable_websocket_over_spdy; 187 188 Optional<bool> enable_quic; 189 Optional<bool> enable_quic_time_based_loss_detection; 190 Optional<bool> enable_quic_port_selection; 191 Optional<bool> quic_always_require_handshake_confirmation; 192 Optional<bool> quic_disable_connection_pooling; 193 Optional<size_t> quic_max_packet_length; 194 net::QuicTagVector quic_connection_options; 195 Optional<std::string> quic_user_agent_id; 196 Optional<net::QuicVersionVector> quic_supported_versions; 197 Optional<net::HostPortPair> origin_to_force_quic_on; 198 bool enable_user_alternate_protocol_ports; 199 // NetErrorTabHelper uses |dns_probe_service| to send DNS probes when a 200 // main frame load fails with a DNS error in order to provide more useful 201 // information to the renderer so it can show a more specific error page. 202 scoped_ptr<chrome_browser_net::DnsProbeService> dns_probe_service; 203 scoped_ptr<data_reduction_proxy::DataReductionProxyParams> 204 data_reduction_proxy_params; 205 scoped_ptr<data_reduction_proxy::DataReductionProxyAuthRequestHandler> 206 data_reduction_proxy_auth_request_handler; 207 scoped_ptr<data_reduction_proxy::DataReductionProxyDelegate> 208 data_reduction_proxy_delegate; 209 }; 210 211 // |net_log| must either outlive the IOThread or be NULL. 212 IOThread(PrefService* local_state, 213 policy::PolicyService* policy_service, 214 ChromeNetLog* net_log, 215 extensions::EventRouterForwarder* extension_event_router_forwarder); 216 217 virtual ~IOThread(); 218 219 static void RegisterPrefs(PrefRegistrySimple* registry); 220 221 // Can only be called on the IO thread. 222 Globals* globals(); 223 224 // Allows overriding Globals in tests where IOThread::Init() and 225 // IOThread::CleanUp() are not called. This allows for injecting mocks into 226 // IOThread global objects. 227 void SetGlobalsForTesting(Globals* globals); 228 229 ChromeNetLog* net_log(); 230 231 // Handles changing to On The Record mode, discarding confidential data. 232 void ChangedToOnTheRecord(); 233 234 // Returns a getter for the URLRequestContext. Only called on the UI thread. 235 net::URLRequestContextGetter* system_url_request_context_getter(); 236 237 // Clears the host cache. Intended to be used to prevent exposing recently 238 // visited sites on about:net-internals/#dns and about:dns pages. Must be 239 // called on the IO thread. 240 void ClearHostCache(); 241 242 void InitializeNetworkSessionParams(net::HttpNetworkSession::Params* params); 243 244 base::TimeTicks creation_time() const; 245 246 private: 247 // Map from name to value for all parameters associate with a field trial. 248 typedef std::map<std::string, std::string> VariationParameters; 249 250 // Provide SystemURLRequestContextGetter with access to 251 // InitSystemRequestContext(). 252 friend class SystemURLRequestContextGetter; 253 254 friend class test::IOThreadPeer; 255 256 // BrowserThreadDelegate implementation, runs on the IO thread. 257 // This handles initialization and destruction of state that must 258 // live on the IO thread. 259 virtual void Init() OVERRIDE; 260 virtual void InitAsync() OVERRIDE; 261 virtual void CleanUp() OVERRIDE; 262 263 // Initializes |params| based on the settings in |globals|. 264 static void InitializeNetworkSessionParamsFromGlobals( 265 const Globals& globals, 266 net::HttpNetworkSession::Params* params); 267 268 void InitializeNetworkOptions(const base::CommandLine& parsed_command_line); 269 270 // Sets up TCP FastOpen if enabled via field trials or via the command line. 271 void ConfigureTCPFastOpen(const base::CommandLine& command_line); 272 273 // Enable SPDY with the given mode, which may contain the following: 274 // 275 // "off" : Disables SPDY support entirely. 276 // "ssl" : Forces SPDY for all HTTPS requests. 277 // "no-ssl" : Forces SPDY for all HTTP requests. 278 // "no-ping" : Disables SPDY ping connection testing. 279 // "exclude=<host>" : Disables SPDY support for the host <host>. 280 // "no-compress" : Disables SPDY header compression. 281 // "no-alt-protocols : Disables alternate protocol support. 282 // "force-alt-protocols : Forces an alternate protocol of SPDY/3 283 // on port 443. 284 // "single-domain" : Forces all spdy traffic to a single domain. 285 // "init-max-streams=<limit>" : Specifies the maximum number of concurrent 286 // streams for a SPDY session, unless the 287 // specifies a different value via SETTINGS. 288 void EnableSpdy(const std::string& mode); 289 290 // Configures available SPDY protocol versions from the given trial. 291 // Used only if no command-line configuration was present. 292 static void ConfigureSpdyFromTrial(base::StringPiece spdy_trial_group, 293 Globals* globals); 294 295 // Global state must be initialized on the IO thread, then this 296 // method must be invoked on the UI thread. 297 void InitSystemRequestContext(); 298 299 // Lazy initialization of system request context for 300 // SystemURLRequestContextGetter. To be called on IO thread only 301 // after global state has been initialized on the IO thread, and 302 // SystemRequestContext state has been initialized on the UI thread. 303 void InitSystemRequestContextOnIOThread(); 304 305 net::HttpAuthHandlerFactory* CreateDefaultAuthHandlerFactory( 306 net::HostResolver* resolver); 307 308 // Returns an SSLConfigService instance. 309 net::SSLConfigService* GetSSLConfigService(); 310 311 void ChangedToOnTheRecordOnIOThread(); 312 313 void UpdateDnsClientEnabled(); 314 315 // Configures QUIC options based on the flags in |command_line| as 316 // well as the QUIC field trial group. 317 void ConfigureQuic(const base::CommandLine& command_line); 318 319 // Set up data reduction proxy related objects on IO thread globals. 320 void SetupDataReductionProxy(ChromeNetworkDelegate* network_delegate); 321 322 extensions::EventRouterForwarder* extension_event_router_forwarder() { 323 #if defined(ENABLE_EXTENSIONS) 324 return extension_event_router_forwarder_; 325 #else 326 return NULL; 327 #endif 328 } 329 // Configures QUIC options in |globals| based on the flags in |command_line| 330 // as well as the QUIC field trial group and parameters. 331 static void ConfigureQuicGlobals( 332 const base::CommandLine& command_line, 333 base::StringPiece quic_trial_group, 334 const VariationParameters& quic_trial_params, 335 Globals* globals); 336 337 // Returns true if QUIC should be enabled, either as a result 338 // of a field trial or a command line flag. 339 static bool ShouldEnableQuic( 340 const base::CommandLine& command_line, 341 base::StringPiece quic_trial_group); 342 343 // Returns true if the selection of the ephemeral port in bind() should be 344 // performed by Chromium, and false if the OS should select the port. The OS 345 // option is used to prevent Windows from posting a security security warning 346 // dialog. 347 static bool ShouldEnableQuicPortSelection( 348 const base::CommandLine& command_line); 349 350 // Returns true if QUIC packet pacing should be negotiated during the 351 // QUIC handshake. 352 static bool ShouldEnableQuicPacing( 353 const base::CommandLine& command_line, 354 base::StringPiece quic_trial_group, 355 const VariationParameters& quic_trial_params); 356 357 // Returns true if QUIC time-base loss detection should be negotiated during 358 // the QUIC handshake. 359 static bool ShouldEnableQuicTimeBasedLossDetection( 360 const base::CommandLine& command_line, 361 base::StringPiece quic_trial_group, 362 const VariationParameters& quic_trial_params); 363 364 // Returns true if QUIC should always require handshake confirmation during 365 // the QUIC handshake. 366 static bool ShouldQuicAlwaysRequireHandshakeConfirmation( 367 const VariationParameters& quic_trial_params); 368 369 // Returns true if QUIC should disable connection pooling. 370 static bool ShouldQuicDisableConnectionPooling( 371 const VariationParameters& quic_trial_params); 372 373 // Returns the maximum length for QUIC packets, based on any flags in 374 // |command_line| or the field trial. Returns 0 if there is an error 375 // parsing any of the options, or if the default value should be used. 376 static size_t GetQuicMaxPacketLength( 377 const base::CommandLine& command_line, 378 base::StringPiece quic_trial_group, 379 const VariationParameters& quic_trial_params); 380 381 // Returns the QUIC versions specified by any flags in |command_line| 382 // or |quic_trial_params|. 383 static net::QuicVersion GetQuicVersion( 384 const base::CommandLine& command_line, 385 const VariationParameters& quic_trial_params); 386 387 // Returns the QUIC version specified by |quic_version| or 388 // QUIC_VERSION_UNSUPPORTED if |quic_version| is invalid. 389 static net::QuicVersion ParseQuicVersion(const std::string& quic_version); 390 391 // Returns the QUIC connection options specified by any flags in 392 // |command_line| or |quic_trial_params|. 393 static net::QuicTagVector GetQuicConnectionOptions( 394 const base::CommandLine& command_line, 395 const VariationParameters& quic_trial_params); 396 397 // Returns the list of QUIC tags represented by the comma separated 398 // string in |connection_options|. 399 static net::QuicTagVector ParseQuicConnectionOptions( 400 const std::string& connection_options); 401 402 // Returns the alternate protocol probability threshold specified by 403 // any flags in |command_line| or |quic_trial_params|. 404 static double GetAlternateProtocolProbabilityThreshold( 405 const base::CommandLine& command_line, 406 const VariationParameters& quic_trial_params); 407 408 // The NetLog is owned by the browser process, to allow logging from other 409 // threads during shutdown, but is used most frequently on the IOThread. 410 ChromeNetLog* net_log_; 411 412 #if defined(ENABLE_EXTENSIONS) 413 // The extensions::EventRouterForwarder allows for sending events to 414 // extensions from the IOThread. 415 extensions::EventRouterForwarder* extension_event_router_forwarder_; 416 #endif 417 418 // These member variables are basically global, but their lifetimes are tied 419 // to the IOThread. IOThread owns them all, despite not using scoped_ptr. 420 // This is because the destructor of IOThread runs on the wrong thread. All 421 // member variables should be deleted in CleanUp(). 422 423 // These member variables are initialized in Init() and do not change for the 424 // lifetime of the IO thread. 425 426 Globals* globals_; 427 428 // Observer that logs network changes to the ChromeNetLog. 429 class LoggingNetworkChangeObserver; 430 scoped_ptr<LoggingNetworkChangeObserver> network_change_observer_; 431 432 BooleanPrefMember system_enable_referrers_; 433 434 BooleanPrefMember dns_client_enabled_; 435 436 BooleanPrefMember quick_check_enabled_; 437 438 // Store HTTP Auth-related policies in this thread. 439 std::string auth_schemes_; 440 bool negotiate_disable_cname_lookup_; 441 bool negotiate_enable_port_; 442 std::string auth_server_whitelist_; 443 std::string auth_delegate_whitelist_; 444 std::string gssapi_library_name_; 445 446 // This is an instance of the default SSLConfigServiceManager for the current 447 // platform and it gets SSL preferences from local_state object. 448 scoped_ptr<SSLConfigServiceManager> ssl_config_service_manager_; 449 450 // These member variables are initialized by a task posted to the IO thread, 451 // which gets posted by calling certain member functions of IOThread. 452 scoped_ptr<net::ProxyConfigService> system_proxy_config_service_; 453 454 scoped_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_; 455 456 scoped_refptr<net::URLRequestContextGetter> 457 system_url_request_context_getter_; 458 459 // True if SPDY is disabled by policy. 460 bool is_spdy_disabled_by_policy_; 461 462 const base::TimeTicks creation_time_; 463 464 base::WeakPtrFactory<IOThread> weak_factory_; 465 466 DISALLOW_COPY_AND_ASSIGN(IOThread); 467 }; 468 469 #endif // CHROME_BROWSER_IO_THREAD_H_ 470