]> granicus.if.org Git - icinga2/commitdiff
Use cork in tlsstream and HTTP connection
authorJean Flach <jean-marcel.flach@icinga.com>
Tue, 27 Feb 2018 13:49:15 +0000 (14:49 +0100)
committerGunnar Beutner <gunnar.beutner@icinga.com>
Wed, 28 Feb 2018 10:40:58 +0000 (11:40 +0100)
lib/base/tlsstream.cpp
lib/base/tlsstream.hpp
lib/remote/httpserverconnection.cpp

index 2846e8962744a486c3496dc38aa4e1800527df13..e93f119d8010f057f77b929c4b7f8bec8e0d019f 100644 (file)
@@ -151,12 +151,17 @@ void TlsStream::OnEvent(int revents)
        char buffer[64 * 1024];
 
        if (m_CurrentAction == TlsActionNone) {
-               if (revents & (POLLIN | POLLERR | POLLHUP))
+               bool corked = IsCorked();
+               if (!corked && (revents & (POLLIN | POLLERR | POLLHUP)))
                        m_CurrentAction = TlsActionRead;
                else if (m_SendQ->GetAvailableBytes() > 0 && (revents & POLLOUT))
                        m_CurrentAction = TlsActionWrite;
                else {
-                       ChangeEvents(POLLIN);
+                       if (corked)
+                               ChangeEvents(0);
+                       else
+                               ChangeEvents(POLLIN);
+
                        return;
                }
        }
@@ -399,6 +404,18 @@ bool TlsStream::IsDataAvailable() const
        return m_RecvQ->GetAvailableBytes() > 0;
 }
 
+void TlsStream::SetCorked(bool corked)
+{
+       Stream::SetCorked(corked);
+
+       boost::mutex::scoped_lock lock(m_Mutex);
+
+       if (corked)
+               m_CurrentAction = TlsActionNone;
+       else
+               ChangeEvents(POLLIN | POLLOUT);
+}
+
 Socket::Ptr TlsStream::GetSocket() const
 {
        return m_Socket;
index 3528d430b14236c35ea5c9d5fea7d5137843de5a..ad5b92d0feafcd68af9f534a5eb19ef3131a7642 100644 (file)
@@ -70,6 +70,8 @@ public:
        bool SupportsWaiting() const override;
        bool IsDataAvailable() const override;
 
+       void SetCorked(bool corked) override;
+
        bool IsVerifyOK() const;
        String GetVerifyError() const;
 
index 122209f62da4b14cdbbb1ccc132e4660a1a0f41e..1a9f9436ef29b1f0bf7f924738d1979a278b63f9 100644 (file)
@@ -96,7 +96,6 @@ void HttpServerConnection::Disconnect()
 
 bool HttpServerConnection::ProcessMessage()
 {
-
        bool res;
        HttpResponse response(m_Stream, m_CurrentRequest);
 
@@ -174,6 +173,8 @@ bool HttpServerConnection::ProcessMessage()
                return res;
        }
 
+       m_Stream->SetCorked(true);
+
        m_RequestQueue.Enqueue(std::bind(&HttpServerConnection::ProcessMessageAsync,
                HttpServerConnection::Ptr(this), m_CurrentRequest, response, m_AuthenticatedUser));
 
@@ -326,6 +327,7 @@ void HttpServerConnection::ProcessMessageAsync(HttpRequest& request, HttpRespons
 
        response.Finish();
        m_PendingRequests--;
+       m_Stream->SetCorked(false);
 }
 
 void HttpServerConnection::DataAvailableHandler()