2013-02-11 2 views
5

У меня есть веб-просмотрщик, и я хочу, чтобы он имел доступ только к нашим веб-приложениям, для этого я разместил заголовок php, который я ищу в своем приложении Qt. Это работает отлично, но с одним исключением, и с 301 постоянными кодами состояния. Современные браузеры перенаправляют вас автоматически, но вводят «/» в конце HTTP-запроса.QNetworkReply и 301 redirect

Когда URL-адрес нашего веб-приложения вводится, в настоящее время требуется, чтобы конечная косая черта позволяла обнаруживать заголовки, но я хочу, чтобы она также попадала в этот заголовок, даже если они не помещают конечную косую черту.

Вот мой текущий метод, чтобы получить заголовок:

QNetworkAccessManager *manager = new QNetworkAccessManager(this); 
    QNetworkRequest request; 
    request.setUrl(url); 
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onFinished(QNetworkReply*))); 

    request.setRawHeader("User-Agent", "CytoViewer 1.0"); 
    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/CytoViewer"); 
    QNetworkReply *reply = manager->get(request); 
    reply->ignoreSslErrors(); 
    QEventLoop loop; 

    connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); 
    loop.exec(); 
    qDebug() << "QLoop reply all: " << reply->readAll(); 
    qDebug() << "QLoop: " << reply->rawHeader("Cyto-Study-Manager"); 
    if(reply->rawHeader("OurWebApp") == "1"){ 
     //Header exists?(QEventLoop finish) Set arg[1]"url 'Found prouct: product header'" 
     product = reply->rawHeader("Product"); 
     return true; 
    } else { 
     //Header doen't exist? Graceful error - not a valid PI product 
     return false; 
    } 

Чтобы решить проблему удара 301 первых Посылают два сетевых запросов, первый один хитов URL вошел и проверить на 301, если есть код статуса 301, который он получает, предлагаемый URL-код через метод reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); и возвращает этот URL-адрес еще, если код статуса отсутствует, он просто возвращает предыдущий URL-адрес пользователя, а затем отправляет другой сетевой запрос для проверки заголовков.

Первый запрос я посылаю, чтобы проверить код состояния:

QUrl MainWindow::networkRequest(QUrl checkUrl){ 
    qDebug() << "checkURL: " << checkUrl; 
    // 
    QNetworkAccessManager *manager = new QNetworkAccessManager(this); 
    QNetworkRequest request; 
    request.setUrl(checkUrl); 
    request.setRawHeader("User-Agent", "CytoViewer 1.0"); 
    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/CytoViewer"); 
    QNetworkReply *reply = manager->get(request); 
    reply->ignoreSslErrors(); 
    QEventLoop checkLoop; 
    connect(reply, SIGNAL(finished()), &checkLoop, SLOT(quit())); 
    checkLoop.exec(); 
    //Check status code 
    if (reply->error() == QNetworkReply::NoError) { 
     int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); 
     if(statusCode == 301) { 
      QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); 
      return redirectUrl; 
     }else { 
      return checkUrl; 
     } 

    } 
} 

Короче говоря, я посылаю две сетевые запросы, 1) Для проверки 301 2) Для проверки нашего заголовка приложения.

Есть ли все-таки сделать это одним запросом? Не хватает ли метода, который будет выполнять это перенаправление автоматически?

С уважением

Натан

ответ

9

Видимо нет.

Там есть официальная запись HOWTO на http://developer.nokia.com/community/wiki/Handling_an_HTTP_redirect_with_QNetworkAccessManager (мертвой ссылке, к сожалению)

Извлечение из указанной выше ссылке:

void QNAMRedirect::replyFinished(QNetworkReply* reply) { 
    /* 
    * Reply is finished! 
    * We'll ask for the reply about the Redirection attribute 
    * http://doc.trolltech.com/qnetworkrequest.html#Attribute-enum 
    */ 
    QVariant possibleRedirectUrl = 
      reply->attribute(QNetworkRequest::RedirectionTargetAttribute); 

    /* We'll deduct if the redirection is valid in the redirectUrl function */ 
    _urlRedirectedTo = this->redirectUrl(possibleRedirectUrl.toUrl(), 
             _urlRedirectedTo); 

    /* If the URL is not empty, we're being redirected. */ 
    if(!_urlRedirectedTo.isEmpty()) { 
     QString text = QString("QNAMRedirect::replyFinished: Redirected to ") 
           .append(_urlRedirectedTo.toString()); 
     this->_textContainer->setText(text); 

     /* We'll do another request to the redirection url. */ 
     this->_qnam->get(QNetworkRequest(_urlRedirectedTo)); 
    } 
    else { 
     /* 
     * We weren't redirected anymore 
     * so we arrived to the final destination... 
     */ 
     QString text = QString("QNAMRedirect::replyFinished: Arrived to ") 
           .append(reply->url().toString()); 
     this->_textContainer->setText(text); 
     /* ...so this can be cleared. */ 
     _urlRedirectedTo.clear(); 
    } 
    /* Clean up. */ 
    reply->deleteLater(); 
} 

QUrl QNAMRedirect::redirectUrl(const QUrl& possibleRedirectUrl, 
           const QUrl& oldRedirectUrl) const { 
    QUrl redirectUrl; 
    /* 
    * Check if the URL is empty and 
    * that we aren't being fooled into a infinite redirect loop. 
    * We could also keep track of how many redirects we have been to 
    * and set a limit to it, but we'll leave that to you. 
    */ 
    if(!possibleRedirectUrl.isEmpty() && 
     possibleRedirectUrl != oldRedirectUrl) { 
     redirectUrl = possibleRedirectUrl; 
    } 
    return redirectUrl; 
} 
+0

Думал, что, возможно, не было способа, но не был уверен, что я что-то упустил, спасибо, что очистил это. @Kfunk :) – Kal

+1

ссылка на официальный HOWTO сломана :( –

+0

@ DavidSánchez: Обновлен комментарий чтобы отразить это. К сожалению, содержание вики не было перенесено до его удаления :( – kfunk

14

Это немного старый, но поддержка автоматического перенаправления просто добавляется в Qt 5.6. Проверьте это QNetworkRequest::FollowRedirectsAttribute (http://doc.qt.io/qt-5/qnetworkrequest.html).

+1

Что значит «старый» для меня это новый. спасибо, что упомянул об этом, вы сохранили мой **, я обновлю с 5.5 до 5.6 для этого работать. –