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,
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      params.proxy_delegate,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pool_type);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // unnamed namespace
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpNetworkSession::Params::Params()
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : client_socket_factory(NULL),
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_resolver(NULL),
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cert_verifier(NULL),
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      channel_id_service(NULL),
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      transport_security_state(NULL),
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      cert_transparency_verifier(NULL),
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proxy_service(NULL),
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_config_service(NULL),
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_auth_handler_factory(NULL),
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      network_delegate(NULL),
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net_log(NULL),
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_mapping_rules(NULL),
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      enable_ssl_connect_job_waiting(false),
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ignore_certificate_errors(false),
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testing_fixed_http_port(0),
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      testing_fixed_https_port(0),
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      enable_tcp_fast_open_for_ssl(false),
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      force_spdy_single_domain(false),
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      enable_spdy_compression(true),
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      enable_spdy_ping_based_connection_checking(true),
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      spdy_default_protocol(kProtoUnknown),
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      spdy_stream_initial_recv_window_size(0),
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      spdy_initial_max_concurrent_streams(0),
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      spdy_max_concurrent_streams_limit(0),
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      time_func(&base::TimeTicks::Now),
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      force_spdy_over_ssl(true),
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      force_spdy_always(false),
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      use_alternate_protocols(false),
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      alternate_protocol_probability_threshold(1),
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      enable_websocket_over_spdy(false),
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      enable_quic(false),
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      enable_quic_port_selection(true),
945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      enable_quic_time_based_loss_detection(false),
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      quic_always_require_handshake_confirmation(false),
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      quic_disable_connection_pooling(false),
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      quic_clock(NULL),
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      quic_random(NULL),
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      quic_max_packet_length(kDefaultMaxPacketSize),
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      enable_user_alternate_protocol_ports(false),
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      quic_crypto_client_stream_factory(NULL),
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      proxy_delegate(NULL) {
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  quic_supported_versions.push_back(QUIC_VERSION_23);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
106ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochHttpNetworkSession::Params::~Params() {}
107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(mbelshe): Move the socket factories into HttpStreamFactory.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpNetworkSession::HttpNetworkSession(const Params& params)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : net_log_(params.net_log),
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      network_delegate_(params.network_delegate),
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_server_properties_(params.http_server_properties),
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cert_verifier_(params.cert_verifier),
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_auth_handler_factory_(params.http_auth_handler_factory),
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proxy_service_(params.proxy_service),
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_config_service_(params.ssl_config_service),
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      normal_socket_pool_manager_(
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CreateSocketPoolManager(NORMAL_SOCKET_POOL, params)),
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      websocket_socket_pool_manager_(
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CreateSocketPoolManager(WEBSOCKET_SOCKET_POOL, params)),
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      quic_stream_factory_(
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          params.host_resolver,
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          params.client_socket_factory
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              ? params.client_socket_factory
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              : net::ClientSocketFactory::GetDefaultFactory(),
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          params.http_server_properties,
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          params.cert_verifier,
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          params.channel_id_service,
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          params.transport_security_state,
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          params.quic_crypto_client_stream_factory,
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          params.quic_random ? params.quic_random : QuicRandom::GetInstance(),
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          params.quic_clock ? params.quic_clock : new QuicClock(),
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          params.quic_max_packet_length,
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          params.quic_user_agent_id,
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          params.quic_supported_versions,
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          params.enable_quic_port_selection,
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          params.enable_quic_time_based_loss_detection,
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          params.quic_always_require_handshake_confirmation,
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          params.quic_disable_connection_pooling,
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          params.quic_connection_options),
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      spdy_session_pool_(params.host_resolver,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         params.ssl_config_service,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         params.http_server_properties,
14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                         params.transport_security_state,
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         params.force_spdy_single_domain,
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         params.enable_spdy_compression,
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         params.enable_spdy_ping_based_connection_checking,
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         params.spdy_default_protocol,
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         params.spdy_stream_initial_recv_window_size,
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         params.spdy_initial_max_concurrent_streams,
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         params.spdy_max_concurrent_streams_limit,
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         params.time_func,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         params.trusted_spdy_proxy),
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      http_stream_factory_(new HttpStreamFactoryImpl(this, false)),
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      http_stream_factory_for_websocket_(new HttpStreamFactoryImpl(this, true)),
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      params_(params) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(proxy_service_);
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(ssl_config_service_.get());
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(http_server_properties_);
1605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (int i = ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION;
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       i <= ALTERNATE_PROTOCOL_MAXIMUM_VALID_VERSION; ++i) {
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    enabled_protocols_[i - ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION] = false;
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // TODO(rtenneti): bug 116575 - consider combining the NextProto and
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // AlternateProtocol.
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (std::vector<NextProto>::const_iterator it = params_.next_protos.begin();
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       it != params_.next_protos.end(); ++it) {
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    NextProto proto = *it;
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Add the protocol to the TLS next protocol list, except for QUIC
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // since it uses UDP.
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (proto != kProtoQUIC1SPDY3) {
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      next_protos_.push_back(SSLClientSocket::NextProtoToString(proto));
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Enable the corresponding alternate protocol, except for HTTP
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // which has not corresponding alternative.
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (proto != kProtoHTTP11) {
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      AlternateProtocol alternate = AlternateProtocolFromNextProto(proto);
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (!IsAlternateProtocolValid(alternate)) {
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        NOTREACHED() << "Invalid next proto: " << proto;
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        continue;
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      }
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      enabled_protocols_[alternate - ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION] =
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          true;
188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (HpackHuffmanAggregator::UseAggregator()) {
1925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    huffman_aggregator_.reset(new HpackHuffmanAggregator());
1935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  http_server_properties_->SetAlternateProtocolProbabilityThreshold(
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      params.alternate_protocol_probability_threshold);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpNetworkSession::~HttpNetworkSession() {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLDeleteElements(&response_drainers_);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  spdy_session_pool_.CloseAllSessions();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpNetworkSession::AddResponseDrainer(HttpResponseBodyDrainer* drainer) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!ContainsKey(response_drainers_, drainer));
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_drainers_.insert(drainer);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpNetworkSession::RemoveResponseDrainer(
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpResponseBodyDrainer* drainer) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(ContainsKey(response_drainers_, drainer));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_drainers_.erase(drainer);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TransportClientSocketPool* HttpNetworkSession::GetTransportSocketPool(
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SocketPoolType pool_type) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetSocketPoolManager(pool_type)->GetTransportSocketPool();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLClientSocketPool* HttpNetworkSession::GetSSLSocketPool(
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SocketPoolType pool_type) {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetSocketPoolManager(pool_type)->GetSSLSocketPool();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SOCKSClientSocketPool* HttpNetworkSession::GetSocketPoolForSOCKSProxy(
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SocketPoolType pool_type,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const HostPortPair& socks_proxy) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetSocketPoolManager(pool_type)->GetSocketPoolForSOCKSProxy(
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      socks_proxy);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpProxyClientSocketPool* HttpNetworkSession::GetSocketPoolForHTTPProxy(
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SocketPoolType pool_type,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const HostPortPair& http_proxy) {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetSocketPoolManager(pool_type)->GetSocketPoolForHTTPProxy(http_proxy);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSLClientSocketPool* HttpNetworkSession::GetSocketPoolForSSLWithProxy(
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SocketPoolType pool_type,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const HostPortPair& proxy_server) {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetSocketPoolManager(pool_type)->GetSocketPoolForSSLWithProxy(
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proxy_server);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::Value* HttpNetworkSession::SocketPoolInfoToValue() const {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(yutak): Should merge values from normal pools and WebSocket pools.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return normal_socket_pool_manager_->SocketPoolInfoToValue();
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::Value* HttpNetworkSession::SpdySessionPoolInfoToValue() const {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return spdy_session_pool_.SpdySessionPoolInfoToValue();
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::Value* HttpNetworkSession::QuicInfoToValue() const {
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::DictionaryValue* dict = new base::DictionaryValue();
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict->Set("sessions", quic_stream_factory_.QuicStreamFactoryInfoToValue());
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dict->SetBoolean("quic_enabled", params_.enable_quic);
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dict->SetBoolean("enable_quic_port_selection",
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   params_.enable_quic_port_selection);
26003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::ListValue* connection_options = new base::ListValue;
26103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  for (QuicTagVector::const_iterator it =
26203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)           params_.quic_connection_options.begin();
26303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)       it != params_.quic_connection_options.end(); ++it) {
26403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    connection_options->AppendString("'" + QuicUtils::TagToString(*it) + "'");
26503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
26603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  dict->Set("connection_options", connection_options);
2675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  dict->SetBoolean("enable_quic_time_based_loss_detection",
2685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                   params_.enable_quic_time_based_loss_detection);
269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dict->SetString("origin_to_force_quic_on",
270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  params_.origin_to_force_quic_on.ToString());
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dict->SetDouble("alternate_protocol_probability_threshold",
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  params_.alternate_protocol_probability_threshold);
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return dict;
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpNetworkSession::CloseAllConnections() {
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  normal_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED);
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  websocket_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED);
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  spdy_session_pool_.CloseCurrentSessions(ERR_ABORTED);
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  quic_stream_factory_.CloseAllSessions(ERR_ABORTED);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpNetworkSession::CloseIdleConnections() {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  normal_socket_pool_manager_->CloseIdleSockets();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  websocket_socket_pool_manager_->CloseIdleSockets();
2867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  spdy_session_pool_.CloseCurrentIdleSessions();
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool HttpNetworkSession::IsProtocolEnabled(AlternateProtocol protocol) const {
290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(IsAlternateProtocolValid(protocol));
291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return enabled_protocols_[
292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      protocol - ALTERNATE_PROTOCOL_MINIMUM_VALID_VERSION];
293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HttpNetworkSession::GetNextProtos(
296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::vector<std::string>* next_protos) const {
297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (HttpStreamFactory::spdy_enabled()) {
298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    *next_protos = next_protos_;
299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else {
300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    next_protos->clear();
301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool HttpNetworkSession::HasSpdyExclusion(
305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    HostPortPair host_port_pair) const {
306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return params_.forced_spdy_exclusions.find(host_port_pair) !=
307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      params_.forced_spdy_exclusions.end();
308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ClientSocketPoolManager* HttpNetworkSession::GetSocketPoolManager(
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SocketPoolType pool_type) {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (pool_type) {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NORMAL_SOCKET_POOL:
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return normal_socket_pool_manager_.get();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WEBSOCKET_SOCKET_POOL:
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return websocket_socket_pool_manager_.get();
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  //  namespace net
325