proxygen
AsyncTransport.h
Go to the documentation of this file.
1 /*
2  * Copyright 2014-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 
17 #pragma once
18 
19 #include <memory>
20 
21 #include <folly/io/IOBuf.h>
29 
31 #ifdef SSL_MODE_MOVE_BUFFER_OWNERSHIP
32  true
33 #else
34  false
35 #endif
36  ;
37 
38 namespace folly {
39 
40 class AsyncSocketException;
41 class EventBase;
42 class SocketAddress;
43 
44 /*
45  * flags given by the application for write* calls
46  */
47 enum class WriteFlags : uint32_t {
48  NONE = 0x00,
49  /*
50  * Whether to delay the output until a subsequent non-corked write.
51  * (Note: may not be supported in all subclasses or on all platforms.)
52  */
53  CORK = 0x01,
54  /*
55  * for a socket that has ACK latency enabled, it will cause the kernel
56  * to fire a TCP ESTATS event when the last byte of the given write call
57  * will be acknowledged.
58  */
59  EOR = 0x02,
60  /*
61  * this indicates that only the write side of socket should be shutdown
62  */
63  WRITE_SHUTDOWN = 0x04,
64  /*
65  * use msg zerocopy if allowed
66  */
67  WRITE_MSG_ZEROCOPY = 0x08,
68 };
69 
70 /*
71  * union operator
72  */
74  return static_cast<WriteFlags>(
75  static_cast<uint32_t>(a) | static_cast<uint32_t>(b));
76 }
77 
78 /*
79  * compound assignment union operator
80  */
82  a = a | b;
83  return a;
84 }
85 
86 /*
87  * intersection operator
88  */
90  return static_cast<WriteFlags>(
91  static_cast<uint32_t>(a) & static_cast<uint32_t>(b));
92 }
93 
94 /*
95  * compound assignment intersection operator
96  */
98  a = a & b;
99  return a;
100 }
101 
102 /*
103  * exclusion parameter
104  */
106  return static_cast<WriteFlags>(~static_cast<uint32_t>(a));
107 }
108 
109 /*
110  * unset operator
111  */
113  return a & ~b;
114 }
115 
116 /*
117  * inclusion operator
118  */
119 inline bool isSet(WriteFlags a, WriteFlags b) {
120  return (a & b) == b;
121 }
122 
151  public:
152  typedef std::unique_ptr<AsyncTransport, Destructor> UniquePtr;
153 
165  virtual void close() = 0;
166 
178  virtual void closeNow() = 0;
179 
190  virtual void closeWithReset() {
191  closeNow();
192  }
193 
216  virtual void shutdownWrite() = 0;
217 
226  virtual void shutdownWriteNow() = 0;
227 
236  virtual bool good() const = 0;
237 
243  virtual bool readable() const = 0;
244 
250  virtual bool writable() const {
251  // By default return good() - leave it to implementers to override.
252  return good();
253  }
254 
260  virtual bool isPending() const {
261  return readable();
262  }
263 
269  virtual bool connecting() const = 0;
270 
276  virtual bool error() const = 0;
277 
286  virtual void attachEventBase(EventBase* eventBase) = 0;
287 
297  virtual void detachEventBase() = 0;
298 
304  virtual bool isDetachable() const = 0;
305 
318  virtual void setSendTimeout(uint32_t milliseconds) = 0;
319 
326  virtual uint32_t getSendTimeout() const = 0;
327 
336  virtual void getLocalAddress(SocketAddress* address) const = 0;
337 
348  getLocalAddress(&addr);
349  return addr;
350  }
351 
352  void getAddress(SocketAddress* address) const override {
353  getLocalAddress(address);
354  }
355 
365  virtual void getPeerAddress(SocketAddress* address) const = 0;
366 
377  getPeerAddress(&addr);
378  return addr;
379  }
380 
384  virtual ssl::X509UniquePtr getPeerCert() const {
385  return nullptr;
386  }
387 
391  virtual const X509* getSelfCert() const {
392  return nullptr;
393  }
394 
399  return nullptr;
400  }
401 
406  return nullptr;
407  }
408 
415  return "";
416  }
417 
422  return "";
423  }
424 
428  virtual bool isEorTrackingEnabled() const = 0;
429 
430  virtual void setEorTracking(bool track) = 0;
431 
432  virtual size_t getAppBytesWritten() const = 0;
433  virtual size_t getRawBytesWritten() const = 0;
434  virtual size_t getAppBytesReceived() const = 0;
435  virtual size_t getRawBytesReceived() const = 0;
436 
438  public:
439  virtual ~BufferCallback() {}
440  virtual void onEgressBuffered() = 0;
441  virtual void onEgressBufferCleared() = 0;
442  };
443 
450  public:
451  virtual ~ReplaySafetyCallback() = default;
452 
456  virtual void onReplaySafe() = 0;
457  };
458 
463  virtual bool isReplaySafe() const {
464  return true;
465  }
466 
473  if (callback) {
474  CHECK(false) << "setReplaySafetyCallback() not supported";
475  }
476  }
477 
478  protected:
479  ~AsyncTransport() override = default;
480 };
481 
482 class AsyncReader {
483  public:
484  class ReadCallback {
485  public:
486  virtual ~ReadCallback() = default;
487 
519  virtual void getReadBuffer(void** bufReturn, size_t* lenReturn) = 0;
520 
534  virtual void readDataAvailable(size_t len) noexcept = 0;
535 
561  virtual bool isBufferMovable() noexcept {
562  return false;
563  }
564 
570  virtual size_t maxBufferSize() const {
571  return 64 * 1024; // 64K
572  }
573 
586  virtual void readBufferAvailable(
587  std::unique_ptr<IOBuf> /*readBuf*/) noexcept {}
588 
595  virtual void readEOF() noexcept = 0;
596 
606  virtual void readErr(const AsyncSocketException& ex) noexcept = 0;
607  };
608 
609  // Read methods that aren't part of AsyncTransport.
610  virtual void setReadCB(ReadCallback* callback) = 0;
611  virtual ReadCallback* getReadCallback() const = 0;
612 
613  protected:
614  virtual ~AsyncReader() = default;
615 };
616 
617 class AsyncWriter {
618  public:
620  public:
621  virtual ~WriteCallback() = default;
622 
634  virtual void writeSuccess() noexcept = 0;
635 
642  virtual void writeErr(
643  size_t bytesWritten,
644  const AsyncSocketException& ex) noexcept = 0;
645  };
646 
656  virtual void write(
657  WriteCallback* callback,
658  const void* buf,
659  size_t bytes,
661 
671  virtual void writev(
672  WriteCallback* callback,
673  const iovec* vec,
674  size_t count,
676 
686  virtual void writeChain(
687  WriteCallback* callback,
688  std::unique_ptr<IOBuf>&& buf,
690 
691  protected:
692  virtual ~AsyncWriter() = default;
693 };
694 
695 // Transitional intermediate interface. This is deprecated.
696 // Wrapper around folly::AsyncTransport, that includes read/write callbacks
697 class AsyncTransportWrapper : virtual public AsyncTransport,
698  virtual public AsyncReader,
699  virtual public AsyncWriter {
700  public:
701  using UniquePtr = std::unique_ptr<AsyncTransportWrapper, Destructor>;
702 
703  // Alias for inherited members from AsyncReader and AsyncWriter
704  // to keep compatibility.
707  void setReadCB(ReadCallback* callback) override = 0;
708  ReadCallback* getReadCallback() const override = 0;
709  void write(
710  WriteCallback* callback,
711  const void* buf,
712  size_t bytes,
713  WriteFlags flags = WriteFlags::NONE) override = 0;
714  void writev(
715  WriteCallback* callback,
716  const iovec* vec,
717  size_t count,
718  WriteFlags flags = WriteFlags::NONE) override = 0;
719  void writeChain(
720  WriteCallback* callback,
721  std::unique_ptr<IOBuf>&& buf,
722  WriteFlags flags = WriteFlags::NONE) override = 0;
729  return nullptr;
730  }
731 
737  template <class T>
738  const T* getUnderlyingTransport() const {
739  const AsyncTransportWrapper* current = this;
740  while (current) {
741  auto sock = dynamic_cast<const T*>(current);
742  if (sock) {
743  return sock;
744  }
745  current = current->getWrappedTransport();
746  }
747  return nullptr;
748  }
749 
750  template <class T>
752  return const_cast<T*>(static_cast<const AsyncTransportWrapper*>(this)
753  ->getUnderlyingTransport<T>());
754  }
755 };
756 
757 } // namespace folly
virtual void readBufferAvailable(std::unique_ptr< IOBuf >) noexcept
flags
Definition: http_parser.h:127
virtual const AsyncTransportWrapper * getWrappedTransport() const
void write(const T &in, folly::io::Appender &appender)
Definition: Types-inl.h:112
std::unique_ptr< X509, X509Deleter > X509UniquePtr
char b
virtual std::string getSecurityProtocol() const
virtual const AsyncTransportCertificate * getSelfCertificate() const
WriteFlags operator|(WriteFlags a, WriteFlags b)
virtual bool isBufferMovable() noexcept
WriteFlags operator&(WriteFlags a, WriteFlags b)
folly::std T
constexpr bool kOpenSslModeMoveBufferOwnership
WriteFlags & operator|=(WriteFlags &a, WriteFlags b)
—— Concurrent Priority Queue Implementation ——
Definition: AtomicBitSet.h:29
requires E e noexcept(noexcept(s.error(std::move(e))))
requires And< SemiMovable< VN >... > &&SemiMovable< E > auto error(E e)
Definition: error.h:48
virtual std::string getApplicationProtocol() const noexcept
bool isSet(WriteFlags a, WriteFlags b)
virtual const AsyncTransportCertificate * getPeerCertificate() const
int current
virtual bool isPending() const
SocketAddress getPeerAddress() const
virtual bool writable() const
WriteFlags operator~(WriteFlags a)
const T * getUnderlyingTransport() const
virtual size_t maxBufferSize() const
char a
Definition: Traits.h:588
SocketAddress getLocalAddress() const
int * count
WriteFlags & operator&=(WriteFlags &a, WriteFlags b)
virtual void closeWithReset()
const char * string
Definition: Conv.cpp:212
void getAddress(SocketAddress *address) const override
WriteFlags unSet(WriteFlags a, WriteFlags b)
virtual ssl::X509UniquePtr getPeerCert() const
const
Definition: upload.py:398
virtual const X509 * getSelfCert() const
virtual void setReplaySafetyCallback(ReplaySafetyCallback *callback)
virtual bool isReplaySafe() const
int close(NetworkSocket s)
Definition: NetOps.cpp:90
ThreadPoolListHook * addr
std::unique_ptr< AsyncTransport, Destructor > UniquePtr