web / ferron /src /util /fcgi_name_value_pair.rs
victorgeek's picture
Upload folder using huggingface_hub
9552aa0 verified
pub fn construct_fastcgi_name_value_pair(name: &[u8], value: &[u8]) -> Vec<u8> {
let mut name_value_pair = Vec::new();
// Name length
let name_length = name.len();
if name_length < 128 {
name_value_pair.extend_from_slice(&(name_length as u8).to_be_bytes());
} else {
name_value_pair.extend_from_slice(&((name_length as u32) | 0x80000000).to_be_bytes());
}
// Value length
let value_length = value.len();
if value_length < 128 {
name_value_pair.extend_from_slice(&(value_length as u8).to_be_bytes());
} else {
name_value_pair.extend_from_slice(&((value_length as u32) | 0x80000000).to_be_bytes());
}
// Name
name_value_pair.extend_from_slice(name);
// Value
name_value_pair.extend_from_slice(value);
name_value_pair
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_short_name_and_value() {
let name = b"HOST";
let value = b"localhost";
let expected = vec![
0x04, // Name length (4 bytes)
0x09, // Value length (9 bytes)
b'H', b'O', b'S', b'T', // Name
b'l', b'o', b'c', b'a', b'l', b'h', b'o', b's', b't', // Value
];
assert_eq!(construct_fastcgi_name_value_pair(name, value), expected);
}
#[test]
fn test_long_name_and_value() {
let name = vec![b'N'; 130]; // Name length 130
let value = vec![b'V'; 135]; // Value length 135
let mut expected = vec![
0x80, 0x00, 0x00, 0x82, // Name length (130 bytes)
0x80, 0x00, 0x00, 0x87, // Value length (135 bytes)
];
expected.extend_from_slice(&name);
expected.extend_from_slice(&value);
assert_eq!(construct_fastcgi_name_value_pair(&name, &value), expected);
}
#[test]
fn test_empty_name_and_value() {
let name = b"";
let value = b"";
let expected = vec![
0x00, // Name length (0 bytes)
0x00, // Value length (0 bytes)
];
assert_eq!(construct_fastcgi_name_value_pair(name, value), expected);
}
#[test]
fn test_name_length_127() {
let name = vec![b'a'; 127];
let value = b"value";
let mut expected = vec![
0x7f, // Name length (127 bytes)
0x05, // Value length (5 bytes)
];
expected.extend_from_slice(&name);
expected.extend_from_slice(value);
assert_eq!(construct_fastcgi_name_value_pair(&name, value), expected);
}
#[test]
fn test_value_length_127() {
let name = b"name";
let value = vec![b'b'; 127];
let mut expected = vec![
0x04, // Name length (4 bytes)
0x7f, // Value length (127 bytes)
];
expected.extend_from_slice(name);
expected.extend_from_slice(&value);
assert_eq!(construct_fastcgi_name_value_pair(name, &value), expected);
}
}