diff options
author | Luca Casonato <hello@lcas.dev> | 2021-07-12 12:44:49 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-12 12:44:49 +0200 |
commit | f649960f87a408124b5b0d6f55f3be7f5724a4e7 (patch) | |
tree | 0a303a918828f602623c64c50a912645df55b772 /runtime/ops/http.rs | |
parent | 6460eadaa178b3a9d09d04205977e4f659fe8fff (diff) |
refactor: deno_http op crate (#11335)
Diffstat (limited to 'runtime/ops/http.rs')
-rw-r--r-- | runtime/ops/http.rs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/runtime/ops/http.rs b/runtime/ops/http.rs new file mode 100644 index 000000000..5b156fc11 --- /dev/null +++ b/runtime/ops/http.rs @@ -0,0 +1,48 @@ +use std::rc::Rc; + +use deno_core::error::bad_resource_id; +use deno_core::error::AnyError; +use deno_core::op_sync; +use deno_core::Extension; +use deno_core::OpState; +use deno_core::ResourceId; +use deno_net::io::TcpStreamResource; +use deno_net::io::TlsStreamResource; + +pub fn init() -> Extension { + Extension::builder() + .ops(vec![("op_http_start", op_sync(op_http_start))]) + .build() +} + +fn op_http_start( + state: &mut OpState, + tcp_stream_rid: ResourceId, + _: (), +) -> Result<ResourceId, AnyError> { + if let Some(resource_rc) = state + .resource_table + .take::<TcpStreamResource>(tcp_stream_rid) + { + let resource = Rc::try_unwrap(resource_rc) + .expect("Only a single use of this resource should happen"); + let (read_half, write_half) = resource.into_inner(); + let tcp_stream = read_half.reunite(write_half)?; + let addr = tcp_stream.local_addr()?; + return deno_http::start_http(state, tcp_stream, addr, "http"); + } + + if let Some(resource_rc) = state + .resource_table + .take::<TlsStreamResource>(tcp_stream_rid) + { + let resource = Rc::try_unwrap(resource_rc) + .expect("Only a single use of this resource should happen"); + let (read_half, write_half) = resource.into_inner(); + let tls_stream = read_half.reunite(write_half); + let addr = tls_stream.get_ref().0.local_addr()?; + return deno_http::start_http(state, tls_stream, addr, "https"); + } + + Err(bad_resource_id()) +} |