diff options
author | Divy Srivastava <dj.srivastava23@gmail.com> | 2022-08-19 10:14:56 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-19 10:14:56 +0530 |
commit | 8bdcec1c84636aa00bf7444539e68b49d79b1fbf (patch) | |
tree | 77fb6ea2aadda9b50a839ac858f0a11073c06521 /ext/flash/request.rs | |
parent | cd21cff29942f24ba7d38287186cce64d0e84e56 (diff) |
fix(ext/flash): concurrent response streams (#15493)
Diffstat (limited to 'ext/flash/request.rs')
-rw-r--r-- | ext/flash/request.rs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/ext/flash/request.rs b/ext/flash/request.rs new file mode 100644 index 000000000..0736b5620 --- /dev/null +++ b/ext/flash/request.rs @@ -0,0 +1,49 @@ +// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license. + +use crate::Stream; +use std::pin::Pin; + +#[derive(Debug)] +pub struct InnerRequest { + /// Backing buffer for the request. + pub buffer: Pin<Box<[u8]>>, + /// Owned headers, we have to keep it around since its referenced in `req`. + pub _headers: Vec<httparse::Header<'static>>, + /// Fully parsed request. + pub req: httparse::Request<'static, 'static>, + pub body_offset: usize, + pub body_len: usize, +} + +#[derive(Debug)] +pub struct Request { + pub inner: InnerRequest, + // Pointer to stream owned by the server loop thread. + // + // Dereferencing is safe until server thread finishes and + // op_flash_serve resolves or websocket upgrade is performed. + pub socket: *mut Stream, + pub keep_alive: bool, + pub content_read: usize, + pub content_length: Option<u64>, + pub remaining_chunk_size: Option<usize>, + pub te_chunked: bool, + pub expect_continue: bool, +} + +// SAFETY: Sent from server thread to JS thread. +// See comment above for `socket`. +unsafe impl Send for Request {} + +impl Request { + #[inline(always)] + pub fn socket<'a>(&self) -> &'a mut Stream { + // SAFETY: Dereferencing is safe until server thread detaches socket or finishes. + unsafe { &mut *self.socket } + } + + #[inline(always)] + pub fn method(&self) -> &str { + self.inner.req.method.unwrap() + } +} |