blob: 8fa33735cf7e80c6e5e6310dc8783be8e4a3bd50 [file] [log] [blame]
Helen Lia6d3b2c2018-05-08 16:09:071// 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
5#include "services/network/tls_client_socket.h"
6
7#include <utility>
8
Sebastien Marchand6d0558fd2019-01-25 16:49:379#include "base/bind.h"
Helen Lia6d3b2c2018-05-08 16:09:0710#include "base/logging.h"
11#include "base/memory/ptr_util.h"
12#include "net/base/net_errors.h"
13#include "net/socket/client_socket_factory.h"
Helen Lia6d3b2c2018-05-08 16:09:0714#include "net/socket/ssl_client_socket.h"
Matt Menke841fc412019-03-05 23:20:1215#include "net/socket/stream_socket.h"
Helen Lia6d3b2c2018-05-08 16:09:0716#include "net/ssl/ssl_config.h"
17#include "net/ssl/ssl_config_service.h"
18
19namespace network {
20
21TLSClientSocket::TLSClientSocket(
22 mojom::TLSClientSocketRequest request,
23 mojom::SocketObserverPtr observer,
24 const net::NetworkTrafficAnnotationTag& traffic_annotation)
25 : observer_(std::move(observer)), traffic_annotation_(traffic_annotation) {}
26
27TLSClientSocket::~TLSClientSocket() {}
28
29void TLSClientSocket::Connect(
30 const net::HostPortPair& host_port_pair,
31 const net::SSLConfig& ssl_config,
Matt Menke841fc412019-03-05 23:20:1232 std::unique_ptr<net::StreamSocket> tcp_socket,
Helen Lia6d3b2c2018-05-08 16:09:0733 const net::SSLClientSocketContext& ssl_client_socket_context,
34 net::ClientSocketFactory* socket_factory,
John Abd-El-Malekebbb0df22018-08-23 19:11:3235 mojom::TCPConnectedSocket::UpgradeToTLSCallback callback,
36 bool send_ssl_info) {
Helen Lia6d3b2c2018-05-08 16:09:0737 connect_callback_ = std::move(callback);
John Abd-El-Malekebbb0df22018-08-23 19:11:3238 send_ssl_info_ = send_ssl_info;
Helen Lia6d3b2c2018-05-08 16:09:0739 socket_ = socket_factory->CreateSSLClientSocket(std::move(tcp_socket),
40 host_port_pair, ssl_config,
41 ssl_client_socket_context);
42 int result = socket_->Connect(base::BindRepeating(
43 &TLSClientSocket::OnTLSConnectCompleted, base::Unretained(this)));
44 if (result != net::ERR_IO_PENDING)
45 OnTLSConnectCompleted(result);
46}
47
48void TLSClientSocket::OnTLSConnectCompleted(int result) {
49 DCHECK(!connect_callback_.is_null());
50
51 if (result != net::OK) {
52 socket_ = nullptr;
53 std::move(connect_callback_)
54 .Run(result, mojo::ScopedDataPipeConsumerHandle(),
John Abd-El-Malekebbb0df22018-08-23 19:11:3255 mojo::ScopedDataPipeProducerHandle(), base::nullopt);
Helen Lia6d3b2c2018-05-08 16:09:0756 return;
57 }
58 mojo::DataPipe send_pipe;
59 mojo::DataPipe receive_pipe;
60 socket_data_pump_ = std::make_unique<SocketDataPump>(
61 socket_.get(), this /*delegate*/, std::move(receive_pipe.producer_handle),
62 std::move(send_pipe.consumer_handle), traffic_annotation_);
John Abd-El-Malekebbb0df22018-08-23 19:11:3263 base::Optional<net::SSLInfo> ssl_info;
64 if (send_ssl_info_) {
65 net::SSLInfo local;
66 socket_->GetSSLInfo(&local);
67 ssl_info = std::move(local);
68 }
Helen Lia6d3b2c2018-05-08 16:09:0769 std::move(connect_callback_)
70 .Run(net::OK, std::move(receive_pipe.consumer_handle),
John Abd-El-Malekebbb0df22018-08-23 19:11:3271 std::move(send_pipe.producer_handle), std::move(ssl_info));
Helen Lia6d3b2c2018-05-08 16:09:0772}
73
74void TLSClientSocket::OnNetworkReadError(int net_error) {
75 if (observer_)
76 observer_->OnReadError(net_error);
77}
78
79void TLSClientSocket::OnNetworkWriteError(int net_error) {
80 if (observer_)
81 observer_->OnWriteError(net_error);
82}
83
84void TLSClientSocket::OnShutdown() {
85 // Do nothing.
86}
87
88} // namespace network