c++ - WebView2 中的新 Sec-* header

标签 c++ webview2

在 C++ 中使用 MS WebView2,如果访问 https://manytools.org/http-html-text/http-request-headers/,我可以看到许多“Sec-*” header

一些示例:

Sec-Fetch-Dest document
Sec-Fetch-User ?1
Sec-Fetch-Mode navigate
Sec-Fetch-Site none
Sec-Ch-Ua-Mobile ?0
Sec-Ch-Ua "Not A;Brand";v="99", "Chromium";v="100", "Microsoft Edge";v="100", "Microsoft Edge WebView2";v="100"

https://wicg.github.io/ua-client-hints/ 中提到了这些新 header

有什么方法可以访问/编辑这些 header ,最好是用 C++ 吗?

可以使用命令行选项禁用 Sec-Ch header :

--disable-features=UserAgentClientHint

并从 C++ 中执行此操作:

Microsoft::WRL::ComPtr<CoreWebView2EnvironmentOptions> options = Microsoft::WRL::Make<CoreWebView2EnvironmentOptions>();
options->put_AdditionalBrowserArguments(L"--disable-features=UserAgentClientHint");

但是,我希望能够编辑这些值。

进一步的谷歌搜索显示了这个页面,我想它回答了这篇文章: https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name

最佳答案

您是正确的,sec-* header 是“禁止 header ”列表的一部分。但对于客户端代码(例如在用户代理上运行的 JS),它们是被禁止的。但像浏览器这样的用户代理可以设置这些字段。

您可以更改 sec-* 中的一些内容回调内的 header 添加到 add_WebResourceRequested 。有些字段如 Sec-Fetch-Site之后被覆盖,其他如 Sec-Fetch-Mode可以设置,但不能删除,因为如果在 WebResourceRequestedEvent 之后未设置,它们将获得默认值。但您可以更改大部分 sec-ch像这样的:

注意:此代码仅用于演示该方法,它缺少一堆错误处理

EventRegistrationToken webResourceRequestedToken;
webviewWindow->AddWebResourceRequestedFilter(L"*", COREWEBVIEW2_WEB_RESOURCE_CONTEXT_ALL);
webviewWindow->add_WebResourceRequested(
  Callback<ICoreWebView2WebResourceRequestedEventHandler>([](ICoreWebView2* sender,
                                                             ICoreWebView2WebResourceRequestedEventArgs* args) {
    COREWEBVIEW2_WEB_RESOURCE_CONTEXT resourceContext;
    args->get_ResourceContext(&resourceContext);
    ICoreWebView2WebResourceRequest* req = nullptr;
    ICoreWebView2HttpRequestHeaders* headers = nullptr;
    ICoreWebView2HttpHeadersCollectionIterator* iter = nullptr;
    args->get_Request(&req);
    req->get_Headers(&headers);
    headers->GetIterator(&iter);
    BOOL hasCurrent = FALSE;
    iter->get_HasCurrentHeader(&hasCurrent);
    std::vector<std::wstring> headersToDelete;
    std::wstring secChPrefix = L"sec-ch";
    while (hasCurrent) {
      LPWSTR name = nullptr, value = nullptr;
      iter->GetCurrentHeader(&name, &value);
      if (secChPrefix.compare(0, secChPrefix.size(), name, secChPrefix.size()) == 0) {
        headersToDelete.push_back(name);
      }
      iter->MoveNext(&hasCurrent);
    }
    for (auto header : headersToDelete) {
      headers->RemoveHeader(header.c_str());
    }
    // Setting "Sec-Fetch-Site" will have no effect, will get overwritten afterwards
    headers->SetHeader(L"Sec-Fetch-Site", L"same-origin");
    // This will work, but removing this key will just make it take the default value
    headers->SetHeader(L"Sec-Fetch-Mode", L"same-origin");

    return S_OK;
  }).Get(),
  &webResourceRequestedToken);

关于c++ - WebView2 中的新 Sec-* header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71893860/

相关文章:

c++ - 如果在父窗口调整大小时打开子窗口卡住

webview2 - 使用 WebView2 将文件上传到网页

c++ - 是否可以使用默认泛型参数在 C++ 中定义 lambda?

c++ - opencv:来自矩形的 Mat 构造函数

c++ - <algorithm> 是否包含 <cmath>?

c++ - 在 BMP 像素 RGB 阵列上应用模糊

c# - 如何检测 webview2 中的鼠标点击(c#/vb.net)

c# - webview2 事件通知应用程序加载所有静态文件

WebView2 文件下载通知框

c++ - 管理/删除工作 WebView2 的 cookie