diff options
Diffstat (limited to 'cli/ops/fetch.rs')
-rw-r--r-- | cli/ops/fetch.rs | 87 |
1 files changed, 39 insertions, 48 deletions
diff --git a/cli/ops/fetch.rs b/cli/ops/fetch.rs index e2ab81a81..7661eb6e9 100644 --- a/cli/ops/fetch.rs +++ b/cli/ops/fetch.rs @@ -1,57 +1,38 @@ // Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. -use super::dispatch_json::{Deserialize, JsonOp, Value}; +use super::dispatch_flatbuffers::serialize_response; +use super::utils::CliOpResult; use crate::http_util; +use crate::msg; +use crate::msg_util; use crate::resources; use crate::state::ThreadSafeState; use deno::*; -use http::header::HeaderName; -use http::uri::Uri; -use http::Method; +use flatbuffers::FlatBufferBuilder; use hyper; -use hyper::header::HeaderValue; use hyper::rt::Future; -use hyper::Request; use std; use std::convert::From; -use std::str::FromStr; - -#[derive(Deserialize)] -struct FetchArgs { - method: Option<String>, - url: String, - headers: Vec<(String, String)>, -} pub fn op_fetch( state: &ThreadSafeState, - args: Value, + base: &msg::Base<'_>, data: Option<PinnedBuf>, -) -> Result<JsonOp, ErrBox> { - let args: FetchArgs = serde_json::from_value(args)?; - let url = args.url; +) -> CliOpResult { + let inner = base.inner_as_fetch().unwrap(); + let cmd_id = base.cmd_id(); + + let header = inner.header().unwrap(); + assert!(header.is_request()); + let url = header.url().unwrap(); let body = match data { None => hyper::Body::empty(), Some(buf) => hyper::Body::from(Vec::from(&*buf)), }; - let mut req = Request::new(body); - let uri = Uri::from_str(&url).map_err(ErrBox::from)?; - *req.uri_mut() = uri; - - if let Some(method) = args.method { - let method = Method::from_str(&method).unwrap(); - *req.method_mut() = method; - } - - let headers = req.headers_mut(); - for header_pair in args.headers { - let name = HeaderName::from_bytes(header_pair.0.as_bytes()).unwrap(); - let v = HeaderValue::from_str(&header_pair.1).unwrap(); - headers.insert(name, v); - } + let req = msg_util::deserialize_request(header, body)?; - let url_ = url::Url::parse(&url).map_err(ErrBox::from)?; + let url_ = url::Url::parse(url).map_err(ErrBox::from)?; state.check_net_url(&url_)?; let client = http_util::get_client(); @@ -61,22 +42,32 @@ pub fn op_fetch( .request(req) .map_err(ErrBox::from) .and_then(move |res| { - let status = res.status().as_u16(); - let mut res_headers = Vec::new(); - for (key, val) in res.headers().iter() { - res_headers.push((key.to_string(), val.to_str().unwrap().to_owned())); - } + let builder = &mut FlatBufferBuilder::new(); + let header_off = msg_util::serialize_http_response(builder, &res); let body = res.into_body(); let body_resource = resources::add_hyper_body(body); + let inner = msg::FetchRes::create( + builder, + &msg::FetchResArgs { + header: Some(header_off), + body_rid: body_resource.rid, + }, + ); - let json_res = json!({ - "bodyRid": body_resource.rid, - "status": status, - "headers": res_headers - }); - - futures::future::ok(json_res) + Ok(serialize_response( + cmd_id, + builder, + msg::BaseArgs { + inner: Some(inner.as_union_value()), + inner_type: msg::Any::FetchRes, + ..Default::default() + }, + )) }); - - Ok(JsonOp::Async(Box::new(future))) + if base.sync() { + let result_buf = future.wait()?; + Ok(Op::Sync(result_buf)) + } else { + Ok(Op::Async(Box::new(future))) + } } |