devtools: Don't panic when sending to a disconnected client fails.

This commit is contained in:
Josh Matthews 2020-08-05 14:55:48 -04:00
parent 611c57bfdf
commit 0b619bf920
16 changed files with 107 additions and 85 deletions

View file

@ -160,7 +160,7 @@ impl Actor for BrowsingContextActor {
} }
} }
} }
stream.write_json_packet(&ReconfigureReply { from: self.name() }); let _ = stream.write_json_packet(&ReconfigureReply { from: self.name() });
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -215,7 +215,7 @@ impl Actor for BrowsingContextActor {
title: self.title.borrow().clone(), title: self.title.borrow().clone(),
}], }],
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },

View file

@ -380,7 +380,7 @@ impl Actor for ConsoleActor {
from: self.name(), from: self.name(),
messages: messages, messages: messages,
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -396,7 +396,7 @@ impl Actor for ConsoleActor {
.collect(), .collect(),
traits: StartedListenersTraits, traits: StartedListenersTraits,
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -413,7 +413,7 @@ impl Actor for ConsoleActor {
.map(|listener| listener.as_str().unwrap().to_owned()) .map(|listener| listener.as_str().unwrap().to_owned())
.collect(), .collect(),
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -425,13 +425,13 @@ impl Actor for ConsoleActor {
matches: vec![], matches: vec![],
matchProp: "".to_owned(), matchProp: "".to_owned(),
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
"evaluateJS" => { "evaluateJS" => {
let msg = self.evaluateJS(&registry, &msg); let msg = self.evaluateJS(&registry, &msg);
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -443,7 +443,9 @@ impl Actor for ConsoleActor {
}; };
// Emit an eager reply so that the client starts listening // Emit an eager reply so that the client starts listening
// for an async event with the resultID // for an async event with the resultID
stream.write_json_packet(&early_reply); if stream.write_json_packet(&early_reply).is_err() {
return Ok(ActorMessageStatus::Processed);
}
if msg.get("eager").and_then(|v| v.as_bool()).unwrap_or(false) { if msg.get("eager").and_then(|v| v.as_bool()).unwrap_or(false) {
// We don't support the side-effect free evaluation that eager evalaution // We don't support the side-effect free evaluation that eager evalaution
@ -464,7 +466,7 @@ impl Actor for ConsoleActor {
helperResult: reply.helperResult, helperResult: reply.helperResult,
}; };
// Send the data from evaluateJS along with a resultID // Send the data from evaluateJS along with a resultID
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -473,7 +475,7 @@ impl Actor for ConsoleActor {
from: self.name(), from: self.name(),
updated: vec![], updated: vec![],
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },

View file

@ -44,7 +44,7 @@ impl Actor for DeviceActor {
platformVersion: "71.0".to_string(), platformVersion: "71.0".to_string(),
}, },
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },

View file

@ -72,13 +72,13 @@ impl Actor for HighlighterActor {
Ok(match msg_type { Ok(match msg_type {
"showBoxModel" => { "showBoxModel" => {
let msg = ShowBoxModelReply { from: self.name() }; let msg = ShowBoxModelReply { from: self.name() };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
"hideBoxModel" => { "hideBoxModel" => {
let msg = HideBoxModelReply { from: self.name() }; let msg = HideBoxModelReply { from: self.name() };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -123,7 +123,7 @@ impl Actor for NodeActor {
)) ))
.unwrap(); .unwrap();
let reply = ModifyAttributeReply { from: self.name() }; let reply = ModifyAttributeReply { from: self.name() };
stream.write_json_packet(&reply); let _ = stream.write_json_packet(&reply);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -293,7 +293,7 @@ impl Actor for WalkerActor {
Ok(match msg_type { Ok(match msg_type {
"querySelector" => { "querySelector" => {
let msg = QuerySelectorReply { from: self.name() }; let msg = QuerySelectorReply { from: self.name() };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -310,13 +310,13 @@ impl Actor for WalkerActor {
from: self.name(), from: self.name(),
node: node, node: node,
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
"clearPseudoClassLocks" => { "clearPseudoClassLocks" => {
let msg = ClearPseudoclassesReply { from: self.name() }; let msg = ClearPseudoclassesReply { from: self.name() };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -343,7 +343,7 @@ impl Actor for WalkerActor {
.collect(), .collect(),
from: self.name(), from: self.name(),
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -481,7 +481,7 @@ impl Actor for PageStyleActor {
sheets: vec![], sheets: vec![],
from: self.name(), from: self.name(),
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -491,7 +491,7 @@ impl Actor for PageStyleActor {
computed: vec![], computed: vec![],
from: self.name(), from: self.name(),
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -576,7 +576,7 @@ impl Actor for PageStyleActor {
}; };
let msg = serde_json::to_string(&msg).unwrap(); let msg = serde_json::to_string(&msg).unwrap();
let msg = serde_json::from_str::<Value>(&msg).unwrap(); let msg = serde_json::from_str::<Value>(&msg).unwrap();
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -625,7 +625,7 @@ impl Actor for InspectorActor {
root: node, root: node,
}, },
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -647,7 +647,7 @@ impl Actor for InspectorActor {
actor: self.pageStyle.borrow().clone().unwrap(), actor: self.pageStyle.borrow().clone().unwrap(),
}, },
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -670,7 +670,7 @@ impl Actor for InspectorActor {
actor: self.highlighter.borrow().clone().unwrap(), actor: self.highlighter.borrow().clone().unwrap(),
}, },
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },

View file

@ -201,7 +201,7 @@ impl Actor for NetworkEventActor {
headerSize: headersSize, headerSize: headersSize,
rawHeaders: rawHeadersString, rawHeaders: rawHeadersString,
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
"getRequestCookies" => { "getRequestCookies" => {
@ -217,7 +217,7 @@ impl Actor for NetworkEventActor {
from: self.name(), from: self.name(),
cookies: cookies, cookies: cookies,
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
"getRequestPostData" => { "getRequestPostData" => {
@ -226,7 +226,7 @@ impl Actor for NetworkEventActor {
postData: self.request.body.clone(), postData: self.request.body.clone(),
postDataDiscarded: false, postDataDiscarded: false,
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
"getResponseHeaders" => { "getResponseHeaders" => {
@ -251,7 +251,7 @@ impl Actor for NetworkEventActor {
headerSize: headersSize, headerSize: headersSize,
rawHeaders: rawHeadersString, rawHeaders: rawHeadersString,
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
} }
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -268,7 +268,7 @@ impl Actor for NetworkEventActor {
from: self.name(), from: self.name(),
cookies: cookies, cookies: cookies,
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
"getResponseContent" => { "getResponseContent" => {
@ -277,7 +277,7 @@ impl Actor for NetworkEventActor {
content: self.response.body.clone(), content: self.response.body.clone(),
contentDiscarded: self.response.body.is_none(), contentDiscarded: self.response.body.is_none(),
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
"getEventTimings" => { "getEventTimings" => {
@ -297,7 +297,7 @@ impl Actor for NetworkEventActor {
timings: timingsObj, timings: timingsObj,
totalTime: total, totalTime: total,
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
"getSecurityInfo" => { "getSecurityInfo" => {
@ -308,7 +308,7 @@ impl Actor for NetworkEventActor {
state: "insecure".to_owned(), state: "insecure".to_owned(),
}, },
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
_ => ActorMessageStatus::Ignored, _ => ActorMessageStatus::Ignored,

View file

@ -72,7 +72,7 @@ impl Actor for PerformanceActor {
}, },
}, },
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
"canCurrentlyRecord" => { "canCurrentlyRecord" => {
@ -83,7 +83,7 @@ impl Actor for PerformanceActor {
errors: vec![], errors: vec![],
}, },
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
_ => ActorMessageStatus::Ignored, _ => ActorMessageStatus::Ignored,

View file

@ -35,7 +35,7 @@ impl Actor for PreferenceActor {
from: self.name(), from: self.name(),
value: false, value: false,
}; };
stream.write_json_packet(&reply); let _ = stream.write_json_packet(&reply);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -44,7 +44,7 @@ impl Actor for PreferenceActor {
from: self.name(), from: self.name(),
value: "".to_owned(), value: "".to_owned(),
}; };
stream.write_json_packet(&reply); let _ = stream.write_json_packet(&reply);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -53,7 +53,7 @@ impl Actor for PreferenceActor {
from: self.name(), from: self.name(),
value: 0, value: 0,
}; };
stream.write_json_packet(&reply); let _ = stream.write_json_packet(&reply);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },

View file

@ -41,7 +41,7 @@ impl Actor for ProcessActor {
from: self.name(), from: self.name(),
workers: vec![], workers: vec![],
}; };
stream.write_json_packet(&reply); let _ = stream.write_json_packet(&reply);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },

View file

@ -131,7 +131,7 @@ impl Actor for RootActor {
from: "root".to_owned(), from: "root".to_owned(),
addons: vec![], addons: vec![],
}; };
stream.write_json_packet(&actor); let _ = stream.write_json_packet(&actor);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -144,7 +144,7 @@ impl Actor for RootActor {
isParent: true, isParent: true,
}], }],
}; };
stream.write_json_packet(&reply); let _ = stream.write_json_packet(&reply);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -157,7 +157,7 @@ impl Actor for RootActor {
isParent: true, isParent: true,
}, },
}; };
stream.write_json_packet(&reply); let _ = stream.write_json_packet(&reply);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -169,7 +169,7 @@ impl Actor for RootActor {
deviceActor: self.device.clone(), deviceActor: self.device.clone(),
preferenceActor: self.preference.clone(), preferenceActor: self.preference.clone(),
}; };
stream.write_json_packet(&actor); let _ = stream.write_json_packet(&actor);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -188,7 +188,7 @@ impl Actor for RootActor {
}) })
.collect(), .collect(),
}; };
stream.write_json_packet(&actor); let _ = stream.write_json_packet(&actor);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -197,7 +197,7 @@ impl Actor for RootActor {
from: self.name(), from: self.name(),
registrations: vec![], registrations: vec![],
}; };
stream.write_json_packet(&reply); let _ = stream.write_json_packet(&reply);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -210,7 +210,7 @@ impl Actor for RootActor {
.map(|name| registry.find::<WorkerActor>(name).encodable()) .map(|name| registry.find::<WorkerActor>(name).encodable())
.collect(), .collect(),
}; };
stream.write_json_packet(&reply); let _ = stream.write_json_packet(&reply);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -220,7 +220,7 @@ impl Actor for RootActor {
from: self.name(), from: self.name(),
tab: tab.encodable(&registry), tab: tab.encodable(&registry),
}; };
stream.write_json_packet(&reply); let _ = stream.write_json_packet(&reply);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -232,7 +232,7 @@ impl Actor for RootActor {
device: DeviceActor::description(), device: DeviceActor::description(),
}, },
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },

View file

@ -34,7 +34,7 @@ impl Actor for StyleSheetsActor {
from: self.name(), from: self.name(),
styleSheets: vec![], styleSheets: vec![],
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },

View file

@ -54,7 +54,7 @@ impl Actor for TabDescriptorActor {
let frame = registry let frame = registry
.find::<BrowsingContextActor>(&self.browsing_context_actor) .find::<BrowsingContextActor>(&self.browsing_context_actor)
.encodable(); .encodable();
stream.write_json_packet(&GetTargetReply { let _ = stream.write_json_packet(&GetTargetReply {
from: self.name(), from: self.name(),
frame, frame,
}); });

View file

@ -100,8 +100,8 @@ impl Actor for ThreadActor {
type_: "attached".to_owned(), type_: "attached".to_owned(),
}, },
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
stream.write_json_packet(&VoidAttachedReply { from: self.name() }); let _ = stream.write_json_packet(&VoidAttachedReply { from: self.name() });
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -110,8 +110,8 @@ impl Actor for ThreadActor {
from: self.name(), from: self.name(),
type_: "resumed".to_owned(), type_: "resumed".to_owned(),
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
stream.write_json_packet(&VoidAttachedReply { from: self.name() }); let _ = stream.write_json_packet(&VoidAttachedReply { from: self.name() });
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -120,12 +120,12 @@ impl Actor for ThreadActor {
from: self.name(), from: self.name(),
type_: "interrupted".to_owned(), type_: "interrupted".to_owned(),
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
"reconfigure" => { "reconfigure" => {
stream.write_json_packet(&ReconfigureReply { from: self.name() }); let _ = stream.write_json_packet(&ReconfigureReply { from: self.name() });
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -134,7 +134,7 @@ impl Actor for ThreadActor {
from: self.name(), from: self.name(),
sources: vec![], sources: vec![],
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },

View file

@ -14,6 +14,7 @@ use msg::constellation_msg::PipelineId;
use serde::{Serialize, Serializer}; use serde::{Serialize, Serializer};
use serde_json::{Map, Value}; use serde_json::{Map, Value};
use std::cell::RefCell; use std::cell::RefCell;
use std::error::Error;
use std::net::TcpStream; use std::net::TcpStream;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::thread; use std::thread;
@ -166,7 +167,9 @@ impl TimelineActor {
while let Ok(Some(marker)) = receiver.try_recv() { while let Ok(Some(marker)) = receiver.try_recv() {
markers.push(emitter.marker(marker)); markers.push(emitter.marker(marker));
} }
emitter.send(markers); if emitter.send(markers).is_err() {
break;
}
thread::sleep(Duration::from_millis(DEFAULT_TIMELINE_DATA_PULL_TIMEOUT)); thread::sleep(Duration::from_millis(DEFAULT_TIMELINE_DATA_PULL_TIMEOUT));
}) })
@ -235,7 +238,7 @@ impl Actor for TimelineActor {
from: self.name(), from: self.name(),
value: HighResolutionStamp::new(registry.start_stamp(), PreciseTime::now()), value: HighResolutionStamp::new(registry.start_stamp(), PreciseTime::now()),
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -245,7 +248,7 @@ impl Actor for TimelineActor {
value: HighResolutionStamp::new(registry.start_stamp(), PreciseTime::now()), value: HighResolutionStamp::new(registry.start_stamp(), PreciseTime::now()),
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
self.script_sender self.script_sender
.send(DropTimelineMarkers( .send(DropTimelineMarkers(
self.pipeline, self.pipeline,
@ -272,7 +275,7 @@ impl Actor for TimelineActor {
value: self.is_recording.lock().unwrap().clone(), value: self.is_recording.lock().unwrap().clone(),
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },
@ -311,7 +314,7 @@ impl Emitter {
} }
} }
fn send(&mut self, markers: Vec<TimelineMarkerReply>) { fn send(&mut self, markers: Vec<TimelineMarkerReply>) -> Result<(), Box<dyn Error>> {
let end_time = PreciseTime::now(); let end_time = PreciseTime::now();
let reply = MarkersEmitterReply { let reply = MarkersEmitterReply {
type_: "markers".to_owned(), type_: "markers".to_owned(),
@ -319,7 +322,7 @@ impl Emitter {
from: self.from.clone(), from: self.from.clone(),
endTime: HighResolutionStamp::new(self.start_stamp, end_time), endTime: HighResolutionStamp::new(self.start_stamp, end_time),
}; };
self.stream.write_json_packet(&reply); self.stream.write_json_packet(&reply)?;
if let Some(ref actor_name) = self.framerate_actor { if let Some(ref actor_name) = self.framerate_actor {
let mut lock = self.registry.lock(); let mut lock = self.registry.lock();
@ -331,7 +334,7 @@ impl Emitter {
delta: HighResolutionStamp::new(self.start_stamp, end_time), delta: HighResolutionStamp::new(self.start_stamp, end_time),
timestamps: framerate_actor.take_pending_ticks(), timestamps: framerate_actor.take_pending_ticks(),
}; };
self.stream.write_json_packet(&framerateReply); self.stream.write_json_packet(&framerateReply)?;
} }
if let Some(ref actor_name) = self.memory_actor { if let Some(ref actor_name) = self.memory_actor {
@ -343,7 +346,9 @@ impl Emitter {
delta: HighResolutionStamp::new(self.start_stamp, end_time), delta: HighResolutionStamp::new(self.start_stamp, end_time),
measurement: memory_actor.measure(), measurement: memory_actor.measure(),
}; };
self.stream.write_json_packet(&memoryReply); self.stream.write_json_packet(&memoryReply)?;
} }
Ok(())
} }
} }

View file

@ -82,7 +82,7 @@ impl Actor for WorkerActor {
threadActor: self.thread.clone(), threadActor: self.thread.clone(),
consoleActor: self.console.clone(), consoleActor: self.console.clone(),
}; };
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed ActorMessageStatus::Processed
}, },

View file

@ -193,7 +193,10 @@ fn run_server(
{ {
let actors = actors.lock().unwrap(); let actors = actors.lock().unwrap();
let msg = actors.find::<RootActor>("root").encodable(); let msg = actors.find::<RootActor>("root").encodable();
stream.write_json_packet(&msg); if let Err(e) = stream.write_json_packet(&msg) {
warn!("Error writing response: {:?}", e);
return;
}
} }
'outer: loop { 'outer: loop {
@ -451,7 +454,7 @@ fn run_server(
eventActor: actor.event_actor(), eventActor: actor.event_actor(),
}; };
for stream in &mut connections { for stream in &mut connections {
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
} }
}, },
NetworkEvent::HttpResponse(httpresponse) => { NetworkEvent::HttpResponse(httpresponse) => {
@ -464,7 +467,7 @@ fn run_server(
updateType: "requestHeaders".to_owned(), updateType: "requestHeaders".to_owned(),
}; };
for stream in &mut connections { for stream in &mut connections {
stream.write_merged_json_packet(&msg, &actor.request_headers()); let _ = stream.write_merged_json_packet(&msg, &actor.request_headers());
} }
let msg = NetworkEventUpdateMsg { let msg = NetworkEventUpdateMsg {
@ -473,7 +476,7 @@ fn run_server(
updateType: "requestCookies".to_owned(), updateType: "requestCookies".to_owned(),
}; };
for stream in &mut connections { for stream in &mut connections {
stream.write_merged_json_packet(&msg, &actor.request_cookies()); let _ = stream.write_merged_json_packet(&msg, &actor.request_cookies());
} }
//Send a networkEventUpdate (responseStart) to the client //Send a networkEventUpdate (responseStart) to the client
@ -485,7 +488,7 @@ fn run_server(
}; };
for stream in &mut connections { for stream in &mut connections {
stream.write_json_packet(&msg); let _ = stream.write_json_packet(&msg);
} }
let msg = NetworkEventUpdateMsg { let msg = NetworkEventUpdateMsg {
from: netevent_actor_name.clone(), from: netevent_actor_name.clone(),
@ -496,7 +499,7 @@ fn run_server(
totalTime: actor.total_time(), totalTime: actor.total_time(),
}; };
for stream in &mut connections { for stream in &mut connections {
stream.write_merged_json_packet(&msg, &extra); let _ = stream.write_merged_json_packet(&msg, &extra);
} }
let msg = NetworkEventUpdateMsg { let msg = NetworkEventUpdateMsg {
@ -508,7 +511,7 @@ fn run_server(
state: "insecure".to_owned(), state: "insecure".to_owned(),
}; };
for stream in &mut connections { for stream in &mut connections {
stream.write_merged_json_packet(&msg, &extra); let _ = stream.write_merged_json_packet(&msg, &extra);
} }
let msg = NetworkEventUpdateMsg { let msg = NetworkEventUpdateMsg {
@ -517,7 +520,7 @@ fn run_server(
updateType: "responseContent".to_owned(), updateType: "responseContent".to_owned(),
}; };
for stream in &mut connections { for stream in &mut connections {
stream.write_merged_json_packet(&msg, &actor.response_content()); let _ = stream.write_merged_json_packet(&msg, &actor.response_content());
} }
let msg = NetworkEventUpdateMsg { let msg = NetworkEventUpdateMsg {
@ -526,7 +529,7 @@ fn run_server(
updateType: "responseCookies".to_owned(), updateType: "responseCookies".to_owned(),
}; };
for stream in &mut connections { for stream in &mut connections {
stream.write_merged_json_packet(&msg, &actor.response_cookies()); let _ = stream.write_merged_json_packet(&msg, &actor.response_cookies());
} }
let msg = NetworkEventUpdateMsg { let msg = NetworkEventUpdateMsg {
@ -535,7 +538,7 @@ fn run_server(
updateType: "responseHeaders".to_owned(), updateType: "responseHeaders".to_owned(),
}; };
for stream in &mut connections { for stream in &mut connections {
stream.write_merged_json_packet(&msg, &actor.response_headers()); let _ = stream.write_merged_json_packet(&msg, &actor.response_headers());
} }
}, },
} }

View file

@ -8,6 +8,7 @@
use serde::Serialize; use serde::Serialize;
use serde_json::{self, Value}; use serde_json::{self, Value};
use std::error::Error;
use std::io::{Read, Write}; use std::io::{Read, Write};
use std::net::TcpStream; use std::net::TcpStream;
@ -26,29 +27,38 @@ pub struct Method {
} }
pub trait JsonPacketStream { pub trait JsonPacketStream {
fn write_json_packet<T: Serialize>(&mut self, obj: &T); fn write_json_packet<T: Serialize>(&mut self, obj: &T) -> Result<(), Box<dyn Error>>;
fn write_merged_json_packet<T: Serialize, U: Serialize>(&mut self, base: &T, extra: &U); fn write_merged_json_packet<T: Serialize, U: Serialize>(
&mut self,
base: &T,
extra: &U,
) -> Result<(), Box<dyn Error>>;
fn read_json_packet(&mut self) -> Result<Option<Value>, String>; fn read_json_packet(&mut self) -> Result<Option<Value>, String>;
} }
impl JsonPacketStream for TcpStream { impl JsonPacketStream for TcpStream {
fn write_json_packet<T: Serialize>(&mut self, obj: &T) { fn write_json_packet<T: Serialize>(&mut self, obj: &T) -> Result<(), Box<dyn Error>> {
let s = serde_json::to_string(obj).unwrap(); let s = serde_json::to_string(obj)?;
debug!("<- {}", s); debug!("<- {}", s);
write!(self, "{}:{}", s.len(), s).unwrap(); write!(self, "{}:{}", s.len(), s)?;
Ok(())
} }
fn write_merged_json_packet<T: Serialize, U: Serialize>(&mut self, base: &T, extra: &U) { fn write_merged_json_packet<T: Serialize, U: Serialize>(
let mut obj = serde_json::to_value(base).unwrap(); &mut self,
base: &T,
extra: &U,
) -> Result<(), Box<dyn Error>> {
let mut obj = serde_json::to_value(base)?;
let obj = obj.as_object_mut().unwrap(); let obj = obj.as_object_mut().unwrap();
let extra = serde_json::to_value(extra).unwrap(); let extra = serde_json::to_value(extra)?;
let extra = extra.as_object().unwrap(); let extra = extra.as_object().unwrap();
for (key, value) in extra { for (key, value) in extra {
obj.insert(key.to_owned(), value.to_owned()); obj.insert(key.to_owned(), value.to_owned());
} }
self.write_json_packet(obj); self.write_json_packet(obj)
} }
fn read_json_packet(&mut self) -> Result<Option<Value>, String> { fn read_json_packet(&mut self) -> Result<Option<Value>, String> {
@ -74,7 +84,9 @@ impl JsonPacketStream for TcpStream {
Err(_) => return Err("packet length missing / not parsable".to_owned()), Err(_) => return Err("packet length missing / not parsable".to_owned()),
}; };
let mut packet = String::new(); let mut packet = String::new();
self.take(packet_len).read_to_string(&mut packet).unwrap(); self.take(packet_len)
.read_to_string(&mut packet)
.map_err(|e| e.to_string())?;
debug!("{}", packet); debug!("{}", packet);
return match serde_json::from_str(&packet) { return match serde_json::from_str(&packet) {
Ok(json) => Ok(Some(json)), Ok(json) => Ok(Some(json)),