socket_factory.cc 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. // Copyright 2018 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. #include "services/network/socket_factory.h"
  5. #include <string>
  6. #include <utility>
  7. #include "mojo/public/cpp/bindings/type_converter.h"
  8. #include "net/base/completion_once_callback.h"
  9. #include "net/base/net_errors.h"
  10. #include "net/cert/cert_verifier.h"
  11. #include "net/cert/ct_policy_enforcer.h"
  12. #include "net/cert/multi_log_ct_verifier.h"
  13. #include "net/http/http_network_session.h"
  14. #include "net/log/net_log.h"
  15. #include "net/socket/client_socket_factory.h"
  16. #include "net/socket/client_socket_handle.h"
  17. #include "net/ssl/ssl_config.h"
  18. #include "net/ssl/ssl_config_service.h"
  19. #include "net/url_request/url_request_context.h"
  20. #include "services/network/tls_client_socket.h"
  21. #include "services/network/udp_socket.h"
  22. #include "third_party/abseil-cpp/absl/types/optional.h"
  23. namespace network {
  24. SocketFactory::SocketFactory(net::NetLog* net_log,
  25. net::URLRequestContext* url_request_context)
  26. : net_log_(net_log),
  27. client_socket_factory_(nullptr),
  28. tls_socket_factory_(url_request_context) {
  29. if (url_request_context->GetNetworkSessionContext()) {
  30. client_socket_factory_ =
  31. url_request_context->GetNetworkSessionContext()->client_socket_factory;
  32. }
  33. if (!client_socket_factory_)
  34. client_socket_factory_ = net::ClientSocketFactory::GetDefaultFactory();
  35. }
  36. SocketFactory::~SocketFactory() {}
  37. void SocketFactory::CreateUDPSocket(
  38. mojo::PendingReceiver<mojom::UDPSocket> receiver,
  39. mojo::PendingRemote<mojom::UDPSocketListener> listener) {
  40. udp_socket_receivers_.Add(
  41. std::make_unique<UDPSocket>(std::move(listener), net_log_),
  42. std::move(receiver));
  43. }
  44. void SocketFactory::CreateTCPServerSocket(
  45. const net::IPEndPoint& local_addr,
  46. int backlog,
  47. const net::NetworkTrafficAnnotationTag& traffic_annotation,
  48. mojo::PendingReceiver<mojom::TCPServerSocket> receiver,
  49. mojom::NetworkContext::CreateTCPServerSocketCallback callback) {
  50. auto socket =
  51. std::make_unique<TCPServerSocket>(this, net_log_, traffic_annotation);
  52. net::IPEndPoint local_addr_out;
  53. int result = socket->Listen(local_addr, backlog, &local_addr_out);
  54. if (result != net::OK) {
  55. std::move(callback).Run(result, absl::nullopt);
  56. return;
  57. }
  58. tcp_server_socket_receivers_.Add(std::move(socket), std::move(receiver));
  59. std::move(callback).Run(result, local_addr_out);
  60. }
  61. void SocketFactory::CreateTCPConnectedSocket(
  62. const absl::optional<net::IPEndPoint>& local_addr,
  63. const net::AddressList& remote_addr_list,
  64. mojom::TCPConnectedSocketOptionsPtr tcp_connected_socket_options,
  65. const net::NetworkTrafficAnnotationTag& traffic_annotation,
  66. mojo::PendingReceiver<mojom::TCPConnectedSocket> receiver,
  67. mojo::PendingRemote<mojom::SocketObserver> observer,
  68. mojom::NetworkContext::CreateTCPConnectedSocketCallback callback) {
  69. auto socket = std::make_unique<TCPConnectedSocket>(
  70. std::move(observer), net_log_, &tls_socket_factory_,
  71. client_socket_factory_, traffic_annotation);
  72. TCPConnectedSocket* socket_raw = socket.get();
  73. tcp_connected_socket_receiver_.Add(std::move(socket), std::move(receiver));
  74. socket_raw->Connect(local_addr, remote_addr_list,
  75. std::move(tcp_connected_socket_options),
  76. std::move(callback));
  77. }
  78. void SocketFactory::CreateTCPBoundSocket(
  79. const net::IPEndPoint& local_addr,
  80. const net::NetworkTrafficAnnotationTag& traffic_annotation,
  81. mojo::PendingReceiver<mojom::TCPBoundSocket> receiver,
  82. mojom::NetworkContext::CreateTCPBoundSocketCallback callback) {
  83. auto socket =
  84. std::make_unique<TCPBoundSocket>(this, net_log_, traffic_annotation);
  85. net::IPEndPoint local_addr_out;
  86. int result = socket->Bind(local_addr, &local_addr_out);
  87. if (result != net::OK) {
  88. std::move(callback).Run(result, absl::nullopt);
  89. return;
  90. }
  91. TCPBoundSocket* socket_ptr = socket.get();
  92. socket_ptr->set_id(
  93. tcp_bound_socket_receivers_.Add(std::move(socket), std::move(receiver)));
  94. std::move(callback).Run(result, local_addr_out);
  95. }
  96. void SocketFactory::DestroyBoundSocket(mojo::ReceiverId bound_socket_id) {
  97. tcp_bound_socket_receivers_.Remove(bound_socket_id);
  98. }
  99. void SocketFactory::OnBoundSocketListening(
  100. mojo::ReceiverId bound_socket_id,
  101. std::unique_ptr<TCPServerSocket> server_socket,
  102. mojo::PendingReceiver<mojom::TCPServerSocket> server_socket_receiver) {
  103. tcp_server_socket_receivers_.Add(std::move(server_socket),
  104. std::move(server_socket_receiver));
  105. tcp_bound_socket_receivers_.Remove(bound_socket_id);
  106. }
  107. void SocketFactory::OnBoundSocketConnected(
  108. mojo::ReceiverId bound_socket_id,
  109. std::unique_ptr<TCPConnectedSocket> connected_socket,
  110. mojo::PendingReceiver<mojom::TCPConnectedSocket>
  111. connected_socket_receiver) {
  112. tcp_connected_socket_receiver_.Add(std::move(connected_socket),
  113. std::move(connected_socket_receiver));
  114. tcp_bound_socket_receivers_.Remove(bound_socket_id);
  115. }
  116. void SocketFactory::OnAccept(
  117. std::unique_ptr<TCPConnectedSocket> socket,
  118. mojo::PendingReceiver<mojom::TCPConnectedSocket> receiver) {
  119. tcp_connected_socket_receiver_.Add(std::move(socket), std::move(receiver));
  120. }
  121. } // namespace network