2014-06-11 6 views
6

Ich möchte AJAX-Requests basierend auf dem Fingerabdruck des SSL-Zertifikats abfangen, überprüfen und (falls erforderlich) ablehnen. Ich benutze die QNetworkAccessManager::createRequest(...) Funktion, um Anfragen zu stellen. Alles funktioniert gut, wenn ich QWebFrame::load(...) benutze. Sogar der Inhalt, der in die Anfrage geladen wird (wie .css oder .js Dateien), gibt Signale aus. Leider gibt keine AJAX-Anfrage irgendwelche Signale aus. Ich weiß, dass die Signale innerhalb der MyNetworkAccessManager::createRequest(...) Funktion mit den gleichen Steckplätzen (für "normale" sowie AJAX-Requests) verbunden sind.Wie man AJAX-Anfragen in QtWebKit abfängt?

QNetworkReply *reply = QNetworkAccessManager::createRequest(op, req, outgoingData); 
connect(reply, SIGNAL(readyRead()), this, SLOT(handleStarted())); 
connect(reply, SIGNAL(sslErrors(const QList<QSslError> &)), this, SLOT(handleSslErrors(const QList<QSslError> &))); 
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(handleNetworkError())); 

Warum sind AJAX-Anfragen so unterschiedlich? Wo kann ich auf sie zugreifen?

+0

Also, Sie versuchen, eine Seite anzuzeigen, die einige Javascript-Code enthält, der einige andere Informationen mit AJAX anfordert? Machst du das? –

+0

Nein, ich möchte auf das SSL-Zertifikat des Servers zugreifen, um SSL-Fingerabdrücke zu erhalten – Senad

Antwort

2

Von was ich sagen kann, senden AJAX-Anfragen das fertige Signal auf QNetworkAccessManager. Sie müssen die Instanz von QNetworkAccessManager auf QWebPage Instanz verbinden:

QWebPage *page = ui->webView->page(); 
QNetworkAccessManager *nam = page->networkAccessManager(); 

connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); 

QFile file; 
file.setFileName(":/js/jquery-2.1.1.min.js"); // jQuery is loaded as a resource 
file.open(QIODevice::ReadOnly); 
QString jQuery = file.readAll(); 
file.close(); 

ui->webView->load(QUrl("about:blank")); 
QWebFrame *frame = m_page->mainFrame(); 


frame->evaluateJavaScript(jQuery); // load jQuery 

// check that jQuery is loaded 
frame->evaluateJavaScript("$(document).ready(function() { alert('jQuery loaded!'); });"); 

// do an AJAX GET 
frame->evaluateJavaScript("$.ajax({" 
          "url: 'http://www.json-generator.com/api/json/get/cqkXBAEoQy?indent=2'," 
          "method: 'GET'," 
          "dataType: 'json'" 
         "}).done(function (data) {" 
          "for (var i = 0; i < data.length; i++) {" 
           "alert(data[i].name);" 
          "}" 
         "}).error(function (data) { alert('AJAX error'); });"); 

Dann können Sie Antworten im replyFinished Slot überwachen etwa so:

void MainWindow::replyFinished(QNetworkReply *reply) 
{ 
    QByteArray bytes = reply->readAll(); 
    QString str = QString::fromUtf8(bytes.data(), bytes.size()); 
    QString replyUrl = reply->url().toString(); 
    int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); 
    qDebug() << statusCode; 
    qDebug() << replyUrl; 
    qDebug() << str; 
} 

ich bemerkt habe, dass jQuery AJAX ist erledigt Versprechen nicht scheinen ausgeführt zu werden, wenn Sie irgendetwas mit QNetworkReply machen, aber Sie können sehen, dass die Anfrage tatsächlich in der Debug-Konsole endet.

Meine GitHub-Repository zu versuchen, den obigen Code aus: https://github.com/pcmantinker/QtWebkitAJAX

Soweit Verbindungen basierend auf SSL-Zertifikate blockiert, dann würden Sie QNetworkAccessManager Unterklasse haben und außer Kraft setzen QNetworkAccessManager :: erzeugeAnf. So etwas könnte funktionieren: