// Copyright 2018-2023 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>, /// Owned headers, we have to keep it around since its referenced in `req`. pub _headers: Vec>, /// 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, pub remaining_chunk_size: Option, 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() } }