Commit 5c74326f authored by Maxim Georgiev's avatar Maxim Georgiev Committed by Facebook Github Bot

Enable EOR flag configuration for folly::AsyncSocket.

Summary: EOR flag was hardcoded to "false" in folly::AsyncSocket. This diff enables changing EOR flag using AsyncSocket::setEorTracking() method.

Reviewed By: yfeldblum

Differential Revision: D4421966

fbshipit-source-id: 2e1b9b19ced6555845396ec33bfd3d5feb710640
parent c72b52a3
...@@ -358,13 +358,9 @@ std::string AsyncSSLSocket::getApplicationProtocol() noexcept { ...@@ -358,13 +358,9 @@ std::string AsyncSSLSocket::getApplicationProtocol() noexcept {
return ""; return "";
} }
bool AsyncSSLSocket::isEorTrackingEnabled() const {
return trackEor_;
}
void AsyncSSLSocket::setEorTracking(bool track) { void AsyncSSLSocket::setEorTracking(bool track) {
if (trackEor_ != track) { if (isEorTrackingEnabled() != track) {
trackEor_ = track; AsyncSocket::setEorTracking(track);
appEorByteNo_ = 0; appEorByteNo_ = 0;
minEorRawByteNo_ = 0; minEorRawByteNo_ = 0;
} }
...@@ -1538,7 +1534,7 @@ AsyncSocket::WriteResult AsyncSSLSocket::performWrite( ...@@ -1538,7 +1534,7 @@ AsyncSocket::WriteResult AsyncSSLSocket::performWrite(
int AsyncSSLSocket::eorAwareSSLWrite(SSL *ssl, const void *buf, int n, int AsyncSSLSocket::eorAwareSSLWrite(SSL *ssl, const void *buf, int n,
bool eor) { bool eor) {
if (eor && trackEor_) { if (eor && isEorTrackingEnabled()) {
if (appEorByteNo_) { if (appEorByteNo_) {
// cannot track for more than one app byte EOR // cannot track for more than one app byte EOR
CHECK(appEorByteNo_ == appBytesWritten_ + n); CHECK(appEorByteNo_ == appBytesWritten_ + n);
...@@ -1601,7 +1597,7 @@ int AsyncSSLSocket::bioWrite(BIO* b, const char* in, int inl) { ...@@ -1601,7 +1597,7 @@ int AsyncSSLSocket::bioWrite(BIO* b, const char* in, int inl) {
tsslSock = reinterpret_cast<AsyncSSLSocket*>(appData); tsslSock = reinterpret_cast<AsyncSSLSocket*>(appData);
CHECK(tsslSock); CHECK(tsslSock);
if (tsslSock->trackEor_ && tsslSock->minEorRawByteNo_ && if (tsslSock->isEorTrackingEnabled() && tsslSock->minEorRawByteNo_ &&
tsslSock->minEorRawByteNo_ <= BIO_number_written(b) + inl) { tsslSock->minEorRawByteNo_ <= BIO_number_written(b) + inl) {
flags = MSG_EOR; flags = MSG_EOR;
} }
......
...@@ -272,7 +272,6 @@ class AsyncSSLSocket : public virtual AsyncSocket { ...@@ -272,7 +272,6 @@ class AsyncSSLSocket : public virtual AsyncSocket {
virtual std::string getSecurityProtocol() const override { return "TLS"; } virtual std::string getSecurityProtocol() const override { return "TLS"; }
bool isEorTrackingEnabled() const override;
virtual void setEorTracking(bool track) override; virtual void setEorTracking(bool track) override;
virtual size_t getRawBytesWritten() const override; virtual size_t getRawBytesWritten() const override;
virtual size_t getRawBytesReceived() const override; virtual size_t getRawBytesReceived() const override;
...@@ -792,9 +791,6 @@ class AsyncSSLSocket : public virtual AsyncSocket { ...@@ -792,9 +791,6 @@ class AsyncSSLSocket : public virtual AsyncSocket {
// whether the SSL session was resumed using session ID or not // whether the SSL session was resumed using session ID or not
bool sessionIDResumed_{false}; bool sessionIDResumed_{false};
// Whether to track EOR or not.
bool trackEor_{false};
// The app byte num that we are tracking for the MSG_EOR // The app byte num that we are tracking for the MSG_EOR
// Only one app EOR byte can be tracked. // Only one app EOR byte can be tracked.
size_t appEorByteNo_{0}; size_t appEorByteNo_{0};
......
...@@ -392,9 +392,13 @@ class AsyncSocket : virtual public AsyncTransportWrapper { ...@@ -392,9 +392,13 @@ class AsyncSocket : virtual public AsyncTransportWrapper {
void getPeerAddress( void getPeerAddress(
folly::SocketAddress* address) const override; folly::SocketAddress* address) const override;
bool isEorTrackingEnabled() const override { return false; } bool isEorTrackingEnabled() const override {
return trackEor_;
}
void setEorTracking(bool /*track*/) override {} void setEorTracking(bool track) override {
trackEor_ = track;
}
bool connecting() const override { bool connecting() const override {
return (state_ == StateEnum::CONNECTING); return (state_ == StateEnum::CONNECTING);
...@@ -958,6 +962,8 @@ class AsyncSocket : virtual public AsyncTransportWrapper { ...@@ -958,6 +962,8 @@ class AsyncSocket : virtual public AsyncTransportWrapper {
bool tfoAttempted_{false}; bool tfoAttempted_{false};
bool tfoFinished_{false}; bool tfoFinished_{false};
bool noTransparentTls_{false}; bool noTransparentTls_{false};
// Whether to track EOR or not.
bool trackEor_{false};
std::unique_ptr<EvbChangeCallback> evbChangeCb_{nullptr}; std::unique_ptr<EvbChangeCallback> evbChangeCb_{nullptr};
}; };
......
...@@ -1177,6 +1177,13 @@ TEST(AsyncSocketTest, WriteIOBuf) { ...@@ -1177,6 +1177,13 @@ TEST(AsyncSocketTest, WriteIOBuf) {
ReadCallback rcb; ReadCallback rcb;
acceptedSocket->setReadCB(&rcb); acceptedSocket->setReadCB(&rcb);
// Check if EOR tracking flag can be set and reset.
EXPECT_FALSE(socket->isEorTrackingEnabled());
socket->setEorTracking(true);
EXPECT_TRUE(socket->isEorTrackingEnabled());
socket->setEorTracking(false);
EXPECT_FALSE(socket->isEorTrackingEnabled());
// Write a simple buffer to the socket // Write a simple buffer to the socket
constexpr size_t simpleBufLength = 5; constexpr size_t simpleBufLength = 5;
char simpleBuf[simpleBufLength]; char simpleBuf[simpleBufLength];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment