summaryrefslogtreecommitdiff
path: root/runtime/ops/http.rs
diff options
context:
space:
mode:
authorLuca Casonato <hello@lcas.dev>2021-07-12 12:44:49 +0200
committerGitHub <noreply@github.com>2021-07-12 12:44:49 +0200
commitf649960f87a408124b5b0d6f55f3be7f5724a4e7 (patch)
tree0a303a918828f602623c64c50a912645df55b772 /runtime/ops/http.rs
parent6460eadaa178b3a9d09d04205977e4f659fe8fff (diff)
refactor: deno_http op crate (#11335)
Diffstat (limited to 'runtime/ops/http.rs')
-rw-r--r--runtime/ops/http.rs48
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())
+}