代理设置Chromium嵌入式



如何手动将代理设置Ip:Port设置为Chromium Embedded。这将只影响控制,而不是像你为IE设置的那样全局。

感谢

在CEF3中,您可以使用--proxy-server命令行开关。示例值为socks5://127.0.0.1:8888。您可以在CefApp::OnBeforeCommandLineProcessing中以编程方式设置它。在此回调中设置时,名称不应包含--前缀。

使用以前存在的类CefProxyHandler可以获得更大的控制
最新的实现只使用命令行标志(我发现这些标志较差)。您可以在CEF的旧SVN分支上找到以前的代码。

我已经用这种方式实现了(以下是Windows上的C++说明-我不会粘贴太多代码,因为它可以从上面的URL中读取):
-按照其他CEF类示例(如CefApp)实现导出的CefProxyHandler类;类有一个方法,GetProxyForUrl
-在cef_types中。h定义cef_proxy_type_t枚举(直接、命名、PAC)和cef_proxy_info_tstruct(包含类型和字符串列表)
-在cef_types_wrappers.h中,在cef_proxy_info_t上定义CepProxyInfoTraits(遵循其他结构示例),并在PreMainMessageLoopRun中的libcef/browser/browser_main.cc中用CepProxyServiceFactory::CreateProxyConfigService替换ProxyServiceFactory:CreateProxySonfigService;Cef工厂将创建一个CepProxyService,该服务最终创建一个CepProxyConfigService-灵感来自src/net/proxy/proxy_config_service_win.cc实现类cepProxyCnfigServiceWin;主要是

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:public-net::ProxyConfigService(全部为空实现),类CefProxyResolver:public-net::ProxyResolver,例如:

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,可能更低)在浏览器进程处理程序和应用程序之间有更多的分隔。这取决于您,所需要的只是通过可用的全局上下文getter访问代理处理程序提供程序(通常是CefApp),并从应用程序直接获取代理处理程序并调用GetProxyHandler,或者浏览器进程处理程序(如果您计划在那里添加代理getter)、CefClient等。之后,您可以很容易地让GetProxyHandler查询您的应用程序以获取代理设置(发布任务,如果您在Windows上,则使用WaitForSingleObject的PostMessage等),因此可以通过GetProxyForUrl检索代理服务器/端口/用户/通行证。

这样做虽然不容易,但会为您提供完全的控制-如果您愿意,您甚至可以处理每个url的代理,在同一浏览器/渲染器/插件内动态更改,而无需重新启动(请记住,挂起的下载甚至插件流可能会受到影响)。

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.

相关内容

  • 没有找到相关文章

最新更新