ferron/util/
fcgi_name_value_pair.rs

1pub fn construct_fastcgi_name_value_pair(name: &[u8], value: &[u8]) -> Vec<u8> {
2  let mut name_value_pair = Vec::new();
3
4  // Name length
5  let name_length = name.len();
6  if name_length < 128 {
7    name_value_pair.extend_from_slice(&(name_length as u8).to_be_bytes());
8  } else {
9    name_value_pair.extend_from_slice(&((name_length as u32) | 0x80000000).to_be_bytes());
10  }
11
12  // Value length
13  let value_length = value.len();
14  if value_length < 128 {
15    name_value_pair.extend_from_slice(&(value_length as u8).to_be_bytes());
16  } else {
17    name_value_pair.extend_from_slice(&((value_length as u32) | 0x80000000).to_be_bytes());
18  }
19
20  // Name
21  name_value_pair.extend_from_slice(name);
22
23  // Value
24  name_value_pair.extend_from_slice(value);
25
26  name_value_pair
27}
28
29#[cfg(test)]
30mod tests {
31  use super::*;
32
33  #[test]
34  fn test_short_name_and_value() {
35    let name = b"HOST";
36    let value = b"localhost";
37    let expected = vec![
38      0x04, // Name length (4 bytes)
39      0x09, // Value length (9 bytes)
40      b'H', b'O', b'S', b'T', // Name
41      b'l', b'o', b'c', b'a', b'l', b'h', b'o', b's', b't', // Value
42    ];
43    assert_eq!(construct_fastcgi_name_value_pair(name, value), expected);
44  }
45
46  #[test]
47  fn test_long_name_and_value() {
48    let name = vec![b'N'; 130]; // Name length 130
49    let value = vec![b'V'; 135]; // Value length 135
50    let mut expected = vec![
51      0x80, 0x00, 0x00, 0x82, // Name length (130 bytes)
52      0x80, 0x00, 0x00, 0x87, // Value length (135 bytes)
53    ];
54    expected.extend_from_slice(&name);
55    expected.extend_from_slice(&value);
56    assert_eq!(construct_fastcgi_name_value_pair(&name, &value), expected);
57  }
58
59  #[test]
60  fn test_empty_name_and_value() {
61    let name = b"";
62    let value = b"";
63    let expected = vec![
64      0x00, // Name length (0 bytes)
65      0x00, // Value length (0 bytes)
66    ];
67    assert_eq!(construct_fastcgi_name_value_pair(name, value), expected);
68  }
69
70  #[test]
71  fn test_name_length_127() {
72    let name = vec![b'a'; 127];
73    let value = b"value";
74    let mut expected = vec![
75      0x7f, // Name length (127 bytes)
76      0x05, // Value length (5 bytes)
77    ];
78    expected.extend_from_slice(&name);
79    expected.extend_from_slice(value);
80    assert_eq!(construct_fastcgi_name_value_pair(&name, value), expected);
81  }
82
83  #[test]
84  fn test_value_length_127() {
85    let name = b"name";
86    let value = vec![b'b'; 127];
87    let mut expected = vec![
88      0x04, // Name length (4 bytes)
89      0x7f, // Value length (127 bytes)
90    ];
91    expected.extend_from_slice(name);
92    expected.extend_from_slice(&value);
93    assert_eq!(construct_fastcgi_name_value_pair(name, &value), expected);
94  }
95}