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
},
@ -215,7 +215,7 @@ impl Actor for BrowsingContextActor {
title: self.title.borrow().clone(),
}],
};
stream.write_json_packet(&msg);
let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed
},

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -14,6 +14,7 @@ use msg::constellation_msg::PipelineId;
use serde::{Serialize, Serializer};
use serde_json::{Map, Value};
use std::cell::RefCell;
use std::error::Error;
use std::net::TcpStream;
use std::sync::{Arc, Mutex};
use std::thread;
@ -166,7 +167,9 @@ impl TimelineActor {
while let Ok(Some(marker)) = receiver.try_recv() {
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));
})
@ -235,7 +238,7 @@ impl Actor for TimelineActor {
from: self.name(),
value: HighResolutionStamp::new(registry.start_stamp(), PreciseTime::now()),
};
stream.write_json_packet(&msg);
let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed
},
@ -245,7 +248,7 @@ impl Actor for TimelineActor {
value: HighResolutionStamp::new(registry.start_stamp(), PreciseTime::now()),
};
stream.write_json_packet(&msg);
let _ = stream.write_json_packet(&msg);
self.script_sender
.send(DropTimelineMarkers(
self.pipeline,
@ -272,7 +275,7 @@ impl Actor for TimelineActor {
value: self.is_recording.lock().unwrap().clone(),
};
stream.write_json_packet(&msg);
let _ = stream.write_json_packet(&msg);
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 reply = MarkersEmitterReply {
type_: "markers".to_owned(),
@ -319,7 +322,7 @@ impl Emitter {
from: self.from.clone(),
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 {
let mut lock = self.registry.lock();
@ -331,7 +334,7 @@ impl Emitter {
delta: HighResolutionStamp::new(self.start_stamp, end_time),
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 {
@ -343,7 +346,9 @@ impl Emitter {
delta: HighResolutionStamp::new(self.start_stamp, end_time),
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(),
consoleActor: self.console.clone(),
};
stream.write_json_packet(&msg);
let _ = stream.write_json_packet(&msg);
ActorMessageStatus::Processed
},

View file

@ -193,7 +193,10 @@ fn run_server(
{
let actors = actors.lock().unwrap();
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 {
@ -451,7 +454,7 @@ fn run_server(
eventActor: actor.event_actor(),
};
for stream in &mut connections {
stream.write_json_packet(&msg);
let _ = stream.write_json_packet(&msg);
}
},
NetworkEvent::HttpResponse(httpresponse) => {
@ -464,7 +467,7 @@ fn run_server(
updateType: "requestHeaders".to_owned(),
};
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 {
@ -473,7 +476,7 @@ fn run_server(
updateType: "requestCookies".to_owned(),
};
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
@ -485,7 +488,7 @@ fn run_server(
};
for stream in &mut connections {
stream.write_json_packet(&msg);
let _ = stream.write_json_packet(&msg);
}
let msg = NetworkEventUpdateMsg {
from: netevent_actor_name.clone(),
@ -496,7 +499,7 @@ fn run_server(
totalTime: actor.total_time(),
};
for stream in &mut connections {
stream.write_merged_json_packet(&msg, &extra);
let _ = stream.write_merged_json_packet(&msg, &extra);
}
let msg = NetworkEventUpdateMsg {
@ -508,7 +511,7 @@ fn run_server(
state: "insecure".to_owned(),
};
for stream in &mut connections {
stream.write_merged_json_packet(&msg, &extra);
let _ = stream.write_merged_json_packet(&msg, &extra);
}
let msg = NetworkEventUpdateMsg {
@ -517,7 +520,7 @@ fn run_server(
updateType: "responseContent".to_owned(),
};
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 {
@ -526,7 +529,7 @@ fn run_server(
updateType: "responseCookies".to_owned(),
};
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 {
@ -535,7 +538,7 @@ fn run_server(
updateType: "responseHeaders".to_owned(),
};
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_json::{self, Value};
use std::error::Error;
use std::io::{Read, Write};
use std::net::TcpStream;
@ -26,29 +27,38 @@ pub struct Method {
}
pub trait JsonPacketStream {
fn write_json_packet<T: Serialize>(&mut self, obj: &T);
fn write_merged_json_packet<T: Serialize, U: Serialize>(&mut self, base: &T, extra: &U);
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,
) -> Result<(), Box<dyn Error>>;
fn read_json_packet(&mut self) -> Result<Option<Value>, String>;
}
impl JsonPacketStream for TcpStream {
fn write_json_packet<T: Serialize>(&mut self, obj: &T) {
let s = serde_json::to_string(obj).unwrap();
fn write_json_packet<T: Serialize>(&mut self, obj: &T) -> Result<(), Box<dyn Error>> {
let s = serde_json::to_string(obj)?;
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) {
let mut obj = serde_json::to_value(base).unwrap();
fn write_merged_json_packet<T: Serialize, U: Serialize>(
&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 extra = serde_json::to_value(extra).unwrap();
let extra = serde_json::to_value(extra)?;
let extra = extra.as_object().unwrap();
for (key, value) in extra {
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> {
@ -74,7 +84,9 @@ impl JsonPacketStream for TcpStream {
Err(_) => return Err("packet length missing / not parsable".to_owned()),
};
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);
return match serde_json::from_str(&packet) {
Ok(json) => Ok(Some(json)),