Skip to content

Commit

Permalink
Fix HTTP chunked request body handling
Browse files Browse the repository at this point in the history
Task: QTBUG-74843
Change-Id: I4978c80195246c99a5e6d1e608b3980f56b39207
Reviewed-by: Jesus Fernandez <[email protected]>
  • Loading branch information
msvetkin authored and jsfdez committed Apr 3, 2019
1 parent 5ad0dd4 commit 6f7e8d2
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 3 deletions.
8 changes: 7 additions & 1 deletion src/httpserver/qhttpserverrequest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,13 @@ int QHttpServerRequestPrivate::onBody(http_parser *httpParser, const char *at, s
qCDebug(lc) << httpParser << QString::fromUtf8(at, int(length));
auto i = instance(httpParser);
i->state = State::OnBody;
i->body = QByteArray(at, int(length));
if (i->body.isEmpty()) {
i->body.reserve(
static_cast<int>(httpParser->content_length) +
static_cast<int>(length));
}

i->body.append(at, int(length));
return 0;
}

Expand Down
45 changes: 43 additions & 2 deletions tests/auto/qhttpserver/tst_qhttpserver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,12 @@ void tst_QHttpServer::initTestCase()
httpserver.route("/check-custom-type/", [] (const CustomArg &customArg) {
return QString("data = %1").arg(customArg.data);
});

httpserver.route("/post-body", "POST", [] (const QHttpServerRequest &request) {
return request.body();
});

urlBase = QStringLiteral("http:https://localhost:%1%2").arg(httpserver.listen());
}

void tst_QHttpServer::routeGet_data()
Expand Down Expand Up @@ -334,6 +340,38 @@ void tst_QHttpServer::routePost_data()
<< "text/html"
<< ""
<< "Hello world post";

QTest::addRow("post-and-get, post")
<< "/post-and-get"
<< 200
<< "text/html"
<< ""
<< "Hello world post";

QTest::addRow("any, post")
<< "/any"
<< 200
<< "text/html"
<< ""
<< "Post";

QTest::addRow("post-body")
<< "/post-body"
<< 200
<< "text/html"
<< "some post data"
<< "some post data";

QString body;
for (int i = 0; i < 10000; i++)
body.append(QString::number(i));

QTest::addRow("post-body - huge body, chunk test")
<< "/post-body"
<< 200
<< "text/html"
<< body
<< body;
}

void tst_QHttpServer::routePost()
Expand All @@ -345,8 +383,11 @@ void tst_QHttpServer::routePost()
QFETCH(QString, body);

QNetworkAccessManager networkAccessManager;
const QUrl requestUrl(urlBase.arg(url));
auto reply = networkAccessManager.post(QNetworkRequest(requestUrl), data.toUtf8());
QNetworkRequest request(QUrl(urlBase.arg(url)));
if (data.size())
request.setHeader(QNetworkRequest::ContentTypeHeader, "text/html");

auto reply = networkAccessManager.post(request, data.toUtf8());

QTRY_VERIFY(reply->isFinished());

Expand Down

0 comments on commit 6f7e8d2

Please sign in to comment.