/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include <iomanip> #include <folly/Optional.h> #include <folly/String.h> #include <folly/io/Cursor.h> #include <folly/io/IOBuf.h> #include <folly/io/SocketOptionMap.h> #include <folly/io/async/AsyncPipe.h> #include <folly/io/async/AsyncSocket.h> #include <folly/io/async/AsyncTimeout.h> #include <folly/io/async/CertificateIdentityVerifier.h> #include <folly/io/async/SSLContext.h> #include <folly/io/async/TimeoutManager.h> #include <folly/io/async/ssl/OpenSSLUtils.h> #include <folly/io/async/ssl/SSLErrors.h> #include <folly/io/async/ssl/TLSDefinitions.h> #include <folly/lang/Bits.h> #include <folly/portability/OpenSSL.h> #include <folly/portability/Sockets.h> #include <folly/ssl/OpenSSLPtrTypes.h> #include <folly/ssl/SSLSession.h> #include <folly/ssl/SSLSessionManager.h> namespace folly { class AsyncSSLSocketConnector; /** * A class for performing asynchronous I/O on an SSL connection. * * AsyncSSLSocket allows users to asynchronously wait for data on an * SSL connection, and to asynchronously send data. * * The APIs for reading and writing are intentionally asymmetric. * Waiting for data to read is a persistent API: a callback is * installed, and is notified whenever new data is available. It * continues to be notified of new events until it is uninstalled. * * AsyncSSLSocket does not provide read timeout functionality, * because it typically cannot determine when the timeout should be * active. Generally, a timeout should only be enabled when * processing is blocked waiting on data from the remote endpoint. * For server connections, the timeout should not be active if the * server is currently processing one or more outstanding requests for * this connection. For client connections, the timeout should not be * active if there are no requests pending on the connection. * Additionally, if a client has multiple pending requests, it will * usually want a separate timeout for each request, rather than a * single read timeout. * * The write API is fairly intuitive: a user can request to send a * block of data, and a callback will be informed once the entire * block has been transferred to the kernel, or on error. * AsyncSSLSocket does provide a send timeout, since most callers * want to give up if the remote end stops responding and no further * progress can be made sending the data. */ class AsyncSSLSocket : public AsyncSocket { … }; } // namespace folly