summaryrefslogtreecommitdiff
path: root/cli/ops/fetch.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/ops/fetch.rs')
-rw-r--r--cli/ops/fetch.rs87
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)))
+ }
}