http_network_session.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/quic_stream_factory.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_factory.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_pool_manager_impl.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/socket/next_proto.h" 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "net/spdy/hpack_huffman_aggregator.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/spdy/spdy_session_pool.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::ClientSocketPoolManager* CreateSocketPoolManager( 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpNetworkSession::SocketPoolType pool_type, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpNetworkSession::Params& params) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(yutak): Differentiate WebSocket pool manager and allow more 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // simultaneous connections for WebSockets. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new net::ClientSocketPoolManagerImpl( 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.net_log, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.client_socket_factory ? 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.client_socket_factory : 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::ClientSocketFactory::GetDefaultFactory(), 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.host_resolver, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.cert_verifier, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.server_bound_cert_service, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.transport_security_state, 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.cert_transparency_verifier, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ssl_session_cache_shard, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.proxy_service, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ssl_config_service, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool_type); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // unnamed namespace 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpNetworkSession::Params::Params() 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : client_socket_factory(NULL), 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_resolver(NULL), 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_verifier(NULL), 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_bound_cert_service(NULL), 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transport_security_state(NULL), 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cert_transparency_verifier(NULL), 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_service(NULL), 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_config_service(NULL), 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_auth_handler_factory(NULL), 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate(NULL), 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net_log(NULL), 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_mapping_rules(NULL), 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ignore_certificate_errors(false), 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_fixed_http_port(0), 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) testing_fixed_https_port(0), 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) force_spdy_single_domain(false), 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enable_spdy_compression(true), 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enable_spdy_ping_based_connection_checking(true), 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spdy_default_protocol(kProtoUnknown), 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spdy_stream_initial_recv_window_size(0), 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spdy_initial_max_concurrent_streams(0), 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spdy_max_concurrent_streams_limit(0), 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_func(&base::TimeTicks::Now), 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) force_spdy_over_ssl(true), 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) force_spdy_always(false), 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) use_alternate_protocols(false), 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enable_quic(false), 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch enable_quic_https(false), 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) enable_quic_port_selection(true), 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) enable_quic_pacing(false), 885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu enable_quic_time_based_loss_detection(false), 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) enable_quic_persist_server_info(false), 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quic_clock(NULL), 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quic_random(NULL), 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) quic_max_packet_length(kDefaultMaxPacketSize), 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enable_user_alternate_protocol_ports(false), 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quic_crypto_client_stream_factory(NULL) { 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) quic_supported_versions.push_back(QUIC_VERSION_17); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochHttpNetworkSession::Params::~Params() {} 99ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(mbelshe): Move the socket factories into HttpStreamFactory. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpNetworkSession::HttpNetworkSession(const Params& params) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : net_log_(params.net_log), 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate_(params.network_delegate), 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_server_properties_(params.http_server_properties), 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_verifier_(params.cert_verifier), 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_auth_handler_factory_(params.http_auth_handler_factory), 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_service_(params.proxy_service), 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_config_service_(params.ssl_config_service), 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) normal_socket_pool_manager_( 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSocketPoolManager(NORMAL_SOCKET_POOL, params)), 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) websocket_socket_pool_manager_( 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSocketPoolManager(WEBSOCKET_SOCKET_POOL, params)), 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quic_stream_factory_(params.host_resolver, 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.client_socket_factory ? 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.client_socket_factory : 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::ClientSocketFactory::GetDefaultFactory(), 1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) params.http_server_properties, 118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch params.cert_verifier, 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.quic_crypto_client_stream_factory, 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.quic_random ? params.quic_random : 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicRandom::GetInstance(), 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.quic_clock ? params. quic_clock : 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new QuicClock(), 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.quic_max_packet_length, 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.quic_supported_versions, 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params.enable_quic_port_selection, 1275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu params.enable_quic_pacing, 1285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu params.enable_quic_time_based_loss_detection), 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) spdy_session_pool_(params.host_resolver, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ssl_config_service, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.http_server_properties, 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.force_spdy_single_domain, 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.enable_spdy_compression, 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.enable_spdy_ping_based_connection_checking, 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.spdy_default_protocol, 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.spdy_stream_initial_recv_window_size, 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.spdy_initial_max_concurrent_streams, 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.spdy_max_concurrent_streams_limit, 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.time_func, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.trusted_spdy_proxy), 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch http_stream_factory_(new HttpStreamFactoryImpl(this, false)), 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) http_stream_factory_for_websocket_( 1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) new HttpStreamFactoryImpl(this, true)), 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params_(params) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(proxy_service_); 146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(ssl_config_service_.get()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(http_server_properties_); 1485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (int i = ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION; 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) i <= ALTERNATE_PROTOCOL_MAXIMUM_VALID_VERSION; ++i) { 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) enabled_protocols_[i - ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION] = false; 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(rtenneti): bug 116575 - consider combining the NextProto and 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // AlternateProtocol. 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (std::vector<NextProto>::const_iterator it = params_.next_protos.begin(); 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) it != params_.next_protos.end(); ++it) { 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NextProto proto = *it; 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Add the protocol to the TLS next protocol list, except for QUIC 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // since it uses UDP. 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (proto != kProtoQUIC1SPDY3) { 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) next_protos_.push_back(SSLClientSocket::NextProtoToString(proto)); 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Enable the corresponding alternate protocol, except for HTTP 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // which has not corresponding alternative. 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (proto != kProtoHTTP11) { 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AlternateProtocol alternate = AlternateProtocolFromNextProto(proto); 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!IsAlternateProtocolValid(alternate)) { 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED() << "Invalid next proto: " << proto; 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) continue; 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) enabled_protocols_[alternate - ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION] = 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) true; 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (HpackHuffmanAggregator::UseAggregator()) { 1805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu huffman_aggregator_.reset(new HpackHuffmanAggregator()); 1815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpNetworkSession::~HttpNetworkSession() { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteElements(&response_drainers_); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) spdy_session_pool_.CloseAllSessions(); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpNetworkSession::AddResponseDrainer(HttpResponseBodyDrainer* drainer) { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!ContainsKey(response_drainers_, drainer)); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_drainers_.insert(drainer); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpNetworkSession::RemoveResponseDrainer( 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpResponseBodyDrainer* drainer) { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(ContainsKey(response_drainers_, drainer)); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_drainers_.erase(drainer); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TransportClientSocketPool* HttpNetworkSession::GetTransportSocketPool( 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SocketPoolType pool_type) { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetSocketPoolManager(pool_type)->GetTransportSocketPool(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLClientSocketPool* HttpNetworkSession::GetSSLSocketPool( 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SocketPoolType pool_type) { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetSocketPoolManager(pool_type)->GetSSLSocketPool(); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SOCKSClientSocketPool* HttpNetworkSession::GetSocketPoolForSOCKSProxy( 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SocketPoolType pool_type, 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HostPortPair& socks_proxy) { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetSocketPoolManager(pool_type)->GetSocketPoolForSOCKSProxy( 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socks_proxy); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpProxyClientSocketPool* HttpNetworkSession::GetSocketPoolForHTTPProxy( 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SocketPoolType pool_type, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HostPortPair& http_proxy) { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetSocketPoolManager(pool_type)->GetSocketPoolForHTTPProxy(http_proxy); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLClientSocketPool* HttpNetworkSession::GetSocketPoolForSSLWithProxy( 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SocketPoolType pool_type, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HostPortPair& proxy_server) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetSocketPoolManager(pool_type)->GetSocketPoolForSSLWithProxy( 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy_server); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::Value* HttpNetworkSession::SocketPoolInfoToValue() const { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(yutak): Should merge values from normal pools and WebSocket pools. 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return normal_socket_pool_manager_->SocketPoolInfoToValue(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::Value* HttpNetworkSession::SpdySessionPoolInfoToValue() const { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return spdy_session_pool_.SpdySessionPoolInfoToValue(); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::Value* HttpNetworkSession::QuicInfoToValue() const { 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* dict = new base::DictionaryValue(); 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->Set("sessions", quic_stream_factory_.QuicStreamFactoryInfoToValue()); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetBoolean("quic_enabled", params_.enable_quic); 2437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch dict->SetBoolean("quic_enabled_https", params_.enable_quic_https); 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dict->SetBoolean("enable_quic_port_selection", 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params_.enable_quic_port_selection); 246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) dict->SetBoolean("enable_quic_pacing", 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params_.enable_quic_pacing); 2485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu dict->SetBoolean("enable_quic_time_based_loss_detection", 2495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu params_.enable_quic_time_based_loss_detection); 250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) dict->SetBoolean("enable_quic_persist_server_info", 251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) params_.enable_quic_persist_server_info); 252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dict->SetString("origin_to_force_quic_on", 253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params_.origin_to_force_quic_on.ToString()); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return dict; 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpNetworkSession::CloseAllConnections() { 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) normal_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED); 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) websocket_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) spdy_session_pool_.CloseCurrentSessions(ERR_ABORTED); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) quic_stream_factory_.CloseAllSessions(ERR_ABORTED); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpNetworkSession::CloseIdleConnections() { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) normal_socket_pool_manager_->CloseIdleSockets(); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) websocket_socket_pool_manager_->CloseIdleSockets(); 2677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch spdy_session_pool_.CloseCurrentIdleSessions(); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool HttpNetworkSession::IsProtocolEnabled(AlternateProtocol protocol) const { 271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(IsAlternateProtocolValid(protocol)); 272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return enabled_protocols_[ 273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protocol - ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION]; 274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HttpNetworkSession::GetNextProtos( 277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<std::string>* next_protos) const { 278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (HttpStreamFactory::spdy_enabled()) { 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *next_protos = next_protos_; 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) next_protos->clear(); 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool HttpNetworkSession::HasSpdyExclusion( 286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) HostPortPair host_port_pair) const { 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return params_.forced_spdy_exclusions.find(host_port_pair) != 288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) params_.forced_spdy_exclusions.end(); 289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ClientSocketPoolManager* HttpNetworkSession::GetSocketPoolManager( 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SocketPoolType pool_type) { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (pool_type) { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NORMAL_SOCKET_POOL: 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return normal_socket_pool_manager_.get(); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WEBSOCKET_SOCKET_POOL: 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return websocket_socket_pool_manager_.get(); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 306