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