注册自定义``backend://`方案在CEF中不起作用

时间:2018-02-15 16:19:18

标签: c++ post url-scheme chromium-embedded postdata

在我的CEF Application

我为方案backend://注册了一个自定义方案处理程序。正如在scheme_handler example中所做的那样 我call in every process(Rendere流程和浏览器流程) AddCustomScheme

void registerCustomSchemes(CefRawPtr<CefSchemeRegistrar> registrar)
    {
        for(auto& scheme : getCustomSchemes()) // "backend" and "client"
        {
            registrar->AddCustomScheme(scheme,
                                       true /* is standart*/,
                                       false /* is local */,
                                       false /* is display_isolated */,
                                       true /* is secure */,
                                       true /* is cors enabled*/,
                                       false /* is_csp_bypassing*/);
        }
    }

client://方案还安装了一个处理程序。

当我不同时使用AddCustomSchemeclient致电backend时。 backend://处理程序工作(以及client处理程序),但我没有收到任何发布请求数据(我发送一些二进制数据)。

当我为AddCustomSchemeclient使用backend方案处理程序时 不再触发。

我应该如何设置自定义处理程序backend以便它接收发布数据请求?我也尝试在AddCustomHandler中使用bool来解决这个问题。

1 个答案:

答案 0 :(得分:2)

您正在尝试跨越XmlHttpRequest(XHR)。您需要配置跨源资源共享(CORS)。看看CefAddCrossOriginWhitelistEntry

WebKit不会将POST数据传递给在非HTTP方案上执行的同步XHR请求。请参阅AreMethodAndURLValidForSend()中的XMLHttpRequest::send() in third_party/WebKit/Source/core/XMLHttpRequest.cpp项检查。

bool XMLHttpRequest::AreMethodAndURLValidForSend() {
  return method_ != HTTPNames::GET && method_ != HTTPNames::HEAD &&
         url_.ProtocolIsInHTTPFamily();
}

如果您需要使用XHR POST请求,则应使用HTTPHTTPS协议注册自定义处理程序。由于这是有意的WebKit设计功能,因此CEF3可能无法更改。