2014-06-11 42 views
6

Voglio intercettare, ispezionare e (se necessario) rifiutare le richieste AJAX basate sull'impronta digitale del certificato SSL. Io uso la funzione QNetworkAccessManager::createRequest(...) per inviare richieste. Tutto funziona correttamente quando utilizzo QWebFrame::load(...). Anche il contenuto che viene caricato all'interno della richiesta (come file .css o .js) emette segnali. Sfortunatamente nessuna richiesta AJAX emette alcun Segnale. So che i segnali sono collegati agli stessi slot (per "normale" e AJAX-Requests) all'interno della funzione MyNetworkAccessManager::createRequest(...).Come intercettare le richieste AJAX in QtWebKit?

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())); 

Perché le richieste AJAX sono così diverse? Dove posso accedervi?

+0

Quindi, stai provando a visualizzare una pagina, che contiene qualche codice javascript che richiede altre informazioni usando AJAX? È quello che stai facendo? –

+0

no, voglio accedere al certificato SSL del server, per la corrispondenza delle impronte digitali SSL – Senad

risposta

2

Da quello che posso dire, le richieste AJAX emettono il segnale finito su QNetworkAccessManager. È necessario connettersi all'istanza di QNetworkAccessManager sull'istanza QWebPage:

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'); });"); 

Quindi è possibile monitorare le repliche in slot replyFinished in questo modo:

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; 
} 

ho notato che la promessa fatto di jQuery AJAX non lo fa sembra che si esegua quando fai qualcosa con QNetworkReply, ma puoi vedere che la richiesta termina effettivamente nella console di debug.

Vedere il mio repository GitHub per provare il codice di cui sopra: https://github.com/pcmantinker/QtWebkitAJAX

Per quanto riguarda bloccando le connessioni basate su certificati SSL, dovreste sottoclasse QNetworkAccessManager e sovrascrivere QNetworkAccessManager :: createRequest. Qualcosa del genere potrebbe funzionare:

QNetworkReply *CustomQNetworkAccessManager::createRequest(Operation op, const QNetworkRequest& request, QIODevice* outgoingData) 
{ 
    QNetworkRequest req(request); 
    QNetworkReply *reply = QNetworkAccessManager::createRequest(op, req, outgoingData); 
    QSslConfiguration *sslConfig = reply->sslConfiguration(); 
    QList<QSslCertificate> sslCaCerts = sslConfig->caCertificates(); 
    // do something with sslCaCerts 

    return reply; 
}