Do not overwrite the payload of a QCoapRequest

When sending POST and PUT requests via overloads taking QCoapRequest and
QByteArray data, the payload of the request will be overwritten by an empty
byte array, if no data has been passed when calling post()/put(). Do
not overwrite the payload of a QCoapRequest, if the data parameter is
empty.

Pick-to: 5.15
Change-Id: Iffa40b00ce841a5cebb09dcf59ea22a2a5f9df50
Reviewed-by: Karsten Heimrich <karsten.heimrich@qt.io>
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
This commit is contained in:
Sona Kurazyan 2020-05-25 11:34:34 +02:00
parent 83acbeace8
commit 3fdd85ec48
2 changed files with 18 additions and 9 deletions

View File

@ -263,7 +263,8 @@ QCoapReply *QCoapClient::get(const QUrl &url)
/*!
Sends the \a request using the PUT method and returns a new QCoapReply
object. Uses \a data as the payload for this request.
object. Uses \a data as the payload for this request. If \a data is empty,
the payload of the \a request will be used.
\sa get(), post(), deleteResource(), observe(), discover()
*/
@ -273,7 +274,8 @@ QCoapReply *QCoapClient::put(const QCoapRequest &request, const QByteArray &data
QCoapRequest copyRequest = QCoapRequestPrivate::createRequest(request, QtCoap::Method::Put,
d->connection->isSecure());
copyRequest.setPayload(data);
if (!data.isEmpty())
copyRequest.setPayload(data);
return d->sendRequest(copyRequest);
}
@ -308,7 +310,8 @@ QCoapReply *QCoapClient::put(const QUrl &url, const QByteArray &data)
/*!
Sends the \a request using the POST method and returns a new QCoapReply
object. Uses \a data as the payload for this request.
object. Uses \a data as the payload for this request. If \a data is empty,
the payload of the \a request will be used.
\sa get(), put(), deleteResource(), observe(), discover()
*/
@ -318,7 +321,8 @@ QCoapReply *QCoapClient::post(const QCoapRequest &request, const QByteArray &dat
QCoapRequest copyRequest = QCoapRequestPrivate::createRequest(request, QtCoap::Method::Post,
d->connection->isSecure());
copyRequest.setPayload(data);
if (!data.isEmpty())
copyRequest.setPayload(data);
return d->sendRequest(copyRequest);
}

View File

@ -363,16 +363,19 @@ void tst_QCoapClient::methods()
QSignalSpy spyClientFinished(&client, SIGNAL(finished(QCoapReply *)));
const QByteArray payload = "test payload";
QScopedPointer<QCoapReply> reply;
if (qstrncmp(QTest::currentDataTag(), "get", 3) == 0)
if (qstrncmp(QTest::currentDataTag(), "get", 3) == 0) {
reply.reset(client.get(request));
else if (qstrncmp(QTest::currentDataTag(), "post", 4) == 0)
} else if (qstrncmp(QTest::currentDataTag(), "post", 4) == 0) {
request.setPayload(payload);
reply.reset(client.post(request));
else if (qstrncmp(QTest::currentDataTag(), "put", 3) == 0)
} else if (qstrncmp(QTest::currentDataTag(), "put", 3) == 0) {
request.setPayload(payload);
reply.reset(client.put(request));
else if (qstrncmp(QTest::currentDataTag(), "delete", 6) == 0)
} else if (qstrncmp(QTest::currentDataTag(), "delete", 6) == 0) {
reply.reset(client.deleteResource(request));
else {
} else {
QString error = QLatin1String("Unrecognized method '") + QTest::currentDataTag() + "'";
QFAIL(qPrintable(error));
}
@ -395,9 +398,11 @@ void tst_QCoapClient::methods()
} else if (qstrncmp(QTest::currentDataTag(), "post", 4) == 0) {
QVERIFY(replyData.isEmpty());
QCOMPARE(reply->responseCode(), QtCoap::ResponseCode::Created);
QCOMPARE(reply->request().payload(), payload);
} else if (qstrncmp(QTest::currentDataTag(), "put", 3) == 0) {
QVERIFY(replyData.isEmpty());
QCOMPARE(reply->responseCode(), QtCoap::ResponseCode::Changed);
QCOMPARE(reply->request().payload(), payload);
} else if (qstrncmp(QTest::currentDataTag(), "delete", 6) == 0) {
QVERIFY(replyData.isEmpty());
QCOMPARE(reply->responseCode(), QtCoap::ResponseCode::Deleted);