diff --git a/src/main.rs b/src/main.rs index f8dd4c7..4d867ba 100644 --- a/src/main.rs +++ b/src/main.rs @@ -288,22 +288,31 @@ impl RequestHandle { let mut len = 0; // Read until CRLF, end-of-stream, or there's no buffer space left. - loop { - let bytes_read = self - .stream - .read(buf) - .await - .or(Err((59, "Request ended unexpectedly")))?; + // + // Since neither CR nor LF can be part of a URI according to + // ISOC-RFC 3986, we could use BufRead::read_line here, but that does + // not allow us to cap the number of read bytes at 1024+2. + let result = loop { + let bytes_read = if let Ok(read) = self.stream.read(buf).await { + read + } else { + break Err((59, "Request ended unexpectedly")); + }; len += bytes_read; if request[..len].ends_with(b"\r\n") { - break; + break Ok(()); } else if bytes_read == 0 { - return Err((59, "Request ended unexpectedly")); + break Err((59, "Request ended unexpectedly")); } buf = &mut request[len..]; } - let request = - std::str::from_utf8(&request[..len - 2]).or(Err((59, "Non-UTF-8 request")))?; + .and_then(|()| std::str::from_utf8(&request[..len - 2]).or(Err((59, "Non-UTF-8 request")))); + + let request = result.map_err(|e| { + // write empty request to log line for uniformity + write!(self.log_line, " \"\"").unwrap(); + e + })?; // log literal request (might be different from or not an actual URL) write!(self.log_line, " \"{}\"", request).unwrap();