]> 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 11:57:22 +0000 (12:57 +0100)
lib/base/tlsstream.cpp
lib/base/tlsstream.hpp
lib/remote/httpserverconnection.cpp

index 1fda60382cbae6a85bde5880787107635f63ee1c..403daf336089a49fb70a684658a400a3df3ac680 100644 (file)
@@ -152,12 +152,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;
                }
        }
@@ -404,3 +409,15 @@ Socket::Ptr TlsStream::GetSocket(void) const
 {
        return m_Socket;
 }
+
+void TlsStream::SetCorked(bool corked)
+{
+       Stream::SetCorked(corked);
+
+       boost::mutex::scoped_lock lock(m_Mutex);
+
+       if (corked)
+               m_CurrentAction = TlsActionNone;
+       else
+               ChangeEvents(POLLIN | POLLOUT);
+}
index 6f7f71738c439fc6a387760cf0a189c27b3127a6..5c475500f6112ae3af4dcfc84bb5af557b232efd 100644 (file)
@@ -73,6 +73,8 @@ public:
        bool IsVerifyOK(void) const;
        String GetVerifyError(void) const;
 
+       virtual void SetCorked(bool corked) override;
+
 private:
        boost::shared_ptr<SSL> m_SSL;
        bool m_Eof;
index 550778751dbc856cf7be030b3e5c4e7235da5343..e087437e613ab4d18fa6563d2fa9dddf5a3c78b4 100644 (file)
@@ -97,7 +97,6 @@ void HttpServerConnection::Disconnect(void)
 
 bool HttpServerConnection::ProcessMessage(void)
 {
-
        bool res;
        HttpResponse response(m_Stream, m_CurrentRequest);
 
@@ -175,6 +174,8 @@ bool HttpServerConnection::ProcessMessage(void)
                return res;
        }
 
+       m_Stream->SetCorked(true);
+
        m_RequestQueue.Enqueue(std::bind(&HttpServerConnection::ProcessMessageAsync,
                HttpServerConnection::Ptr(this), m_CurrentRequest, response, m_AuthenticatedUser));
 
@@ -328,6 +329,7 @@ void HttpServerConnection::ProcessMessageAsync(HttpRequest& request, HttpRespons
 
        response.Finish();
        m_PendingRequests--;
+       m_Stream->SetCorked(false);
 }
 
 void HttpServerConnection::DataAvailableHandler(void)