是否可以将 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 5.5使用WebEngine替代qtwebkit后,是否就可以不使用ICU