Use cork in tlsstream and HTTP connection

This commit is contained in:
Jean Flach 2018-02-27 14:49:15 +01:00 committed by Gunnar Beutner
parent 7d103aaf1b
commit d0cf7c654e
3 changed files with 24 additions and 3 deletions

View File

@ -151,12 +151,17 @@ void TlsStream::OnEvent(int revents)
char buffer[64 * 1024]; char buffer[64 * 1024];
if (m_CurrentAction == TlsActionNone) { if (m_CurrentAction == TlsActionNone) {
if (revents & (POLLIN | POLLERR | POLLHUP)) bool corked = IsCorked();
if (!corked && (revents & (POLLIN | POLLERR | POLLHUP)))
m_CurrentAction = TlsActionRead; m_CurrentAction = TlsActionRead;
else if (m_SendQ->GetAvailableBytes() > 0 && (revents & POLLOUT)) else if (m_SendQ->GetAvailableBytes() > 0 && (revents & POLLOUT))
m_CurrentAction = TlsActionWrite; m_CurrentAction = TlsActionWrite;
else { else {
ChangeEvents(POLLIN); if (corked)
ChangeEvents(0);
else
ChangeEvents(POLLIN);
return; return;
} }
} }
@ -399,6 +404,18 @@ bool TlsStream::IsDataAvailable() const
return m_RecvQ->GetAvailableBytes() > 0; 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 Socket::Ptr TlsStream::GetSocket() const
{ {
return m_Socket; return m_Socket;

View File

@ -70,6 +70,8 @@ public:
bool SupportsWaiting() const override; bool SupportsWaiting() const override;
bool IsDataAvailable() const override; bool IsDataAvailable() const override;
void SetCorked(bool corked) override;
bool IsVerifyOK() const; bool IsVerifyOK() const;
String GetVerifyError() const; String GetVerifyError() const;

View File

@ -96,7 +96,6 @@ void HttpServerConnection::Disconnect()
bool HttpServerConnection::ProcessMessage() bool HttpServerConnection::ProcessMessage()
{ {
bool res; bool res;
HttpResponse response(m_Stream, m_CurrentRequest); HttpResponse response(m_Stream, m_CurrentRequest);
@ -174,6 +173,8 @@ bool HttpServerConnection::ProcessMessage()
return res; return res;
} }
m_Stream->SetCorked(true);
m_RequestQueue.Enqueue(std::bind(&HttpServerConnection::ProcessMessageAsync, m_RequestQueue.Enqueue(std::bind(&HttpServerConnection::ProcessMessageAsync,
HttpServerConnection::Ptr(this), m_CurrentRequest, response, m_AuthenticatedUser)); HttpServerConnection::Ptr(this), m_CurrentRequest, response, m_AuthenticatedUser));
@ -326,6 +327,7 @@ void HttpServerConnection::ProcessMessageAsync(HttpRequest& request, HttpRespons
response.Finish(); response.Finish();
m_PendingRequests--; m_PendingRequests--;
m_Stream->SetCorked(false);
} }
void HttpServerConnection::DataAvailableHandler() void HttpServerConnection::DataAvailableHandler()