X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2Fio%2Fasync%2Ftest%2FAsyncSSLSocketTest.h;h=122bb8f70ed92c5c9892577bfc61b0716e353870;hb=fbc4c23895b0ee3874d9a36401d580a2a8957ba9;hp=5c0fe43704543d46a7c9da598bb13b2df4f8ebbc;hpb=35fcff936a0ba58986269fb05689843f99e89eb5;p=folly.git diff --git a/folly/io/async/test/AsyncSSLSocketTest.h b/folly/io/async/test/AsyncSSLSocketTest.h index 5c0fe437..122bb8f7 100644 --- a/folly/io/async/test/AsyncSSLSocketTest.h +++ b/folly/io/async/test/AsyncSSLSocketTest.h @@ -1,5 +1,5 @@ /* - * Copyright 2016 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,10 +16,10 @@ #pragma once #include -#include #include #include +#include #include #include #include @@ -27,45 +27,122 @@ #include #include #include +#include +#include +#include +#include #include -#include -#include -#include #include -#include #include -#include -#include +#include +#include +#include namespace folly { -enum StateEnum { - STATE_WAITING, - STATE_SUCCEEDED, - STATE_FAILED -}; - // The destructors of all callback classes assert that the state is // STATE_SUCCEEDED, for both possitive and negative tests. The tests // are responsible for setting the succeeded state properly before the // destructors are called. +class SendMsgParamsCallbackBase : + public folly::AsyncSocket::SendMsgParamsCallback { + public: + SendMsgParamsCallbackBase() {} + + void setSocket( + const std::shared_ptr &socket) { + socket_ = socket; + oldCallback_ = socket_->getSendMsgParamsCB(); + socket_->setSendMsgParamCB(this); + } + + int getFlagsImpl(folly::WriteFlags flags, int /*defaultFlags*/) noexcept + override { + return oldCallback_->getFlags(flags, false /*zeroCopyEnabled*/); + } + + void getAncillaryData(folly::WriteFlags flags, void* data) noexcept override { + oldCallback_->getAncillaryData(flags, data); + } + + uint32_t getAncillaryDataSize(folly::WriteFlags flags) noexcept override { + return oldCallback_->getAncillaryDataSize(flags); + } + + std::shared_ptr socket_; + folly::AsyncSocket::SendMsgParamsCallback* oldCallback_{nullptr}; +}; + +class SendMsgFlagsCallback : public SendMsgParamsCallbackBase { + public: + SendMsgFlagsCallback() {} + + void resetFlags(int flags) { + flags_ = flags; + } + + int getFlagsImpl(folly::WriteFlags flags, int /*defaultFlags*/) noexcept + override { + if (flags_) { + return flags_; + } else { + return oldCallback_->getFlags(flags, false /*zeroCopyEnabled*/); + } + } + + int flags_{0}; +}; + +class SendMsgDataCallback : public SendMsgFlagsCallback { + public: + SendMsgDataCallback() {} + + void resetData(std::vector&& data) { + ancillaryData_.swap(data); + } + + void getAncillaryData(folly::WriteFlags flags, void* data) noexcept override { + if (ancillaryData_.size()) { + std::cerr << "getAncillaryData: copying data" << std::endl; + memcpy(data, ancillaryData_.data(), ancillaryData_.size()); + } else { + oldCallback_->getAncillaryData(flags, data); + } + } + + uint32_t getAncillaryDataSize(folly::WriteFlags flags) noexcept override { + if (ancillaryData_.size()) { + std::cerr << "getAncillaryDataSize: returning size" << std::endl; + return ancillaryData_.size(); + } else { + return oldCallback_->getAncillaryDataSize(flags); + } + } + + std::vector ancillaryData_; +}; + class WriteCallbackBase : public AsyncTransportWrapper::WriteCallback { -public: - WriteCallbackBase() + public: + explicit WriteCallbackBase(SendMsgParamsCallbackBase* mcb = nullptr) : state(STATE_WAITING) , bytesWritten(0) - , exception(AsyncSocketException::UNKNOWN, "none") {} + , exception(AsyncSocketException::UNKNOWN, "none") + , mcb_(mcb) {} - ~WriteCallbackBase() { + ~WriteCallbackBase() override { EXPECT_EQ(STATE_SUCCEEDED, state); } - void setSocket( + virtual void setSocket( const std::shared_ptr &socket) { socket_ = socket; + if (mcb_) { + mcb_->setSocket(socket); + } } void writeSuccess() noexcept override { @@ -74,32 +151,140 @@ public: } void writeErr( - size_t bytesWritten, + size_t nBytesWritten, const AsyncSocketException& ex) noexcept override { - std::cerr << "writeError: bytesWritten " << bytesWritten + std::cerr << "writeError: bytesWritten " << nBytesWritten << ", exception " << ex.what() << std::endl; state = STATE_FAILED; - this->bytesWritten = bytesWritten; + this->bytesWritten = nBytesWritten; exception = ex; socket_->close(); - socket_->detachEventBase(); } std::shared_ptr socket_; StateEnum state; size_t bytesWritten; AsyncSocketException exception; + SendMsgParamsCallbackBase* mcb_; }; +class ExpectWriteErrorCallback : +public WriteCallbackBase { + public: + explicit ExpectWriteErrorCallback(SendMsgParamsCallbackBase* mcb = nullptr) + : WriteCallbackBase(mcb) {} + + ~ExpectWriteErrorCallback() override { + EXPECT_EQ(STATE_FAILED, state); + EXPECT_EQ(exception.type_, + AsyncSocketException::AsyncSocketExceptionType::NETWORK_ERROR); + EXPECT_EQ(exception.errno_, 22); + // Suppress the assert in ~WriteCallbackBase() + state = STATE_SUCCEEDED; + } +}; + +#ifdef MSG_ERRQUEUE +/* copied from include/uapi/linux/net_tstamp.h */ +/* SO_TIMESTAMPING gets an integer bit field comprised of these values */ +enum SOF_TIMESTAMPING { + SOF_TIMESTAMPING_TX_SOFTWARE = (1 << 1), + SOF_TIMESTAMPING_SOFTWARE = (1 << 4), + SOF_TIMESTAMPING_OPT_ID = (1 << 7), + SOF_TIMESTAMPING_TX_SCHED = (1 << 8), + SOF_TIMESTAMPING_TX_ACK = (1 << 9), + SOF_TIMESTAMPING_OPT_TSONLY = (1 << 11), +}; + +class WriteCheckTimestampCallback : + public WriteCallbackBase { + public: + explicit WriteCheckTimestampCallback(SendMsgParamsCallbackBase* mcb = nullptr) + : WriteCallbackBase(mcb) {} + + ~WriteCheckTimestampCallback() override { + EXPECT_EQ(STATE_SUCCEEDED, state); + EXPECT_TRUE(gotTimestamp_); + EXPECT_TRUE(gotByteSeq_); + } + + void setSocket( + const std::shared_ptr &socket) override { + WriteCallbackBase::setSocket(socket); + + EXPECT_NE(socket_->getFd(), 0); + int flags = SOF_TIMESTAMPING_OPT_ID + | SOF_TIMESTAMPING_OPT_TSONLY + | SOF_TIMESTAMPING_SOFTWARE; + AsyncSocket::OptionKey tstampingOpt = {SOL_SOCKET, SO_TIMESTAMPING}; + int ret = tstampingOpt.apply(socket_->getFd(), flags); + EXPECT_EQ(ret, 0); + } + + void checkForTimestampNotifications() noexcept { + int fd = socket_->getFd(); + std::vector ctrl(1024, 0); + unsigned char data; + struct msghdr msg; + iovec entry; + + memset(&msg, 0, sizeof(msg)); + entry.iov_base = &data; + entry.iov_len = sizeof(data); + msg.msg_iov = &entry; + msg.msg_iovlen = 1; + msg.msg_control = ctrl.data(); + msg.msg_controllen = ctrl.size(); + + int ret; + while (true) { + ret = recvmsg(fd, &msg, MSG_ERRQUEUE); + if (ret < 0) { + if (errno != EAGAIN) { + auto errnoCopy = errno; + std::cerr << "::recvmsg exited with code " << ret + << ", errno: " << errnoCopy << std::endl; + AsyncSocketException ex( + AsyncSocketException::INTERNAL_ERROR, + "recvmsg() failed", + errnoCopy); + exception = ex; + } + return; + } + + for (struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msg); + cmsg != nullptr && cmsg->cmsg_len != 0; + cmsg = CMSG_NXTHDR(&msg, cmsg)) { + if (cmsg->cmsg_level == SOL_SOCKET && + cmsg->cmsg_type == SCM_TIMESTAMPING) { + gotTimestamp_ = true; + continue; + } + + if ((cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVERR) || + (cmsg->cmsg_level == SOL_IPV6 && cmsg->cmsg_type == IPV6_RECVERR)) { + gotByteSeq_ = true; + continue; + } + } + } + } + + bool gotTimestamp_{false}; + bool gotByteSeq_{false}; +}; +#endif // MSG_ERRQUEUE + class ReadCallbackBase : public AsyncTransportWrapper::ReadCallback { public: explicit ReadCallbackBase(WriteCallbackBase* wcb) : wcb_(wcb), state(STATE_WAITING) {} - ~ReadCallbackBase() { - EXPECT_EQ(state, STATE_SUCCEEDED); + ~ReadCallbackBase() override { + EXPECT_EQ(STATE_SUCCEEDED, state); } void setSocket( @@ -119,14 +304,12 @@ public AsyncTransportWrapper::ReadCallback { std::cerr << "readError " << ex.what() << std::endl; state = STATE_FAILED; socket_->close(); - socket_->detachEventBase(); } void readEOF() noexcept override { std::cerr << "readEOF" << std::endl; socket_->close(); - socket_->detachEventBase(); } std::shared_ptr socket_; @@ -135,12 +318,12 @@ public AsyncTransportWrapper::ReadCallback { }; class ReadCallback : public ReadCallbackBase { -public: + public: explicit ReadCallback(WriteCallbackBase *wcb) : ReadCallbackBase(wcb) , buffers() {} - ~ReadCallback() { + ~ReadCallback() override { for (std::vector::iterator it = buffers.begin(); it != buffers.end(); ++it) { @@ -173,7 +356,7 @@ public: } class Buffer { - public: + public: Buffer() : buffer(nullptr), length(0) {} Buffer(char* buf, size_t len) : buffer(buf), length(len) {} @@ -181,10 +364,10 @@ public: buffer = nullptr; length = 0; } - void allocate(size_t length) { + void allocate(size_t len) { assert(buffer == nullptr); - this->buffer = static_cast(malloc(length)); - this->length = length; + this->buffer = static_cast(malloc(len)); + this->length = len; } void free() { ::free(buffer); @@ -200,7 +383,7 @@ public: }; class ReadErrorCallback : public ReadCallbackBase { -public: + public: explicit ReadErrorCallback(WriteCallbackBase *wcb) : ReadCallbackBase(wcb) {} @@ -245,7 +428,7 @@ class ReadEOFCallback : public ReadCallbackBase { }; class WriteErrorCallback : public ReadCallback { -public: + public: explicit WriteErrorCallback(WriteCallbackBase *wcb) : ReadCallback(wcb) {} @@ -260,7 +443,9 @@ public: wcb_->setSocket(socket_); // Write back the same data. - socket_->write(wcb_, currentBuffer.buffer, len); + folly::test::msvcSuppressAbortOnInvalidParams([&] { + socket_->write(wcb_, currentBuffer.buffer, len); + }); if (wcb_->state == STATE_FAILED) { setState(STATE_SUCCEEDED); @@ -279,22 +464,23 @@ public: }; class EmptyReadCallback : public ReadCallback { -public: + public: explicit EmptyReadCallback() : ReadCallback(nullptr) {} void readErr(const AsyncSocketException& ex) noexcept override { std::cerr << "readError " << ex.what() << std::endl; state = STATE_FAILED; - tcpSocket_->close(); - tcpSocket_->detachEventBase(); + if (tcpSocket_) { + tcpSocket_->close(); + } } void readEOF() noexcept override { std::cerr << "readEOF" << std::endl; - - tcpSocket_->close(); - tcpSocket_->detachEventBase(); + if (tcpSocket_) { + tcpSocket_->close(); + } state = STATE_SUCCEEDED; } @@ -303,7 +489,7 @@ public: class HandshakeCallback : public AsyncSSLSocket::HandshakeCB { -public: + public: enum ExpectType { EXPECT_SUCCESS, EXPECT_ERROR @@ -353,8 +539,8 @@ public: cv_.wait(lock, [this] { return state != STATE_WAITING; }); } - ~HandshakeCallback() { - EXPECT_EQ(state, STATE_SUCCEEDED); + ~HandshakeCallback() override { + EXPECT_EQ(STATE_SUCCEEDED, state); } void closeSocket() { @@ -375,52 +561,8 @@ public: std::string errorString_; }; -class SSLServerAcceptCallbackBase: -public folly::AsyncServerSocket::AcceptCallback { -public: - explicit SSLServerAcceptCallbackBase(HandshakeCallback *hcb): - state(STATE_WAITING), hcb_(hcb) {} - - ~SSLServerAcceptCallbackBase() { - EXPECT_EQ(state, STATE_SUCCEEDED); - } - - void acceptError(const std::exception& ex) noexcept override { - std::cerr << "SSLServerAcceptCallbackBase::acceptError " - << ex.what() << std::endl; - state = STATE_FAILED; - } - - void connectionAccepted( - int fd, const folly::SocketAddress& /* clientAddr */) noexcept override { - printf("Connection accepted\n"); - std::shared_ptr sslSock; - try { - // Create a AsyncSSLSocket object with the fd. The socket should be - // added to the event base and in the state of accepting SSL connection. - sslSock = AsyncSSLSocket::newSocket(ctx_, base_, fd); - } catch (const std::exception &e) { - LOG(ERROR) << "Exception %s caught while creating a AsyncSSLSocket " - "object with socket " << e.what() << fd; - ::close(fd); - acceptError(e); - return; - } - - connAccepted(sslSock); - } - - virtual void connAccepted( - const std::shared_ptr &s) = 0; - - StateEnum state; - HandshakeCallback *hcb_; - std::shared_ptr ctx_; - folly::EventBase* base_; -}; - class SSLServerAcceptCallback: public SSLServerAcceptCallbackBase { -public: + public: uint32_t timeout_; explicit SSLServerAcceptCallback(HandshakeCallback *hcb, @@ -428,7 +570,7 @@ public: SSLServerAcceptCallbackBase(hcb), timeout_(timeout) {} - virtual ~SSLServerAcceptCallback() { + ~SSLServerAcceptCallback() override { if (timeout_ > 0) { // if we set a timeout, we expect failure EXPECT_EQ(hcb_->state, STATE_FAILED); @@ -436,7 +578,6 @@ public: } } - // Functions inherited from TAsyncSSLServerSocket::SSLAcceptCallback void connAccepted( const std::shared_ptr &s) noexcept override { @@ -444,7 +585,7 @@ public: std::cerr << "SSLServerAcceptCallback::connAccepted" << std::endl; hcb_->setSocket(sock); - sock->sslAccept(hcb_, timeout_); + sock->sslAccept(hcb_, std::chrono::milliseconds(timeout_)); EXPECT_EQ(sock->getSSLState(), AsyncSSLSocket::STATE_ACCEPTING); @@ -453,11 +594,10 @@ public: }; class SSLServerAcceptCallbackDelay: public SSLServerAcceptCallback { -public: + public: explicit SSLServerAcceptCallbackDelay(HandshakeCallback *hcb): SSLServerAcceptCallback(hcb) {} - // Functions inherited from TAsyncSSLServerSocket::SSLAcceptCallback void connAccepted( const std::shared_ptr &s) noexcept override { @@ -494,12 +634,11 @@ public: }; class SSLServerAsyncCacheAcceptCallback: public SSLServerAcceptCallback { -public: + public: explicit SSLServerAsyncCacheAcceptCallback(HandshakeCallback *hcb, uint32_t timeout = 0): SSLServerAcceptCallback(hcb, timeout) {} - // Functions inherited from TAsyncSSLServerSocket::SSLAcceptCallback void connAccepted( const std::shared_ptr &s) noexcept override { @@ -508,7 +647,7 @@ public: std::cerr << "SSLServerAcceptCallback::connAccepted" << std::endl; hcb_->setSocket(sock); - sock->sslAccept(hcb_, timeout_); + sock->sslAccept(hcb_, std::chrono::milliseconds(timeout_)); ASSERT_TRUE((sock->getSSLState() == AsyncSSLSocket::STATE_ACCEPTING) || (sock->getSSLState() == @@ -520,11 +659,10 @@ public: class HandshakeErrorCallback: public SSLServerAcceptCallbackBase { -public: + public: explicit HandshakeErrorCallback(HandshakeCallback *hcb): SSLServerAcceptCallbackBase(hcb) {} - // Functions inherited from TAsyncSSLServerSocket::SSLAcceptCallback void connAccepted( const std::shared_ptr &s) noexcept override { @@ -549,8 +687,6 @@ public: EXPECT_EQ(hcb_->state, STATE_FAILED); EXPECT_EQ(callback2.state, STATE_FAILED); - sock->detachEventBase(); - state = STATE_SUCCEEDED; hcb_->setState(STATE_SUCCEEDED); callback2.setState(STATE_SUCCEEDED); @@ -558,11 +694,10 @@ public: }; class HandshakeTimeoutCallback: public SSLServerAcceptCallbackBase { -public: + public: explicit HandshakeTimeoutCallback(HandshakeCallback *hcb): SSLServerAcceptCallbackBase(hcb) {} - // Functions inherited from TAsyncSSLServerSocket::SSLAcceptCallback void connAccepted( const std::shared_ptr &s) noexcept override { @@ -589,41 +724,22 @@ public: } }; - -class TestSSLServer { - protected: - EventBase evb_; - std::shared_ptr ctx_; - SSLServerAcceptCallbackBase *acb_; - std::shared_ptr socket_; - folly::SocketAddress address_; - pthread_t thread_; - - static void *Main(void *ctx) { - TestSSLServer *self = static_cast(ctx); - self->evb_.loop(); - std::cerr << "Server thread exited event loop" << std::endl; - return nullptr; - } - +class ConnectTimeoutCallback : public SSLServerAcceptCallbackBase { public: - // Create a TestSSLServer. - // This immediately starts listening on the given port. - explicit TestSSLServer(SSLServerAcceptCallbackBase *acb); - - // Kill the thread. - ~TestSSLServer() { - evb_.runInEventBaseThread([&](){ - socket_->stopAccepting(); - }); - std::cerr << "Waiting for server thread to exit" << std::endl; - pthread_join(thread_, nullptr); + ConnectTimeoutCallback() : SSLServerAcceptCallbackBase(nullptr) { + // We don't care if we get invoked or not. + // The client may time out and give up before connAccepted() is even + // called. + state = STATE_SUCCEEDED; } - EventBase &getEventBase() { return evb_; } + void connAccepted( + const std::shared_ptr& s) noexcept override { + std::cerr << "ConnectTimeoutCallback::connAccepted" << std::endl; - const folly::SocketAddress& getAddress() const { - return address_; + // Just wait a while before closing the socket, so the client + // will time out waiting for the handshake to complete. + s->getEventBase()->tryRunAfterDelay([=] { s->close(); }, 100); } }; @@ -633,8 +749,10 @@ class TestSSLAsyncCacheServer : public TestSSLServer { int lookupDelay = 100) : TestSSLServer(acb) { SSL_CTX *sslCtx = ctx_->getSSLCtx(); +#ifdef SSL_ERROR_WANT_SESS_CACHE_LOOKUP SSL_CTX_sess_set_get_cb(sslCtx, TestSSLAsyncCacheServer::getSessionCallback); +#endif SSL_CTX_set_session_cache_mode( sslCtx, SSL_SESS_CACHE_NO_INTERNAL | SSL_SESS_CACHE_SERVER); asyncCallbacks_ = 0; @@ -656,6 +774,7 @@ class TestSSLAsyncCacheServer : public TestSSLServer { int* copyflag) { *copyflag = 0; asyncCallbacks_++; + (void)ssl; #ifdef SSL_ERROR_WANT_SESS_CACHE_LOOKUP if (!SSL_want_sess_cache_lookup(ssl)) { // libssl.so mismatch @@ -721,7 +840,7 @@ class BlockingWriteClient : } } - socket_->sslConn(this, 100); + socket_->sslConn(this, std::chrono::milliseconds(100)); } struct iovec* getIovec() const { @@ -767,7 +886,7 @@ class BlockingWriteServer : bufSize_(2500 * 2000), bytesRead_(0) { buf_.reset(new uint8_t[bufSize_]); - socket_->sslAccept(this, 100); + socket_->sslAccept(this, std::chrono::milliseconds(100)); } void checkBuffer(struct iovec* iov, uint32_t count) const { @@ -843,6 +962,7 @@ class NpnClient : const unsigned char* nextProto; unsigned nextProtoLength; SSLContext::NextProtocolType protocolType; + folly::Optional except; private: void handshakeSuc(AsyncSSLSocket*) noexcept override { @@ -852,7 +972,7 @@ class NpnClient : void handshakeErr( AsyncSSLSocket*, const AsyncSocketException& ex) noexcept override { - ADD_FAILURE() << "client handshake error: " << ex.what(); + except = ex; } void writeSuccess() noexcept override { socket_->close(); @@ -879,6 +999,7 @@ class NpnServer : const unsigned char* nextProto; unsigned nextProtoLength; SSLContext::NextProtocolType protocolType; + folly::Optional except; private: void handshakeSuc(AsyncSSLSocket*) noexcept override { @@ -888,7 +1009,7 @@ class NpnServer : void handshakeErr( AsyncSSLSocket*, const AsyncSocketException& ex) noexcept override { - ADD_FAILURE() << "server handshake error: " << ex.what(); + except = ex; } void getReadBuffer(void** /* bufReturn */, size_t* lenReturn) override { *lenReturn = 0; @@ -913,7 +1034,7 @@ class RenegotiatingServer : public AsyncSSLSocket::HandshakeCB, socket_->sslAccept(this); } - ~RenegotiatingServer() { + ~RenegotiatingServer() override { socket_->setReadCB(nullptr); } @@ -1066,8 +1187,9 @@ class SSLClient : public AsyncSocket::ConnectCallback, // socket, even if the maxReadsPerEvent_ is hit during // a event loop iteration. static constexpr size_t kMaxReadsPerEvent = 2; + // 2 event loop iterations static constexpr size_t kMaxReadBufferSz = - sizeof(readbuf_) / kMaxReadsPerEvent / 2; // 2 event loop iterations + sizeof(decltype(readbuf_)) / kMaxReadsPerEvent / 2; public: SSLClient(EventBase *eventBase, @@ -1090,7 +1212,7 @@ class SSLClient : public AsyncSocket::ConnectCallback, memset(buf_, 'a', sizeof(buf_)); } - ~SSLClient() { + ~SSLClient() override { if (session_) { SSL_SESSION_free(session_); } @@ -1265,7 +1387,7 @@ class SSLHandshakeClient : public SSLHandshakeBase { bool preverifyResult, bool verifyResult) : SSLHandshakeBase(std::move(socket), preverifyResult, verifyResult) { - socket_->sslConn(this, 0); + socket_->sslConn(this, std::chrono::milliseconds::zero()); } }; @@ -1276,8 +1398,10 @@ class SSLHandshakeClientNoVerify : public SSLHandshakeBase { bool preverifyResult, bool verifyResult) : SSLHandshakeBase(std::move(socket), preverifyResult, verifyResult) { - socket_->sslConn(this, 0, - folly::SSLContext::SSLVerifyPeerEnum::NO_VERIFY); + socket_->sslConn( + this, + std::chrono::milliseconds::zero(), + folly::SSLContext::SSLVerifyPeerEnum::NO_VERIFY); } }; @@ -1288,8 +1412,10 @@ class SSLHandshakeClientDoVerify : public SSLHandshakeBase { bool preverifyResult, bool verifyResult) : SSLHandshakeBase(std::move(socket), preverifyResult, verifyResult) { - socket_->sslConn(this, 0, - folly::SSLContext::SSLVerifyPeerEnum::VERIFY); + socket_->sslConn( + this, + std::chrono::milliseconds::zero(), + folly::SSLContext::SSLVerifyPeerEnum::VERIFY); } }; @@ -1300,7 +1426,7 @@ class SSLHandshakeServer : public SSLHandshakeBase { bool preverifyResult, bool verifyResult) : SSLHandshakeBase(std::move(socket), preverifyResult, verifyResult) { - socket_->sslAccept(this, 0); + socket_->sslAccept(this, std::chrono::milliseconds::zero()); } }; @@ -1312,7 +1438,7 @@ class SSLHandshakeServerParseClientHello : public SSLHandshakeBase { bool verifyResult) : SSLHandshakeBase(std::move(socket), preverifyResult, verifyResult) { socket_->enableClientHelloParsing(); - socket_->sslAccept(this, 0); + socket_->sslAccept(this, std::chrono::milliseconds::zero()); } std::string clientCiphers_, sharedCiphers_, serverCiphers_, chosenCipher_; @@ -1335,8 +1461,10 @@ class SSLHandshakeServerNoVerify : public SSLHandshakeBase { bool preverifyResult, bool verifyResult) : SSLHandshakeBase(std::move(socket), preverifyResult, verifyResult) { - socket_->sslAccept(this, 0, - folly::SSLContext::SSLVerifyPeerEnum::NO_VERIFY); + socket_->sslAccept( + this, + std::chrono::milliseconds::zero(), + folly::SSLContext::SSLVerifyPeerEnum::NO_VERIFY); } }; @@ -1347,8 +1475,10 @@ class SSLHandshakeServerDoVerify : public SSLHandshakeBase { bool preverifyResult, bool verifyResult) : SSLHandshakeBase(std::move(socket), preverifyResult, verifyResult) { - socket_->sslAccept(this, 0, - folly::SSLContext::SSLVerifyPeerEnum::VERIFY_REQ_CLIENT_CERT); + socket_->sslAccept( + this, + std::chrono::milliseconds::zero(), + folly::SSLContext::SSLVerifyPeerEnum::VERIFY_REQ_CLIENT_CERT); } };