From f509d73d61af081db4f29a5d272e599785a38cbf Mon Sep 17 00:00:00 2001 From: Subodh Iyengar Date: Mon, 14 Mar 2016 23:08:18 -0700 Subject: [PATCH] Allow httpsession to be movable readCB Summary:Allow HTTPSession to have a movable read callback independent of the openssl check. This allows other downstream transports to deliver app data more efficiently. Reviewed By: w-o-o, knekritz Differential Revision: D3023517 fb-gh-sync-id: ff27c0e14f7364ad7d7b0028ef740b2678dbcb4c shipit-source-id: ff27c0e14f7364ad7d7b0028ef740b2678dbcb4c --- folly/io/async/AsyncSSLSocket.cpp | 6 +++++- folly/io/async/AsyncSSLSocket.h | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/folly/io/async/AsyncSSLSocket.cpp b/folly/io/async/AsyncSSLSocket.cpp index 97cce2d9..6d85ded4 100644 --- a/folly/io/async/AsyncSSLSocket.cpp +++ b/folly/io/async/AsyncSSLSocket.cpp @@ -1172,7 +1172,7 @@ AsyncSSLSocket::handleConnect() noexcept { void AsyncSSLSocket::setReadCB(ReadCallback *callback) { #ifdef SSL_MODE_MOVE_BUFFER_OWNERSHIP // turn on the buffer movable in openssl - if (ssl_ != nullptr && !isBufferMovable_ && + if (bufferMovableEnabled_ && ssl_ != nullptr && !isBufferMovable_ && callback != nullptr && callback->isBufferMovable()) { SSL_set_mode(ssl_, SSL_get_mode(ssl_) | SSL_MODE_MOVE_BUFFER_OWNERSHIP); isBufferMovable_ = true; @@ -1182,6 +1182,10 @@ void AsyncSSLSocket::setReadCB(ReadCallback *callback) { AsyncSocket::setReadCB(callback); } +void AsyncSSLSocket::setBufferMovableEnabled(bool enabled) { + bufferMovableEnabled_ = enabled; +} + void AsyncSSLSocket::prepareReadBuffer(void** buf, size_t* buflen) noexcept { CHECK(readCallback_); if (isBufferMovable_) { diff --git a/folly/io/async/AsyncSSLSocket.h b/folly/io/async/AsyncSSLSocket.h index 2e4d5bac..4900d2fa 100644 --- a/folly/io/async/AsyncSSLSocket.h +++ b/folly/io/async/AsyncSSLSocket.h @@ -676,6 +676,13 @@ class AsyncSSLSocket : public virtual AsyncSocket { void setReadCB(ReadCallback* callback) override; + /** + * Tries to enable the buffer movable experimental feature in openssl. + * This is not guaranteed to succeed in case openssl does not have + * the experimental feature built in. + */ + void setBufferMovableEnabled(bool enabled); + /** * Returns the peer certificate, or nullptr if no peer certificate received. */ @@ -828,6 +835,7 @@ class AsyncSSLSocket : public virtual AsyncSocket { bool parseClientHello_{false}; bool cacheAddrOnFailure_{false}; + bool bufferMovableEnabled_{false}; std::unique_ptr clientHelloInfo_; // Time taken to complete the ssl handshake. -- 2.34.1