From 29aa988476ee968ea00f9c026ae276d72c316476 Mon Sep 17 00:00:00 2001 From: Matt Mastracci Date: Wed, 10 May 2023 16:23:26 +0200 Subject: [PATCH] refactor(core): http_next generic over request extractor (#19071) --- cli/build.rs | 3 +- ext/http/http_next.rs | 79 +++++++++++++++++----------------- ext/http/lib.rs | 10 +++-- ext/http/request_properties.rs | 4 +- runtime/build.rs | 3 +- runtime/web_worker.rs | 3 +- runtime/worker.rs | 3 +- 7 files changed, 57 insertions(+), 48 deletions(-) diff --git a/cli/build.rs b/cli/build.rs index 94b49dfe02..560c8ceae2 100644 --- a/cli/build.rs +++ b/cli/build.rs @@ -9,6 +9,7 @@ use deno_core::Extension; use deno_core::ExtensionFileSource; use deno_core::ExtensionFileSourceCode; use deno_runtime::deno_cache::SqliteBackedCache; +use deno_runtime::deno_http::DefaultHttpPropertyExtractor; use deno_runtime::deno_kv::sqlite::SqliteDbHandler; use deno_runtime::permissions::PermissionsContainer; use deno_runtime::*; @@ -361,7 +362,7 @@ fn create_cli_snapshot(snapshot_path: PathBuf) { false, // No --unstable. ), deno_napi::deno_napi::init_ops::(), - deno_http::deno_http::init_ops(), + deno_http::deno_http::init_ops::(), deno_io::deno_io::init_ops(Default::default()), deno_fs::deno_fs::init_ops::(false, fs.clone()), deno_node::deno_node::init_ops::(None, fs), diff --git a/ext/http/http_next.rs b/ext/http/http_next.rs index 080cfea6c3..12db29b1b7 100644 --- a/ext/http/http_next.rs +++ b/ext/http/http_next.rs @@ -1,9 +1,8 @@ -use crate::compressible::is_content_compressible; // Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. +use crate::compressible::is_content_compressible; use crate::extract_network_stream; use crate::network_buffered_stream::NetworkStreamPrefixCheck; use crate::request_body::HttpRequestBody; -use crate::request_properties::DefaultHttpRequestProperties; use crate::request_properties::HttpConnectionProperties; use crate::request_properties::HttpListenProperties; use crate::request_properties::HttpPropertyExtractor; @@ -375,12 +374,15 @@ pub fn op_http_set_promise_complete(index: u32, status: u16) { } #[op] -pub fn op_http_get_request_method_and_url( +pub fn op_http_get_request_method_and_url( index: u32, -) -> (String, Option, String, String, Option) { +) -> (String, Option, String, String, Option) +where + HTTP: HttpPropertyExtractor, +{ // TODO(mmastrac): Passing method can be optimized with_http(index, |http| { - let request_properties = DefaultHttpRequestProperties::request_properties( + let request_properties = HTTP::request_properties( &http.request_info, &http.request_parts.uri, &http.request_parts.headers, @@ -825,12 +827,15 @@ fn serve_http( spawn_local(serve_http2_autodetect(io, svc).try_or_cancel(cancel)) } -fn serve_http_on( +fn serve_http_on( network_stream: NetworkStream, listen_properties: &HttpListenProperties, cancel: Rc, tx: tokio::sync::mpsc::Sender, -) -> JoinHandle> { +) -> JoinHandle> +where + HTTP: HttpPropertyExtractor, +{ // We always want some sort of peer address. If we can't get one, just make up one. let peer_address = network_stream.peer_address().unwrap_or_else(|_| { NetworkStreamAddress::Ip(SocketAddr::V4(SocketAddrV4::new( @@ -839,10 +844,7 @@ fn serve_http_on( ))) }); let connection_properties: HttpConnectionProperties = - DefaultHttpRequestProperties::connection_properties( - listen_properties, - &peer_address, - ); + HTTP::connection_properties(listen_properties, &peer_address); match network_stream { NetworkStream::Tcp(conn) => { @@ -889,21 +891,21 @@ impl Drop for HttpJoinHandle { } #[op(v8)] -pub fn op_http_serve( +pub fn op_http_serve( state: Rc>, listener_rid: ResourceId, -) -> Result<(ResourceId, &'static str, String), AnyError> { - let listener = - DefaultHttpRequestProperties::get_network_stream_listener_for_rid( - &mut state.borrow_mut(), - listener_rid, - )?; +) -> Result<(ResourceId, &'static str, String), AnyError> +where + HTTP: HttpPropertyExtractor, +{ + let listener = HTTP::get_network_stream_listener_for_rid( + &mut state.borrow_mut(), + listener_rid, + )?; let local_address = listener.listen_address()?; - let listen_properties = DefaultHttpRequestProperties::listen_properties( - listener.stream(), - &local_address, - ); + let listen_properties = + HTTP::listen_properties(listener.stream(), &local_address); let (tx, rx) = tokio::sync::mpsc::channel(10); let resource: Rc = Rc::new(HttpJoinHandle( @@ -920,7 +922,7 @@ pub fn op_http_serve( .accept() .try_or_cancel(cancel_clone.clone()) .await?; - serve_http_on( + serve_http_on::( conn, &listen_properties_clone, cancel_clone.clone(), @@ -944,21 +946,19 @@ pub fn op_http_serve( } #[op(v8)] -pub fn op_http_serve_on( +pub fn op_http_serve_on( state: Rc>, conn: ResourceId, -) -> Result<(ResourceId, &'static str, String), AnyError> { +) -> Result<(ResourceId, &'static str, String), AnyError> +where + HTTP: HttpPropertyExtractor, +{ let network_stream: NetworkStream = - DefaultHttpRequestProperties::get_network_stream_for_rid( - &mut state.borrow_mut(), - conn, - )?; + HTTP::get_network_stream_for_rid(&mut state.borrow_mut(), conn)?; let local_address = network_stream.local_address()?; - let listen_properties = DefaultHttpRequestProperties::listen_properties( - network_stream.stream(), - &local_address, - ); + let listen_properties = + HTTP::listen_properties(network_stream.stream(), &local_address); let (tx, rx) = tokio::sync::mpsc::channel(10); let resource: Rc = Rc::new(HttpJoinHandle( @@ -967,12 +967,13 @@ pub fn op_http_serve_on( AsyncRefCell::new(rx), )); - let handle: JoinHandle> = serve_http_on( - network_stream, - &listen_properties, - resource.cancel_handle(), - tx, - ); + let handle: JoinHandle> = + serve_http_on::( + network_stream, + &listen_properties, + resource.cancel_handle(), + tx, + ); // Set the handle after we start the future *RcRef::map(&resource, |this| &this.0) diff --git a/ext/http/lib.rs b/ext/http/lib.rs index 6dab375a1a..3eb5c89c0a 100644 --- a/ext/http/lib.rs +++ b/ext/http/lib.rs @@ -73,6 +73,7 @@ use tokio::task::spawn_local; use crate::network_buffered_stream::NetworkBufferedStream; use crate::reader_stream::ExternallyAbortableReaderStream; use crate::reader_stream::ShutdownHandle; +use crate::request_properties::HttpPropertyExtractor; pub mod compressible; mod http_next; @@ -83,9 +84,12 @@ mod request_properties; mod response_body; mod websocket_upgrade; +pub use request_properties::DefaultHttpPropertyExtractor; + deno_core::extension!( deno_http, deps = [deno_web, deno_net, deno_fetch, deno_websocket], + parameters = [ HTTP: HttpPropertyExtractor ], ops = [ op_http_accept, op_http_headers, @@ -97,10 +101,10 @@ deno_core::extension!( op_http_write, http_next::op_http_get_request_header, http_next::op_http_get_request_headers, - http_next::op_http_get_request_method_and_url, + http_next::op_http_get_request_method_and_url, http_next::op_http_read_request_body, - http_next::op_http_serve_on, - http_next::op_http_serve, + http_next::op_http_serve_on, + http_next::op_http_serve, http_next::op_http_set_promise_complete, http_next::op_http_set_response_body_bytes, http_next::op_http_set_response_body_resource, diff --git a/ext/http/request_properties.rs b/ext/http/request_properties.rs index 7a7f5219c0..9c0c0e8152 100644 --- a/ext/http/request_properties.rs +++ b/ext/http/request_properties.rs @@ -70,9 +70,9 @@ pub trait HttpPropertyExtractor { ) -> HttpRequestProperties; } -pub struct DefaultHttpRequestProperties {} +pub struct DefaultHttpPropertyExtractor {} -impl HttpPropertyExtractor for DefaultHttpRequestProperties { +impl HttpPropertyExtractor for DefaultHttpPropertyExtractor { fn get_network_stream_for_rid( state: &mut OpState, rid: ResourceId, diff --git a/runtime/build.rs b/runtime/build.rs index 18aaf7a7f0..412257f122 100644 --- a/runtime/build.rs +++ b/runtime/build.rs @@ -18,6 +18,7 @@ mod startup_snapshot { use deno_core::Extension; use deno_core::ExtensionFileSource; use deno_core::ModuleCode; + use deno_http::DefaultHttpPropertyExtractor; use std::path::Path; fn transpile_ts_for_snapshotting( @@ -319,7 +320,7 @@ mod startup_snapshot { false, // No --unstable ), deno_napi::deno_napi::init_ops_and_esm::(), - deno_http::deno_http::init_ops_and_esm(), + deno_http::deno_http::init_ops_and_esm::(), deno_io::deno_io::init_ops_and_esm(Default::default()), deno_fs::deno_fs::init_ops_and_esm::(false, fs.clone()), runtime::init_ops_and_esm(), diff --git a/runtime/web_worker.rs b/runtime/web_worker.rs index 6487239f8b..d8c881ab7c 100644 --- a/runtime/web_worker.rs +++ b/runtime/web_worker.rs @@ -35,6 +35,7 @@ use deno_core::SharedArrayBufferStore; use deno_core::Snapshot; use deno_core::SourceMapGetter; use deno_fs::FileSystem; +use deno_http::DefaultHttpPropertyExtractor; use deno_io::Stdio; use deno_kv::sqlite::SqliteDbHandler; use deno_tls::RootCertStoreProvider; @@ -439,7 +440,7 @@ impl WebWorker { unstable, ), deno_napi::deno_napi::init_ops::(), - deno_http::deno_http::init_ops(), + deno_http::deno_http::init_ops::(), deno_io::deno_io::init_ops(Some(options.stdio)), deno_fs::deno_fs::init_ops::( unstable, diff --git a/runtime/worker.rs b/runtime/worker.rs index 77f16553b6..ae6bd717f6 100644 --- a/runtime/worker.rs +++ b/runtime/worker.rs @@ -31,6 +31,7 @@ use deno_core::SharedArrayBufferStore; use deno_core::Snapshot; use deno_core::SourceMapGetter; use deno_fs::FileSystem; +use deno_http::DefaultHttpPropertyExtractor; use deno_io::Stdio; use deno_kv::sqlite::SqliteDbHandler; use deno_tls::RootCertStoreProvider; @@ -264,7 +265,7 @@ impl MainWorker { unstable, ), deno_napi::deno_napi::init_ops::(), - deno_http::deno_http::init_ops(), + deno_http::deno_http::init_ops::(), deno_io::deno_io::init_ops(Some(options.stdio)), deno_fs::deno_fs::init_ops::( unstable,