DecoratedAsyncTransportWrapper.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. /*
  2. * Copyright 2015-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. #include <folly/io/async/AsyncTransport.h>
  18. namespace folly {
  19. /**
  20. * Convenience class so that AsyncTransportWrapper can be decorated without
  21. * having to redefine every single method.
  22. */
  23. template <class T>
  24. class DecoratedAsyncTransportWrapper : public folly::AsyncTransportWrapper {
  25. public:
  26. explicit DecoratedAsyncTransportWrapper(typename T::UniquePtr transport)
  27. : transport_(std::move(transport)) {}
  28. const AsyncTransportWrapper* getWrappedTransport() const override {
  29. return transport_.get();
  30. }
  31. // folly::AsyncTransportWrapper
  32. ReadCallback* getReadCallback() const override {
  33. return transport_->getReadCallback();
  34. }
  35. void setReadCB(
  36. folly::AsyncTransportWrapper::ReadCallback* callback) override {
  37. transport_->setReadCB(callback);
  38. }
  39. void write(
  40. folly::AsyncTransportWrapper::WriteCallback* callback,
  41. const void* buf,
  42. size_t bytes,
  43. folly::WriteFlags flags = folly::WriteFlags::NONE) override {
  44. transport_->write(callback, buf, bytes, flags);
  45. }
  46. void writeChain(
  47. folly::AsyncTransportWrapper::WriteCallback* callback,
  48. std::unique_ptr<folly::IOBuf>&& buf,
  49. folly::WriteFlags flags = folly::WriteFlags::NONE) override {
  50. transport_->writeChain(callback, std::move(buf), flags);
  51. }
  52. void writev(
  53. folly::AsyncTransportWrapper::WriteCallback* callback,
  54. const iovec* vec,
  55. size_t bytes,
  56. folly::WriteFlags flags = folly::WriteFlags::NONE) override {
  57. transport_->writev(callback, vec, bytes, flags);
  58. }
  59. // folly::AsyncSocketBase
  60. folly::EventBase* getEventBase() const override {
  61. return transport_->getEventBase();
  62. }
  63. // folly::AsyncTransport
  64. void attachEventBase(folly::EventBase* eventBase) override {
  65. transport_->attachEventBase(eventBase);
  66. }
  67. void close() override {
  68. transport_->close();
  69. }
  70. void closeNow() override {
  71. transport_->closeNow();
  72. }
  73. void closeWithReset() override {
  74. transport_->closeWithReset();
  75. // This will likely result in 2 closeNow() calls on the decorated transport,
  76. // but otherwise it is very easy to miss the derived class's closeNow().
  77. closeNow();
  78. }
  79. bool connecting() const override {
  80. return transport_->connecting();
  81. }
  82. void detachEventBase() override {
  83. transport_->detachEventBase();
  84. }
  85. bool error() const override {
  86. return transport_->error();
  87. }
  88. size_t getAppBytesReceived() const override {
  89. return transport_->getAppBytesReceived();
  90. }
  91. size_t getAppBytesWritten() const override {
  92. return transport_->getAppBytesWritten();
  93. }
  94. void getLocalAddress(folly::SocketAddress* address) const override {
  95. return transport_->getLocalAddress(address);
  96. }
  97. void getPeerAddress(folly::SocketAddress* address) const override {
  98. return transport_->getPeerAddress(address);
  99. }
  100. folly::ssl::X509UniquePtr getPeerCert() const override {
  101. return transport_->getPeerCert();
  102. }
  103. size_t getRawBytesReceived() const override {
  104. return transport_->getRawBytesReceived();
  105. }
  106. size_t getRawBytesWritten() const override {
  107. return transport_->getRawBytesWritten();
  108. }
  109. uint32_t getSendTimeout() const override {
  110. return transport_->getSendTimeout();
  111. }
  112. bool good() const override {
  113. return transport_->good();
  114. }
  115. bool isDetachable() const override {
  116. return transport_->isDetachable();
  117. }
  118. bool isEorTrackingEnabled() const override {
  119. return transport_->isEorTrackingEnabled();
  120. }
  121. bool readable() const override {
  122. return transport_->readable();
  123. }
  124. bool writable() const override {
  125. return transport_->writable();
  126. }
  127. void setEorTracking(bool track) override {
  128. return transport_->setEorTracking(track);
  129. }
  130. void setSendTimeout(uint32_t timeoutInMs) override {
  131. transport_->setSendTimeout(timeoutInMs);
  132. }
  133. void shutdownWrite() override {
  134. transport_->shutdownWrite();
  135. }
  136. void shutdownWriteNow() override {
  137. transport_->shutdownWriteNow();
  138. }
  139. std::string getApplicationProtocol() const noexcept override {
  140. return transport_->getApplicationProtocol();
  141. }
  142. std::string getSecurityProtocol() const override {
  143. return transport_->getSecurityProtocol();
  144. }
  145. bool isReplaySafe() const override {
  146. return transport_->isReplaySafe();
  147. }
  148. void setReplaySafetyCallback(
  149. folly::AsyncTransport::ReplaySafetyCallback* callback) override {
  150. transport_->setReplaySafetyCallback(callback);
  151. }
  152. const AsyncTransportCertificate* getPeerCertificate() const override {
  153. return transport_->getPeerCertificate();
  154. }
  155. const AsyncTransportCertificate* getSelfCertificate() const override {
  156. return transport_->getSelfCertificate();
  157. }
  158. protected:
  159. ~DecoratedAsyncTransportWrapper() override {}
  160. typename T::UniquePtr transport_;
  161. };
  162. } // namespace folly