diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/handlers.rs | 96 | ||||
-rw-r--r-- | src/main.rs | 1 |
2 files changed, 97 insertions, 0 deletions
diff --git a/src/handlers.rs b/src/handlers.rs index 21e5b2baa..b40bbc67b 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -6,9 +6,13 @@ use from_c; use fs; use futures; use futures::sync::oneshot; +use hyper; +use hyper::rt::{Future, Stream}; +use hyper::Client; use msg_generated::deno as msg; use std; use std::path::Path; +use tokio::prelude::future; pub extern "C" fn msg_from_js(d: *const DenoC, buf: deno_buf) { let bytes = unsafe { std::slice::from_raw_parts(buf.data_ptr, buf.data_len) }; @@ -33,6 +37,12 @@ pub extern "C" fn msg_from_js(d: *const DenoC, buf: deno_buf) { let output_code = msg.output_code().unwrap(); handle_code_cache(d, filename, source_code, output_code); } + msg::Any::FetchReq => { + // TODO base.msg_as_FetchReq(); + let msg = msg::FetchReq::init_from_table(base.msg().unwrap()); + let url = msg.url().unwrap(); + handle_fetch_req(d, msg.id(), url); + } msg::Any::TimerStart => { // TODO base.msg_as_TimerStart(); let msg = msg::TimerStart::init_from_table(base.msg().unwrap()); @@ -210,6 +220,92 @@ fn handle_code_cache( // null response indicates success. } +fn handle_fetch_req(d: *const DenoC, id: u32, url: &str) { + let deno = from_c(d); + let url = url.parse::<hyper::Uri>().unwrap(); + let client = Client::new(); + + deno.rt.spawn( + client + .get(url) + .map(move |res| { + let status = res.status().as_u16() as i32; + + // Send the first message without a body. This is just to indicate + // what status code. + let mut builder = flatbuffers::FlatBufferBuilder::new(); + let msg = msg::FetchRes::create( + &mut builder, + &msg::FetchResArgs { + id, + status, + ..Default::default() + }, + ); + send_base( + d, + &mut builder, + &msg::BaseArgs { + msg: Some(flatbuffers::Offset::new(msg.value())), + msg_type: msg::Any::FetchRes, + ..Default::default() + }, + ); + res + }) + .and_then(move |res| { + // Send the body as a FetchRes message. + res.into_body().concat2().map(move |body_buffer| { + let mut builder = flatbuffers::FlatBufferBuilder::new(); + let data_off = builder.create_byte_vector(body_buffer.as_ref()); + let msg = msg::FetchRes::create( + &mut builder, + &msg::FetchResArgs { + id, + body: Some(data_off), + ..Default::default() + }, + ); + send_base( + d, + &mut builder, + &msg::BaseArgs { + msg: Some(flatbuffers::Offset::new(msg.value())), + msg_type: msg::Any::FetchRes, + ..Default::default() + }, + ); + }) + }) + .map_err(move |err| { + let errmsg = format!("{}", err); + + // TODO This is obviously a lot of duplicated code from the success case. + // Leaving it here now jsut to get a first pass implementation, but this + // needs to be cleaned up. + let mut builder = flatbuffers::FlatBufferBuilder::new(); + let err_off = builder.create_string(errmsg.as_str()); + let msg = msg::FetchRes::create( + &mut builder, + &msg::FetchResArgs { + id, + ..Default::default() + }, + ); + send_base( + d, + &mut builder, + &msg::BaseArgs { + msg: Some(flatbuffers::Offset::new(msg.value())), + msg_type: msg::Any::FetchRes, + error: Some(err_off), + ..Default::default() + }, + ); + }), + ); +} + fn set_timeout<F>( cb: F, delay: u32, diff --git a/src/main.rs b/src/main.rs index b5eab9e7c..2d83b8259 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ extern crate flatbuffers; extern crate futures; +extern crate hyper; extern crate libc; extern crate msg_rs as msg_generated; extern crate sha1; |