// Copyright 2016 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef NET_SOCKET_SOCKET_BIO_ADAPTER_H_ #define NET_SOCKET_SOCKET_BIO_ADAPTER_H_ #include "base/containers/span.h" #include "base/memory/raw_ptr.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "net/base/completion_repeating_callback.h" #include "net/base/net_errors.h" #include "net/base/net_export.h" #include "third_party/boringssl/src/include/openssl/base.h" namespace net { class GrowableIOBuffer; class IOBuffer; class StreamSocket; // An adapter to convert between StreamSocket and OpenSSL BIO I/O models. // // BIO exposes a UNIX-like interface where BIO_read and BIO_write may either // succeed synchronously or be retried (with no memory between calls). // StreamSocket exposes an asynchronous interface where an asynchronous // operation continues running and completes with a callback. // // For reading, SocketBIOAdapter maintains a buffer to pass to // StreamSocket::Read. Once that Read completes, BIO_read synchronously drains // the buffer and signals BIO_should_read once empty. // // For writing, SocketBIOAdapter maintains a ring buffer of data to be written // to the StreamSocket. BIO_write synchronously copies data into the buffer or // signals BIO_should_write if the buffer is full. The ring buffer is drained // asynchronously into the socket. Note this means write errors are reported at // a later BIO_write. // // To work around this delay, write errors are also surfaced out of // BIO_read. Otherwise a failure in the final BIO_write of an application may go // unnoticed. If this occurs, OnReadReady will be signaled as if it were a read // error. See https://crbug.com/249848. class NET_EXPORT_PRIVATE SocketBIOAdapter { … }; } // namespace net #endif // NET_SOCKET_SOCKET_BIO_ADAPTER_H_