Можно ли добавить в белый список URL для прокси в Qt WebEngine - PullRequest
0 голосов
/ 04 марта 2020

Простой вопрос: возможно ли внести в белый список URL (или домен) для прокси в Qt WebEngine?

При использовании других модулей Qt, которые полагаются на Qt Network, можно установить прокси для каждого URL используя QNetworkProxyFactory::queryProxy() примерно так:

QList<QNetworkProxy> MyProxyFactory::queryProxy(const QNetworkProxyQuery &query)
{
    if (whitelist.contains(query.url)) {
        return { QNetworkProxy::NoProxy };
    }
    ...
}

Однако Qt WebEngine использует не Qt Network, а сетевой стек Chromium. Тем не менее, Qt Web Engine использует прокси уровня приложения Qt, но только в ограниченной степени. Qt WebEngine в основном просто копирует прокси-хост и порт из Qt Network proxy в сетевой стек chromium. Qt WebEngine не вызывает QNetworkProxyFactory::queryProxy() для каждого запроса.

Есть ли другой способ добиться того же результата, если у некоторых URL нет прокси-сервера и прокси-сервера для всех других URL-адресов?

1 Ответ

0 голосов
/ 04 марта 2020

В QtWebEngine вы должны использовать QWebEngineUrlRequestInterceptor, как я показываю в этот ответ , в вашем случае это:

#include <QApplication>
#include <QWebEngineProfile>
#include <QWebEngineUrlRequestInterceptor>
#include <QWebEngineView>

class WebEngineUrlRequestInterceptor: public QWebEngineUrlRequestInterceptor{
public:
    void interceptRequest(QWebEngineUrlRequestInfo &info){
        if(m_whitelist.contains(info.requestUrl()))
            info.block(true);
    }
    QList<QUrl> whitelist() const{
        return m_whitelist;
    }
    void setWhitelist(const QList<QUrl> &whitelist){
        m_whitelist = whitelist;
    }

private:
    QList<QUrl> m_whitelist;
};

int main(int argc, char *argv[]){
    QApplication a(argc, argv);
    WebEngineUrlRequestInterceptor *interceptor = new WebEngineUrlRequestInterceptor;
    interceptor->setWhitelist({QUrl("https://www.google.com/")});
    QWebEngineProfile::defaultProfile()->setRequestInterceptor(interceptor);
    QWebEngineView w;
    w.setUrl(QUrl("https://www.google.com/"));
    w.show();
    return a.exec();
}
...