pub const CRLF: &[u8] = b"\r\n";
pub const CRLF_STR: &str = "\r\n";
pub const CRLF_LEN: usize = CRLF.len();
pub const DOUBLE_CRLF: &[u8] = b"\r\n\r\n";
pub const DOUBLE_CRLF_STR: &str = "\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_PREFIX: &[u8] = b"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 HEADER_SEPARATOR: &str = ": ";
pub const CONNECTION_CLOSE_END: &str = "Connection: close\r\n\r\n";
pub const MAX_HEADERS: usize = 16;
#[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(CRLF_STR) {
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
}