aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/servohtmlparser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/servohtmlparser.rs')
-rw-r--r--components/script/dom/servohtmlparser.rs43
1 files changed, 31 insertions, 12 deletions
diff --git a/components/script/dom/servohtmlparser.rs b/components/script/dom/servohtmlparser.rs
index 2312ac96795..25fbff24d28 100644
--- a/components/script/dom/servohtmlparser.rs
+++ b/components/script/dom/servohtmlparser.rs
@@ -26,7 +26,7 @@ use hyper::header::ContentType;
use hyper::mime::{Mime, SubLevel, TopLevel};
use js::jsapi::JSTracer;
use msg::constellation_msg::{PipelineId, SubpageId};
-use net_traits::{AsyncResponseListener, Metadata};
+use net_traits::{AsyncResponseListener, Metadata, NetworkError};
use network_listener::PreInvoke;
use parse::Parser;
use script_runtime::ScriptChan;
@@ -36,6 +36,7 @@ use std::cell::UnsafeCell;
use std::default::Default;
use std::ptr;
use url::Url;
+use util::resource_files::read_resource_file;
#[must_root]
#[derive(JSTraceable, HeapSizeOf)]
@@ -239,12 +240,23 @@ impl ParserContext {
}
impl AsyncResponseListener for ParserContext {
- fn headers_available(&mut self, metadata: Metadata) {
- let content_type = metadata.content_type.clone();
-
- let parser = ScriptThread::page_fetch_complete(self.id.clone(), self.subpage.clone(),
- metadata);
- let parser = match parser {
+ fn headers_available(&mut self, meta_result: Result<Metadata, NetworkError>) {
+ let mut is_ssl_error = false;
+ let metadata = match meta_result {
+ Ok(meta) => Some(meta),
+ Err(NetworkError::SslValidation(url)) => {
+ is_ssl_error = true;
+ let mut meta = Metadata::default(url);
+ let mime: Option<Mime> = "text/html".parse().ok();
+ meta.set_content_type(mime.as_ref());
+ Some(meta)
+ },
+ Err(_) => None,
+ };
+ let content_type = metadata.clone().and_then(|meta| meta.content_type);
+ let parser = match ScriptThread::page_fetch_complete(self.id.clone(),
+ self.subpage.clone(),
+ metadata) {
Some(parser) => parser,
None => return,
};
@@ -262,8 +274,7 @@ impl AsyncResponseListener for ParserContext {
match content_type {
Some(ContentType(Mime(TopLevel::Image, _, _))) => {
self.is_synthesized_document = true;
- let page = format!("<html><body><img src='{}' /></body></html>",
- self.url.serialize());
+ let page = format!("<html><body><img src='{}' /></body></html>", self.url);
parser.pending_input().borrow_mut().push(page);
parser.parse_sync();
},
@@ -274,7 +285,15 @@ impl AsyncResponseListener for ParserContext {
parser.parse_sync();
parser.set_plaintext_state();
},
- Some(ContentType(Mime(TopLevel::Text, SubLevel::Html, _))) => {}, // Handle text/html
+ Some(ContentType(Mime(TopLevel::Text, SubLevel::Html, _))) => { // Handle text/html
+ if is_ssl_error {
+ self.is_synthesized_document = true;
+ let page_bytes = read_resource_file("badcert.html").unwrap();
+ let page = String::from_utf8(page_bytes).unwrap();
+ parser.pending_input().borrow_mut().push(page);
+ parser.parse_sync();
+ }
+ },
Some(ContentType(Mime(TopLevel::Text, SubLevel::Xml, _))) => {}, // Handle text/xml
Some(ContentType(Mime(toplevel, sublevel, _))) => {
if toplevel.as_str() == "application" && sublevel.as_str() == "xhtml+xml" {
@@ -308,7 +327,7 @@ impl AsyncResponseListener for ParserContext {
}
}
- fn response_complete(&mut self, status: Result<(), String>) {
+ fn response_complete(&mut self, status: Result<(), NetworkError>) {
let parser = match self.parser.as_ref() {
Some(parser) => parser.root(),
None => return,
@@ -316,7 +335,7 @@ impl AsyncResponseListener for ParserContext {
parser.r().document().finish_load(LoadType::PageSource(self.url.clone()));
if let Err(err) = status {
- debug!("Failed to load page URL {}, error: {}", self.url.serialize(), err);
+ debug!("Failed to load page URL {}, error: {:?}", self.url, err);
// TODO(Savago): we should send a notification to callers #5463.
}