in src/connection.rs [205:255]
fn parse_request_line(
&mut self,
start: &mut usize,
end: usize,
) -> Result<bool, ConnectionError> {
if end < *start {
return Err(ConnectionError::ParseError(RequestError::Underflow));
}
if end > self.buffer.len() {
return Err(ConnectionError::ParseError(RequestError::Overflow));
}
// The slice access is safe because `end` is checked to be smaller than the buffer size
// and larger than `start`.
match find(&self.buffer[*start..end], &[CR, LF]) {
Some(line_end_index) => {
// The unchecked addition `start + line_end_index` is safe because `line_end_index`
// is returned by `find` and thus guaranteed to be in-bounds. This also makes the
// slice access safe.
let line = &self.buffer[*start..(*start + line_end_index)];
// The unchecked addition is safe because of the previous `find()`.
*start = *start + line_end_index + CRLF_LEN;
// Form the request with a valid request line, which is the bare minimum
// for a valid request.
self.pending_request = Some(Request {
request_line: RequestLine::try_from(line)
.map_err(ConnectionError::ParseError)?,
headers: Headers::default(),
body: None,
files: Vec::new(),
});
self.state = ConnectionState::WaitingForHeaders;
Ok(true)
}
None => {
// The request line is longer than BUFFER_SIZE bytes, so the request is invalid.
if end == BUFFER_SIZE && *start == 0 {
return Err(ConnectionError::ParseError(RequestError::InvalidRequest));
} else {
// Move the incomplete request line to the beginning of the buffer and wait
// for the next `try_read` call to complete it.
// This can only happen if another request was sent before this one, as the
// limit for the length of a request line in this implementation is 1024 bytes.
self.shift_buffer_left(*start, end)
.map_err(ConnectionError::ParseError)?;
}
Ok(false)
}
}
}