http_network_session.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_session.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/debug/stack_trace.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_auth_handler_factory.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_body_drainer.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_stream_factory_impl.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/url_security_manager.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_service.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/crypto/quic_random.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/quic_clock.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/quic_crypto_client_stream_factory.h" 236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "net/quic/quic_protocol.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/quic_stream_factory.h" 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "net/quic/quic_utils.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_factory.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_pool_manager_impl.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/socket/next_proto.h" 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "net/spdy/hpack_huffman_aggregator.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/spdy/spdy_session_pool.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::ClientSocketPoolManager* CreateSocketPoolManager( 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpNetworkSession::SocketPoolType pool_type, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpNetworkSession::Params& params) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(yutak): Differentiate WebSocket pool manager and allow more 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // simultaneous connections for WebSockets. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new net::ClientSocketPoolManagerImpl( 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.net_log, 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.client_socket_factory 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ? params.client_socket_factory 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : net::ClientSocketFactory::GetDefaultFactory(), 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.host_resolver, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.cert_verifier, 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.channel_id_service, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transport_security_state, 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.cert_transparency_verifier, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ssl_session_cache_shard, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.proxy_service, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ssl_config_service, 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.enable_ssl_connect_job_waiting, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool_type); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // unnamed namespace 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpNetworkSession::Params::Params() 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : client_socket_factory(NULL), 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_resolver(NULL), 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_verifier(NULL), 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) channel_id_service(NULL), 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transport_security_state(NULL), 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cert_transparency_verifier(NULL), 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_service(NULL), 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_config_service(NULL), 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_auth_handler_factory(NULL), 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate(NULL), 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net_log(NULL), 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_mapping_rules(NULL), 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enable_ssl_connect_job_waiting(false), 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ignore_certificate_errors(false), 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_fixed_http_port(0), 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) testing_fixed_https_port(0), 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) force_spdy_single_domain(false), 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enable_spdy_compression(true), 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enable_spdy_ping_based_connection_checking(true), 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spdy_default_protocol(kProtoUnknown), 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spdy_stream_initial_recv_window_size(0), 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spdy_initial_max_concurrent_streams(0), 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spdy_max_concurrent_streams_limit(0), 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_func(&base::TimeTicks::Now), 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) force_spdy_over_ssl(true), 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) force_spdy_always(false), 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) use_alternate_protocols(false), 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) alternate_protocol_probability_threshold(1), 8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) enable_websocket_over_spdy(false), 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enable_quic(false), 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) enable_quic_port_selection(true), 925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu enable_quic_time_based_loss_detection(false), 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quic_clock(NULL), 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quic_random(NULL), 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) quic_max_packet_length(kDefaultMaxPacketSize), 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enable_user_alternate_protocol_ports(false), 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quic_crypto_client_stream_factory(NULL) { 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) quic_supported_versions.push_back(QUIC_VERSION_21); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochHttpNetworkSession::Params::~Params() {} 102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(mbelshe): Move the socket factories into HttpStreamFactory. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpNetworkSession::HttpNetworkSession(const Params& params) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : net_log_(params.net_log), 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate_(params.network_delegate), 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_server_properties_(params.http_server_properties), 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_verifier_(params.cert_verifier), 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_auth_handler_factory_(params.http_auth_handler_factory), 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_service_(params.proxy_service), 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_config_service_(params.ssl_config_service), 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) normal_socket_pool_manager_( 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSocketPoolManager(NORMAL_SOCKET_POOL, params)), 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) websocket_socket_pool_manager_( 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSocketPoolManager(WEBSOCKET_SOCKET_POOL, params)), 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quic_stream_factory_(params.host_resolver, 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.client_socket_factory ? 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.client_socket_factory : 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::ClientSocketFactory::GetDefaultFactory(), 1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params.http_server_properties, 121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch params.cert_verifier, 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.channel_id_service, 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.transport_security_state, 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.quic_crypto_client_stream_factory, 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.quic_random ? params.quic_random : 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicRandom::GetInstance(), 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.quic_clock ? params. quic_clock : 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new QuicClock(), 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.quic_max_packet_length, 13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) params.quic_user_agent_id, 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.quic_supported_versions, 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.enable_quic_port_selection, 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params.enable_quic_time_based_loss_detection, 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params.quic_connection_options), 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) spdy_session_pool_(params.host_resolver, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ssl_config_service, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.http_server_properties, 13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) params.transport_security_state, 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.force_spdy_single_domain, 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.enable_spdy_compression, 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.enable_spdy_ping_based_connection_checking, 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.spdy_default_protocol, 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.spdy_stream_initial_recv_window_size, 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.spdy_initial_max_concurrent_streams, 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.spdy_max_concurrent_streams_limit, 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.time_func, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.trusted_spdy_proxy), 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch http_stream_factory_(new HttpStreamFactoryImpl(this, false)), 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) http_stream_factory_for_websocket_( 1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) new HttpStreamFactoryImpl(this, true)), 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params_(params) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(proxy_service_); 153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(ssl_config_service_.get()); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(http_server_properties_); 1555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (int i = ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION; 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) i <= ALTERNATE_PROTOCOL_MAXIMUM_VALID_VERSION; ++i) { 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) enabled_protocols_[i - ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION] = false; 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(rtenneti): bug 116575 - consider combining the NextProto and 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // AlternateProtocol. 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (std::vector<NextProto>::const_iterator it = params_.next_protos.begin(); 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) it != params_.next_protos.end(); ++it) { 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NextProto proto = *it; 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Add the protocol to the TLS next protocol list, except for QUIC 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // since it uses UDP. 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (proto != kProtoQUIC1SPDY3) { 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) next_protos_.push_back(SSLClientSocket::NextProtoToString(proto)); 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Enable the corresponding alternate protocol, except for HTTP 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // which has not corresponding alternative. 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (proto != kProtoHTTP11) { 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AlternateProtocol alternate = AlternateProtocolFromNextProto(proto); 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!IsAlternateProtocolValid(alternate)) { 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED() << "Invalid next proto: " << proto; 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) continue; 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) enabled_protocols_[alternate - ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION] = 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) true; 183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (HpackHuffmanAggregator::UseAggregator()) { 1875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu huffman_aggregator_.reset(new HpackHuffmanAggregator()); 1885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch http_server_properties_->SetAlternateProtocolProbabilityThreshold( 191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params.alternate_protocol_probability_threshold); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpNetworkSession::~HttpNetworkSession() { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteElements(&response_drainers_); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) spdy_session_pool_.CloseAllSessions(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpNetworkSession::AddResponseDrainer(HttpResponseBodyDrainer* drainer) { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!ContainsKey(response_drainers_, drainer)); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_drainers_.insert(drainer); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpNetworkSession::RemoveResponseDrainer( 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpResponseBodyDrainer* drainer) { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(ContainsKey(response_drainers_, drainer)); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_drainers_.erase(drainer); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TransportClientSocketPool* HttpNetworkSession::GetTransportSocketPool( 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SocketPoolType pool_type) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetSocketPoolManager(pool_type)->GetTransportSocketPool(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLClientSocketPool* HttpNetworkSession::GetSSLSocketPool( 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SocketPoolType pool_type) { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetSocketPoolManager(pool_type)->GetSSLSocketPool(); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SOCKSClientSocketPool* HttpNetworkSession::GetSocketPoolForSOCKSProxy( 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SocketPoolType pool_type, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HostPortPair& socks_proxy) { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetSocketPoolManager(pool_type)->GetSocketPoolForSOCKSProxy( 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socks_proxy); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpProxyClientSocketPool* HttpNetworkSession::GetSocketPoolForHTTPProxy( 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SocketPoolType pool_type, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HostPortPair& http_proxy) { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetSocketPoolManager(pool_type)->GetSocketPoolForHTTPProxy(http_proxy); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLClientSocketPool* HttpNetworkSession::GetSocketPoolForSSLWithProxy( 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SocketPoolType pool_type, 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HostPortPair& proxy_server) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetSocketPoolManager(pool_type)->GetSocketPoolForSSLWithProxy( 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_server); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::Value* HttpNetworkSession::SocketPoolInfoToValue() const { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(yutak): Should merge values from normal pools and WebSocket pools. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return normal_socket_pool_manager_->SocketPoolInfoToValue(); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::Value* HttpNetworkSession::SpdySessionPoolInfoToValue() const { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return spdy_session_pool_.SpdySessionPoolInfoToValue(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::Value* HttpNetworkSession::QuicInfoToValue() const { 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* dict = new base::DictionaryValue(); 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->Set("sessions", quic_stream_factory_.QuicStreamFactoryInfoToValue()); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetBoolean("quic_enabled", params_.enable_quic); 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dict->SetBoolean("enable_quic_port_selection", 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params_.enable_quic_port_selection); 25503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::ListValue* connection_options = new base::ListValue; 25603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (QuicTagVector::const_iterator it = 25703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) params_.quic_connection_options.begin(); 25803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) it != params_.quic_connection_options.end(); ++it) { 25903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) connection_options->AppendString("'" + QuicUtils::TagToString(*it) + "'"); 26003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 26103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) dict->Set("connection_options", connection_options); 2625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu dict->SetBoolean("enable_quic_time_based_loss_detection", 2635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu params_.enable_quic_time_based_loss_detection); 264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dict->SetString("origin_to_force_quic_on", 265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params_.origin_to_force_quic_on.ToString()); 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return dict; 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpNetworkSession::CloseAllConnections() { 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) normal_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) websocket_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED); 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spdy_session_pool_.CloseCurrentSessions(ERR_ABORTED); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quic_stream_factory_.CloseAllSessions(ERR_ABORTED); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpNetworkSession::CloseIdleConnections() { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) normal_socket_pool_manager_->CloseIdleSockets(); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) websocket_socket_pool_manager_->CloseIdleSockets(); 2797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch spdy_session_pool_.CloseCurrentIdleSessions(); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool HttpNetworkSession::IsProtocolEnabled(AlternateProtocol protocol) const { 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(IsAlternateProtocolValid(protocol)); 284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return enabled_protocols_[ 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protocol - ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION]; 286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HttpNetworkSession::GetNextProtos( 289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<std::string>* next_protos) const { 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (HttpStreamFactory::spdy_enabled()) { 291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *next_protos = next_protos_; 292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) next_protos->clear(); 294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool HttpNetworkSession::HasSpdyExclusion( 298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) HostPortPair host_port_pair) const { 299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return params_.forced_spdy_exclusions.find(host_port_pair) != 300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) params_.forced_spdy_exclusions.end(); 301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ClientSocketPoolManager* HttpNetworkSession::GetSocketPoolManager( 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SocketPoolType pool_type) { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (pool_type) { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NORMAL_SOCKET_POOL: 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return normal_socket_pool_manager_.get(); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WEBSOCKET_SOCKET_POOL: 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return websocket_socket_pool_manager_.get(); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 318