diff --git a/src/servo/parser/html_lexer.rs b/src/servo/parser/html_lexer.rs index ca95e1177fe..911ca60e828 100644 --- a/src/servo/parser/html_lexer.rs +++ b/src/servo/parser/html_lexer.rs @@ -184,7 +184,6 @@ fn spawn_html_lexer_task(-url: url, resource_task: ResourceTask) -> port let html_chan = chan(html_port); task::spawn(|| { - assert url.path.ends_with(~".html"); let input_port = port(); resource_task.send(Load(url, input_port.chan())); diff --git a/src/servo/resource/http_loader.rs b/src/servo/resource/http_loader.rs new file mode 100644 index 00000000000..fdde14d7a6d --- /dev/null +++ b/src/servo/resource/http_loader.rs @@ -0,0 +1,48 @@ +export factory; + +import comm::{chan, methods}; +import task::spawn; +import resource_task::{ProgressMsg, Payload, Done}; +import std::net::url::url; +import http_client::{ + uv_http_request, + Uri +}; +import result::{ok, err}; + +fn factory(url: url, progress_chan: chan) { + assert url.scheme == ~"http"; + + do spawn { + #debug("http_loader: requesting via http: %?", url); + let request = uv_http_request(url_to_http_client_uri(url)); + let errored = @mut false; + do request.begin |event| { + alt event { + http_client::Status(*) { } + http_client::Payload(data) { + #debug("http_loader: got data from %?", url); + let mut crap = none; + *data <-> crap; + progress_chan.send(Payload(option::unwrap(crap))); + } + http_client::Error(*) { + #debug("http_loader: error loading %?", url); + *errored = true; + progress_chan.send(Done(err(()))); + } + } + } + + if !*errored { + progress_chan.send(Done(ok(()))); + } + } +} + +fn url_to_http_client_uri(url: url) -> Uri { + { + host: url.host, + path: url.path + } +} \ No newline at end of file diff --git a/src/servo/resource/resource_task.rs b/src/servo/resource/resource_task.rs index a3593cbac58..a5684436fc6 100644 --- a/src/servo/resource/resource_task.rs +++ b/src/servo/resource/resource_task.rs @@ -30,7 +30,8 @@ type LoaderTaskFactory = fn~(url: url, chan); fn ResourceTask() -> ResourceTask { let loaders = ~[ - (~"file", file_loader::factory) + (~"file", file_loader::factory), + (~"http", http_loader::factory) ]; create_resource_task_with_loaders(loaders) } diff --git a/src/servo/servo.rc b/src/servo/servo.rc index 6cadf75241d..3cc8e816db2 100755 --- a/src/servo/servo.rc +++ b/src/servo/servo.rc @@ -114,6 +114,7 @@ mod engine; mod resource { mod resource_task; mod file_loader; + mod http_loader; } import servo_text = text;