aboutsummaryrefslogtreecommitdiffstats
path: root/components/devtools/network_handler.rs
diff options
context:
space:
mode:
authorJerens Lensun <54782057+jerensl@users.noreply.github.com>2025-03-22 22:46:57 +0800
committerGitHub <noreply@github.com>2025-03-22 14:46:57 +0000
commit02375809b0348aeac85c709d9a6cf828d7f22144 (patch)
treec056def97458dfe41ab30f8860fe2fdacd67b297 /components/devtools/network_handler.rs
parentcb5dd3172a04908be3c05420fa404a25ceb63764 (diff)
downloadservo-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.rs164
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());
+ }
+ },
+ }
+}