client_socket_factory.cc revision 513209b27ff55e2841eac0e4120199c23acce758
1// Copyright (c) 2010 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#include "net/socket/client_socket_factory.h"
6
7#include "base/singleton.h"
8#include "build/build_config.h"
9#include "net/socket/client_socket_handle.h"
10#if defined(OS_WIN)
11#include "net/socket/ssl_client_socket_win.h"
12#elif defined(USE_OPENSSL)
13#include "net/socket/ssl_client_socket_openssl.h"
14#elif defined(USE_NSS)
15#include "net/socket/ssl_client_socket_nss.h"
16#elif defined(USE_OPENSSL) && defined(ANDROID)
17#include "net/socket/ssl_client_socket_openssl.h"
18#elif defined(OS_MACOSX)
19#include "net/socket/ssl_client_socket_nss.h"
20#endif
21#include "net/socket/ssl_host_info.h"
22#include "net/socket/tcp_client_socket.h"
23
24namespace net {
25
26class DnsRRResolver;
27
28namespace {
29
30SSLClientSocket* DefaultSSLClientSocketFactory(
31    ClientSocketHandle* transport_socket,
32    const std::string& hostname,
33    const SSLConfig& ssl_config,
34    SSLHostInfo* ssl_host_info,
35    DnsRRResolver* dnsrr_resolver) {
36  scoped_ptr<SSLHostInfo> shi(ssl_host_info);
37#if defined(OS_WIN)
38  return new SSLClientSocketWin(transport_socket, hostname, ssl_config);
39#elif defined(USE_OPENSSL)
40  return new SSLClientSocketOpenSSL(transport_socket, hostname, ssl_config);
41#elif defined(USE_NSS)
42  return new SSLClientSocketNSS(transport_socket, hostname, ssl_config,
43                                shi.release(), dnsrr_resolver);
44#elif defined(OS_MACOSX)
45  return new SSLClientSocketNSS(transport_socket, hostname, ssl_config,
46                                shi.release(), dnsrr_resolver);
47#else
48  NOTIMPLEMENTED();
49  return NULL;
50#endif
51}
52
53SSLClientSocketFactory g_ssl_factory = DefaultSSLClientSocketFactory;
54
55class DefaultClientSocketFactory : public ClientSocketFactory {
56 public:
57  virtual ClientSocket* CreateTCPClientSocket(
58      const AddressList& addresses,
59      NetLog* net_log,
60      const NetLog::Source& source) {
61    return new TCPClientSocket(addresses, net_log, source);
62  }
63
64  virtual SSLClientSocket* CreateSSLClientSocket(
65      ClientSocketHandle* transport_socket,
66      const std::string& hostname,
67      const SSLConfig& ssl_config,
68      SSLHostInfo* ssl_host_info,
69      DnsRRResolver* dnsrr_resolver) {
70    return g_ssl_factory(transport_socket, hostname, ssl_config, ssl_host_info,
71                         dnsrr_resolver);
72  }
73};
74
75}  // namespace
76
77// static
78ClientSocketFactory* ClientSocketFactory::GetDefaultFactory() {
79  return Singleton<DefaultClientSocketFactory>::get();
80}
81
82// static
83void ClientSocketFactory::SetSSLClientSocketFactory(
84    SSLClientSocketFactory factory) {
85  g_ssl_factory = factory;
86}
87
88// Deprecated function (http://crbug.com/37810) that takes a ClientSocket.
89SSLClientSocket* ClientSocketFactory::CreateSSLClientSocket(
90    ClientSocket* transport_socket,
91    const std::string& hostname,
92    const SSLConfig& ssl_config,
93    SSLHostInfo* ssl_host_info) {
94  ClientSocketHandle* socket_handle = new ClientSocketHandle();
95  socket_handle->set_socket(transport_socket);
96  return CreateSSLClientSocket(socket_handle, hostname, ssl_config,
97                               ssl_host_info, NULL /* DnsRRResolver */);
98}
99
100}  // namespace net
101