Je vérifie la compatibilité de mon code avec les codes d'état HTTP 3xx (redirections).QNetworkAccessManager ne gère pas le code d'état HTTP 308
Je suis intéressé par les codes 301, 302, 303, 307 et 308.
Tous ceux qui travaillent très bien avec mon code, à l'exception 308.
Mon testcase client est Qt/C++ base, et mon serveur de test est basé sur python. Je posterai le code des deux.
client.cpp:
#include <QGuiApplication>
#include <QObject>
#include <QByteArray>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
int main(int argc, char *argv[]) {
QGuiApplication app(argc, argv);
QNetworkAccessManager webCtrl;
QObject::connect(&webCtrl, &QNetworkAccessManager::finished, [&](QNetworkReply* reply) {
if(reply->error() != QNetworkReply::NoError) {
qDebug() << "got error";
}
QByteArray data = reply->readAll();
qDebug() << "got" << data.length() << "bytes";
});
QNetworkRequest request(QUrl("http://localhost:8080/not_working"));
request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy);
webCtrl.get(request);
return app.exec();
}
test_server.py:
#!/usr/bin/env python
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import os
class MyHTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
if self.path == '/working':
self.send_response(200)
self.send_header('Content-type','text-html')
self.end_headers()
self.wfile.write("hey")
elif self.path == '/not_working':
self.send_response(308)
self.send_header('Location','/working')
self.end_headers()
server_address = ('127.0.0.1', 8080)
httpd = HTTPServer(server_address, MyHTTPRequestHandler)
httpd.serve_forever()
je lance le serveur, alors qu'il est en cours d'exécution, je lance le client et je reçois got 0 bytes
dans le console. Si je change la réponse de 308 à, disons, 301, cela fonctionne bien (imprime got 3 bytes
).
Une idée pourquoi?
Remarque: La redirection fonctionne correctement dans Chrome, mon code serveur est probablement correct.
Remarque: Il semble qu'il soit documenté comme non pris en charge. De the docs:
Ce signal est émis si le QNetworkRequest :: FollowRedirectsAttribute a été fixé dans la requête et le serveur a répondu avec un statut 3xx (spécifiquement 301, 302, 303, 305 ou 307 code d'état) avec url valide dans l'en-tête de l'emplacement, indiquant une redirection HTTP.
(Souligné par l'auteur)
Je voudrais encore savoir pourquoi , cependant.
Probablement parce que 308 est expérimental. Je ne crois pas que ce soit dans une norme officielle pour le moment. – jszakmeister