У меня есть веб-просмотрщик, и я хочу, чтобы он имел доступ только к нашим веб-приложениям, для этого я разместил заголовок php, который ищу в своем приложении Qt. Это работает нормально, но с одним исключением, а именно с 301 постоянно перемещенным кодом состояния. Современные браузеры перенаправляют вас автоматически, но в конце http-запроса ставят «/».
Когда вводится 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) для проверки заголовка нашего приложения.
Есть ли способ сделать это в одном запросе? Мне не хватает метода, который будет выполнять это перенаправление автоматически?
С Уважением
Натан