From 0949071f13e7bcbc16a0f07f496e0b6a23b04edd Mon Sep 17 00:00:00 2001 From: Topi Reinio Date: Wed, 18 Apr 2012 14:55:02 +0200 Subject: [PATCH] Keep XMLHttpRequest response data after receiving a server error Fix XMLHttpRequest.responseText being set to empty string whenever a server status code other than '200/OK' is received. XMLHttpRequest specification says that response entity body is to be returned unless the error flag is set, and the flag is set only in case of abort() or network error. This change enables clients to receive additional error information the server may return in the response body. http://www.w3.org/TR/XMLHttpRequest/#the-responsetext-attribute Task-number: QTBUG-21706 Change-Id: I7e44f481494dc7eddea3868d6f92ee45d7ab0c69 Reviewed-by: Yunqiao Yin Reviewed-by: Bea Lam --- src/qml/qml/qqmlxmlhttprequest.cpp | 4 +--- .../qml/qqmlxmlhttprequest/data/status.400.reply | 1 - tests/auto/qml/qqmlxmlhttprequest/data/status.qml | 6 +----- .../qml/qqmlxmlhttprequest/data/statusText.qml | 6 +----- .../qqmlxmlhttprequest/tst_qqmlxmlhttprequest.cpp | 4 ++-- 5 files changed, 5 insertions(+), 16 deletions(-) diff --git a/src/qml/qml/qqmlxmlhttprequest.cpp b/src/qml/qml/qqmlxmlhttprequest.cpp index 94ee7c7..e829b8b 100644 --- a/src/qml/qml/qqmlxmlhttprequest.cpp +++ b/src/qml/qml/qqmlxmlhttprequest.cpp @@ -1281,14 +1281,11 @@ void QQmlXMLHttpRequest::error(QNetworkReply::NetworkError error) { v8::HandleScope handle_scope; - Q_UNUSED(error) m_status = m_network->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); m_statusText = QString::fromUtf8(m_network->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toByteArray()); - m_responseEntityBody = QByteArray(); - m_request = QNetworkRequest(); m_data.clear(); destroyNetwork(); @@ -1310,6 +1307,7 @@ void QQmlXMLHttpRequest::error(QNetworkReply::NetworkError error) if (tc.HasCaught()) printError(tc.Message()); } else { m_errorFlag = true; + m_responseEntityBody = QByteArray(); } m_state = Done; diff --git a/tests/auto/qml/qqmlxmlhttprequest/data/status.400.reply b/tests/auto/qml/qqmlxmlhttprequest/data/status.400.reply index e3f6944..c158fbb 100644 --- a/tests/auto/qml/qqmlxmlhttprequest/data/status.400.reply +++ b/tests/auto/qml/qqmlxmlhttprequest/data/status.400.reply @@ -1,4 +1,3 @@ HTTP/1.0 400 Bad request Connection: close Content-type: text/html; charset=UTF-8 - diff --git a/tests/auto/qml/qqmlxmlhttprequest/data/status.qml b/tests/auto/qml/qqmlxmlhttprequest/data/status.qml index f5e10d7..5feac17 100644 --- a/tests/auto/qml/qqmlxmlhttprequest/data/status.qml +++ b/tests/auto/qml/qqmlxmlhttprequest/data/status.qml @@ -48,11 +48,7 @@ QtObject { if (x.status == expectedStatus) done = true; - if (expectedStatus != 200) { - dataOK = (x.responseText == ""); - } else { - dataOK = (x.responseText == "QML Rocks!\n"); - } + dataOK = (x.responseText == "QML Rocks!\n"); x.open("GET", url); x.setRequestHeader("Accept-Language", "en-US"); diff --git a/tests/auto/qml/qqmlxmlhttprequest/data/statusText.qml b/tests/auto/qml/qqmlxmlhttprequest/data/statusText.qml index e7f658f..3c74efc 100644 --- a/tests/auto/qml/qqmlxmlhttprequest/data/statusText.qml +++ b/tests/auto/qml/qqmlxmlhttprequest/data/statusText.qml @@ -48,11 +48,7 @@ QtObject { if (x.statusText == expectedStatus) done = true; - if (expectedStatus != "OK") { - dataOK = (x.responseText == ""); - } else { - dataOK = (x.responseText == "QML Rocks!\n"); - } + dataOK = (x.responseText == "QML Rocks!\n"); x.open("GET", url); x.setRequestHeader("Accept-Language", "en-US"); diff --git a/tests/auto/qml/qqmlxmlhttprequest/tst_qqmlxmlhttprequest.cpp b/tests/auto/qml/qqmlxmlhttprequest/tst_qqmlxmlhttprequest.cpp index f8d74c3..7a65308 100644 --- a/tests/auto/qml/qqmlxmlhttprequest/tst_qqmlxmlhttprequest.cpp +++ b/tests/auto/qml/qqmlxmlhttprequest/tst_qqmlxmlhttprequest.cpp @@ -937,8 +937,8 @@ void tst_qqmlxmlhttprequest::responseText_data() QTest::newRow("OK") << testFileUrl("status.200.reply") << testFileUrl("testdocument.html") << "QML Rocks!\n"; QTest::newRow("empty body") << testFileUrl("status.200.reply") << QUrl() << ""; - QTest::newRow("Not Found") << testFileUrl("status.404.reply") << testFileUrl("testdocument.html") << ""; - QTest::newRow("Bad Request") << testFileUrl("status.404.reply") << testFileUrl("testdocument.html") << ""; + QTest::newRow("Not Found") << testFileUrl("status.404.reply") << testFileUrl("testdocument.html") << "QML Rocks!\n"; + QTest::newRow("Bad Request") << testFileUrl("status.400.reply") << testFileUrl("testdocument.html") << "QML Rocks!\n"; } void tst_qqmlxmlhttprequest::nonUtf8() -- 1.7.2.5