@@ -288,6 +288,44 @@ mod tests {
288288 use std:: thread;
289289 use tempfile:: tempdir;
290290
291+ fn read_http_request ( stream : & mut impl Read ) -> String {
292+ let mut request = Vec :: new ( ) ;
293+ let mut chunk = [ 0_u8 ; 1024 ] ;
294+ let mut header_end = None ;
295+ let mut content_length = None ;
296+
297+ loop {
298+ let n = stream. read ( & mut chunk) . unwrap ( ) ;
299+ assert ! ( n > 0 , "client closed before request body was fully read" ) ;
300+ request. extend_from_slice ( & chunk[ ..n] ) ;
301+
302+ if header_end. is_none ( )
303+ && let Some ( pos) = request. windows ( 4 ) . position ( |window| window == b"\r \n \r \n " )
304+ {
305+ let end = pos + 4 ;
306+ header_end = Some ( end) ;
307+ let headers = String :: from_utf8_lossy ( & request[ ..end] ) ;
308+ content_length = Some (
309+ headers
310+ . lines ( )
311+ . find_map ( |line| {
312+ let ( name, value) = line. split_once ( ':' ) ?;
313+ name. eq_ignore_ascii_case ( "Content-Length" )
314+ . then ( || value. trim ( ) . parse :: < usize > ( ) . ok ( ) )
315+ . flatten ( )
316+ } )
317+ . unwrap_or ( 0 ) ,
318+ ) ;
319+ }
320+
321+ if let ( Some ( end) , Some ( len) ) = ( header_end, content_length)
322+ && request. len ( ) >= end + len
323+ {
324+ return String :: from_utf8 ( request) . unwrap ( ) ;
325+ }
326+ }
327+ }
328+
291329 #[ test]
292330 fn ts13_is_13_digits ( ) {
293331 let s = ts13 ( ) ;
@@ -372,9 +410,7 @@ mod tests {
372410 let addr = listener. local_addr ( ) . unwrap ( ) ;
373411 let handle = thread:: spawn ( move || {
374412 let ( mut stream, _) = listener. accept ( ) . unwrap ( ) ;
375- let mut buf = [ 0_u8 ; 4096 ] ;
376- let n = stream. read ( & mut buf) . unwrap ( ) ;
377- let request = String :: from_utf8_lossy ( & buf[ ..n] ) ;
413+ let request = read_http_request ( & mut stream) ;
378414 assert ! ( request. contains( "POST /api/hooks/execute HTTP/1.1" ) ) ;
379415 assert ! ( request. contains( "X-Gobby-Session-Id: s" ) ) ;
380416 assert ! ( request. contains( "\" hook_type\" :\" SessionStart\" " ) ) ;
@@ -420,8 +456,7 @@ mod tests {
420456 let addr = listener. local_addr ( ) . unwrap ( ) ;
421457 let handle = thread:: spawn ( move || {
422458 let ( mut stream, _) = listener. accept ( ) . unwrap ( ) ;
423- let mut buf = [ 0_u8 ; 4096 ] ;
424- let _ = stream. read ( & mut buf) ;
459+ let _ = read_http_request ( & mut stream) ;
425460 stream
426461 . write_all (
427462 b"HTTP/1.1 500 Internal Server Error\r \n Content-Type: text/plain\r \n Content-Length: 4\r \n \r \n nope" ,
0 commit comments