diff --git a/src/components/net/http_loader.rs b/src/components/net/http_loader.rs index 92f5c15a4ee..23763775a81 100644 --- a/src/components/net/http_loader.rs +++ b/src/components/net/http_loader.rs @@ -54,7 +54,7 @@ fn load(url: Url, start_chan: Chan) { } let mut metadata = Metadata::default(url); - // We will set other fields here. + metadata.set_content_type(&response.headers.content_type); let progress_chan = start_sending(start_chan, metadata); loop { diff --git a/src/components/net/resource_task.rs b/src/components/net/resource_task.rs index 5a738df59bf..5f256428f62 100644 --- a/src/components/net/resource_task.rs +++ b/src/components/net/resource_task.rs @@ -12,6 +12,7 @@ use std::comm::{Chan, Port, SharedChan}; use std::comm; use extra::url::Url; use util::spawn_listener; +use http::headers::content_type::MediaType; pub enum ControlMsg { /// Request the data associated with a particular URL @@ -24,14 +25,37 @@ pub struct Metadata { /// Final URL after redirects. final_url: Url, - // Other fields (e.g. content type, charset) will go here. + /// MIME type / subtype. + content_type: Option<(~str, ~str)>, + + /// Character set. + charset: Option<~str>, } impl Metadata { /// Metadata with defaults for everything optional. pub fn default(url: Url) -> Metadata { Metadata { - final_url: url, + final_url: url, + content_type: None, + charset: None, + } + } + + /// Extract the parts of a MediaType that we care about. + pub fn set_content_type(&mut self, content_type: &Option) { + match *content_type { + None => (), + Some(MediaType { type_: ref type_, + subtype: ref subtype, + parameters: ref parameters }) => { + self.content_type = Some((type_.clone(), subtype.clone())); + for &(ref k, ref v) in parameters.iter() { + if "charset" == k.as_slice() { + self.charset = Some(v.clone()); + } + } + } } } } diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index 3f90c80dc9c..ec9e186b51d 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -336,6 +336,8 @@ pub fn parse_html(cx: *JSContext, resource_task.send(Load(url.clone(), input_chan)); let load_response = input_port.recv(); + debug!("Fetched page; metadata is %?", load_response.metadata); + let url2 = load_response.metadata.final_url.clone(); let url3 = url2.clone();