tufao1: Fix 204 No Content producing a Message Body bug
This has been reported upstream as https://github.com/vinipsmaker/tufao/issues/41
This commit is contained in:
parent
d81ab13268
commit
5cd79448e4
|
@ -0,0 +1,119 @@
|
|||
From ea73dadcce8dc958aebde7d4bc0d438d71c46aa2 Mon Sep 17 00:00:00 2001
|
||||
From: Holger Hans Peter Freyther <holger@moiji-mobile.com>
|
||||
Date: Mon, 31 Mar 2014 21:42:29 +0200
|
||||
Subject: [PATCH] response: No message-body should be sent on a 204 No Content
|
||||
|
||||
According to the RFC2616 no message-body should be sent when
|
||||
the response code 204 is used. When using keep-alive the .NET
|
||||
stack will break on response parsing after the next request.
|
||||
|
||||
Add some hacks to not generate chunked-encoding in the answer
|
||||
and provide a content-length. The code could use some more
|
||||
re-use and the question is what should happen when ::write()
|
||||
or ::end() with data is used on a 204..
|
||||
---
|
||||
src/httpserverresponse.cpp | 19 ++++++++++++++++---
|
||||
src/priv/httpserverresponse.h | 1 +
|
||||
2 files changed, 17 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/httpserverresponse.cpp b/src/httpserverresponse.cpp
|
||||
index f6e6617..2f87180 100644
|
||||
--- a/src/httpserverresponse.cpp
|
||||
+++ b/src/httpserverresponse.cpp
|
||||
@@ -139,6 +139,7 @@ bool HttpServerResponse::writeHead(int statusCode, const QByteArray &reasonPhras
|
||||
priv->device.write(reasonPhrase);
|
||||
priv->device.write(CRLF);
|
||||
priv->formattingState = Priv::HEADERS;
|
||||
+ priv->responseStatus = statusCode;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -182,6 +183,7 @@ bool HttpServerResponse::writeHead(HttpResponseStatus statusCode,
|
||||
priv->device.write(CRLF);
|
||||
}
|
||||
priv->formattingState = Priv::HEADERS;
|
||||
+ priv->responseStatus = int(statusCode);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -203,6 +205,7 @@ bool HttpServerResponse::writeHead(HttpResponseStatus statusCode)
|
||||
priv->device.write(reasonPhrase(statusCode));
|
||||
priv->device.write(CRLF);
|
||||
priv->formattingState = Priv::HEADERS;
|
||||
+ priv->responseStatus = int(statusCode);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -211,6 +214,10 @@ bool HttpServerResponse::write(const QByteArray &chunk)
|
||||
if (!chunk.size())
|
||||
return false;
|
||||
|
||||
+ /* Bad?! At least write the headers? */
|
||||
+ if (priv->responseStatus == int(HttpResponseStatus::NO_CONTENT) && chunk.size())
|
||||
+ return false;
|
||||
+
|
||||
if (priv->options.testFlag(HttpServerResponse::HTTP_1_0)) {
|
||||
switch (priv->formattingState) {
|
||||
case Priv::STATUS_LINE:
|
||||
@@ -241,6 +248,7 @@ bool HttpServerResponse::write(const QByteArray &chunk)
|
||||
QByteArray::fromRawData(value,
|
||||
sizeof(value) - 1));
|
||||
}
|
||||
+
|
||||
priv->headers.insert("Transfer-Encoding", "chunked");
|
||||
|
||||
for (Headers::iterator i = priv->headers.begin()
|
||||
@@ -346,7 +354,9 @@ bool HttpServerResponse::end(const QByteArray &chunk)
|
||||
- 1));
|
||||
}
|
||||
}
|
||||
- {
|
||||
+ if (priv->responseStatus == int(HttpResponseStatus::NO_CONTENT))
|
||||
+ priv->headers.insert("Content-Length", "0");
|
||||
+ else {
|
||||
static const char key[] = "Transfer-Encoding",
|
||||
value[] = "chunked";
|
||||
priv->headers.insert(QByteArray::fromRawData(key,
|
||||
@@ -376,6 +386,7 @@ bool HttpServerResponse::end(const QByteArray &chunk)
|
||||
}
|
||||
case Priv::MESSAGE_BODY:
|
||||
{
|
||||
+ /* Check that no chunk has been specified for 204... */
|
||||
if (chunk.size()) {
|
||||
if (priv->options.testFlag(HttpServerResponse::HTTP_1_1)) {
|
||||
priv->device.write(QByteArray::number(chunk.size(), 16));
|
||||
@@ -392,7 +403,8 @@ bool HttpServerResponse::end(const QByteArray &chunk)
|
||||
priv->http10Buffer.clear();
|
||||
}
|
||||
if (priv->options.testFlag(HttpServerResponse::HTTP_1_1)) {
|
||||
- priv->device.write(LAST_CHUNK);
|
||||
+ if (priv->responseStatus != int(HttpResponseStatus::NO_CONTENT))
|
||||
+ priv->device.write(LAST_CHUNK);
|
||||
priv->formattingState = Priv::TRAILERS;
|
||||
} else {
|
||||
priv->device.close();
|
||||
@@ -403,7 +415,8 @@ bool HttpServerResponse::end(const QByteArray &chunk)
|
||||
}
|
||||
case Priv::TRAILERS:
|
||||
{
|
||||
- priv->device.write(CRLF);
|
||||
+ if (priv->responseStatus != int(HttpResponseStatus::NO_CONTENT))
|
||||
+ priv->device.write(CRLF);
|
||||
if (!priv->options.testFlag(HttpServerResponse::KEEP_ALIVE))
|
||||
priv->device.close();
|
||||
|
||||
diff --git a/src/priv/httpserverresponse.h b/src/priv/httpserverresponse.h
|
||||
index 2562b34..74598e6 100644
|
||||
--- a/src/priv/httpserverresponse.h
|
||||
+++ b/src/priv/httpserverresponse.h
|
||||
@@ -46,6 +46,7 @@ struct HttpServerResponse::Priv
|
||||
QIODevice &device;
|
||||
HttpResponseFormattingState formattingState;
|
||||
Tufao::HttpServerResponse::Options options;
|
||||
+ int responseStatus;
|
||||
Headers headers;
|
||||
|
||||
QByteArray http10Buffer;
|
||||
--
|
||||
1.9.0
|
||||
|
|
@ -10,7 +10,8 @@ DEPENDS += "qtbase"
|
|||
|
||||
SRC_URI = "git://github.com/vinipsmaker/tufao;branch=master \
|
||||
file://hardcode_paths.patch \
|
||||
file://qt_sysroot.patch "
|
||||
file://qt_sysroot.patch \
|
||||
file://fix-204-no-content.patch"
|
||||
S= "${WORKDIR}/git"
|
||||
SRCREV = "0d37027f8e7a64bc58196b963dffc72e13420c7a"
|
||||
|
||||
|
|
Loading…
Reference in New Issue