proxygen
AsyncSSLSocketTest.h
Go to the documentation of this file.
1 /*
2  * Copyright 2012-present Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #pragma once
17 
18 #include <signal.h>
19 
20 #include <folly/ExceptionWrapper.h>
21 #include <folly/SocketAddress.h>
35 
36 #include <fcntl.h>
37 #include <sys/types.h>
38 #include <condition_variable>
39 #include <iostream>
40 #include <list>
41 #include <memory>
42 
43 namespace folly {
44 
45 // The destructors of all callback classes assert that the state is
46 // STATE_SUCCEEDED, for both possitive and negative tests. The tests
47 // are responsible for setting the succeeded state properly before the
48 // destructors are called.
49 
52  public:
54 
55  void setSocket(const std::shared_ptr<AsyncSSLSocket>& socket) {
56  socket_ = socket;
57  oldCallback_ = socket_->getSendMsgParamsCB();
58  socket_->setSendMsgParamCB(this);
59  }
60 
63  int /*defaultFlags*/) noexcept override {
64  return oldCallback_->getFlags(flags, false /*zeroCopyEnabled*/);
65  }
66 
69  }
70 
73  }
74 
75  std::shared_ptr<AsyncSSLSocket> socket_;
77 };
78 
80  public:
82 
83  void resetFlags(int flags) {
84  flags_ = flags;
85  }
86 
89  int /*defaultFlags*/) noexcept override {
90  if (flags_) {
91  return flags_;
92  } else {
93  return oldCallback_->getFlags(flags, false /*zeroCopyEnabled*/);
94  }
95  }
96 
97  int flags_{0};
98 };
99 
101  public:
103 
104  void resetData(std::vector<char>&& data) {
105  ancillaryData_.swap(data);
106  }
107 
109  if (ancillaryData_.size()) {
110  std::cerr << "getAncillaryData: copying data" << std::endl;
111  memcpy(data, ancillaryData_.data(), ancillaryData_.size());
112  } else {
114  }
115  }
116 
118  if (ancillaryData_.size()) {
119  std::cerr << "getAncillaryDataSize: returning size" << std::endl;
120  return ancillaryData_.size();
121  } else {
123  }
124  }
125 
126  std::vector<char> ancillaryData_;
127 };
128 
130  public:
132  : state(STATE_WAITING),
133  bytesWritten(0),
134  exception(AsyncSocketException::UNKNOWN, "none"),
135  mcb_(mcb) {}
136 
137  ~WriteCallbackBase() override {
139  }
140 
141  virtual void setSocket(const std::shared_ptr<AsyncSSLSocket>& socket) {
142  socket_ = socket;
143  if (mcb_) {
144  mcb_->setSocket(socket);
145  }
146  }
147 
148  void writeSuccess() noexcept override {
149  std::cerr << "writeSuccess" << std::endl;
151  }
152 
153  void writeErr(
154  size_t nBytesWritten,
155  const AsyncSocketException& ex) noexcept override {
156  std::cerr << "writeError: bytesWritten " << nBytesWritten << ", exception "
157  << ex.what() << std::endl;
158 
160  this->bytesWritten = nBytesWritten;
161  exception = ex;
162  socket_->close();
163  }
164 
165  std::shared_ptr<AsyncSSLSocket> socket_;
167  size_t bytesWritten;
170 };
171 
173  public:
175  : WriteCallbackBase(mcb) {}
176 
179  EXPECT_EQ(
180  exception.getType(),
181  AsyncSocketException::AsyncSocketExceptionType::NETWORK_ERROR);
182  EXPECT_EQ(exception.getErrno(), 22);
183  // Suppress the assert in ~WriteCallbackBase()
185  }
186 };
187 
188 #ifdef FOLLY_HAVE_MSG_ERRQUEUE
189 /* copied from include/uapi/linux/net_tstamp.h */
190 /* SO_TIMESTAMPING gets an integer bit field comprised of these values */
191 enum SOF_TIMESTAMPING {
192  SOF_TIMESTAMPING_TX_SOFTWARE = (1 << 1),
193  SOF_TIMESTAMPING_SOFTWARE = (1 << 4),
194  SOF_TIMESTAMPING_OPT_ID = (1 << 7),
195  SOF_TIMESTAMPING_TX_SCHED = (1 << 8),
196  SOF_TIMESTAMPING_TX_ACK = (1 << 9),
197  SOF_TIMESTAMPING_OPT_TSONLY = (1 << 11),
198 };
199 
200 class WriteCheckTimestampCallback : public WriteCallbackBase {
201  public:
202  explicit WriteCheckTimestampCallback(SendMsgParamsCallbackBase* mcb = nullptr)
203  : WriteCallbackBase(mcb) {}
204 
205  ~WriteCheckTimestampCallback() override {
207  EXPECT_TRUE(gotTimestamp_);
208  EXPECT_TRUE(gotByteSeq_);
209  }
210 
211  void setSocket(const std::shared_ptr<AsyncSSLSocket>& socket) override {
213 
214  EXPECT_NE(socket_->getFd(), 0);
215  int flags = SOF_TIMESTAMPING_OPT_ID | SOF_TIMESTAMPING_OPT_TSONLY |
216  SOF_TIMESTAMPING_SOFTWARE;
217  AsyncSocket::OptionKey tstampingOpt = {SOL_SOCKET, SO_TIMESTAMPING};
218  int ret = tstampingOpt.apply(socket_->getFd(), flags);
219  EXPECT_EQ(ret, 0);
220  }
221 
222  void checkForTimestampNotifications() noexcept {
223  int fd = socket_->getFd();
224  std::vector<char> ctrl(1024, 0);
225  unsigned char data;
226  struct msghdr msg;
227  iovec entry;
228 
229  memset(&msg, 0, sizeof(msg));
230  entry.iov_base = &data;
231  entry.iov_len = sizeof(data);
232  msg.msg_iov = &entry;
233  msg.msg_iovlen = 1;
234  msg.msg_control = ctrl.data();
235  msg.msg_controllen = ctrl.size();
236 
237  int ret;
238  while (true) {
239  ret = recvmsg(fd, &msg, MSG_ERRQUEUE);
240  if (ret < 0) {
241  if (errno != EAGAIN) {
242  auto errnoCopy = errno;
243  std::cerr << "::recvmsg exited with code " << ret
244  << ", errno: " << errnoCopy << std::endl;
247  "recvmsg() failed",
248  errnoCopy);
249  exception = ex;
250  }
251  return;
252  }
253 
254  for (struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msg);
255  cmsg != nullptr && cmsg->cmsg_len != 0;
256  cmsg = CMSG_NXTHDR(&msg, cmsg)) {
257  if (cmsg->cmsg_level == SOL_SOCKET &&
258  cmsg->cmsg_type == SCM_TIMESTAMPING) {
259  gotTimestamp_ = true;
260  continue;
261  }
262 
263  if ((cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVERR) ||
264  (cmsg->cmsg_level == SOL_IPV6 && cmsg->cmsg_type == IPV6_RECVERR)) {
265  gotByteSeq_ = true;
266  continue;
267  }
268  }
269  }
270  }
271 
272  bool gotTimestamp_{false};
273  bool gotByteSeq_{false};
274 };
275 #endif // FOLLY_HAVE_MSG_ERRQUEUE
276 
278  public:
280  : wcb_(wcb), state(STATE_WAITING) {}
281 
282  ~ReadCallbackBase() override {
284  }
285 
286  void setSocket(const std::shared_ptr<AsyncSSLSocket>& socket) {
287  socket_ = socket;
288  }
289 
291  state = s;
292  if (wcb_) {
293  wcb_->state = s;
294  }
295  }
296 
297  void readErr(const AsyncSocketException& ex) noexcept override {
298  std::cerr << "readError " << ex.what() << std::endl;
300  socket_->close();
301  }
302 
303  void readEOF() noexcept override {
304  std::cerr << "readEOF" << std::endl;
305 
306  socket_->close();
307  }
308 
309  std::shared_ptr<AsyncSSLSocket> socket_;
312 };
313 
315  public:
317  : ReadCallbackBase(wcb), buffers() {}
318 
319  ~ReadCallback() override {
320  for (std::vector<Buffer>::iterator it = buffers.begin();
321  it != buffers.end();
322  ++it) {
323  it->free();
324  }
325  currentBuffer.free();
326  }
327 
328  void getReadBuffer(void** bufReturn, size_t* lenReturn) override {
329  if (!currentBuffer.buffer) {
330  currentBuffer.allocate(4096);
331  }
332  *bufReturn = currentBuffer.buffer;
333  *lenReturn = currentBuffer.length;
334  }
335 
336  void readDataAvailable(size_t len) noexcept override {
337  std::cerr << "readDataAvailable, len " << len << std::endl;
338 
339  currentBuffer.length = len;
340 
341  wcb_->setSocket(socket_);
342 
343  // Write back the same data.
344  socket_->write(wcb_, currentBuffer.buffer, len);
345 
346  buffers.push_back(currentBuffer);
347  currentBuffer.reset();
349  }
350 
351  class Buffer {
352  public:
353  Buffer() : buffer(nullptr), length(0) {}
354  Buffer(char* buf, size_t len) : buffer(buf), length(len) {}
355 
356  void reset() {
357  buffer = nullptr;
358  length = 0;
359  }
360  void allocate(size_t len) {
361  assert(buffer == nullptr);
362  this->buffer = static_cast<char*>(malloc(len));
363  this->length = len;
364  }
365  void free() {
366  ::free(buffer);
367  reset();
368  }
369 
370  char* buffer;
371  size_t length;
372  };
373 
374  std::vector<Buffer> buffers;
376 };
377 
379  public:
381 
382  // Return nullptr buffer to trigger readError()
383  void getReadBuffer(void** bufReturn, size_t* lenReturn) override {
384  *bufReturn = nullptr;
385  *lenReturn = 0;
386  }
387 
388  void readDataAvailable(size_t /* len */) noexcept override {
389  // This should never to called.
390  FAIL();
391  }
392 
393  void readErr(const AsyncSocketException& ex) noexcept override {
395  std::cerr << "ReadErrorCallback::readError" << std::endl;
396  setState(STATE_SUCCEEDED);
397  }
398 };
399 
401  public:
403 
404  // Return nullptr buffer to trigger readError()
405  void getReadBuffer(void** bufReturn, size_t* lenReturn) override {
406  *bufReturn = nullptr;
407  *lenReturn = 0;
408  }
409 
410  void readDataAvailable(size_t /* len */) noexcept override {
411  // This should never to called.
412  FAIL();
413  }
414 
415  void readEOF() noexcept override {
417  setState(STATE_SUCCEEDED);
418  }
419 };
420 
422  public:
424 
425  void readDataAvailable(size_t len) noexcept override {
426  std::cerr << "readDataAvailable, len " << len << std::endl;
427 
428  currentBuffer.length = len;
429 
430  // close the socket before writing to trigger writeError().
431  ::close(socket_->getFd());
432 
433  wcb_->setSocket(socket_);
434 
435  // Write back the same data.
437  [&] { socket_->write(wcb_, currentBuffer.buffer, len); });
438 
439  if (wcb_->state == STATE_FAILED) {
440  setState(STATE_SUCCEEDED);
441  } else {
443  }
444 
445  buffers.push_back(currentBuffer);
446  currentBuffer.reset();
447  }
448 
449  void readErr(const AsyncSocketException& ex) noexcept override {
450  std::cerr << "readError " << ex.what() << std::endl;
451  // do nothing since this is expected
452  }
453 };
454 
456  public:
458 
459  void readErr(const AsyncSocketException& ex) noexcept override {
460  std::cerr << "readError " << ex.what() << std::endl;
462  if (tcpSocket_) {
463  tcpSocket_->close();
464  }
465  }
466 
467  void readEOF() noexcept override {
468  std::cerr << "readEOF" << std::endl;
469  if (tcpSocket_) {
470  tcpSocket_->close();
471  }
473  }
474 
475  std::shared_ptr<AsyncSocket> tcpSocket_;
476 };
477 
479  public:
480  enum ExpectType { EXPECT_SUCCESS, EXPECT_ERROR };
481 
483  ReadCallbackBase* rcb,
484  ExpectType expect = EXPECT_SUCCESS)
485  : state(STATE_WAITING), rcb_(rcb), expect_(expect) {}
486 
487  void setSocket(const std::shared_ptr<AsyncSSLSocket>& socket) {
488  socket_ = socket;
489  }
490 
492  state = s;
493  rcb_->setState(s);
494  }
495 
496  // Functions inherited from AsyncSSLSocketHandshakeCallback
497  void handshakeSuc(AsyncSSLSocket* sock) noexcept override {
498  std::lock_guard<std::mutex> g(mutex_);
499  cv_.notify_all();
500  EXPECT_EQ(sock, socket_.get());
501  std::cerr << "HandshakeCallback::connectionAccepted" << std::endl;
502  rcb_->setSocket(socket_);
503  sock->setReadCB(rcb_);
504  state = (expect_ == EXPECT_SUCCESS) ? STATE_SUCCEEDED : STATE_FAILED;
505  }
507  AsyncSSLSocket* /* sock */,
508  const AsyncSocketException& ex) noexcept override {
509  std::lock_guard<std::mutex> g(mutex_);
510  cv_.notify_all();
511  std::cerr << "HandshakeCallback::handshakeError " << ex.what() << std::endl;
512  state = (expect_ == EXPECT_ERROR) ? STATE_SUCCEEDED : STATE_FAILED;
513  if (expect_ == EXPECT_ERROR) {
514  // rcb will never be invoked
515  rcb_->setState(STATE_SUCCEEDED);
516  }
517  errorString_ = ex.what();
518  }
519 
521  std::unique_lock<std::mutex> lock(mutex_);
522  cv_.wait(lock, [this] { return state != STATE_WAITING; });
523  }
524 
525  ~HandshakeCallback() override {
527  }
528 
529  void closeSocket() {
530  socket_->close();
532  }
533 
534  std::shared_ptr<AsyncSSLSocket> getSocket() {
535  return socket_;
536  }
537 
539  std::shared_ptr<AsyncSSLSocket> socket_;
543  std::condition_variable cv_;
545 };
546 
548  public:
550 
552  : SSLServerAcceptCallbackBase(hcb), timeout_(timeout) {}
553 
555  if (timeout_ > 0) {
556  // if we set a timeout, we expect failure
557  EXPECT_EQ(hcb_->state, STATE_FAILED);
558  hcb_->setState(STATE_SUCCEEDED);
559  }
560  }
561 
563  const std::shared_ptr<folly::AsyncSSLSocket>& s) noexcept override {
564  auto sock = std::static_pointer_cast<AsyncSSLSocket>(s);
565  std::cerr << "SSLServerAcceptCallback::connAccepted" << std::endl;
566 
567  hcb_->setSocket(sock);
568  sock->sslAccept(hcb_, std::chrono::milliseconds(timeout_));
569  EXPECT_EQ(sock->getSSLState(), AsyncSSLSocket::STATE_ACCEPTING);
570 
572  }
573 };
574 
576  public:
578  : SSLServerAcceptCallback(hcb) {}
579 
581  const std::shared_ptr<folly::AsyncSSLSocket>& s) noexcept override {
582  auto sock = std::static_pointer_cast<AsyncSSLSocket>(s);
583 
584  std::cerr << "SSLServerAcceptCallbackDelay::connAccepted" << std::endl;
585  int fd = sock->getFd();
586 
587 #ifndef TCP_NOPUSH
588  {
589  // The accepted connection should already have TCP_NODELAY set
590  int value;
591  socklen_t valueLength = sizeof(value);
592  int rc = getsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &value, &valueLength);
593  EXPECT_EQ(rc, 0);
594  EXPECT_EQ(value, 1);
595  }
596 #endif
597 
598  // Unset the TCP_NODELAY option.
599  int value = 0;
600  socklen_t valueLength = sizeof(value);
601  int rc = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &value, valueLength);
602  EXPECT_EQ(rc, 0);
603 
604  rc = getsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &value, &valueLength);
605  EXPECT_EQ(rc, 0);
606  EXPECT_EQ(value, 0);
607 
609  }
610 };
611 
613  public:
615  HandshakeCallback* hcb,
616  uint32_t timeout = 0)
618 
620  const std::shared_ptr<folly::AsyncSSLSocket>& s) noexcept override {
621  auto sock = std::static_pointer_cast<AsyncSSLSocket>(s);
622 
623  std::cerr << "SSLServerAcceptCallback::connAccepted" << std::endl;
624 
625  hcb_->setSocket(sock);
626  sock->sslAccept(hcb_, std::chrono::milliseconds(timeout_));
627  ASSERT_TRUE(
628  (sock->getSSLState() == AsyncSSLSocket::STATE_ACCEPTING) ||
629  (sock->getSSLState() == AsyncSSLSocket::STATE_CACHE_LOOKUP));
630 
632  }
633 };
634 
636  public:
639 
641  const std::shared_ptr<folly::AsyncSSLSocket>& s) noexcept override {
642  auto sock = std::static_pointer_cast<AsyncSSLSocket>(s);
643 
644  std::cerr << "HandshakeErrorCallback::connAccepted" << std::endl;
645 
646  // The first call to sslAccept() should succeed.
647  hcb_->setSocket(sock);
648  sock->sslAccept(hcb_);
649  EXPECT_EQ(sock->getSSLState(), AsyncSSLSocket::STATE_ACCEPTING);
650 
651  // The second call to sslAccept() should fail.
652  HandshakeCallback callback2(hcb_->rcb_);
653  callback2.setSocket(sock);
654  sock->sslAccept(&callback2);
655  EXPECT_EQ(sock->getSSLState(), AsyncSSLSocket::STATE_ERROR);
656 
657  // Both callbacks should be in the error state.
658  EXPECT_EQ(hcb_->state, STATE_FAILED);
659  EXPECT_EQ(callback2.state, STATE_FAILED);
660 
662  hcb_->setState(STATE_SUCCEEDED);
663  callback2.setState(STATE_SUCCEEDED);
664  }
665 };
666 
668  public:
671 
673  const std::shared_ptr<folly::AsyncSSLSocket>& s) noexcept override {
674  std::cerr << "HandshakeErrorCallback::connAccepted" << std::endl;
675 
676  auto sock = std::static_pointer_cast<AsyncSSLSocket>(s);
677 
678  hcb_->setSocket(sock);
680  [=] {
681  std::cerr << "Delayed SSL accept, client will have close by now"
682  << std::endl;
683  // SSL accept will fail
684  EXPECT_EQ(sock->getSSLState(), AsyncSSLSocket::STATE_UNINIT);
685  hcb_->socket_->sslAccept(hcb_);
686  // This registers for an event
687  EXPECT_EQ(sock->getSSLState(), AsyncSSLSocket::STATE_ACCEPTING);
688 
690  },
691  100);
692  }
693 };
694 
696  public:
698  // We don't care if we get invoked or not.
699  // The client may time out and give up before connAccepted() is even
700  // called.
702  }
703 
705  const std::shared_ptr<folly::AsyncSSLSocket>& s) noexcept override {
706  std::cerr << "ConnectTimeoutCallback::connAccepted" << std::endl;
707 
708  // Just wait a while before closing the socket, so the client
709  // will time out waiting for the handshake to complete.
710  s->getEventBase()->tryRunAfterDelay([=] { s->close(); }, 100);
711  }
712 };
713 
715  public:
718  int lookupDelay = 100)
719  : TestSSLServer(acb) {
720  SSL_CTX* sslCtx = ctx_->getSSLCtx();
721 #ifdef SSL_ERROR_WANT_SESS_CACHE_LOOKUP
722  SSL_CTX_sess_set_get_cb(
724 #endif
725  SSL_CTX_set_session_cache_mode(
726  sslCtx, SSL_SESS_CACHE_NO_INTERNAL | SSL_SESS_CACHE_SERVER);
727  asyncCallbacks_ = 0;
728  asyncLookups_ = 0;
729  lookupDelay_ = lookupDelay;
730  }
731 
733  return asyncCallbacks_;
734  }
736  return asyncLookups_;
737  }
738 
739  private:
743 
744  static SSL_SESSION* getSessionCallback(
745  SSL* ssl,
746  unsigned char* /* sess_id */,
747  int /* id_len */,
748  int* copyflag) {
749  *copyflag = 0;
750  asyncCallbacks_++;
751  (void)ssl;
752 #ifdef SSL_ERROR_WANT_SESS_CACHE_LOOKUP
753  if (!SSL_want_sess_cache_lookup(ssl)) {
754  // libssl.so mismatch
755  std::cerr << "no async support" << std::endl;
756  return nullptr;
757  }
758 
759  AsyncSSLSocket* sslSocket = AsyncSSLSocket::getFromSSL(ssl);
760  assert(sslSocket != nullptr);
761  // Going to simulate an async cache by just running delaying the miss 100ms
762  if (asyncCallbacks_ % 2 == 0) {
763  // This socket is already blocked on lookup, return miss
764  std::cerr << "returning miss" << std::endl;
765  } else {
766  // fresh meat - block it
767  std::cerr << "async lookup" << std::endl;
768  sslSocket->getEventBase()->tryRunAfterDelay(
770  lookupDelay_);
771  *copyflag = SSL_SESSION_CB_WOULD_BLOCK;
772  asyncLookups_++;
773  }
774 #endif
775  return nullptr;
776  }
777 };
778 
779 void getfds(int fds[2]);
780 
781 void getctx(
782  std::shared_ptr<folly::SSLContext> clientCtx,
783  std::shared_ptr<folly::SSLContext> serverCtx);
784 
785 void sslsocketpair(
786  EventBase* eventBase,
787  AsyncSSLSocket::UniquePtr* clientSock,
788  AsyncSSLSocket::UniquePtr* serverSock);
789 
792  public:
794  : socket_(std::move(socket)), bufLen_(2500), iovCount_(2000) {
795  // Fill buf_
796  buf_ = std::make_unique<uint8_t[]>(bufLen_);
797  for (uint32_t n = 0; n < sizeof(buf_); ++n) {
798  buf_[n] = n % 0xff;
799  }
800 
801  // Initialize iov_
802  iov_ = std::make_unique<struct iovec[]>(iovCount_);
803  for (uint32_t n = 0; n < iovCount_; ++n) {
804  iov_[n].iov_base = buf_.get() + n;
805  if (n & 0x1) {
806  iov_[n].iov_len = n % bufLen_;
807  } else {
808  iov_[n].iov_len = bufLen_ - (n % bufLen_);
809  }
810  }
811 
812  socket_->sslConn(this, std::chrono::milliseconds(100));
813  }
814 
815  struct iovec* getIovec() const {
816  return iov_.get();
817  }
819  return iovCount_;
820  }
821 
822  private:
824  socket_->writev(this, iov_.get(), iovCount_);
825  }
828  const AsyncSocketException& ex) noexcept override {
829  ADD_FAILURE() << "client handshake error: " << ex.what();
830  }
831  void writeSuccess() noexcept override {
832  socket_->close();
833  }
834  void writeErr(
835  size_t bytesWritten,
836  const AsyncSocketException& ex) noexcept override {
837  ADD_FAILURE() << "client write error after " << bytesWritten
838  << " bytes: " << ex.what();
839  }
840 
844  std::unique_ptr<uint8_t[]> buf_;
845  std::unique_ptr<struct iovec[]> iov_;
846 };
847 
850  public:
852  : socket_(std::move(socket)), bufSize_(2500 * 2000), bytesRead_(0) {
853  buf_ = std::make_unique<uint8_t[]>(bufSize_);
854  socket_->sslAccept(this, std::chrono::milliseconds(100));
855  }
856 
857  void checkBuffer(struct iovec* iov, uint32_t count) const {
858  uint32_t idx = 0;
859  for (uint32_t n = 0; n < count; ++n) {
860  size_t bytesLeft = bytesRead_ - idx;
861  int rc = memcmp(
862  buf_.get() + idx,
863  iov[n].iov_base,
864  std::min(iov[n].iov_len, bytesLeft));
865  if (rc != 0) {
866  FAIL() << "buffer mismatch at iovec " << n << "/" << count
867  << ": rc=" << rc;
868  }
869  if (iov[n].iov_len > bytesLeft) {
870  FAIL() << "server did not read enough data: "
871  << "ended at byte " << bytesLeft << "/" << iov[n].iov_len
872  << " in iovec " << n << "/" << count;
873  }
874 
875  idx += iov[n].iov_len;
876  }
877  if (idx != bytesRead_) {
878  ADD_FAILURE() << "server read extra data: " << bytesRead_
879  << " bytes read; expected " << idx;
880  }
881  }
882 
883  private:
885  // Wait 10ms before reading, so the client's writes will initially block.
886  socket_->getEventBase()->tryRunAfterDelay(
887  [this] { socket_->setReadCB(this); }, 10);
888  }
891  const AsyncSocketException& ex) noexcept override {
892  ADD_FAILURE() << "server handshake error: " << ex.what();
893  }
894  void getReadBuffer(void** bufReturn, size_t* lenReturn) override {
895  *bufReturn = buf_.get() + bytesRead_;
896  *lenReturn = bufSize_ - bytesRead_;
897  }
898  void readDataAvailable(size_t len) noexcept override {
899  bytesRead_ += len;
900  socket_->setReadCB(nullptr);
901  socket_->getEventBase()->tryRunAfterDelay(
902  [this] { socket_->setReadCB(this); }, 2);
903  }
904  void readEOF() noexcept override {
905  socket_->close();
906  }
907  void readErr(const AsyncSocketException& ex) noexcept override {
908  ADD_FAILURE() << "server read error: " << ex.what();
909  }
910 
914  std::unique_ptr<uint8_t[]> buf_;
915 };
916 
919  public:
921  : nextProto(nullptr), nextProtoLength(0), socket_(std::move(socket)) {
922  socket_->sslConn(this);
923  }
924 
925  const unsigned char* nextProto;
926  unsigned nextProtoLength;
928 
929  private:
931  socket_->getSelectedNextProtocol(&nextProto, &nextProtoLength);
932  }
935  const AsyncSocketException& ex) noexcept override {
936  except = ex;
937  }
938  void writeSuccess() noexcept override {
939  socket_->close();
940  }
941  void writeErr(
942  size_t bytesWritten,
943  const AsyncSocketException& ex) noexcept override {
944  ADD_FAILURE() << "client write error after " << bytesWritten
945  << " bytes: " << ex.what();
946  }
947 
949 };
950 
953  public:
955  : nextProto(nullptr), nextProtoLength(0), socket_(std::move(socket)) {
956  socket_->sslAccept(this);
957  }
958 
959  const unsigned char* nextProto;
960  unsigned nextProtoLength;
962 
963  private:
965  socket_->getSelectedNextProtocol(&nextProto, &nextProtoLength);
966  }
969  const AsyncSocketException& ex) noexcept override {
970  except = ex;
971  }
972  void getReadBuffer(void** /* bufReturn */, size_t* lenReturn) override {
973  *lenReturn = 0;
974  }
975  void readDataAvailable(size_t /* len */) noexcept override {}
976  void readEOF() noexcept override {
977  socket_->close();
978  }
979  void readErr(const AsyncSocketException& ex) noexcept override {
980  ADD_FAILURE() << "server read error: " << ex.what();
981  }
982 
984 };
985 
988  public:
990  : socket_(std::move(socket)) {
991  socket_->sslAccept(this);
992  }
993 
994  ~RenegotiatingServer() override {
995  socket_->setReadCB(nullptr);
996  }
997 
998  void handshakeSuc(AsyncSSLSocket* /* socket */) noexcept override {
999  LOG(INFO) << "Renegotiating server handshake success";
1000  socket_->setReadCB(this);
1001  }
1003  AsyncSSLSocket*,
1004  const AsyncSocketException& ex) noexcept override {
1005  ADD_FAILURE() << "Renegotiating server handshake error: " << ex.what();
1006  }
1007  void getReadBuffer(void** bufReturn, size_t* lenReturn) override {
1008  *lenReturn = sizeof(buf);
1009  *bufReturn = buf;
1010  }
1011  void readDataAvailable(size_t /* len */) noexcept override {}
1012  void readEOF() noexcept override {}
1013  void readErr(const AsyncSocketException& ex) noexcept override {
1014  LOG(INFO) << "server got read error " << ex.what();
1015  auto exPtr = dynamic_cast<const SSLException*>(&ex);
1016  ASSERT_NE(nullptr, exPtr);
1017  std::string exStr(ex.what());
1019  ASSERT_NE(std::string::npos, exStr.find(sslEx.what()));
1020  renegotiationError_ = true;
1021  }
1022 
1024  unsigned char buf[128];
1025  bool renegotiationError_{false};
1026 };
1027 
1028 #ifndef OPENSSL_NO_TLSEXT
1031  public:
1033  : serverNameMatch(false), socket_(std::move(socket)) {
1034  socket_->sslConn(this);
1035  }
1036 
1038 
1039  private:
1041  serverNameMatch = socket_->isServerNameMatch();
1042  }
1044  AsyncSSLSocket*,
1045  const AsyncSocketException& ex) noexcept override {
1046  ADD_FAILURE() << "client handshake error: " << ex.what();
1047  }
1048  void writeSuccess() noexcept override {
1049  socket_->close();
1050  }
1051  void writeErr(
1052  size_t bytesWritten,
1053  const AsyncSocketException& ex) noexcept override {
1054  ADD_FAILURE() << "client write error after " << bytesWritten
1055  << " bytes: " << ex.what();
1056  }
1057 
1059 };
1060 
1063  public:
1064  explicit SNIServer(
1066  const std::shared_ptr<folly::SSLContext>& ctx,
1067  const std::shared_ptr<folly::SSLContext>& sniCtx,
1068  const std::string& expectedServerName)
1069  : serverNameMatch(false),
1070  socket_(std::move(socket)),
1071  sniCtx_(sniCtx),
1072  expectedServerName_(expectedServerName) {
1073  ctx->setServerNameCallback(
1074  std::bind(&SNIServer::serverNameCallback, this, std::placeholders::_1));
1075  socket_->sslAccept(this);
1076  }
1077 
1079 
1080  private:
1081  void handshakeSuc(AsyncSSLSocket* /* ssl */) noexcept override {}
1083  AsyncSSLSocket*,
1084  const AsyncSocketException& ex) noexcept override {
1085  ADD_FAILURE() << "server handshake error: " << ex.what();
1086  }
1087  void getReadBuffer(void** /* bufReturn */, size_t* lenReturn) override {
1088  *lenReturn = 0;
1089  }
1090  void readDataAvailable(size_t /* len */) noexcept override {}
1091  void readEOF() noexcept override {
1092  socket_->close();
1093  }
1094  void readErr(const AsyncSocketException& ex) noexcept override {
1095  ADD_FAILURE() << "server read error: " << ex.what();
1096  }
1097 
1098  folly::SSLContext::ServerNameCallbackResult serverNameCallback(SSL* ssl) {
1099  const char* sn = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name);
1100  if (sniCtx_ && sn && !strcasecmp(expectedServerName_.c_str(), sn)) {
1101  AsyncSSLSocket* sslSocket = AsyncSSLSocket::getFromSSL(ssl);
1102  sslSocket->switchServerSSLContext(sniCtx_);
1103  serverNameMatch = true;
1104  return folly::SSLContext::SERVER_NAME_FOUND;
1105  } else {
1106  serverNameMatch = false;
1107  return folly::SSLContext::SERVER_NAME_NOT_FOUND;
1108  }
1109  }
1110 
1112  std::shared_ptr<folly::SSLContext> sniCtx_;
1114 };
1115 #endif
1116 
1120  private:
1122  std::shared_ptr<AsyncSSLSocket> sslSocket_;
1123  SSL_SESSION* session_;
1124  std::shared_ptr<folly::SSLContext> ctx_;
1128  char buf_[128];
1129  char readbuf_[128];
1135 
1136  // These settings test that we eventually drain the
1137  // socket, even if the maxReadsPerEvent_ is hit during
1138  // a event loop iteration.
1139  static constexpr size_t kMaxReadsPerEvent = 2;
1140  // 2 event loop iterations
1141  static constexpr size_t kMaxReadBufferSz =
1142  sizeof(decltype(readbuf_)) / kMaxReadsPerEvent / 2;
1143 
1144  public:
1146  EventBase* eventBase,
1147  const folly::SocketAddress& address,
1149  uint32_t timeout = 0)
1150  : eventBase_(eventBase),
1151  session_(nullptr),
1152  requests_(requests),
1153  address_(address),
1154  timeout_(timeout),
1155  bytesRead_(0),
1156  hit_(0),
1157  miss_(0),
1158  errors_(0),
1159  writeAfterConnectErrors_(0) {
1160  ctx_.reset(new folly::SSLContext());
1161  ctx_->setOptions(SSL_OP_NO_TICKET);
1162  ctx_->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
1163  memset(buf_, 'a', sizeof(buf_));
1164  }
1165 
1166  ~SSLClient() override {
1167  if (session_) {
1168  SSL_SESSION_free(session_);
1169  }
1170  if (errors_ == 0) {
1171  EXPECT_EQ(bytesRead_, sizeof(buf_));
1172  }
1173  }
1174 
1175  uint32_t getHit() const {
1176  return hit_;
1177  }
1178 
1179  uint32_t getMiss() const {
1180  return miss_;
1181  }
1182 
1184  return errors_;
1185  }
1186 
1188  return writeAfterConnectErrors_;
1189  }
1190 
1191  void connect(bool writeNow = false) {
1192  sslSocket_ = AsyncSSLSocket::newSocket(ctx_, eventBase_);
1193  if (session_ != nullptr) {
1194  sslSocket_->setSSLSession(session_);
1195  }
1196  requests_--;
1197  sslSocket_->connect(this, address_, timeout_);
1198  if (sslSocket_ && writeNow) {
1199  // write some junk, used in an error test
1200  sslSocket_->write(this, buf_, sizeof(buf_));
1201  }
1202  }
1203 
1204  void connectSuccess() noexcept override {
1205  std::cerr << "client SSL socket connected" << std::endl;
1206  if (sslSocket_->getSSLSessionReused()) {
1207  hit_++;
1208  } else {
1209  miss_++;
1210  if (session_ != nullptr) {
1211  SSL_SESSION_free(session_);
1212  }
1213  session_ = sslSocket_->getSSLSession();
1214  }
1215 
1216  // write()
1217  sslSocket_->setMaxReadsPerEvent(kMaxReadsPerEvent);
1218  sslSocket_->write(this, buf_, sizeof(buf_));
1219  sslSocket_->setReadCB(this);
1220  memset(readbuf_, 'b', sizeof(readbuf_));
1221  bytesRead_ = 0;
1222  }
1223 
1224  void connectErr(const AsyncSocketException& ex) noexcept override {
1225  std::cerr << "SSLClient::connectError: " << ex.what() << std::endl;
1226  errors_++;
1227  sslSocket_.reset();
1228  }
1229 
1230  void writeSuccess() noexcept override {
1231  std::cerr << "client write success" << std::endl;
1232  }
1233 
1234  void writeErr(
1235  size_t /* bytesWritten */,
1236  const AsyncSocketException& ex) noexcept override {
1237  std::cerr << "client writeError: " << ex.what() << std::endl;
1238  if (!sslSocket_) {
1239  writeAfterConnectErrors_++;
1240  }
1241  }
1242 
1243  void getReadBuffer(void** bufReturn, size_t* lenReturn) override {
1244  *bufReturn = readbuf_ + bytesRead_;
1245  *lenReturn = std::min(kMaxReadBufferSz, sizeof(readbuf_) - bytesRead_);
1246  }
1247 
1248  void readEOF() noexcept override {
1249  std::cerr << "client readEOF" << std::endl;
1250  }
1251 
1252  void readErr(const AsyncSocketException& ex) noexcept override {
1253  std::cerr << "client readError: " << ex.what() << std::endl;
1254  }
1255 
1256  void readDataAvailable(size_t len) noexcept override {
1257  std::cerr << "client read data: " << len << std::endl;
1258  bytesRead_ += len;
1259  if (bytesRead_ == sizeof(buf_)) {
1260  EXPECT_EQ(memcmp(buf_, readbuf_, bytesRead_), 0);
1261  sslSocket_->closeNow();
1262  sslSocket_.reset();
1263  if (requests_ != 0) {
1264  connect();
1265  }
1266  }
1267  }
1268 };
1269 
1272  public:
1275  bool preverifyResult,
1276  bool verifyResult)
1277  : handshakeVerify_(false),
1278  handshakeSuccess_(false),
1279  handshakeError_(false),
1280  socket_(std::move(socket)),
1281  preverifyResult_(preverifyResult),
1282  verifyResult_(verifyResult) {}
1283 
1285  return std::move(socket_);
1286  }
1287 
1291  std::chrono::nanoseconds handshakeTime;
1292 
1293  protected:
1297 
1298  // HandshakeCallback
1300  AsyncSSLSocket* /* sock */,
1301  bool preverifyOk,
1302  X509_STORE_CTX* /* ctx */) noexcept override {
1303  handshakeVerify_ = true;
1304 
1305  EXPECT_EQ(preverifyResult_, preverifyOk);
1306  return verifyResult_;
1307  }
1308 
1310  LOG(INFO) << "Handshake success";
1311  handshakeSuccess_ = true;
1312  if (socket_) {
1313  handshakeTime = socket_->getHandshakeTime();
1314  }
1315  }
1316 
1318  AsyncSSLSocket*,
1319  const AsyncSocketException& ex) noexcept override {
1320  LOG(INFO) << "Handshake error " << ex.what();
1321  handshakeError_ = true;
1322  if (socket_) {
1323  handshakeTime = socket_->getHandshakeTime();
1324  }
1325  }
1326 
1327  // WriteCallback
1328  void writeSuccess() noexcept override {
1329  if (socket_) {
1330  socket_->close();
1331  }
1332  }
1333 
1334  void writeErr(
1335  size_t bytesWritten,
1336  const AsyncSocketException& ex) noexcept override {
1337  ADD_FAILURE() << "client write error after " << bytesWritten
1338  << " bytes: " << ex.what();
1339  }
1340 };
1341 
1343  public:
1346  bool preverifyResult,
1347  bool verifyResult)
1348  : SSLHandshakeBase(std::move(socket), preverifyResult, verifyResult) {
1349  socket_->sslConn(this, std::chrono::milliseconds::zero());
1350  }
1351 };
1352 
1354  public:
1357  bool preverifyResult,
1358  bool verifyResult)
1359  : SSLHandshakeBase(std::move(socket), preverifyResult, verifyResult) {
1360  socket_->sslConn(
1361  this,
1362  std::chrono::milliseconds::zero(),
1363  folly::SSLContext::SSLVerifyPeerEnum::NO_VERIFY);
1364  }
1365 };
1366 
1368  public:
1371  bool preverifyResult,
1372  bool verifyResult)
1373  : SSLHandshakeBase(std::move(socket), preverifyResult, verifyResult) {
1374  socket_->sslConn(
1375  this,
1376  std::chrono::milliseconds::zero(),
1377  folly::SSLContext::SSLVerifyPeerEnum::VERIFY);
1378  }
1379 };
1380 
1382  public:
1385  bool preverifyResult,
1386  bool verifyResult)
1387  : SSLHandshakeBase(std::move(socket), preverifyResult, verifyResult) {
1388  socket_->sslAccept(this, std::chrono::milliseconds::zero());
1389  }
1390 };
1391 
1393  public:
1396  bool preverifyResult,
1397  bool verifyResult)
1398  : SSLHandshakeBase(std::move(socket), preverifyResult, verifyResult) {
1399  socket_->enableClientHelloParsing();
1400  socket_->sslAccept(this, std::chrono::milliseconds::zero());
1401  }
1402 
1403  std::string clientCiphers_, sharedCiphers_, serverCiphers_, chosenCipher_;
1404 
1405  protected:
1406  void handshakeSuc(AsyncSSLSocket* sock) noexcept override {
1407  handshakeSuccess_ = true;
1408  sock->getSSLSharedCiphers(sharedCiphers_);
1409  sock->getSSLServerCiphers(serverCiphers_);
1410  sock->getSSLClientCiphers(clientCiphers_);
1411  chosenCipher_ = sock->getNegotiatedCipherName();
1412  }
1413 };
1414 
1416  public:
1419  bool preverifyResult,
1420  bool verifyResult)
1421  : SSLHandshakeBase(std::move(socket), preverifyResult, verifyResult) {
1422  socket_->sslAccept(
1423  this,
1424  std::chrono::milliseconds::zero(),
1425  folly::SSLContext::SSLVerifyPeerEnum::NO_VERIFY);
1426  }
1427 };
1428 
1430  public:
1433  bool preverifyResult,
1434  bool verifyResult)
1435  : SSLHandshakeBase(std::move(socket), preverifyResult, verifyResult) {
1436  socket_->sslAccept(
1437  this,
1438  std::chrono::milliseconds::zero(),
1439  folly::SSLContext::SSLVerifyPeerEnum::VERIFY_REQ_CLIENT_CERT);
1440  }
1441 };
1442 
1444  public:
1445  EventBaseAborter(EventBase* eventBase, uint32_t timeoutMS)
1446  : AsyncTimeout(eventBase, AsyncTimeout::InternalEnum::INTERNAL),
1447  eventBase_(eventBase) {
1448  scheduleTimeout(timeoutMS);
1449  }
1450 
1451  void timeoutExpired() noexcept override {
1452  FAIL() << "test timed out";
1453  eventBase_->terminateLoopSoon();
1454  }
1455 
1456  private:
1458 };
1459 
1461  public:
1462  explicit SSLAcceptEvbRunner(EventBase* evb) : evb_(evb) {}
1463  ~SSLAcceptEvbRunner() override = default;
1464 
1465  void run(Function<int()> acceptFunc, Function<void(int)> finallyFunc)
1466  const override {
1467  evb_->runInLoop([acceptFunc = std::move(acceptFunc),
1468  finallyFunc = std::move(finallyFunc)]() mutable {
1469  finallyFunc(acceptFunc());
1470  });
1471  }
1472 
1473  protected:
1475 };
1476 
1478  public:
1480  ~SSLAcceptErrorRunner() override = default;
1481 
1482  void run(Function<int()> /*acceptFunc*/, Function<void(int)> finallyFunc)
1483  const override {
1484  evb_->runInLoop(
1485  [finallyFunc = std::move(finallyFunc)]() mutable { finallyFunc(-1); });
1486  }
1487 };
1488 
1490  public:
1492  : SSLAcceptEvbRunner(evb), socket_(sock) {}
1493  ~SSLAcceptCloseRunner() override = default;
1494 
1495  void run(Function<int()> acceptFunc, Function<void(int)> finallyFunc)
1496  const override {
1497  evb_->runInLoop([acceptFunc = std::move(acceptFunc),
1498  finallyFunc = std::move(finallyFunc),
1499  sock = socket_]() mutable {
1500  auto ret = acceptFunc();
1501  sock->closeNow();
1502  finallyFunc(ret);
1503  });
1504  }
1505 
1506  private:
1508 };
1509 
1511  public:
1513  : SSLAcceptEvbRunner(evb), sslBase_(base) {}
1514  ~SSLAcceptDestroyRunner() override = default;
1515 
1516  void run(Function<int()> acceptFunc, Function<void(int)> finallyFunc)
1517  const override {
1518  evb_->runInLoop([acceptFunc = std::move(acceptFunc),
1519  finallyFunc = std::move(finallyFunc),
1520  sslBase = sslBase_]() mutable {
1521  auto ret = acceptFunc();
1522  std::move(*sslBase).moveSocket();
1523  finallyFunc(ret);
1524  });
1525  }
1526 
1527  private:
1529 };
1530 
1531 } // namespace folly
std::vector< uint8_t > buffer(kBufferSize+16)
void writeSuccess() noexceptoverride
uint32_t writeAfterConnectErrors_
void resetData(std::vector< char > &&data)
void getReadBuffer(void **bufReturn, size_t *lenReturn) override
uint32_t getMiss() const
std::string expectedServerName_
void handshakeSuc(AsyncSSLSocket *) noexceptoverride
flags
Definition: http_parser.h:127
void writeSuccess() noexceptoverride
#define FAIL()
Definition: gtest.h:1822
uint32_t getWriteAfterConnectErrors() const
int connect(NetworkSocket s, const sockaddr *name, socklen_t namelen)
Definition: NetOps.cpp:94
uint32_t getAncillaryDataSize(folly::WriteFlags flags) noexceptoverride
const struct message requests[]
Definition: test.c:80
void readEOF() noexceptoverride
SSLServerAsyncCacheAcceptCallback(HandshakeCallback *hcb, uint32_t timeout=0)
void connAccepted(const std::shared_ptr< folly::AsyncSSLSocket > &s) noexceptoverride
SSLServerAcceptCallbackDelay(HandshakeCallback *hcb)
SSLClient(EventBase *eventBase, const folly::SocketAddress &address, uint32_t requests, uint32_t timeout=0)
ReadEOFCallback(WriteCallbackBase *wcb)
void handshakeSuc(AsyncSSLSocket *) noexceptoverride
AsyncSSLSocket::UniquePtr socket_
virtual void setSocket(const std::shared_ptr< AsyncSSLSocket > &socket)
folly::Optional< AsyncSocketException > except
void connAccepted(const std::shared_ptr< folly::AsyncSSLSocket > &s) noexceptoverride
SSL_SESSION * session_
int setsockopt(NetworkSocket s, int level, int optname, const void *optval, socklen_t optlen)
Definition: NetOps.cpp:384
AlpnClient(AsyncSSLSocket::UniquePtr socket)
void readDataAvailable(size_t len) noexceptoverride
void connAccepted(const std::shared_ptr< folly::AsyncSSLSocket > &s) noexceptoverride
ReadCallbackBase(WriteCallbackBase *wcb)
AsyncSSLSocket::UniquePtr socket_
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
void handshakeErr(AsyncSSLSocket *, const AsyncSocketException &ex) noexceptoverride
void readErr(const AsyncSocketException &ex) noexceptoverride
folly::Optional< AsyncSocketException > except
void writeSuccess() noexceptoverride
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
bool tryRunAfterDelay(Func cob, uint32_t milliseconds, InternalEnum internal=InternalEnum::NORMAL)
uint32_t getErrors() const
virtual void sslAccept(HandshakeCB *callback, std::chrono::milliseconds timeout=std::chrono::milliseconds::zero(), const folly::SSLContext::SSLVerifyPeerEnum &verifyPeer=folly::SSLContext::SSLVerifyPeerEnum::USE_CTX)
void run(Function< int()> acceptFunc, Function< void(int)> finallyFunc) const override
uint32_t getHit() const
void readDataAvailable(size_t) noexceptoverride
void setSocket(const std::shared_ptr< AsyncSSLSocket > &socket)
STL namespace.
void writeSuccess() noexceptoverride
void connectSuccess() noexceptoverride
folly::AsyncSocket::SendMsgParamsCallback * oldCallback_
AsyncSSLSocket::UniquePtr socket_
std::vector< Buffer > buffers
AlpnServer(AsyncSSLSocket::UniquePtr socket)
folly::SSLContext::ServerNameCallbackResult serverNameCallback(SSL *ssl)
SSLHandshakeServer(AsyncSSLSocket::UniquePtr socket, bool preverifyResult, bool verifyResult)
void readEOF() noexceptoverride
WriteCallbackBase(SendMsgParamsCallbackBase *mcb=nullptr)
TestSSLAsyncCacheServer(SSLServerAcceptCallbackBase *acb, int lookupDelay=100)
void connAccepted(const std::shared_ptr< folly::AsyncSSLSocket > &s) noexceptoverride
void sslsocketpair(EventBase *eventBase, AsyncSSLSocket::UniquePtr *clientSock, AsyncSSLSocket::UniquePtr *serverSock)
std::shared_ptr< folly::SSLContext > sniCtx_
SSLHandshakeBase(AsyncSSLSocket::UniquePtr socket, bool preverifyResult, bool verifyResult)
—— Concurrent Priority Queue Implementation ——
Definition: AtomicBitSet.h:29
void setState(StateEnum s)
SSLHandshakeClient(AsyncSSLSocket::UniquePtr socket, bool preverifyResult, bool verifyResult)
void readEOF() noexceptoverride
void readDataAvailable(size_t len) noexceptoverride
auto msvcSuppressAbortOnInvalidParams(Func func) -> decltype(func())
Definition: TestUtil.h:166
HandshakeCallback(ReadCallbackBase *rcb, ExpectType expect=EXPECT_SUCCESS)
void getReadBuffer(void **bufReturn, size_t *lenReturn) override
void readErr(const AsyncSocketException &ex) noexceptoverride
SSLAcceptCloseRunner(EventBase *evb, folly::AsyncSSLSocket *sock)
requires E e noexcept(noexcept(s.error(std::move(e))))
void getReadBuffer(void **bufReturn, size_t *lenReturn) override
void handshakeErr(AsyncSSLSocket *, const AsyncSocketException &ex) noexceptoverride
void readEOF() noexceptoverride
void readDataAvailable(size_t) noexceptoverride
void readErr(const AsyncSocketException &ex) noexceptoverride
#define nullptr
Definition: http_parser.c:41
std::shared_ptr< FizzServerContext > ctx_
std::condition_variable cv_
void writeErr(size_t nBytesWritten, const AsyncSocketException &ex) noexceptoverride
std::condition_variable cv_
void handshakeErr(AsyncSSLSocket *, const AsyncSocketException &ex) noexceptoverride
void writeSuccess() noexceptoverride
void writeErr(size_t bytesWritten, const AsyncSocketException &ex) noexceptoverride
void setSocket(const std::shared_ptr< AsyncSSLSocket > &socket)
SNIServer(AsyncSSLSocket::UniquePtr socket, const std::shared_ptr< folly::SSLContext > &ctx, const std::shared_ptr< folly::SSLContext > &sniCtx, const std::string &expectedServerName)
std::mutex mutex_
SSLHandshakeClientDoVerify(AsyncSSLSocket::UniquePtr socket, bool preverifyResult, bool verifyResult)
void readDataAvailable(size_t) noexceptoverride
void readErr(const AsyncSocketException &ex) noexceptoverride
void connAccepted(const std::shared_ptr< folly::AsyncSSLSocket > &s) noexceptoverride
static std::shared_ptr< AsyncSSLSocket > newSocket(const std::shared_ptr< folly::SSLContext > &ctx, EventBase *evb, int fd, bool server=true, bool deferSecurityNegotiation=false)
AsyncSSLSocket::UniquePtr moveSocket()&&
std::shared_ptr< AsyncSSLSocket > socket_
ReadErrorCallback(WriteCallbackBase *wcb)
std::unique_ptr< AsyncSSLSocket, Destructor > UniquePtr
SSLAcceptDestroyRunner(EventBase *evb, SSLHandshakeBase *base)
AsyncSSLSocket::UniquePtr socket_
bool handshakeVer(AsyncSSLSocket *, bool preverifyOk, X509_STORE_CTX *) noexceptoverride
void handshakeSuc(AsyncSSLSocket *sock) noexceptoverride
folly::SocketAddress address_
std::unique_ptr< uint8_t[]> buf_
void run(Function< int()> acceptFunc, Function< void(int)> finallyFunc) const override
void readErr(const AsyncSocketException &ex) noexceptoverride
uint32_t getAncillaryDataSize(folly::WriteFlags flags) noexceptoverride
void handshakeSuc(AsyncSSLSocket *sock) noexceptoverride
EventBase * evb_
LogLevel min
Definition: LogLevel.cpp:30
void connAccepted(const std::shared_ptr< folly::AsyncSSLSocket > &s) noexceptoverride
void handshakeErr(AsyncSSLSocket *, const AsyncSocketException &ex) noexceptoverride
SSLHandshakeServerParseClientHello(AsyncSSLSocket::UniquePtr socket, bool preverifyResult, bool verifyResult)
std::vector< char > ancillaryData_
HandshakeTimeoutCallback(HandshakeCallback *hcb)
BlockingWriteServer(AsyncSSLSocket::UniquePtr socket)
virtual void getAncillaryData(folly::WriteFlags, void *) noexcept
Definition: AsyncSocket.h:170
const unsigned char * nextProto
void readDataAvailable(size_t) noexceptoverride
std::unique_ptr< uint8_t[]> buf_
void timeoutExpired() noexceptoverride
constexpr auto data(C &c) -> decltype(c.data())
Definition: Access.h:71
void getAncillaryData(folly::WriteFlags flags, void *data) noexceptoverride
int getFlagsImpl(folly::WriteFlags flags, int) noexceptoverride
EventBaseAborter(EventBase *eventBase, uint32_t timeoutMS)
WriteErrorCallback(WriteCallbackBase *wcb)
void readEOF() noexceptoverride
ExpectWriteErrorCallback(SendMsgParamsCallbackBase *mcb=nullptr)
void handshakeErr(AsyncSSLSocket *, const AsyncSocketException &ex) noexceptoverride
void handshakeErr(AsyncSSLSocket *, const AsyncSocketException &ex) noexceptoverride
auto lock(Synchronized< D, M > &synchronized, Args &&...args)
SNIClient(AsyncSSLSocket::UniquePtr socket)
int getsockopt(NetworkSocket s, int level, int optname, void *optval, socklen_t *optlen)
Definition: NetOps.cpp:112
int getFlagsImpl(folly::WriteFlags flags, int) noexceptoverride
void readDataAvailable(size_t len) noexceptoverride
void getfds(int fds[2])
std::shared_ptr< AsyncSSLSocket > socket_
AsyncSSLSocket::UniquePtr socket_
virtual int getFd() const
Definition: AsyncSocket.h:335
int getFlags(folly::WriteFlags flags, bool zeroCopyEnabled) noexcept
Definition: AsyncSocket.h:156
AsyncSSLSocket::UniquePtr socket_
void readEOF() noexceptoverride
void readErr(const AsyncSocketException &ex) noexceptoverride
NetworkSocket socket(int af, int type, int protocol)
Definition: NetOps.cpp:412
Buffer(char *buf, size_t len)
static SSL_SESSION * getSessionCallback(SSL *ssl, unsigned char *, int, int *copyflag)
void handshakeErr(AsyncSSLSocket *, const AsyncSocketException &ex) noexceptoverride
std::shared_ptr< AsyncSSLSocket > sslSocket_
void expect(LineReader &lr, const char *expected)
void free()
void getAncillaryData(folly::WriteFlags flags, void *data) noexceptoverride
std::shared_ptr< folly::SSLContext > ctx_
folly::AsyncSSLSocket * socket_
void getReadBuffer(void **bufReturn, size_t *lenReturn) override
void handshakeSuc(AsyncSSLSocket *) noexceptoverride
SSLHandshakeServerDoVerify(AsyncSSLSocket::UniquePtr socket, bool preverifyResult, bool verifyResult)
int * count
void readErr(const AsyncSocketException &ex) noexceptoverride
ssize_t recvmsg(NetworkSocket s, msghdr *message, int flags)
Definition: NetOps.cpp:268
AsyncSSLSocket::UniquePtr socket_
#define EXPECT_TRUE(condition)
Definition: gtest.h:1859
std::chrono::nanoseconds handshakeTime
void checkBuffer(struct iovec *iov, uint32_t count) const
struct iovec * getIovec() const
std::shared_ptr< AsyncSSLSocket > getSocket()
void writeErr(size_t bytesWritten, const AsyncSocketException &ex) noexceptoverride
std::mutex mutex
WriteCallbackBase * wcb_
const char * string
Definition: Conv.cpp:212
void readEOF() noexceptoverride
int bind(NetworkSocket s, const sockaddr *name, socklen_t namelen)
Definition: NetOps.cpp:76
g_t g(f_t)
void readErr(const AsyncSocketException &ex) noexceptoverride
void getctx(std::shared_ptr< folly::SSLContext > clientCtx, std::shared_ptr< folly::SSLContext > serverCtx)
void connectErr(const AsyncSocketException &ex) noexceptoverride
#define EXPECT_NE(val1, val2)
Definition: gtest.h:1926
static set< string > s
void handshakeSuc(AsyncSSLSocket *) noexceptoverride
HandshakeErrorCallback(HandshakeCallback *hcb)
EventBase * getEventBase() const override
Definition: AsyncSocket.h:328
uint64_t value(const typename LockFreeRingBuffer< T, Atom >::Cursor &rbcursor)
void writeSuccess() noexceptoverride
SSLServerAcceptCallback(HandshakeCallback *hcb, uint32_t timeout=0)
void writeErr(size_t, const AsyncSocketException &ex) noexceptoverride
std::unique_ptr< struct iovec[]> iov_
void handshakeSuc(AsyncSSLSocket *) noexceptoverride
virtual uint32_t getAncillaryDataSize(folly::WriteFlags) noexcept
Definition: AsyncSocket.h:180
#define ASSERT_NE(val1, val2)
Definition: gtest.h:1960
void readDataAvailable(size_t) noexceptoverride
AsyncSocketException exception
AsyncSSLSocket::UniquePtr socket_
void connect(bool writeNow=false)
void getReadBuffer(void **, size_t *lenReturn) override
SendMsgParamsCallbackBase * mcb_
#define ADD_FAILURE()
Definition: gtest.h:1808
std::shared_ptr< AsyncSocket > tcpSocket_
#define ASSERT_TRUE(condition)
Definition: gtest.h:1865
std::shared_ptr< AsyncSSLSocket > socket_
void handshakeSuc(AsyncSSLSocket *) noexceptoverride
void readErr(const AsyncSocketException &ex) noexceptoverride
void writeErr(size_t bytesWritten, const AsyncSocketException &ex) noexceptoverride
void getReadBuffer(void **bufReturn, size_t *lenReturn) override
int close(NetworkSocket s)
Definition: NetOps.cpp:90
void handshakeErr(AsyncSSLSocket *, const AsyncSocketException &ex) noexceptoverride
void getReadBuffer(void **bufReturn, size_t *lenReturn) override
std::shared_ptr< AsyncSSLSocket > socket_
int apply(int fd, int val) const
Definition: AsyncSocket.h:368
static AsyncSSLSocket * getFromSSL(const SSL *ssl)
RenegotiatingServer(AsyncSSLSocket::UniquePtr socket)
BlockingWriteClient(AsyncSSLSocket::UniquePtr socket)
void handshakeErr(AsyncSSLSocket *, const AsyncSocketException &ex) noexceptoverride
void writeErr(size_t bytesWritten, const AsyncSocketException &ex) noexceptoverride
SSLHandshakeServerNoVerify(AsyncSSLSocket::UniquePtr socket, bool preverifyResult, bool verifyResult)
void readDataAvailable(size_t len) noexceptoverride
void run(Function< int()>, Function< void(int)> finallyFunc) const override
state
Definition: http_parser.c:272
void run(Function< int()> acceptFunc, Function< void(int)> finallyFunc) const override
void getReadBuffer(void **, size_t *lenReturn) override
SSLHandshakeClientNoVerify(AsyncSSLSocket::UniquePtr socket, bool preverifyResult, bool verifyResult)
void readEOF() noexceptoverride
void setSocket(const std::shared_ptr< AsyncSSLSocket > &socket)
const unsigned char * nextProto
void handshakeSuc(AsyncSSLSocket *) noexceptoverride
void handshakeSuc(AsyncSSLSocket *) noexceptoverride
ReadCallback(WriteCallbackBase *wcb)