devtools/
network_handler.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5use std::net::TcpStream;
6use std::sync::{Arc, Mutex};
7
8use devtools_traits::NetworkEvent;
9use serde::Serialize;
10
11use crate::actor::ActorRegistry;
12use crate::actors::network_event::NetworkEventActor;
13use crate::actors::watcher::WatcherActor;
14use crate::resource::{ResourceArrayType, ResourceAvailable};
15
16#[derive(Clone, Serialize)]
17pub struct Cause {
18    #[serde(rename = "type")]
19    pub type_: String,
20    #[serde(rename = "loadingDocumentUri")]
21    pub loading_document_uri: Option<String>,
22}
23
24pub(crate) fn handle_network_event(
25    actors: Arc<Mutex<ActorRegistry>>,
26    netevent_actor_name: String,
27    mut connections: Vec<TcpStream>,
28    network_event: NetworkEvent,
29) {
30    let mut actors = actors.lock().unwrap();
31    let actor = actors.find_mut::<NetworkEventActor>(&netevent_actor_name);
32    let watcher_name = actor.watcher_name.clone();
33    match network_event {
34        NetworkEvent::HttpRequest(httprequest) => {
35            actor.add_request(httprequest);
36
37            let event_actor = actor.event_actor();
38            let resource_updates = actor.resource_updates();
39            let watcher_actor = actors.find::<WatcherActor>(&watcher_name);
40
41            for stream in &mut connections {
42                watcher_actor.resource_array(
43                    event_actor.clone(),
44                    "network-event".to_string(),
45                    ResourceArrayType::Available,
46                    stream,
47                );
48
49                // Also push initial resource update (request headers, cookies)
50                watcher_actor.resource_array(
51                    resource_updates.clone(),
52                    "network-event".to_string(),
53                    ResourceArrayType::Updated,
54                    stream,
55                );
56            }
57        },
58
59        NetworkEvent::HttpRequestUpdate(httprequest) => {
60            actor.add_request(httprequest);
61            let resource = actor.resource_updates();
62            let watcher_actor = actors.find::<WatcherActor>(&watcher_name);
63
64            for stream in &mut connections {
65                watcher_actor.resource_array(
66                    resource.clone(),
67                    "network-event".to_string(),
68                    ResourceArrayType::Updated,
69                    stream,
70                );
71            }
72        },
73        NetworkEvent::HttpResponse(httpresponse) => {
74            // Store the response information in the actor
75            actor.add_response(httpresponse);
76            let resource = actor.resource_updates();
77            let watcher_actor = actors.find::<WatcherActor>(&watcher_name);
78
79            for stream in &mut connections {
80                watcher_actor.resource_array(
81                    resource.clone(),
82                    "network-event".to_string(),
83                    ResourceArrayType::Updated,
84                    stream,
85                );
86            }
87        },
88    }
89}