pub const CRLF: &[u8] = b"\r\n";
pub const CRLF_LEN: usize = CRLF.len();
pub const DOUBLE_CRLF: &[u8] = b"\r\n\r\n";
pub const DOUBLE_CRLF_LEN: usize = DOUBLE_CRLF.len();
pub const CHUNKED_END_MARKER: &[u8] = b"0\r\n\r\n";
pub const HTTP_VERSION: &str = "HTTP/1.1";
pub const HTTP_VERSION_LINE_SUFFIX: &str = " HTTP/1.1\r\n";
pub const DEFAULT_HTTP_PORT: u16 = 80;
pub const DEFAULT_HTTPS_PORT: u16 = 443;
pub const TRANSFER_ENCODING: &str = "Transfer-Encoding";
pub const CHUNKED: &str = "chunked";
pub const MAX_HEADERS: usize = 16;
pub const MAX_URL_PARTS: usize = 8;
#[must_use]
pub fn find_double_crlf(data: &[u8]) -> Option<usize> {
data.windows(DOUBLE_CRLF_LEN).position(|w| w == DOUBLE_CRLF)
}
#[must_use]
pub fn find_crlf(data: &[u8]) -> Option<usize> {
data.windows(CRLF_LEN).position(|w| w == CRLF)
}
#[must_use]
pub fn find_header_value<'a>(headers_str: &'a str, target_name: &str) -> Option<&'a str> {
for line in headers_str.split("\r\n") {
if let Some(colon_pos) = line.find(':') {
let name = line[..colon_pos].trim();
let value = line[colon_pos + 1..].trim();
if name.eq_ignore_ascii_case(target_name) {
return Some(value);
}
}
}
None
}