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::sync::Arc;
6
7use devtools_traits::NetworkEvent;
8use serde::Serialize;
9
10use crate::actor::{ActorEncode, ActorRegistry};
11use crate::actors::network_event::NetworkEventActor;
12use crate::actors::watcher::WatcherActor;
13use crate::protocol::DevtoolsConnection;
14use crate::resource::{ResourceArrayType, ResourceAvailable};
15
16#[derive(Clone, Serialize)]
17#[serde(rename_all = "camelCase")]
18pub(crate) struct Cause {
19    #[serde(rename = "type")]
20    pub type_: String,
21    pub loading_document_uri: Option<String>,
22}
23
24pub(crate) fn handle_network_event(
25    registry: Arc<ActorRegistry>,
26    network_event_name: String,
27    mut connections: Vec<DevtoolsConnection>,
28    network_event: NetworkEvent,
29) {
30    let network_event_actor = registry.find::<NetworkEventActor>(&network_event_name);
31    let watcher_actor = registry.find::<WatcherActor>(&network_event_actor.watcher_name);
32
33    match network_event {
34        NetworkEvent::HttpRequest(httprequest) => {
35            network_event_actor.add_request(httprequest);
36            let msg = network_event_actor.encode(&registry);
37            let resource = network_event_actor.resource_updates(&registry);
38
39            for stream in &mut connections {
40                watcher_actor.resource_array(
41                    msg.clone(),
42                    "network-event".to_string(),
43                    ResourceArrayType::Available,
44                    stream,
45                );
46
47                // Also push initial resource update (request headers, cookies)
48                watcher_actor.resource_array(
49                    resource.clone(),
50                    "network-event".to_string(),
51                    ResourceArrayType::Updated,
52                    stream,
53                );
54            }
55        },
56
57        NetworkEvent::HttpRequestUpdate(httprequest) => {
58            network_event_actor.add_request(httprequest);
59            let resource = network_event_actor.resource_updates(&registry);
60
61            for stream in &mut connections {
62                watcher_actor.resource_array(
63                    resource.clone(),
64                    "network-event".to_string(),
65                    ResourceArrayType::Updated,
66                    stream,
67                );
68            }
69        },
70        NetworkEvent::HttpResponse(httpresponse) => {
71            network_event_actor.add_response(httpresponse);
72            let resource = network_event_actor.resource_updates(&registry);
73
74            for stream in &mut connections {
75                watcher_actor.resource_array(
76                    resource.clone(),
77                    "network-event".to_string(),
78                    ResourceArrayType::Updated,
79                    stream,
80                );
81            }
82        },
83        NetworkEvent::SecurityInfo(update) => {
84            network_event_actor.add_security_info(update.security_info);
85            let resource = network_event_actor.resource_updates(&registry);
86
87            for stream in &mut connections {
88                watcher_actor.resource_array(
89                    resource.clone(),
90                    "network-event".to_string(),
91                    ResourceArrayType::Updated,
92                    stream,
93                );
94            }
95        },
96    }
97}