如何手动将代理设置 Ip:Port 设置为 Chromium Embedded。如果您为 IE 设置它,那只会影响控件而不是全局控件。
谢谢
在 CEF 3 中,您可以使用--proxy-server
命令行开关。一个示例值是socks5://127.0.0.1:8888
。您可以在CefApp::OnBeforeCommandLineProcessing
. 在此回调名称中设置时不应包含--
前缀。
uses ceflib;
procedure AppCefGetProxyForUrl(const url: ustring; var proxyType: TCefProxyType;
var proxyList: ustring );
begin
proxyType := CEF_PROXY_TYPE_NAMED;
proxyList := 'ip:port';
end;
initialization
CefGetProxyForUrl := @AppCefGetProxyForUrl;
end.
使用先前存在的类CefProxyHandler可以获得更大的控制。
最新的实现只使用命令行标志(我发现这些不太好)。您可以在CEF 的旧 SVN 分支上找到以前的代码。
我已经以这种方式实现了(以下是 Windows 上的 C++ 说明——我不会粘贴太多代码,因为它可以从上面的 URL 中读取):
——在其他 CEF 类示例(例如 CefApp)之后
实现导出的CefProxyHandler类;类有一个方法,GetProxyForUrl
- 在 cef_types.h 中定义cef_proxy_type_t枚举(直接,命名,PAC)和cef_proxy_info_t结构(包含类型和字符串列表)
- 在 cef_types_wrappers.h 中定义CefProxyInfoTraits over cef_proxy_info_t(遵循其他结构示例) , 和类CefProxyInfo : public CefStructBase
- 在 libcef/browser/browser_main.cc 中PreMainMessageLoopRun将ProxyServiceFactory::CreateProxyConfigService替换为CefProxyServiceFactory::CreateProxyConfigService;Cef 工厂将创建一个CefProxyService,最终创建一个CefProxyConfigService
- 灵感来自src/net/proxy/proxy_config_service_win.cc实现类CefProxyConfigServiceWin;主要的是
static void GetCurrentProxyConfig(net::ProxyConfig* config) {
CefRefPtr<CefApp> app = CefContentClient::Get()->application();
if(app.get()) {
CefRefPtr<CefProxyHandler> handler = app->GetProxyHandler();
if(handler.get()) {
// ... use handler->GetProxyForUrl etc.
}
}
WINHTTP_CURRENT_USER_IE_PROXY_CONFIG ie_config = {0};
if (!WinHttpGetIEProxyConfigForCurrentUser(&ie_config)) {
LOG(ERROR) << "WinHttpGetIEProxyConfigForCurrentUser failed: " <<
GetLastError();
*config = net::ProxyConfig::CreateDirect();
config->set_source(net::PROXY_CONFIG_SOURCE_SYSTEM_FAILED);
return;
}
SetFromIEConfig(config, ie_config);
FreeIEConfig(&ie_config);
}
- 重新添加旧版本
中存在的 net::ProxyConfigServiceWin::set_force_auto_detect - 在 libcef/browser/url_request_context_getter.cc 中(从旧 CEF 分支中获得灵感)实现ProxyConfigServiceNull:公共 net::ProxyConfigService(全为空实现),类 CefProxyResolver: public net::ProxyResolver(这里是GetProxyForUrl所在的位置),并在CefURLRequestContextGetter::GetURLRequestContext()检查自定义代理处理程序,例如:
bool fCustomProxyHandler = false;
CefRefPtr<CefApp> app = CefContentClient::Get()->application();
if(app.get()) {
CefRefPtr<CefProxyHandler> handler = app->GetProxyHandler();
if(handler.get()) {
#if defined(OS_WIN)
// Force auto-detect so the client resolver will be called.
net::ProxyConfigServiceWin::set_force_auto_detect(true);
#endif
// The client will provide proxy resolution.
storage_->set_proxy_service(
new net::ProxyService(
net::ProxyService::CreateSystemProxyConfigService(io_loop_->message_loop_proxy(), file_loop_),
new CefProxyResolver(handler),
NULL
)
);
fCustomProxyHandler = true;
}
}
if(!fCustomProxyHandler) {
// custom proxy resolution not provided
scoped_ptr<net::ProxyService> system_proxy_service;
system_proxy_service.reset(
ProxyServiceFactory::CreateProxyService(
NULL,
url_request_context_.get(),
url_request_context_->network_delegate(),
CefContentBrowserClient::Get()->proxy_config_service().release(),
command_line));
storage_->set_proxy_service(system_proxy_service.release());
}
关键是提供 storage_->set_proxy_service 您自己的实现。最后要做的是提供 CefProxyHandler(以前的版本可以添加到 CefApp 或 CefClient 中,与生命周期处理程序、请求处理程序等类似)。上面的例子是从 CefApp 提供的。
最新的分支(2357,可能更低)在浏览器进程处理程序和应用程序之间分离得更多。这取决于您,所需要的只是通过可用的全局上下文获取器访问代理处理程序提供程序(通常是 CefApp),并从应用程序直接获取代理处理程序并调用 GetProxyHandler 或浏览器进程处理程序(如果您打算在那里添加代理获取器), CefClient 等。之后,您可以轻松地让 GetProxyHandler 查询您的应用程序的代理设置(发布任务,如果您在 Windows 上,则使用 WaitForSingleObject 发布消息等),以便通过 GetProxyForUrl 检索代理服务器/端口/用户/密码。
这样做虽然不容易,但会为您提供完全的控制权 - 如果您愿意,您甚至可以处理每个 url的代理,在同一个浏览器/渲染器/插件中动态更改,而无需重新启动(请记住诸如挂起的下载甚至插件流式传输可能会受到影响)。