#include "extensions/browser/api/socket/tcp_socket.h"
#include <utility>
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/lazy_instance.h"
#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/storage_partition.h"
#include "extensions/browser/api/api_resource.h"
#include "extensions/browser/api/socket/mojo_data_pump.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "net/base/address_list.h"
#include "net/base/ip_endpoint.h"
#include "net/base/net_errors.h"
#include "net/base/url_util.h"
#include "services/network/public/mojom/network_context.mojom.h"
#include "services/network/public/mojom/ssl_config.mojom.h"
namespace extensions {
namespace {
bool SSLProtocolVersionFromString(const std::string& version_str,
network::mojom::SSLVersion* version_out,
bool is_min_version) { … }
}
const char kTCPSocketTypeInvalidError[] = …;
const char kSocketListenError[] = …;
static base::LazyInstance<BrowserContextKeyedAPIFactory<
ApiResourceManager<ResumableTCPSocket>>>::DestructorAtExit g_factory = …;
template <>
BrowserContextKeyedAPIFactory<ApiResourceManager<ResumableTCPSocket> >*
ApiResourceManager<ResumableTCPSocket>::GetFactoryInstance() { … }
static base::LazyInstance<BrowserContextKeyedAPIFactory<
ApiResourceManager<ResumableTCPServerSocket>>>::DestructorAtExit
g_server_factory = …;
template <>
BrowserContextKeyedAPIFactory<ApiResourceManager<ResumableTCPServerSocket> >*
ApiResourceManager<ResumableTCPServerSocket>::GetFactoryInstance() { … }
TCPSocket::TCPSocket(content::BrowserContext* browser_context,
const std::string& owner_extension_id)
: … { … }
TCPSocket::TCPSocket(
mojo::PendingRemote<network::mojom::TCPConnectedSocket> socket,
mojo::ScopedDataPipeConsumerHandle receive_stream,
mojo::ScopedDataPipeProducerHandle send_stream,
const std::optional<net::IPEndPoint>& remote_addr,
const std::string& owner_extension_id)
: … { … }
TCPSocket::~TCPSocket() { … }
void TCPSocket::Connect(const net::AddressList& address,
net::CompletionOnceCallback callback) { … }
void TCPSocket::Disconnect(bool socket_destroying) { … }
void TCPSocket::Bind(const std::string& address,
uint16_t port,
net::CompletionOnceCallback callback) { … }
void TCPSocket::Read(int count, ReadCompletionCallback callback) { … }
void TCPSocket::RecvFrom(int count, RecvFromCompletionCallback callback) { … }
void TCPSocket::SendTo(scoped_refptr<net::IOBuffer> io_buffer,
int byte_count,
const net::IPEndPoint& address,
net::CompletionOnceCallback callback) { … }
void TCPSocket::SetKeepAlive(bool enable,
int delay,
SetKeepAliveCallback callback) { … }
void TCPSocket::SetNoDelay(bool no_delay, SetNoDelayCallback callback) { … }
void TCPSocket::Listen(const std::string& address,
uint16_t port,
int backlog,
ListenCallback callback) { … }
void TCPSocket::Accept(AcceptCompletionCallback callback) { … }
bool TCPSocket::IsConnected() { … }
bool TCPSocket::GetPeerAddress(net::IPEndPoint* address) { … }
bool TCPSocket::GetLocalAddress(net::IPEndPoint* address) { … }
Socket::SocketType TCPSocket::GetSocketType() const { … }
int TCPSocket::WriteImpl(net::IOBuffer* io_buffer,
int io_buffer_size,
net::CompletionOnceCallback callback) { … }
void TCPSocket::OnConnectComplete(
int result,
const std::optional<net::IPEndPoint>& local_addr,
const std::optional<net::IPEndPoint>& peer_addr,
mojo::ScopedDataPipeConsumerHandle receive_stream,
mojo::ScopedDataPipeProducerHandle send_stream) { … }
void TCPSocket::OnListenComplete(
int result,
const std::optional<net::IPEndPoint>& local_addr) { … }
content::StoragePartition* TCPSocket::GetStoragePartitionHelper() { … }
void TCPSocket::OnAccept(
int result,
const std::optional<net::IPEndPoint>& remote_addr,
mojo::PendingRemote<network::mojom::TCPConnectedSocket> connected_socket,
mojo::ScopedDataPipeConsumerHandle receive_stream,
mojo::ScopedDataPipeProducerHandle send_stream) { … }
void TCPSocket::OnWriteComplete(net::CompletionOnceCallback callback,
int result) { … }
void TCPSocket::OnReadComplete(int result,
scoped_refptr<net::IOBuffer> io_buffer) { … }
void TCPSocket::OnUpgradeToTLSComplete(
UpgradeToTLSCallback callback,
mojo::PendingRemote<network::mojom::TLSClientSocket> tls_socket,
const net::IPEndPoint& local_addr,
const net::IPEndPoint& peer_addr,
int result,
mojo::ScopedDataPipeConsumerHandle receive_stream,
mojo::ScopedDataPipeProducerHandle send_stream,
const std::optional<net::SSLInfo>& ssl_info) { … }
void TCPSocket::UpgradeToTLS(api::socket::SecureOptions* options,
UpgradeToTLSCallback callback) { … }
ResumableTCPSocket::ResumableTCPSocket(content::BrowserContext* browser_context,
const std::string& owner_extension_id)
: … { … }
ResumableTCPSocket::ResumableTCPSocket(
mojo::PendingRemote<network::mojom::TCPConnectedSocket> socket,
mojo::ScopedDataPipeConsumerHandle receive_stream,
mojo::ScopedDataPipeProducerHandle send_stream,
const std::optional<net::IPEndPoint>& remote_addr,
const std::string& owner_extension_id)
: … { … }
ResumableTCPSocket::~ResumableTCPSocket() { … }
bool ResumableTCPSocket::IsPersistent() const { … }
ResumableTCPServerSocket::ResumableTCPServerSocket(
content::BrowserContext* browser_context,
const std::string& owner_extension_id)
: … { … }
bool ResumableTCPServerSocket::IsPersistent() const { … }
}