ferron/util/
fcgi_record.rs1pub fn construct_fastcgi_record(record_type: u8, request_id: u16, content: &[u8]) -> Vec<u8> {
2 let mut record = Vec::new();
3
4 record.push(1);
6
7 record.extend_from_slice(&(record_type.to_be_bytes()));
9
10 record.extend_from_slice(&(request_id.to_be_bytes()));
12
13 let content_length = content.len() as u16;
15 record.extend_from_slice(&(content_length.to_be_bytes()));
16
17 let content_length_modulo = (content_length % 8) as u8;
19 let padding_length = match content_length_modulo {
20 0 => 0,
21 _ => 8 - content_length_modulo,
22 };
23 record.extend_from_slice(&(padding_length.to_be_bytes()));
24
25 record.push(0);
27
28 record.extend_from_slice(content);
30
31 record.append(&mut vec![0u8; padding_length as usize]);
33
34 record
35}
36
37#[cfg(test)]
38mod tests {
39 use super::*;
40
41 #[test]
42 fn test_construct_fastcgi_record() {
43 let record_type = 1;
45 let request_id = 1234;
46 let content: &[u8] = &[];
47 let expected_record = vec![
48 1, 1, 4, 210, 0, 0, 0, 0, ];
55 assert_eq!(
56 construct_fastcgi_record(record_type, request_id, content),
57 expected_record
58 );
59
60 let record_type = 2;
62 let request_id = 5678;
63 let content = b"Hello";
64 let expected_record = vec![
65 1, 2, 22, 46, 0, 5, 3, 0, 72, 101, 108, 108, 111, 0, 0, 0, ];
74 assert_eq!(
75 construct_fastcgi_record(record_type, request_id, content),
76 expected_record
77 );
78
79 let record_type = 3;
81 let request_id = 9012;
82 let content = b"12345678";
83 let expected_record = vec![
84 1, 3, 35, 52, 0, 8, 0, 0, 49, 50, 51, 52, 53, 54, 55, 56, ];
92 assert_eq!(
93 construct_fastcgi_record(record_type, request_id, content),
94 expected_record
95 );
96 }
97}