Spaces:
Runtime error
Runtime error
| 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 | |
| } | |
| mod tests { | |
| use super::*; | |
| 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); | |
| } | |
| 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); | |
| } | |
| 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); | |
| } | |
| 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); | |
| } | |
| 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); | |
| } | |
| } | |