/
githubmirror
/
servo
Обзор
Документация
Войти
/
githubmirror
/
servo
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
components/net/request_interceptor.rs
89 строк
4 KB
webbeef
servo: Add `referrer` and `destination` fields to `WebResourceRequest` (#44493)
28 апр 2026, 12:28
Не верифицирован
28 апр 2026, 12:28
0117a8c
Код
Авторство
О чём код?
/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use content_security_policy::Destination; use embedder_traits::{GenericEmbedderProxy, WebResourceRequest, WebResourceResponseMsg}; use log::error; use net_traits::NetworkError; use net_traits::http_status::HttpStatus; use net_traits::request::Request; use net_traits::response::{Response, ResponseBody}; use crate::embedder::NetToEmbedderMsg; use crate::fetch::methods::FetchContext; #[derive(Clone)] pub struct RequestInterceptor { embedder_proxy: GenericEmbedderProxy<NetToEmbedderMsg>, } impl RequestInterceptor { pub fn new(embedder_proxy: GenericEmbedderProxy<NetToEmbedderMsg>) -> RequestInterceptor { RequestInterceptor { embedder_proxy } } pub async fn intercept_request( &self, request: &mut Request, response: &mut Option<Response>, context: &FetchContext, ) { let (sender, mut receiver) = tokio::sync::mpsc::unbounded_channel(); let is_for_main_frame = matches!(request.destination, Destination::Document); let web_resource_request = WebResourceRequest { method: request.method.clone(), url: request.url().into_url(), headers: request.headers.clone(), destination: request.destination, referrer_url: request.referrer.to_url().map(|url| url.as_url().clone()), is_for_main_frame, is_redirect: request.redirect_count > 0, }; self.embedder_proxy .send(NetToEmbedderMsg::WebResourceRequested( request.target_webview_id, web_resource_request, sender, )); // TODO: use done_chan and run in CoreResourceThreadPool. let mut accumulated_body = Vec::new(); while let Some(message) = receiver.recv().await { match message { WebResourceResponseMsg::Start(webresource_response) => { let timing = context.timing.inner().clone(); let mut response_override = Response::new(webresource_response.url.into(), timing); response_override.headers = webresource_response.headers; response_override.status = HttpStatus::new( webresource_response.status_code, webresource_response.status_message, ); *response = Some(response_override); }, WebResourceResponseMsg::SendBodyData(data) => { accumulated_body.push(data); }, WebResourceResponseMsg::FinishLoad => { if accumulated_body.is_empty() { break; } let Some(response) = response.as_mut() else { error!("Received unexpected FinishLoad message"); break; }; *response.body.lock() = ResponseBody::Done(accumulated_body.into_iter().flatten().collect()); break; }, WebResourceResponseMsg::CancelLoad => { *response = Some(Response::network_error(NetworkError::LoadCancelled)); break; }, WebResourceResponseMsg::DoNotIntercept => break, } } } }