Skip to content

Commit

Permalink
refactor: add deno_fetch::Options for init (denoland#12904)
Browse files Browse the repository at this point in the history
deno_fetch::init has a lot of parameters and generic on two types 
that keeps expanding over time. This refactor adds deno_fetch::Options 
struct for more clearly defining the various parameters.
  • Loading branch information
ry committed Nov 28, 2021
1 parent 96d02de commit cc83ad3
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 54 deletions.
7 changes: 7 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions ext/fetch/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ bytes = "1.1.0"
data-url = "0.1.0"
deno_core = { version = "0.109.0", path = "../../core" }
deno_tls = { version = "0.14.0", path = "../tls" }
dyn-clone = "1"
http = "0.2.4"
reqwest = { version = "0.11.4", default-features = false, features = ["rustls-tls", "stream", "gzip", "brotli"] }
serde = { version = "1.0.129", features = ["derive"] }
Expand Down
76 changes: 49 additions & 27 deletions ext/fetch/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,18 +57,35 @@ pub use reqwest;

pub use fs_fetch_handler::FsFetchHandler;

pub fn init<FP, FH>(
user_agent: String,
root_cert_store: Option<RootCertStore>,
proxy: Option<Proxy>,
request_builder_hook: Option<fn(RequestBuilder) -> RequestBuilder>,
unsafely_ignore_certificate_errors: Option<Vec<String>>,
client_cert_chain_and_key: Option<(String, String)>,
file_fetch_handler: FH,
) -> Extension
pub struct Options {
pub user_agent: String,
pub root_cert_store: Option<RootCertStore>,
pub proxy: Option<Proxy>,
pub request_builder_hook: Option<fn(RequestBuilder) -> RequestBuilder>,
pub unsafely_ignore_certificate_errors: Option<Vec<String>>,
pub client_cert_chain_and_key: Option<(String, String)>,
pub file_fetch_handler: Box<dyn FetchHandler>,
}

struct BoxFetchHandler(Box<dyn FetchHandler>);

impl Default for Options {
fn default() -> Self {
Self {
user_agent: "".to_string(),
root_cert_store: None,
proxy: None,
request_builder_hook: None,
unsafely_ignore_certificate_errors: None,
client_cert_chain_and_key: None,
file_fetch_handler: Box::new(DefaultFileFetchHandler),
}
}
}

pub fn init<FP>(options: Options) -> Extension
where
FP: FetchPermissions + 'static,
FH: FetchHandler + 'static,
{
Extension::builder()
.js(include_js_files!(
Expand All @@ -83,7 +100,7 @@ where
"26_fetch.js",
))
.ops(vec![
("op_fetch", op_sync(op_fetch::<FP, FH>)),
("op_fetch", op_sync(op_fetch::<FP>)),
("op_fetch_send", op_async(op_fetch_send)),
(
"op_fetch_custom_client",
Expand All @@ -93,25 +110,28 @@ where
.state(move |state| {
state.put::<reqwest::Client>({
create_http_client(
user_agent.clone(),
root_cert_store.clone(),
options.user_agent.clone(),
options.root_cert_store.clone(),
vec![],
proxy.clone(),
unsafely_ignore_certificate_errors.clone(),
client_cert_chain_and_key.clone(),
options.proxy.clone(),
options.unsafely_ignore_certificate_errors.clone(),
options.client_cert_chain_and_key.clone(),
)
.unwrap()
});
state.put::<HttpClientDefaults>(HttpClientDefaults {
user_agent: user_agent.clone(),
root_cert_store: root_cert_store.clone(),
proxy: proxy.clone(),
request_builder_hook,
unsafely_ignore_certificate_errors: unsafely_ignore_certificate_errors
user_agent: options.user_agent.clone(),
root_cert_store: options.root_cert_store.clone(),
proxy: options.proxy.clone(),
request_builder_hook: options.request_builder_hook,
unsafely_ignore_certificate_errors: options
.unsafely_ignore_certificate_errors
.clone(),
client_cert_chain_and_key: client_cert_chain_and_key.clone(),
client_cert_chain_and_key: options.client_cert_chain_and_key.clone(),
});
state.put::<FH>(file_fetch_handler.clone());
state.put(BoxFetchHandler(dyn_clone::clone_box(
&*options.file_fetch_handler,
)));
Ok(())
})
.build()
Expand All @@ -129,7 +149,7 @@ pub struct HttpClientDefaults {
pub type CancelableResponseFuture =
Pin<Box<dyn Future<Output = CancelableResponseResult>>>;

pub trait FetchHandler: Clone {
pub trait FetchHandler: dyn_clone::DynClone {
// Return the result of the fetch request consisting of a tuple of the
// cancelable response result, the optional fetch body resource and the
// optional cancel handle.
Expand All @@ -143,6 +163,8 @@ pub trait FetchHandler: Clone {
);
}

dyn_clone::clone_trait_object!(FetchHandler);

/// A default implementation which will error for every request.
#[derive(Clone)]
pub struct DefaultFileFetchHandler;
Expand Down Expand Up @@ -193,14 +215,13 @@ pub struct FetchReturn {
cancel_handle_rid: Option<ResourceId>,
}

pub fn op_fetch<FP, FH>(
pub fn op_fetch<FP>(
state: &mut OpState,
args: FetchArgs,
data: Option<ZeroCopyBuf>,
) -> Result<FetchReturn, AnyError>
where
FP: FetchPermissions + 'static,
FH: FetchHandler + 'static,
{
let client = if let Some(rid) = args.client_rid {
let r = state.resource_table.get::<HttpClientResource>(rid)?;
Expand Down Expand Up @@ -230,7 +251,8 @@ where
)));
}

let file_fetch_handler = state.borrow_mut::<FH>();
let BoxFetchHandler(file_fetch_handler) =
state.borrow_mut::<BoxFetchHandler>();
let (request, maybe_request_body, maybe_cancel_handle) =
file_fetch_handler.fetch_file(url);
let request_rid = state.resource_table.add(FetchRequestResource(request));
Expand Down
10 changes: 1 addition & 9 deletions runtime/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,15 +121,7 @@ mod not_docs {
deno_url::init(),
deno_tls::init(),
deno_web::init(deno_web::BlobStore::default(), Default::default()),
deno_fetch::init::<Permissions, deno_fetch::DefaultFileFetchHandler>(
"".to_owned(),
None,
None,
None,
None,
None,
deno_fetch::DefaultFileFetchHandler, // No enable_file_fetch
),
deno_fetch::init::<Permissions>(Default::default()),
deno_websocket::init::<Permissions>("".to_owned(), None, None),
deno_webstorage::init(None),
deno_crypto::init(None),
Expand Down
18 changes: 9 additions & 9 deletions runtime/web_worker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -318,15 +318,15 @@ impl WebWorker {
deno_console::init(),
deno_url::init(),
deno_web::init(options.blob_store.clone(), Some(main_module.clone())),
deno_fetch::init::<Permissions, deno_fetch::FsFetchHandler>(
options.user_agent.clone(),
options.root_cert_store.clone(),
None,
None,
options.unsafely_ignore_certificate_errors.clone(),
None,
deno_fetch::FsFetchHandler,
),
deno_fetch::init::<Permissions>(deno_fetch::Options {
user_agent: options.user_agent.clone(),
root_cert_store: options.root_cert_store.clone(),
unsafely_ignore_certificate_errors: options
.unsafely_ignore_certificate_errors
.clone(),
file_fetch_handler: Box::new(deno_fetch::FsFetchHandler),
..Default::default()
}),
deno_websocket::init::<Permissions>(
options.user_agent.clone(),
options.root_cert_store.clone(),
Expand Down
18 changes: 9 additions & 9 deletions runtime/worker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -101,15 +101,15 @@ impl MainWorker {
options.blob_store.clone(),
options.bootstrap.location.clone(),
),
deno_fetch::init::<Permissions, deno_fetch::FsFetchHandler>(
options.user_agent.clone(),
options.root_cert_store.clone(),
None,
None,
options.unsafely_ignore_certificate_errors.clone(),
None,
deno_fetch::FsFetchHandler,
),
deno_fetch::init::<Permissions>(deno_fetch::Options {
user_agent: options.user_agent.clone(),
root_cert_store: options.root_cert_store.clone(),
unsafely_ignore_certificate_errors: options
.unsafely_ignore_certificate_errors
.clone(),
file_fetch_handler: Box::new(deno_fetch::FsFetchHandler),
..Default::default()
}),
deno_websocket::init::<Permissions>(
options.user_agent.clone(),
options.root_cert_store.clone(),
Expand Down

0 comments on commit cc83ad3

Please sign in to comment.