From 5b53e2e516b47db8f6b932c43a7b8389abb18587 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Thu, 2 Jan 2014 08:35:54 +0100 Subject: [PATCH] HttpRequest: close the connection on Stop() When calling Stop(), we expect the request thread to exit as soon as possible. Closing the connection unlocks it from any blocking read() or write(), avoiding some lockup situations. --- headers/os/net/HttpRequest.h | 1 + src/kits/network/libnetapi/HttpRequest.cpp | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/headers/os/net/HttpRequest.h b/headers/os/net/HttpRequest.h index 3c0a77731d..4592302db1 100644 --- a/headers/os/net/HttpRequest.h +++ b/headers/os/net/HttpRequest.h @@ -47,6 +47,7 @@ public: const ssize_t size = -1); void AdoptHeaders(BHttpHeaders* const headers); + status_t Stop(); const BUrlResult& Result() const; const char* StatusString(status_t threadStatus) const; diff --git a/src/kits/network/libnetapi/HttpRequest.cpp b/src/kits/network/libnetapi/HttpRequest.cpp index d6cff91666..96f3bbcfb5 100644 --- a/src/kits/network/libnetapi/HttpRequest.cpp +++ b/src/kits/network/libnetapi/HttpRequest.cpp @@ -257,6 +257,15 @@ BHttpRequest::Result() const } +status_t +BHttpRequest::Stop() +{ + fSocket->Disconnect(); + // Unlock any pending connect, read or write operation. + return BUrlRequest::Stop(); +} + + void BHttpRequest::_ResetOptions() { @@ -880,12 +889,12 @@ BHttpRequest::_SendHeaders() for (BNetworkCookieJar::UrlIterator it = fContext->GetCookieJar().GetUrlIterator(fUrl); (cookie = it.Next()) != NULL;) { - cookieString << "; "; cookieString << cookie->RawCookie(false); + cookieString << "; "; } - // Remove the extra "; " we added before the first item - cookieString.Remove(0, 2); + // Remove the extra "; " we added after the last item. + cookieString.Truncate(cookieString.Length() - 2); if (cookieString.Length() > 0) fOutputHeaders.AddHeader("Cookie", cookieString); @@ -897,6 +906,8 @@ BHttpRequest::_SendHeaders() const char* header = fOutputHeaders.HeaderAt(headerIndex).Header(); fSocket->Write(header, strlen(header)); fSocket->Write("\r\n", 2); + + _EmitDebug(B_URL_PROTOCOL_DEBUG_HEADER_OUT, "%s", header); } }