Skip to content

Commit 591cf10

Browse files
committed
[gobby-cli-#126] test(ghook): fix partial request read in transport tests
1 parent afcbf37 commit 591cf10

1 file changed

Lines changed: 40 additions & 5 deletions

File tree

crates/ghook/src/transport.rs

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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\nContent-Type: text/plain\r\nContent-Length: 4\r\n\r\nnope",

0 commit comments

Comments
 (0)