是否可以将 Qt WebEngine 中的代理 URL 列入白名单

Posted

技术标签:

【中文标题】是否可以将 Qt WebEngine 中的代理 URL 列入白名单【英文标题】:Is it possible to whitelist an URL for proxy in Qt WebEngine 【发布时间】:2020-03-04 16:27:16 【问题描述】:

简单的问题:是否可以将 Qt WebEngine 中的代理 URL(或域)列入白名单?

当使用其他依赖 Qt Network 的 Qt 模块时,可以使用 QNetworkProxyFactory::queryProxy() 设置每个 URL 代理,如下所示:

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 网络代理复制到铬网络堆栈。 Qt WebEngine 不会为每个请求调用QNetworkProxyFactory::queryProxy()

是否有任何其他方法可以实现在某些 URL 上没有代理而对所有其他 URL 没有代理的相同结果?

【问题讨论】:

【参考方案1】:

在 QtWebEngine 中,您必须使用 QWebEngineUrlRequestInterceptor,正如我在 this answer 中显示的那样,在您的情况下是:

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

class WebEngineUrlRequestInterceptor: public QWebEngineUrlRequestInterceptor
    Q_OBJECT
    Q_DISABLE_COPY(WebEngineUrlRequestInterceptor)
public:
    explicit WebEngineUrlRequestInterceptor(QObject* p = nullptr)
    : QWebEngineUrlRequestInterceptor(p)
    
    
    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();

【讨论】:

info.block() 将阻止呼叫。我希望拨打电话但没有代理。我相信拦截器可用于将调用重定向到另一个方案,然后我需要使用方案处理程序使用我自己的 QNetworkAccesManager 进行调用,但它看起来更像是一个 hack,而不是一个干净的解决方案。

以上是关于是否可以将 Qt WebEngine 中的代理 URL 列入白名单的主要内容,如果未能解决你的问题,请参考以下文章

Qt WebEngine 失败

Qt 5.5使用WebEngine替代qtwebkit后,是否就可以不使用ICU

如何单击 Qt WebEngine 中的按钮?

项目错误:QT 中的未知模块:webengine

Yocto SDK,QtWebEngine:QT 中的未知模块:webengine

Qt WebEngine:有没有办法模拟移动浏览器?