diff options
author | Jerens Lensun <54782057+jerensl@users.noreply.github.com> | 2025-03-22 22:46:57 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-22 14:46:57 +0000 |
commit | 02375809b0348aeac85c709d9a6cf828d7f22144 (patch) | |
tree | c056def97458dfe41ab30f8860fe2fdacd67b297 /components/devtools/network_handler.rs | |
parent | cb5dd3172a04908be3c05420fa404a25ceb63764 (diff) | |
download | servo-02375809b0348aeac85c709d9a6cf828d7f22144.tar.gz servo-02375809b0348aeac85c709d9a6cf828d7f22144.zip |
devtools: refactor network related (#36093)
* devtools: extract network related into new file
Signed-off-by: jerensl <54782057+jerensl@users.noreply.github.com>
* devtools: fix missing license and linting error
Signed-off-by: jerensl <54782057+jerensl@users.noreply.github.com>
* fixup! devtools: extract network related into new file
Signed-off-by: jerensl <54782057+jerensl@users.noreply.github.com>
---------
Signed-off-by: jerensl <54782057+jerensl@users.noreply.github.com>
Diffstat (limited to 'components/devtools/network_handler.rs')
-rw-r--r-- | components/devtools/network_handler.rs | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/components/devtools/network_handler.rs b/components/devtools/network_handler.rs new file mode 100644 index 00000000000..a6d21820c2c --- /dev/null +++ b/components/devtools/network_handler.rs @@ -0,0 +1,164 @@ +/* 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 std::net::TcpStream; +use std::sync::{Arc, Mutex}; + +use devtools_traits::NetworkEvent; +use serde::Serialize; + +use crate::actor::ActorRegistry; +use crate::actors::network_event::{EventActor, NetworkEventActor, ResponseStartMsg}; +use crate::protocol::JsonPacketStream; + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +struct NetworkEventMsg { + from: String, + #[serde(rename = "type")] + type_: String, + event_actor: EventActor, +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +struct NetworkEventUpdateMsg { + from: String, + #[serde(rename = "type")] + type_: String, + update_type: String, +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +struct ResponseStartUpdateMsg { + from: String, + #[serde(rename = "type")] + type_: String, + update_type: String, + response: ResponseStartMsg, +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +struct EventTimingsUpdateMsg { + total_time: u64, +} + +#[derive(Serialize)] +struct SecurityInfoUpdateMsg { + state: String, +} + +pub(crate) fn handle_network_event( + actors: Arc<Mutex<ActorRegistry>>, + console_actor_name: String, + netevent_actor_name: String, + mut connections: Vec<TcpStream>, + network_event: NetworkEvent, +) { + let mut actors = actors.lock().unwrap(); + let actor = actors.find_mut::<NetworkEventActor>(&netevent_actor_name); + + match network_event { + NetworkEvent::HttpRequest(httprequest) => { + // Store the request information in the actor + actor.add_request(httprequest); + + // Send a networkEvent message to the client + let msg = NetworkEventMsg { + from: console_actor_name, + type_: "networkEvent".to_owned(), + event_actor: actor.event_actor(), + }; + for stream in &mut connections { + let _ = stream.write_json_packet(&msg); + } + }, + NetworkEvent::HttpResponse(httpresponse) => { + // Store the response information in the actor + actor.add_response(httpresponse); + + let msg = NetworkEventUpdateMsg { + from: netevent_actor_name.clone(), + type_: "networkEventUpdate".to_owned(), + update_type: "requestHeaders".to_owned(), + }; + for stream in &mut connections { + let _ = stream.write_merged_json_packet(&msg, &actor.request_headers()); + } + + let msg = NetworkEventUpdateMsg { + from: netevent_actor_name.clone(), + type_: "networkEventUpdate".to_owned(), + update_type: "requestCookies".to_owned(), + }; + for stream in &mut connections { + let _ = stream.write_merged_json_packet(&msg, &actor.request_cookies()); + } + + // Send a networkEventUpdate (responseStart) to the client + let msg = ResponseStartUpdateMsg { + from: netevent_actor_name.clone(), + type_: "networkEventUpdate".to_owned(), + update_type: "responseStart".to_owned(), + response: actor.response_start(), + }; + + for stream in &mut connections { + let _ = stream.write_json_packet(&msg); + } + let msg = NetworkEventUpdateMsg { + from: netevent_actor_name.clone(), + type_: "networkEventUpdate".to_owned(), + update_type: "eventTimings".to_owned(), + }; + let extra = EventTimingsUpdateMsg { + total_time: actor.total_time().as_millis() as u64, + }; + for stream in &mut connections { + let _ = stream.write_merged_json_packet(&msg, &extra); + } + + let msg = NetworkEventUpdateMsg { + from: netevent_actor_name.clone(), + type_: "networkEventUpdate".to_owned(), + update_type: "securityInfo".to_owned(), + }; + let extra = SecurityInfoUpdateMsg { + state: "insecure".to_owned(), + }; + for stream in &mut connections { + let _ = stream.write_merged_json_packet(&msg, &extra); + } + + let msg = NetworkEventUpdateMsg { + from: netevent_actor_name.clone(), + type_: "networkEventUpdate".to_owned(), + update_type: "responseContent".to_owned(), + }; + for stream in &mut connections { + let _ = stream.write_merged_json_packet(&msg, &actor.response_content()); + } + + let msg = NetworkEventUpdateMsg { + from: netevent_actor_name.clone(), + type_: "networkEventUpdate".to_owned(), + update_type: "responseCookies".to_owned(), + }; + for stream in &mut connections { + let _ = stream.write_merged_json_packet(&msg, &actor.response_cookies()); + } + + let msg = NetworkEventUpdateMsg { + from: netevent_actor_name, + type_: "networkEventUpdate".to_owned(), + update_type: "responseHeaders".to_owned(), + }; + for stream in &mut connections { + let _ = stream.write_merged_json_packet(&msg, &actor.response_headers()); + } + }, + } +} |