diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2016-04-09 15:56:57 +0530 |
---|---|---|
committer | bors-servo <lbergstrom+bors@mozilla.com> | 2016-04-09 15:56:57 +0530 |
commit | 4720992ffcf23a166b3ae08d8090cff5a993a0b6 (patch) | |
tree | 3f120534294fa86684f02cb38f64c68e8f9affc7 /components/script/dom | |
parent | 90ab488d424511e81902b58056602e2b498866ec (diff) | |
parent | ee9bb1f3c6534822eeceec8434b38d1e7eee96c1 (diff) | |
download | servo-4720992ffcf23a166b3ae08d8090cff5a993a0b6.tar.gz servo-4720992ffcf23a166b3ae08d8090cff5a993a0b6.zip |
Auto merge of #10203 - Shiroy:script-not-found-executed, r=Ms2ger
Avoid script execution when not found
Fix #8391
If the status code is an error or has not been received, we discard data and prevent the script from being executed.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="35" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/10203)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/htmlscriptelement.rs | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 3a609a0977f..efe5fe54535 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -28,6 +28,7 @@ use dom::window::ScriptHelpers; use encoding::label::encoding_from_whatwg_label; use encoding::types::{DecoderTrap, Encoding, EncodingRef}; use html5ever::tree_builder::NextParserState; +use hyper::http::RawStatus; use ipc_channel::ipc; use ipc_channel::router::ROUTER; use js::jsapi::RootedValue; @@ -136,20 +137,35 @@ struct ScriptContext { metadata: Option<Metadata>, /// The initial URL requested. url: Url, + /// Indicates whether the request failed, and why + status: Result<(), String> } impl AsyncResponseListener for ScriptContext { fn headers_available(&mut self, metadata: Metadata) { + let status_code = match metadata.status { + Some(RawStatus(c, _)) => c, + _ => 0 + }; + + self.status = match status_code { + 0 => Err("No http status code received".to_owned()), + 200...299 => Ok(()), // HTTP ok status codes + _ => Err(format!("HTTP error code {}", status_code)) + }; + self.metadata = Some(metadata); } fn data_available(&mut self, payload: Vec<u8>) { - let mut payload = payload; - self.data.append(&mut payload); + if self.status.is_ok() { + let mut payload = payload; + self.data.append(&mut payload); + } } fn response_complete(&mut self, status: Result<(), String>) { - let load = status.map(|_| { + let load = status.and(self.status.clone()).map(|_| { let data = mem::replace(&mut self.data, vec!()); let metadata = self.metadata.take().unwrap(); (metadata, data) @@ -292,6 +308,7 @@ impl HTMLScriptElement { data: vec!(), metadata: None, url: url.clone(), + status: Ok(()) })); let (action_sender, action_receiver) = ipc::channel().unwrap(); |