ferron/util/
fcgi_name_value_pair.rs1pub fn construct_fastcgi_name_value_pair(name: &[u8], value: &[u8]) -> Vec<u8> {
2 let mut name_value_pair = Vec::new();
3
4 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 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_value_pair.extend_from_slice(name);
22
23 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, 0x09, b'H', b'O', b'S', b'T', b'l', b'o', b'c', b'a', b'l', b'h', b'o', b's', b't', ];
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]; let value = vec![b'V'; 135]; let mut expected = vec![
51 0x80, 0x00, 0x00, 0x82, 0x80, 0x00, 0x00, 0x87, ];
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, 0x00, ];
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, 0x05, ];
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, 0x7f, ];
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}