Al trabajar con MS WebView2 en C++, puedo ver varios encabezados "Sec-*" si visito https://manytools.org/http-html-text/http-request-headers/
Ejemplo de algunos:
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"
Estos nuevos encabezados se mencionan en https://wicg.github.io/ua-client-hints/
¿Hay alguna forma de acceder/editar esos encabezados, preferiblemente en C++?
Es posible deshabilitar los encabezados Sec-Ch con una opción de línea de comando:
--disable-features=UserAgentClientHint
y para hacerlo desde C++:
Microsoft::WRL::ComPtr<CoreWebView2EnvironmentOptions> options = Microsoft::WRL::Make<CoreWebView2EnvironmentOptions>();
options->put_AdditionalBrowserArguments(L"--disable-features=UserAgentClientHint");
Sin embargo, quiero poder editar esos valores.
Más búsquedas en Google revelaron esta página que supongo responde a esta publicación:
https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name
Solución del problema
Tiene razón en que los sec-*
encabezados son parte de las listas de "encabezados prohibidos". Pero están prohibidos para el código del cliente como el JS que se ejecuta en el agente de usuario. Pero los agentes de usuario como el navegador pueden establecer esos campos.
Puede cambiar algunos de los sec-*
encabezados dentro de una devolución de llamada agregada a add_WebResourceRequested
. Algunos campos Sec-Fetch-Site
se sobrescriben después, otros Sec-Fetch-Mode
se pueden configurar, pero no se pueden eliminar porque obtendrán un valor predeterminado, si no se configuran después de WebResourceRequestedEvent. Pero puedes cambiar la mayoría de los de sec-ch
esta manera:
NOTA: este código es solo para demostrar el enfoque, le falta un montón de manejo de errores
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);
No hay comentarios.:
Publicar un comentario