From 8edf099485903a402d8e9df4810b9362ed1b1f15 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Fri, 18 Sep 2020 12:31:30 -0400 Subject: [PATCH] publish deno_fetch during CI (#7557) --- .github/workflows/ci.yml | 3 +++ cli/main.rs | 2 ++ op_crates/fetch/Cargo.toml | 2 +- op_crates/fetch/README.md | 1 + op_crates/fetch/lib.rs | 47 +++++++++++++------------------------- 5 files changed, 23 insertions(+), 32 deletions(-) create mode 100644 op_crates/fetch/README.md diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 557ae0a9d6..c0e52aedda 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -231,6 +231,9 @@ jobs: cd ../op_crates/web cargo publish sleep 30 + cd ../op_crates/fetch + cargo publish + sleep 30 cd ../../cli sleep 30 cargo publish diff --git a/cli/main.rs b/cli/main.rs index 18dd3ffcb6..2d80372c71 100644 --- a/cli/main.rs +++ b/cli/main.rs @@ -1,5 +1,7 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. +#![deny(warnings)] + #[macro_use] extern crate lazy_static; #[macro_use] diff --git a/op_crates/fetch/Cargo.toml b/op_crates/fetch/Cargo.toml index 66c03ee371..2c1130bff1 100644 --- a/op_crates/fetch/Cargo.toml +++ b/op_crates/fetch/Cargo.toml @@ -4,7 +4,7 @@ name = "deno_fetch" version = "0.1.0" edition = "2018" -description = "fetch Web API" +description = "provides fetch Web API to deno_core" authors = ["the Deno authors"] license = "MIT" readme = "README.md" diff --git a/op_crates/fetch/README.md b/op_crates/fetch/README.md new file mode 100644 index 0000000000..1a6dcab174 --- /dev/null +++ b/op_crates/fetch/README.md @@ -0,0 +1 @@ +This crate provides the web standard fetch API to `deno_core`. diff --git a/op_crates/fetch/lib.rs b/op_crates/fetch/lib.rs index e386431b56..dbca638023 100644 --- a/op_crates/fetch/lib.rs +++ b/op_crates/fetch/lib.rs @@ -1,5 +1,7 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. +#![deny(warnings)] + use deno_core::error::bad_resource_id; use deno_core::error::type_error; use deno_core::error::AnyError; @@ -14,10 +16,9 @@ use deno_core::BufVec; use deno_core::JsRuntime; use deno_core::OpState; use deno_core::ZeroCopyBuf; -use reqwest::header::HeaderMap; + use reqwest::header::HeaderName; use reqwest::header::HeaderValue; -use reqwest::header::USER_AGENT; use reqwest::redirect::Policy; use reqwest::Client; use reqwest::Method; @@ -31,6 +32,8 @@ use std::path::Path; use std::path::PathBuf; use std::rc::Rc; +pub use reqwest; // Re-export reqwest + pub fn init(isolate: &mut JsRuntime) { let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR")); let files = vec![ @@ -63,15 +66,6 @@ pub fn get_declaration() -> PathBuf { PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("lib.deno_fetch.d.ts") } -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -struct FetchArgs { - method: Option, - url: String, - headers: Vec<(String, String)>, - client_rid: Option, -} - pub async fn op_fetch( state: Rc>, args: Value, @@ -80,6 +74,15 @@ pub async fn op_fetch( where FP: FetchPermissions + 'static, { + #[derive(Deserialize)] + #[serde(rename_all = "camelCase")] + struct FetchArgs { + method: Option, + url: String, + headers: Vec<(String, String)>, + client_rid: Option, + } + let args: FetchArgs = serde_json::from_value(args)?; let url = args.url; @@ -181,23 +184,13 @@ pub async fn op_fetch_read( let mut chunk_fut = response.chunk().boxed_local(); let r = ready!(chunk_fut.poll_unpin(cx))?; if let Some(chunk) = r { + // TODO(ry) This is terribly inefficient. Make this zero-copy. Ok(json!({ "chunk": &*chunk })).into() } else { Ok(json!({ "chunk": null })).into() } }); f.await - /* - // I'm programming this as I want it to be programmed, even though it might be - // incorrect, normally we would use poll_fn here. We need to make this await pattern work. - let chunk = response.chunk().await?; - if let Some(chunk) = chunk { - // TODO(ry) This is terribly inefficient. Make this zero-copy. - Ok(json!({ "chunk": &*chunk })) - } else { - Ok(json!({ "chunk": null })) - } - */ } struct HttpClientResource { @@ -245,21 +238,13 @@ where /// Create new instance of async reqwest::Client. This client supports /// proxies and doesn't follow redirects. fn create_http_client(ca_file: Option<&str>) -> Result { - let mut headers = HeaderMap::new(); - // TODO(ry) set the verison correctly. - headers.insert(USER_AGENT, format!("Deno/{}", "x.x.x").parse().unwrap()); - let mut builder = Client::builder() - .redirect(Policy::none()) - .default_headers(headers) - .use_rustls_tls(); - + let mut builder = Client::builder().redirect(Policy::none()).use_rustls_tls(); if let Some(ca_file) = ca_file { let mut buf = Vec::new(); File::open(ca_file)?.read_to_end(&mut buf)?; let cert = reqwest::Certificate::from_pem(&buf)?; builder = builder.add_root_certificate(cert); } - builder .build() .map_err(|_| deno_core::error::generic_error("Unable to build http client"))