1// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef NET_HTTP_HTTP_NETWORK_SESSION_H_
6#define NET_HTTP_HTTP_NETWORK_SESSION_H_
7
8#include "base/ref_counted.h"
9#include "net/base/host_resolver.h"
10#include "net/base/ssl_client_auth_cache.h"
11#include "net/base/ssl_config_service.h"
12#include "net/http/http_auth_cache.h"
13#include "net/proxy/proxy_service.h"
14#include "net/socket/tcp_client_socket_pool.h"
15
16namespace net {
17
18class ClientSocketFactory;
19class FlipSessionPool;
20class NetworkChangeNotifier;
21
22// This class holds session objects used by HttpNetworkTransaction objects.
23class HttpNetworkSession : public base::RefCounted<HttpNetworkSession> {
24 public:
25  HttpNetworkSession(
26      NetworkChangeNotifier* network_change_notifier,
27      HostResolver* host_resolver,
28      ProxyService* proxy_service,
29      ClientSocketFactory* client_socket_factory,
30      SSLConfigService* ssl_config_service,
31      FlipSessionPool* flip_session_pool);
32
33  HttpAuthCache* auth_cache() { return &auth_cache_; }
34  SSLClientAuthCache* ssl_client_auth_cache() {
35    return &ssl_client_auth_cache_;
36  }
37
38  // TCP sockets come from the tcp_socket_pool().
39  TCPClientSocketPool* tcp_socket_pool() { return tcp_socket_pool_; }
40  // SSL sockets come frmo the socket_factory().
41  ClientSocketFactory* socket_factory() { return socket_factory_; }
42  HostResolver* host_resolver() { return host_resolver_; }
43  ProxyService* proxy_service() { return proxy_service_; }
44  SSLConfigService* ssl_config_service() { return ssl_config_service_; }
45  const scoped_refptr<FlipSessionPool>& flip_session_pool() {
46    return flip_session_pool_;
47  }
48
49  // Replace the current socket pool with a new one.  This effectively
50  // abandons the current pool.  This is only used for debugging.
51  void ReplaceTCPSocketPool();
52
53  static void set_max_sockets_per_group(int socket_count);
54
55  static uint16 fixed_http_port() { return g_fixed_http_port; }
56  static void set_fixed_http_port(uint16 port) { g_fixed_http_port = port; }
57
58  static uint16 fixed_https_port() { return g_fixed_https_port; }
59  static void set_fixed_https_port(uint16 port) { g_fixed_https_port = port; }
60
61 private:
62  friend class base::RefCounted<HttpNetworkSession>;
63  FRIEND_TEST(HttpNetworkTransactionTest, GroupNameForProxyConnections);
64
65  ~HttpNetworkSession();
66
67  // Total limit of sockets. Not a constant to allow experiments.
68  static int max_sockets_;
69
70  // Default to allow up to 6 connections per host. Experiment and tuning may
71  // try other values (greater than 0).  Too large may cause many problems, such
72  // as home routers blocking the connections!?!?
73  static int max_sockets_per_group_;
74
75  static uint16 g_fixed_http_port;
76  static uint16 g_fixed_https_port;
77
78  HttpAuthCache auth_cache_;
79  SSLClientAuthCache ssl_client_auth_cache_;
80  NetworkChangeNotifier* const network_change_notifier_;
81  scoped_refptr<TCPClientSocketPool> tcp_socket_pool_;
82  ClientSocketFactory* socket_factory_;
83  scoped_refptr<HostResolver> host_resolver_;
84  scoped_refptr<ProxyService> proxy_service_;
85  scoped_refptr<SSLConfigService> ssl_config_service_;
86  scoped_refptr<FlipSessionPool> flip_session_pool_;
87};
88
89}  // namespace net
90
91#endif  // NET_HTTP_HTTP_NETWORK_SESSION_H_
92