GOOGLE ADS

lunes, 2 de mayo de 2022

Nuevos encabezados Sec-* en WebView2

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-Sitese sobrescriben después, otros Sec-Fetch-Modese 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-chesta 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

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...