diff options
Diffstat (limited to 'ext/http/http_next.rs')
-rw-r--r-- | ext/http/http_next.rs | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/ext/http/http_next.rs b/ext/http/http_next.rs index 60ef83b0f..17e9befe2 100644 --- a/ext/http/http_next.rs +++ b/ext/http/http_next.rs @@ -14,6 +14,7 @@ use crate::slab::slab_drop; use crate::slab::slab_get; use crate::slab::slab_init; use crate::slab::slab_insert; +use crate::slab::HttpRequestBodyAutocloser; use crate::slab::SlabId; use crate::websocket_upgrade::WebSocketUpgrade; use crate::LocalExecutor; @@ -376,13 +377,20 @@ pub fn op_http_get_request_headers<'scope>( #[op(fast)] pub fn op_http_read_request_body( - state: &mut OpState, + state: Rc<RefCell<OpState>>, slab_id: SlabId, ) -> ResourceId { let mut http = slab_get(slab_id); - let incoming = http.take_body(); - let body_resource = Rc::new(HttpRequestBody::new(incoming)); - state.resource_table.add_rc(body_resource) + let rid = if let Some(incoming) = http.take_body() { + let body_resource = Rc::new(HttpRequestBody::new(incoming)); + state.borrow_mut().resource_table.add_rc(body_resource) + } else { + // This should not be possible, but rather than panicking we'll return an invalid + // resource value to JavaScript. + ResourceId::MAX + }; + http.put_resource(HttpRequestBodyAutocloser::new(rid, state.clone())); + rid } #[op2(fast)] @@ -577,6 +585,7 @@ fn set_response( response_fn: impl FnOnce(Compression) -> ResponseBytesInner, ) { let mut http = slab_get(slab_id); + let resource = http.take_resource(); let compression = is_request_compressible(&http.request_parts().headers); let response = http.response(); let compression = modify_compressibility_from_response( @@ -584,7 +593,9 @@ fn set_response( length, response.headers_mut(), ); - response.body_mut().initialize(response_fn(compression)); + response + .body_mut() + .initialize(response_fn(compression), resource); // The Javascript code should never provide a status that is invalid here (see 23_response.js), so we // will quitely ignore invalid values. |