Allow httpsession to be movable readCB
authorSubodh Iyengar <subodh@fb.com>
Tue, 15 Mar 2016 06:08:18 +0000 (23:08 -0700)
committerFacebook Github Bot 9 <facebook-github-bot-9-bot@fb.com>
Tue, 15 Mar 2016 06:20:20 +0000 (23:20 -0700)
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
folly/io/async/AsyncSSLSocket.h

index 97cce2d96aa4c4380948868036bc14c14181c2fb..6d85ded48ea48026372e1b0c070aec9a3ca4e79c 100644 (file)
@@ -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_) {
index 2e4d5bacbeee648cb9725bb8bb37e5cf2d1dc1c0..4900d2fa32b018d379f38e403d140daab6ffba9b 100644 (file)
@@ -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<ssl::ClientHelloInfo> clientHelloInfo_;
 
   // Time taken to complete the ssl handshake.