// Test for refused auth, with sync call (i.e. in thread) void testCallRefusedAuth() { HttpServerThread server(countryResponse(), HttpServerThread::BasicAuth); KDSoapClientInterface client(server.endPoint(), countryMessageNamespace()); KDSoapAuthentication auth; auth.setUser(QLatin1String("kdab")); auth.setPassword(QLatin1String("invalid")); client.setAuthentication(auth); KDSoapMessage reply = client.call(QLatin1String("getEmployeeCountry"), countryMessage()); QVERIFY(reply.isFault()); }
void testCorrectHttpHeader() { HttpServerThread server(countryResponse(), HttpServerThread::Public); KDSoapClientInterface client(server.endPoint(), countryMessageNamespace()); KDSoapAuthentication auth; auth.setUser(QLatin1String("kdab")); auth.setPassword(QLatin1String("unused")); client.setAuthentication(auth); // unused... QNetworkCookieJar myJar; QList<QNetworkCookie> myCookies; myCookies.append(QNetworkCookie("biscuits", "are good")); myJar.setCookiesFromUrl(myCookies, QUrl(server.endPoint())); client.setCookieJar(&myJar); QByteArray expectedRequestXml = expectedCountryRequest(); client.setSoapVersion(KDSoapClientInterface::SOAP1_1); { KDSoapMessage ret = client.call(QLatin1String("getEmployeeCountry"), countryMessage()); // Check what we sent QVERIFY(xmlBufferCompare(server.receivedData(), expectedRequestXml)); QVERIFY(!ret.isFault()); QCOMPARE(server.header("Content-Type").constData(), "text/xml;charset=utf-8"); QCOMPARE(server.header("SoapAction").constData(), "\"http://www.kdab.com/xml/MyWsdl/getEmployeeCountry\""); #if QT_VERSION >= 0x040800 QCOMPARE(server.header("Cookie").constData(), "biscuits=are good"); #elif QT_VERSION >= 0x040700 QCOMPARE(server.header("Cookie").constData(), "biscuits=\"are good\""); #endif QCOMPARE(ret.arguments().child(QLatin1String("employeeCountry")).value().toString(), QString::fromLatin1("France")); } client.setSoapVersion(KDSoapClientInterface::SOAP1_2); { KDSoapMessage ret = client.call(QLatin1String("getEmployeeCountry"), countryMessage()); // Check what we sent QByteArray expectedRequestXml12 = expectedRequestXml; expectedRequestXml12.replace("http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/2003/05/soap-envelope"); expectedRequestXml12.replace("http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/2003/05/soap-encoding"); QVERIFY(xmlBufferCompare(server.receivedData(), expectedRequestXml12)); QVERIFY(!ret.isFault()); QCOMPARE(server.header("Content-Type").constData(), "application/soap+xml;charset=utf-8;action=http://www.kdab.com/xml/MyWsdl/getEmployeeCountry"); QCOMPARE(ret.arguments().child(QLatin1String("employeeCountry")).value().toString(), QString::fromLatin1("France")); #if QT_VERSION >= 0x040800 QCOMPARE(server.header("Cookie").constData(), "biscuits=are good"); #elif QT_VERSION >= 0x040700 QCOMPARE(server.header("Cookie").constData(), "biscuits=\"are good\""); #endif } }
// Test for refused auth, with async call void testAsyncCallRefusedAuth() { HttpServerThread server(countryResponse(), HttpServerThread::BasicAuth); KDSoapClientInterface client(server.endPoint(), countryMessageNamespace()); KDSoapAuthentication auth; auth.setUser(QLatin1String("kdab")); auth.setPassword(QLatin1String("invalid")); client.setAuthentication(auth); KDSoapPendingCall call = client.asyncCall(QLatin1String("getEmployeeCountry"), countryMessage()); QVERIFY(!call.isFinished()); waitForCallFinished(call); #if QT_VERSION >= 0x040600 QVERIFY(xmlBufferCompare(server.receivedData(), expectedCountryRequest())); QVERIFY(call.isFinished()); #endif QVERIFY(call.returnMessage().isFault()); }
// Test for basic auth, with async call void testAsyncCallWithAuth() { HttpServerThread server(countryResponse(), HttpServerThread::BasicAuth); KDSoapClientInterface client(server.endPoint(), countryMessageNamespace()); KDSoapAuthentication auth; auth.setUser(QLatin1String("kdab")); auth.setPassword(QLatin1String("testpass")); client.setAuthentication(auth); KDSoapPendingCall call = client.asyncCall(QLatin1String("getEmployeeCountry"), countryMessage()); QVERIFY(!call.isFinished()); waitForCallFinished(call); #if QT_VERSION >= 0x040600 // Auth is broken in Qt-4.5: QNetworkAccessManager doesn't re-send the body when it re-sends the request // with an authorization header (in response to a 401). Bug in Qt-4.5? QVERIFY(xmlBufferCompare(server.receivedData(), expectedCountryRequest())); QVERIFY(call.isFinished()); #endif QCOMPARE(call.returnMessage().arguments().child(QLatin1String("employeeCountry")).value().toString(), QString::fromLatin1("France")); }
// Using direct call(), check the xml we send, the response parsing. // Then test callNoReply, then various ways to use asyncCall. void testCallNoReply() { HttpServerThread server(countryResponse(), HttpServerThread::Public); // First, make the proper call KDSoapClientInterface client(server.endPoint(), countryMessageNamespace()); KDSoapAuthentication auth; auth.setUser(QLatin1String("kdab")); auth.setPassword(QLatin1String("unused")); client.setAuthentication(auth); // unused... QByteArray expectedRequestXml = expectedCountryRequest(); { KDSoapMessage ret = client.call(QLatin1String("getEmployeeCountry"), countryMessage()); // Check what we sent QVERIFY(xmlBufferCompare(server.receivedData(), expectedRequestXml)); QVERIFY(!ret.isFault()); QCOMPARE(ret.arguments().child(QLatin1String("employeeCountry")).value().toString(), QString::fromLatin1("France")); } // Now make the call again, but async, and don't wait for response. server.resetReceivedBuffers(); //qDebug() << "== now calling callNoReply =="; client.callNoReply(QLatin1String("getEmployeeCountry"), countryMessage()); QTest::qWait(200); QVERIFY(xmlBufferCompare(server.receivedData(), expectedRequestXml)); // What happens if we use asyncCall and discard the result? // The KDSoapPendingCall goes out of scope, and the network request is aborted. // // The whole reason KDSoapPendingCall is a value, is so that people don't forget // to delete it. But of course if they even forget to store it, nothing happens. server.resetReceivedBuffers(); { client.asyncCall(QLatin1String("getEmployeeCountry"), countryMessage()); QTest::qWait(200); } QVERIFY(server.receivedData().isEmpty()); }
bool KDSoapServerAuthInterface::handleHttpAuth(const QByteArray &authValue, const QString& path) { bool authOk = false; KDSoapAuthentication authSettings; if (authValue.isEmpty()) { // Let the implementation decide whether it accepts "no auth". authOk = validateAuthentication(authSettings, path); } else { //qDebug() << "got authValue=" << authValue; // looks like "Basic <base64 of user:pass>" Method method; QString headerVal; parseAuthLine(QString::fromLatin1(authValue.constData(), authValue.size()), &method, &headerVal); //qDebug() << "method=" << method << "headerVal=" << headerVal; switch (method) { case None: // Let the implementation decide whether it accepts "no auth". authOk = validateAuthentication(authSettings, path); break; case Basic: { const QByteArray userPass = QByteArray::fromBase64(headerVal.toLatin1()); const int separatorPos = userPass.indexOf(':'); if (separatorPos == -1) break; authSettings.setUser(QString::fromUtf8(userPass.left(separatorPos).constData())); authSettings.setPassword(QString::fromUtf8(userPass.mid(separatorPos + 1).constData())); authOk = validateAuthentication(authSettings, path); break; } default: qWarning("Unsupported authentication mechanism %s", authValue.constData()); break; } } return authOk; }