diff options
author | Sean McArthur <sean@seanmonstar.com> | 2024-07-12 15:51:37 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-13 00:51:37 +0200 |
commit | f6fd6619e708a515831f707438368d81b0c9aa56 (patch) | |
tree | 9c65c76613330a22c5a88c017752a9aa7e0951ac /runtime/ops | |
parent | 2fca4f11fe22a5d49326b6bf5b3ef039403eb0df (diff) |
refactor(fetch): reimplement fetch with hyper instead of reqwest (#24237)
This commit re-implements `ext/fetch` and all dependent crates
using `hyper` and `hyper-util`, instead of `reqwest`.
The reasoning is that we want to have greater control and access
to low level `hyper` APIs when implementing `fetch` API as well
as `node:http` module.
---------
Co-authored-by: Bartek IwaĆczuk <biwanczuk@gmail.com>
Diffstat (limited to 'runtime/ops')
-rw-r--r-- | runtime/ops/web_worker/sync_fetch.rs | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/runtime/ops/web_worker/sync_fetch.rs b/runtime/ops/web_worker/sync_fetch.rs index 37286ca62..cdb151a86 100644 --- a/runtime/ops/web_worker/sync_fetch.rs +++ b/runtime/ops/web_worker/sync_fetch.rs @@ -13,6 +13,7 @@ use deno_core::OpState; use deno_fetch::data_url::DataUrl; use deno_web::BlobStore; use deno_websocket::DomExceptionNetworkError; +use http_body_util::BodyExt; use hyper::body::Bytes; use serde::Deserialize; use serde::Serialize; @@ -78,10 +79,23 @@ pub fn op_worker_sync_fetch( let (body, mime_type, res_url) = match script_url.scheme() { "http" | "https" => { - let resp = - client.get(script_url).send().await?.error_for_status()?; - - let res_url = resp.url().to_string(); + let mut req = http::Request::new( + http_body_util::Empty::new() + .map_err(|never| match never {}) + .boxed(), + ); + *req.uri_mut() = script_url.as_str().parse()?; + + let resp = client.send(req).await?; + + if resp.status().is_client_error() + || resp.status().is_server_error() + { + return Err(type_error(format!( + "http status error: {}", + resp.status() + ))); + } // TODO(andreubotella) Properly run fetch's "extract a MIME type". let mime_type = resp @@ -93,9 +107,9 @@ pub fn op_worker_sync_fetch( // Always check the MIME type with HTTP(S). loose_mime_checks = false; - let body = resp.bytes().await?; + let body = resp.collect().await?.to_bytes(); - (body, mime_type, res_url) + (body, mime_type, script) } "data" => { let data_url = DataUrl::process(&script) |