Simplify higher-level socket interfaces Where we previously had StreamClientSocket (with connect/disconnect) built on top of Socket (with receive/send), merge into a single ConnectingClientSocket. I think this works better for two reasons: 1) Nothing in StreamClientSocket was particular to a streaming protocol. The interface is just as applicable for stuff like "connected" UDP sockets. 2) The undirected Send/Receive previously in Socket make more sense for a connected socket whereas an unconnected socket is more likely to make use of SendTo/ReceiveFrom. Maybe undirected Receive is useful for both, but that's an issue that can be figured out if/when we ever add unconnected socket support in these interfaces. Naming note: My initial instinct is to call a connection-oriented client socket `ConnectedClientSocket`, but I decided to go with `ConnectingClientSocket` instead to avoid confusion with it referring to a socket that has already been connected. PiperOrigin-RevId: 471878943
diff --git a/build/source_list.bzl b/build/source_list.bzl index 55336fa..f652020 100644 --- a/build/source_list.bzl +++ b/build/source_list.bzl
@@ -954,6 +954,7 @@ "quic/core/batch_writer/quic_batch_writer_test.h", "quic/core/batch_writer/quic_gso_batch_writer.h", "quic/core/batch_writer/quic_sendmmsg_batch_writer.h", + "quic/core/io/connecting_client_socket.h", "quic/core/io/event_loop_socket_factory.h", "quic/core/io/event_loop_tcp_client_socket.h", "quic/core/io/quic_default_event_loop.h", @@ -961,7 +962,6 @@ "quic/core/io/quic_poll_event_loop.h", "quic/core/io/socket.h", "quic/core/io/socket_factory.h", - "quic/core/io/stream_client_socket.h", "quic/core/quic_default_packet_writer.h", "quic/core/quic_epoll_alarm_factory.h", "quic/core/quic_epoll_clock.h",
diff --git a/build/source_list.gni b/build/source_list.gni index 802b493..0b8adf2 100644 --- a/build/source_list.gni +++ b/build/source_list.gni
@@ -954,6 +954,7 @@ "src/quiche/quic/core/batch_writer/quic_batch_writer_test.h", "src/quiche/quic/core/batch_writer/quic_gso_batch_writer.h", "src/quiche/quic/core/batch_writer/quic_sendmmsg_batch_writer.h", + "src/quiche/quic/core/io/connecting_client_socket.h", "src/quiche/quic/core/io/event_loop_socket_factory.h", "src/quiche/quic/core/io/event_loop_tcp_client_socket.h", "src/quiche/quic/core/io/quic_default_event_loop.h", @@ -961,7 +962,6 @@ "src/quiche/quic/core/io/quic_poll_event_loop.h", "src/quiche/quic/core/io/socket.h", "src/quiche/quic/core/io/socket_factory.h", - "src/quiche/quic/core/io/stream_client_socket.h", "src/quiche/quic/core/quic_default_packet_writer.h", "src/quiche/quic/core/quic_epoll_alarm_factory.h", "src/quiche/quic/core/quic_epoll_clock.h",
diff --git a/build/source_list.json b/build/source_list.json index ea2cf5e..1b2e8e4 100644 --- a/build/source_list.json +++ b/build/source_list.json
@@ -953,6 +953,7 @@ "quiche/quic/core/batch_writer/quic_batch_writer_test.h", "quiche/quic/core/batch_writer/quic_gso_batch_writer.h", "quiche/quic/core/batch_writer/quic_sendmmsg_batch_writer.h", + "quiche/quic/core/io/connecting_client_socket.h", "quiche/quic/core/io/event_loop_socket_factory.h", "quiche/quic/core/io/event_loop_tcp_client_socket.h", "quiche/quic/core/io/quic_default_event_loop.h", @@ -960,7 +961,6 @@ "quiche/quic/core/io/quic_poll_event_loop.h", "quiche/quic/core/io/socket.h", "quiche/quic/core/io/socket_factory.h", - "quiche/quic/core/io/stream_client_socket.h", "quiche/quic/core/quic_default_packet_writer.h", "quiche/quic/core/quic_epoll_alarm_factory.h", "quiche/quic/core/quic_epoll_clock.h",
diff --git a/quiche/quic/core/io/connecting_client_socket.h b/quiche/quic/core/io/connecting_client_socket.h new file mode 100644 index 0000000..930300b --- /dev/null +++ b/quiche/quic/core/io/connecting_client_socket.h
@@ -0,0 +1,107 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_QUIC_CORE_IO_CONNECTING_CLIENT_SOCKET_H_ +#define QUICHE_QUIC_CORE_IO_CONNECTING_CLIENT_SOCKET_H_ + +#include <string> + +#include "absl/status/status.h" +#include "absl/status/statusor.h" +#include "quiche/common/platform/api/quiche_export.h" +#include "quiche/common/platform/api/quiche_mem_slice.h" +#include "quiche/quic/core/quic_types.h" + +namespace quic { + +// A client socket that provides connection-based send/receive. In the case of +// protocols like UDP, may only be a pseudo-connection that doesn't actually +// affect the underlying network protocol. +// +// Must not destroy a connected/connecting socket. If connected or connecting, +// must call Disconnect() to disconnect or cancel the connection before +// destruction. +// +// Warning regarding blocking calls: Code in the QUICHE library typically +// handles IO on a single thread, so if making calls from that typical +// environment, it would be problematic to make a blocking call and block that +// single thread. +class QUICHE_EXPORT_PRIVATE ConnectingClientSocket { + public: + class AsyncVisitor { + public: + virtual ~AsyncVisitor() = default; + + virtual void ConnectComplete(absl::Status status) = 0; + + // If the operation completed without error, `data` is set to the received + // data. + virtual void ReceiveComplete( + absl::StatusOr<quiche::QuicheMemSlice> data) = 0; + + virtual void SendComplete(absl::Status status) = 0; + }; + + virtual ~ConnectingClientSocket() = default; + + // Establishes a connection synchronously. Should not be called if socket has + // already been successfully connected without first calling Disconnect(). + // + // After calling, the socket must not be destroyed until Disconnect() is + // called. + virtual absl::Status ConnectBlocking() = 0; + + // Establishes a connection asynchronously. On completion, calls + // ConnectComplete() on the visitor, potentially before return from + // ConnectAsync(). Should not be called if socket has already been + // successfully connected without first calling Disconnect(). + // + // After calling, the socket must not be destroyed until Disconnect() is + // called. + virtual void ConnectAsync() = 0; + + // Disconnects a connected socket or cancels an in-progress ConnectAsync(), + // invoking the `ConnectComplete(absl::CancelledError())` on the visitor. + // After success, it is possible to call ConnectBlocking() or ConnectAsync() + // again to establish a new connection. Cancels any pending read or write + // operations, calling visitor completion methods with + // `absl::CancelledError()`. + // + // Typically implemented via a call to ::close(), which for TCP can result in + // either FIN or RST, depending on socket/platform state and undefined + // platform behavior. + virtual void Disconnect() = 0; + + // Blocking read. Receives and returns a buffer of up to `max_size` bytes from + // socket. Returns status on error. + virtual absl::StatusOr<quiche::QuicheMemSlice> ReceiveBlocking( + QuicByteCount max_size) = 0; + + // Asynchronous read. Receives up to `max_size` bytes from socket. If + // no data is synchronously available to be read, waits until some data is + // available or the socket is closed. On completion, calls ReceiveComplete() + // on the visitor, potentially before return from ReceiveAsync(). + // + // After calling, the socket must not be destroyed until ReceiveComplete() is + // called. + virtual void ReceiveAsync(QuicByteCount max_size) = 0; + + // Blocking write. Sends all of `data` (potentially via multiple underlying + // socket sends). + virtual absl::Status SendBlocking(std::string data) = 0; + virtual absl::Status SendBlocking(quiche::QuicheMemSlice data) = 0; + + // Asynchronous write. Sends all of `data` (potentially via multiple + // underlying socket sends). On completion, calls SendComplete() on the + // visitor, potentially before return from SendAsync(). + // + // After calling, the socket must not be destroyed until SendComplete() is + // called. + virtual void SendAsync(std::string data) = 0; + virtual void SendAsync(quiche::QuicheMemSlice data) = 0; +}; + +} // namespace quic + +#endif // QUICHE_QUIC_CORE_IO_CONNECTING_CLIENT_SOCKET_H_
diff --git a/quiche/quic/core/io/event_loop_socket_factory.cc b/quiche/quic/core/io/event_loop_socket_factory.cc index 4d2508e..b403c6b 100644 --- a/quiche/quic/core/io/event_loop_socket_factory.cc +++ b/quiche/quic/core/io/event_loop_socket_factory.cc
@@ -6,9 +6,9 @@ #include <memory> +#include "quiche/quic/core/io/connecting_client_socket.h" #include "quiche/quic/core/io/event_loop_tcp_client_socket.h" #include "quiche/quic/core/io/quic_event_loop.h" -#include "quiche/quic/core/io/stream_client_socket.h" #include "quiche/quic/core/quic_types.h" #include "quiche/quic/platform/api/quic_socket_address.h" #include "quiche/common/platform/api/quiche_logging.h" @@ -23,11 +23,11 @@ QUICHE_DCHECK(buffer_allocator_); } -std::unique_ptr<StreamClientSocket> +std::unique_ptr<ConnectingClientSocket> EventLoopSocketFactory::CreateTcpClientSocket( const quic::QuicSocketAddress& peer_address, QuicByteCount receive_buffer_size, QuicByteCount send_buffer_size, - StreamClientSocket::AsyncVisitor* async_visitor) { + ConnectingClientSocket::AsyncVisitor* async_visitor) { return std::make_unique<EventLoopTcpClientSocket>( peer_address, receive_buffer_size, send_buffer_size, event_loop_, buffer_allocator_, async_visitor);
diff --git a/quiche/quic/core/io/event_loop_socket_factory.h b/quiche/quic/core/io/event_loop_socket_factory.h index 6882e80..03ab856 100644 --- a/quiche/quic/core/io/event_loop_socket_factory.h +++ b/quiche/quic/core/io/event_loop_socket_factory.h
@@ -7,9 +7,9 @@ #include <memory> +#include "quiche/quic/core/io/connecting_client_socket.h" #include "quiche/quic/core/io/quic_event_loop.h" #include "quiche/quic/core/io/socket_factory.h" -#include "quiche/quic/core/io/stream_client_socket.h" #include "quiche/quic/core/quic_types.h" #include "quiche/quic/platform/api/quic_socket_address.h" #include "quiche/common/platform/api/quiche_export.h" @@ -26,10 +26,10 @@ quiche::QuicheBufferAllocator* buffer_allocator); // SocketFactory: - std::unique_ptr<StreamClientSocket> CreateTcpClientSocket( + std::unique_ptr<ConnectingClientSocket> CreateTcpClientSocket( const quic::QuicSocketAddress& peer_address, QuicByteCount receive_buffer_size, QuicByteCount send_buffer_size, - StreamClientSocket::AsyncVisitor* async_visitor) override; + ConnectingClientSocket::AsyncVisitor* async_visitor) override; private: QuicEventLoop* const event_loop_; // unowned
diff --git a/quiche/quic/core/io/event_loop_tcp_client_socket.h b/quiche/quic/core/io/event_loop_tcp_client_socket.h index 2d50087..4d4e515 100644 --- a/quiche/quic/core/io/event_loop_tcp_client_socket.h +++ b/quiche/quic/core/io/event_loop_tcp_client_socket.h
@@ -11,8 +11,8 @@ #include "absl/strings/string_view.h" #include "absl/types/optional.h" #include "absl/types/variant.h" +#include "quiche/quic/core/io/connecting_client_socket.h" #include "quiche/quic/core/io/quic_event_loop.h" -#include "quiche/quic/core/io/stream_client_socket.h" #include "quiche/quic/core/quic_types.h" #include "quiche/quic/platform/api/quic_socket_address.h" #include "quiche/common/platform/api/quiche_export.h" @@ -22,7 +22,7 @@ // A TCP client socket implemented using an underlying QuicEventLoop. class QUICHE_EXPORT_PRIVATE EventLoopTcpClientSocket - : public StreamClientSocket, + : public ConnectingClientSocket, public QuicSocketEventListener { public: // Will use platform default buffer size if `receive_buffer_size` or @@ -38,12 +38,10 @@ ~EventLoopTcpClientSocket() override; - // StreamClientSocket: + // ConnectingClientSocket: absl::Status ConnectBlocking() override; void ConnectAsync() override; void Disconnect() override; - - // Socket: absl::StatusOr<quiche::QuicheMemSlice> ReceiveBlocking( QuicByteCount max_size) override; void ReceiveAsync(QuicByteCount max_size) override;
diff --git a/quiche/quic/core/io/event_loop_tcp_client_socket_test.cc b/quiche/quic/core/io/event_loop_tcp_client_socket_test.cc index f3c0800..cbf724e 100644 --- a/quiche/quic/core/io/event_loop_tcp_client_socket_test.cc +++ b/quiche/quic/core/io/event_loop_tcp_client_socket_test.cc
@@ -15,11 +15,11 @@ #include "absl/strings/string_view.h" #include "absl/types/optional.h" #include "absl/types/span.h" +#include "quiche/quic/core/io/connecting_client_socket.h" #include "quiche/quic/core/io/event_loop_socket_factory.h" #include "quiche/quic/core/io/quic_default_event_loop.h" #include "quiche/quic/core/io/quic_event_loop.h" #include "quiche/quic/core/io/socket.h" -#include "quiche/quic/core/io/stream_client_socket.h" #include "quiche/quic/core/quic_time.h" #include "quiche/quic/platform/api/quic_ip_address_family.h" #include "quiche/quic/platform/api/quic_socket_address.h" @@ -128,7 +128,7 @@ class EventLoopTcpClientSocketTest : public quiche::test::QuicheTestWithParam<QuicEventLoopFactory*>, - public StreamClientSocket::AsyncVisitor { + public ConnectingClientSocket::AsyncVisitor { public: void SetUp() override { QUICHE_CHECK(CreateListeningServerSocket(&server_socket_descriptor_, @@ -181,7 +181,7 @@ &GetTestParamName); TEST_P(EventLoopTcpClientSocketTest, Connect) { - std::unique_ptr<StreamClientSocket> socket = + std::unique_ptr<ConnectingClientSocket> socket = socket_factory_.CreateTcpClientSocket(server_socket_address_, /*receive_buffer_size=*/0, /*send_buffer_size=*/0, @@ -195,7 +195,7 @@ } TEST_P(EventLoopTcpClientSocketTest, ConnectAsync) { - std::unique_ptr<StreamClientSocket> socket = + std::unique_ptr<ConnectingClientSocket> socket = socket_factory_.CreateTcpClientSocket(server_socket_address_, /*receive_buffer_size=*/0, /*send_buffer_size=*/0, @@ -220,7 +220,7 @@ } TEST_P(EventLoopTcpClientSocketTest, ErrorBeforeConnectAsync) { - std::unique_ptr<StreamClientSocket> socket = + std::unique_ptr<ConnectingClientSocket> socket = socket_factory_.CreateTcpClientSocket(server_socket_address_, /*receive_buffer_size=*/0, /*send_buffer_size=*/0, @@ -241,7 +241,7 @@ } TEST_P(EventLoopTcpClientSocketTest, ErrorDuringConnectAsync) { - std::unique_ptr<StreamClientSocket> socket = + std::unique_ptr<ConnectingClientSocket> socket = socket_factory_.CreateTcpClientSocket(server_socket_address_, /*receive_buffer_size=*/0, /*send_buffer_size=*/0, @@ -268,7 +268,7 @@ } TEST_P(EventLoopTcpClientSocketTest, Disconnect) { - std::unique_ptr<StreamClientSocket> socket = + std::unique_ptr<ConnectingClientSocket> socket = socket_factory_.CreateTcpClientSocket(server_socket_address_, /*receive_buffer_size=*/0, /*send_buffer_size=*/0, @@ -279,7 +279,7 @@ } TEST_P(EventLoopTcpClientSocketTest, DisconnectCancelsConnectAsync) { - std::unique_ptr<StreamClientSocket> socket = + std::unique_ptr<ConnectingClientSocket> socket = socket_factory_.CreateTcpClientSocket(server_socket_address_, /*receive_buffer_size=*/0, /*send_buffer_size=*/0, @@ -302,7 +302,7 @@ } TEST_P(EventLoopTcpClientSocketTest, ConnectAndReconnect) { - std::unique_ptr<StreamClientSocket> socket = + std::unique_ptr<ConnectingClientSocket> socket = socket_factory_.CreateTcpClientSocket(server_socket_address_, /*receive_buffer_size=*/0, /*send_buffer_size=*/0, @@ -332,7 +332,7 @@ TestTcpServerSocketRunner runner( server_socket_descriptor_, absl::bind_front(&SendDataOnSocket, expected)); - std::unique_ptr<StreamClientSocket> socket = + std::unique_ptr<ConnectingClientSocket> socket = socket_factory_.CreateTcpClientSocket(server_socket_address_, /*receive_buffer_size=*/0, /*send_buffer_size=*/0, @@ -352,7 +352,7 @@ } TEST_P(EventLoopTcpClientSocketTest, ReceiveAsync) { - std::unique_ptr<StreamClientSocket> socket = + std::unique_ptr<ConnectingClientSocket> socket = socket_factory_.CreateTcpClientSocket(server_socket_address_, /*receive_buffer_size=*/0, /*send_buffer_size=*/0, @@ -396,7 +396,7 @@ } TEST_P(EventLoopTcpClientSocketTest, DisconnectCancelsReceiveAsync) { - std::unique_ptr<StreamClientSocket> socket = + std::unique_ptr<ConnectingClientSocket> socket = socket_factory_.CreateTcpClientSocket(server_socket_address_, /*receive_buffer_size=*/0, /*send_buffer_size=*/0, @@ -438,7 +438,7 @@ server_socket_descriptor_, absl::bind_front(&ReceiveDataFromSocket, &sent)); - std::unique_ptr<StreamClientSocket> socket = + std::unique_ptr<ConnectingClientSocket> socket = socket_factory_.CreateTcpClientSocket(server_socket_address_, /*receive_buffer_size=*/0, /*send_buffer_size=*/0, @@ -456,7 +456,7 @@ TEST_P(EventLoopTcpClientSocketTest, SendAsync) { // Use a small send buffer to improve chances of a send needing to be // asynchronous. - std::unique_ptr<StreamClientSocket> socket = + std::unique_ptr<ConnectingClientSocket> socket = socket_factory_.CreateTcpClientSocket(server_socket_address_, /*receive_buffer_size=*/0, /*send_buffer_size=*/4, @@ -497,7 +497,7 @@ TEST_P(EventLoopTcpClientSocketTest, DisconnectCancelsSendAsync) { // Use a small send buffer to improve chances of a send needing to be // asynchronous. - std::unique_ptr<StreamClientSocket> socket = + std::unique_ptr<ConnectingClientSocket> socket = socket_factory_.CreateTcpClientSocket(server_socket_address_, /*receive_buffer_size=*/0, /*send_buffer_size=*/4,
diff --git a/quiche/quic/core/io/socket.h b/quiche/quic/core/io/socket.h index fcc6418..a591723 100644 --- a/quiche/quic/core/io/socket.h +++ b/quiche/quic/core/io/socket.h
@@ -16,7 +16,6 @@ #include "quiche/quic/platform/api/quic_ip_address_family.h" #include "quiche/quic/platform/api/quic_socket_address.h" #include "quiche/common/platform/api/quiche_export.h" -#include "quiche/common/platform/api/quiche_mem_slice.h" #if defined(_WIN32) #include <winsock2.h> @@ -32,57 +31,6 @@ inline constexpr SocketFd kInvalidSocketFd = -1; #endif -// A read/write socket. -// -// Warning regarding blocking calls: Code in the QUICHE library typically -// handles IO on a single thread, so if making calls from that typical -// environment, it would be problematic to make a blocking call and block that -// single thread. -class QUICHE_EXPORT_PRIVATE Socket { - public: - class AsyncVisitor { - public: - virtual ~AsyncVisitor() = default; - - // If the operation completed without error, `data` is set to the received - // data. - virtual void ReceiveComplete( - absl::StatusOr<quiche::QuicheMemSlice> data) = 0; - - virtual void SendComplete(absl::Status status) = 0; - }; - - virtual ~Socket() = default; - - // Blocking read. Receives and returns a buffer of up to `max_size` bytes from - // socket. Returns status on error. - virtual absl::StatusOr<quiche::QuicheMemSlice> ReceiveBlocking( - QuicByteCount max_size) = 0; - - // Asynchronous read. Receives up to `max_size` bytes from socket. If - // no data is synchronously available to be read, waits until some data is - // available or the socket is closed. On completion, calls ReceiveComplete() - // on the visitor, potentially before return from ReceiveAsync(). - // - // After calling, the socket must not be destroyed until ReceiveComplete() is - // called. - virtual void ReceiveAsync(QuicByteCount max_size) = 0; - - // Blocking write. Sends all of `data` (potentially via multiple underlying - // socket sends). - virtual absl::Status SendBlocking(std::string data) = 0; - virtual absl::Status SendBlocking(quiche::QuicheMemSlice data) = 0; - - // Asynchronous write. Sends all of `data` (potentially via multiple - // underlying socket sends). On completion, calls SendComplete() on the - // visitor, potentially before return from SendAsync(). - // - // After calling, the socket must not be destroyed until SendComplete() is - // called. - virtual void SendAsync(std::string data) = 0; - virtual void SendAsync(quiche::QuicheMemSlice data) = 0; -}; - // Low-level platform-agnostic socket operations. Closely follows the behavior // of basic POSIX socket APIs, diverging mostly only to convert to/from cleaner // and platform-agnostic types.
diff --git a/quiche/quic/core/io/socket_factory.h b/quiche/quic/core/io/socket_factory.h index 39102f1..36ea666 100644 --- a/quiche/quic/core/io/socket_factory.h +++ b/quiche/quic/core/io/socket_factory.h
@@ -7,7 +7,7 @@ #include <memory> -#include "quiche/quic/core/io/stream_client_socket.h" +#include "quiche/quic/core/io/connecting_client_socket.h" #include "quiche/quic/core/quic_types.h" #include "quiche/quic/platform/api/quic_socket_address.h" #include "quiche/common/platform/api/quiche_export.h" @@ -23,10 +23,10 @@ // `send_buffer_size` is zero. If `async_visitor` is null, async operations // must not be called on the created socket. If `async_visitor` is non-null, // it must outlive the created socket. - virtual std::unique_ptr<StreamClientSocket> CreateTcpClientSocket( + virtual std::unique_ptr<ConnectingClientSocket> CreateTcpClientSocket( const quic::QuicSocketAddress& peer_address, QuicByteCount receive_buffer_size, QuicByteCount send_buffer_size, - StreamClientSocket::AsyncVisitor* async_visitor) = 0; + ConnectingClientSocket::AsyncVisitor* async_visitor) = 0; }; } // namespace quic
diff --git a/quiche/quic/core/io/stream_client_socket.h b/quiche/quic/core/io/stream_client_socket.h deleted file mode 100644 index 00f9a42..0000000 --- a/quiche/quic/core/io/stream_client_socket.h +++ /dev/null
@@ -1,62 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef QUICHE_QUIC_CORE_IO_STREAM_CLIENT_SOCKET_H_ -#define QUICHE_QUIC_CORE_IO_STREAM_CLIENT_SOCKET_H_ - -#include "absl/status/status.h" -#include "quiche/quic/core/io/socket.h" -#include "quiche/common/platform/api/quiche_export.h" - -namespace quic { - -// A client socket using a protocol (typically TCP) that provides -// connection-based streams. -// -// Must not destroy a connected/connecting socket. If connected or connecting, -// must call Disconnect() to disconnect or cancel the connection before -// destruction. -// -// Warning regarding blocking calls: Code in the QUICHE library typically -// handles IO on a single thread, so if making calls from that typical -// environment, it would be problematic to make a blocking call and block that -// single thread. -class QUICHE_EXPORT_PRIVATE StreamClientSocket : public Socket { - public: - class AsyncVisitor : public Socket::AsyncVisitor { - public: - virtual void ConnectComplete(absl::Status status) = 0; - }; - - ~StreamClientSocket() override = default; - - // Establishes a connection synchronously. Should not be called if socket has - // already been successfully connected without first calling Disconnect(). - virtual absl::Status ConnectBlocking() = 0; - - // Establishes a connection asynchronously. On completion, calls - // ConnectComplete() on the visitor, potentially before return from - // ConnectAsync(). Should not be called if socket has already been - // successfully connected without first calling Disconnect(). - // - // After calling, the socket must not be destroyed until Disconnect() is - // called. - virtual void ConnectAsync() = 0; - - // Disconnects a connected socket or cancels an in-progress ConnectAsync(), - // invoking the `ConnectComplete(absl::CancelledError())` on the visitor. - // After success, it is possible to call ConnectBlocking() or ConnectAsync() - // again to establish a new connection. Cancels any pending read or write - // operations, calling visitor completion methods with - // `absl::CancelledError()`. - // - // Typically implemented via a call to ::close(), which for TCP can result in - // either FIN or RST, depending on socket/platform state and undefined - // platform behavior. - virtual void Disconnect() = 0; -}; - -} // namespace quic - -#endif // QUICHE_QUIC_CORE_IO_STREAM_CLIENT_SOCKET_H_
diff --git a/quiche/quic/tools/connect_tunnel.h b/quiche/quic/tools/connect_tunnel.h index 357a9d0..7cc9bbf 100644 --- a/quiche/quic/tools/connect_tunnel.h +++ b/quiche/quic/tools/connect_tunnel.h
@@ -14,8 +14,8 @@ #include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/strings/string_view.h" +#include "quiche/quic/core/io/connecting_client_socket.h" #include "quiche/quic/core/io/socket_factory.h" -#include "quiche/quic/core/io/stream_client_socket.h" #include "quiche/quic/core/quic_error_codes.h" #include "quiche/quic/core/quic_server_id.h" #include "quiche/quic/tools/quic_simple_server_backend.h" @@ -25,7 +25,7 @@ namespace quic { // Manages a single connection tunneled over a CONNECT proxy. -class ConnectTunnel : public StreamClientSocket::AsyncVisitor { +class ConnectTunnel : public ConnectingClientSocket::AsyncVisitor { public: // `client_stream_request_handler` and `socket_factory` must both outlive the // created ConnectTunnel. @@ -53,7 +53,7 @@ // interacted with after completion. void OnClientStreamClose(); - // StreamClientSocket::AsyncVisitor: + // ConnectingClientSocket::AsyncVisitor: void ConnectComplete(absl::Status status) override; void ReceiveComplete(absl::StatusOr<quiche::QuicheMemSlice> data) override; void SendComplete(absl::Status status) override; @@ -79,7 +79,7 @@ QuicSimpleServerBackend::RequestHandler* client_stream_request_handler_; // Null when destination connection disconnected. - std::unique_ptr<StreamClientSocket> destination_socket_; + std::unique_ptr<ConnectingClientSocket> destination_socket_; bool receive_started_ = false; };
diff --git a/quiche/quic/tools/connect_tunnel_test.cc b/quiche/quic/tools/connect_tunnel_test.cc index de569f3..4492c7a 100644 --- a/quiche/quic/tools/connect_tunnel_test.cc +++ b/quiche/quic/tools/connect_tunnel_test.cc
@@ -12,8 +12,8 @@ #include "absl/status/statusor.h" #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" +#include "quiche/quic/core/io/connecting_client_socket.h" #include "quiche/quic/core/io/socket_factory.h" -#include "quiche/quic/core/io/stream_client_socket.h" #include "quiche/quic/core/quic_connection_id.h" #include "quiche/quic/core/quic_error_codes.h" #include "quiche/quic/core/quic_types.h" @@ -63,15 +63,15 @@ class MockSocketFactory : public SocketFactory { public: - MOCK_METHOD(std::unique_ptr<StreamClientSocket>, CreateTcpClientSocket, + MOCK_METHOD(std::unique_ptr<ConnectingClientSocket>, CreateTcpClientSocket, (const quic::QuicSocketAddress& peer_address, QuicByteCount receive_buffer_size, QuicByteCount send_buffer_size, - StreamClientSocket::AsyncVisitor* async_visitor), + ConnectingClientSocket::AsyncVisitor* async_visitor), (override)); }; -class MockSocket : public StreamClientSocket { +class MockSocket : public ConnectingClientSocket { public: MOCK_METHOD(absl::Status, ConnectBlocking, (), (override)); MOCK_METHOD(void, ConnectAsync, (), (override));