Add more specific HTTP error codes to QNetworkReply::NetworkError

A few more HTTP status codes from the 4xx and 5xx series have been
added to QNetworkReply::NetworkError.

For content errors, the following codes have been added:
1. 409 - Resource Conflict
2. 410 - Resource Gone

For server related errors, the following codes have been added:
1. 500 - Internal Server Error
2. 501 - Operation Not Implemented
3. 503 - Service Unavailable

Few of the above codes are quite possible when communicating with REST
based services.

NOTE:
=====
* HTTP error status 400 is interpreted as
QNetworkReply::ProtocolInvalidOperationError.
* QNetworkReply::UnknownServerError is returned for all server related
errors (5xx) not listed above.

[ChangeLog][QtNetwork][QNetworkReply] Added more (specific) HTTP status
codes to NetworkError enum.

Task-number: QTBUG-30880
Change-Id: I9d2a133f6b3869f26710c6eb930dd8b08df31108
Reviewed-by: Peter Hartmann <phartmann@blackberry.com>
bb10
Mandeep Sandhu 2013-11-15 18:42:22 +05:30 committed by The Qt Project
parent b584b6c478
commit fd5dd27126
4 changed files with 53 additions and 4 deletions

View File

@ -60,6 +60,10 @@ static QNetworkReply::NetworkError statusCodeFromHttp(int httpStatusCode, const
QNetworkReply::NetworkError code;
// we've got an error
switch (httpStatusCode) {
case 400: // Bad Request
code = QNetworkReply::ProtocolInvalidOperationError;
break;
case 401: // Authorization required
code = QNetworkReply::AuthenticationRequiredError;
break;
@ -80,15 +84,34 @@ static QNetworkReply::NetworkError statusCodeFromHttp(int httpStatusCode, const
code = QNetworkReply::ProxyAuthenticationRequiredError;
break;
case 409: // Resource Conflict
code = QNetworkReply::ContentConflictError;
break;
case 410: // Content no longer available
code = QNetworkReply::ContentGoneError;
break;
case 418: // I'm a teapot
code = QNetworkReply::ProtocolInvalidOperationError;
break;
case 500: // Internal Server Error
code = QNetworkReply::InternalServerError;
break;
case 501: // Server does not support this functionality
code = QNetworkReply::OperationNotImplementedError;
break;
case 503: // Service unavailable
code = QNetworkReply::ServiceUnavailableError;
break;
default:
if (httpStatusCode > 500) {
// some kind of server error
code = QNetworkReply::ProtocolUnknownError;
code = QNetworkReply::UnknownServerError;
} else if (httpStatusCode >= 400) {
// content error we did not handle above
code = QNetworkReply::UnknownContentError;

View File

@ -173,6 +173,21 @@ QNetworkReplyPrivate::QNetworkReplyPrivate()
again, but this failed for example because the upload data
could not be read a second time.
\value ContentConflictError the request could not be completed due
to a conflict with the current state of the resource.
\value ContentGoneError the requested resource is no longer
available at the server.
\value InternalServerError the server encountered an unexpected
condition which prevented it from fulfilling the request.
\value OperationNotImplementedError the server does not support the
functionality required to fulfill the request.
\value ServiceUnavailableError the server is unable to handle the
request at this time.
\value ProtocolUnknownError the Network Access API cannot
honor the request because the protocol is not known
@ -191,6 +206,9 @@ QNetworkReplyPrivate::QNetworkReplyPrivate()
\value ProtocolFailure a breakdown in protocol was
detected (parsing error, invalid or unexpected responses, etc.)
\value UnknownServerError an unknown error related to
the server response was detected
\sa error()
*/

View File

@ -93,12 +93,20 @@ public:
ContentNotFoundError,
AuthenticationRequiredError,
ContentReSendError,
ContentConflictError,
ContentGoneError,
UnknownContentError = 299,
// protocol errors
ProtocolUnknownError = 301,
ProtocolInvalidOperationError,
ProtocolFailure = 399
ProtocolFailure = 399,
// Server side errors (401-499)
InternalServerError = 401,
OperationNotImplementedError,
ServiceUnavailableError,
UnknownServerError = 499
};
~QNetworkReply();

View File

@ -2856,9 +2856,9 @@ void tst_QNetworkReply::sendCustomRequestToHttp_data()
QTest::newRow("trace") << QUrl("http://" + QtNetworkSettings::serverName()) <<
QByteArray("TRACE") << (QBuffer *) 0 << 200 << QNetworkReply::NoError << QByteArray();
QTest::newRow("connect") << QUrl("http://" + QtNetworkSettings::serverName()) <<
QByteArray("CONNECT") << (QBuffer *) 0 << 400 << QNetworkReply::UnknownContentError << QByteArray(); // 400 = Bad Request
QByteArray("CONNECT") << (QBuffer *) 0 << 400 << QNetworkReply::ProtocolInvalidOperationError << QByteArray(); // 400 = Bad Request
QTest::newRow("nonsense") << QUrl("http://" + QtNetworkSettings::serverName()) <<
QByteArray("NONSENSE") << (QBuffer *) 0 << 501 << QNetworkReply::ProtocolUnknownError << QByteArray(); // 501 = Method Not Implemented
QByteArray("NONSENSE") << (QBuffer *) 0 << 501 << QNetworkReply::OperationNotImplementedError << QByteArray(); // 501 = Method Not Implemented
QByteArray ba("test");
QBuffer *buffer = new QBuffer;