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 419103b407
commit 8b334fe259
3 changed files with 24 additions and 3 deletions

View 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);
}

View 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;

View 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)