Skip to main content

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