Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-63142

Following redirects changes HTTP verb to GET

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: P3: Somewhat important P3: Somewhat important
    • 5.9.3
    • 5.9.1
    • Network
    • None
    • c4cf90b1f739c47383672de3d66b1d9d5427f5db, 18f0a45964e62bf3db7b657847902a356fd31f51

      When FollowRedirectsAttribute is set, the redirected request will almost always be changed to the "GET" HTTP verb. This is correct for some response codes (303, in practice 302) but is incorrect for at least 307.

      From looking at the code, it looks like only the "HEAD" verb is preserved for all redirection codes.

      Here's test code:

          QCoreApplication a(argc, argv);
      
          int redirectCode = 307;
          QByteArray receivedMethod;
          QTcpServer server;
          server.listen(QHostAddress::LocalHost);
          qDebug() << "Listening at" << server.serverPort();
          QObject::connect(&server, &QTcpServer::newConnection, &a, [&] {
              while (QTcpSocket *socket = server.nextPendingConnection()) {
                  QObject::connect(socket, &QTcpSocket::disconnected, socket, &QTcpSocket::deleteLater);
                  auto buffer = new QByteArray;
                  QObject::connect(socket, &QIODevice::readyRead, &a, [&, socket, buffer] {
                      buffer->append(socket->readAll());
                      if (!buffer->endsWith("\r\n"))
                          return;
                      auto tokens = buffer->split(' ');
                      qDebug() << "SERVER: " << tokens[0] << tokens[1];
      
                      QTextStream stream(socket);
                      if (tokens[1] == "/redirectme") {
                          stream << QString("HTTP/1.0 %1 Redirectme\r\n").arg(redirectCode);
                          stream << QString("Location: http://localhost:%1/target\r\n").arg(server.serverPort());
                      } else {
                          stream << "HTTP/1.0 200 Ok\r\n";
                          receivedMethod = tokens[0];
                      }
                      stream << "\r\n";
                      stream.flush();
                      socket->flush();
                      socket->close();
                      socket->deleteLater();
                  });
              }
          });
      
          QNetworkAccessManager nam;
      
          for (int code: {301, 302, 303, 307, 308}) {
              qDebug() << "\nTesting redirect code" << code;
              redirectCode = code;
      
              QNetworkRequest req;
              req.setUrl(QString("http://localhost:%1/redirectme").arg(server.serverPort()));
              req.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
              auto reply = nam.sendCustomRequest(req, "PROPFIND");
              qDebug() << "CLIENT sends a request, server will redirect";
      
              QEventLoop loop;
              QObject::connect(reply, &QNetworkReply::finished, &a, [&]{
                  qDebug() << "CLIENT finished. The redirected request method was" << receivedMethod;
                  loop.quit();
              });
              loop.exec();
          }
      

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

            manordheim Mårten Nordheim
            ckamm Christian Kamm
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved:

                There are no open Gerrit changes