tiny_http/util/
mod.rs
1pub use self::custom_stream::CustomStream;
2pub use self::equal_reader::EqualReader;
3pub use self::fused_reader::FusedReader;
4pub use self::messages_queue::MessagesQueue;
5pub use self::refined_tcp_stream::RefinedTcpStream;
6pub use self::sequential::{SequentialReader, SequentialReaderBuilder};
7pub use self::sequential::{SequentialWriter, SequentialWriterBuilder};
8pub use self::task_pool::TaskPool;
9
10use std::str::FromStr;
11
12mod custom_stream;
13mod equal_reader;
14mod fused_reader;
15mod messages_queue;
16pub(crate) mod refined_tcp_stream;
17mod sequential;
18mod task_pool;
19
20pub fn parse_header_value(input: &str) -> Vec<(&str, f32)> {
26 input
27 .split(',')
28 .filter_map(|elem| {
29 let mut params = elem.split(';');
30
31 let t = params.next()?;
32
33 let mut value = 1.0_f32;
34
35 for p in params {
36 if p.trim_start().starts_with("q=") {
37 if let Ok(val) = f32::from_str(p.trim_start()[2..].trim()) {
38 value = val;
39 break;
40 }
41 }
42 }
43
44 Some((t.trim(), value))
45 })
46 .collect()
47}
48
49#[cfg(test)]
50mod test {
51 #[test]
52 #[allow(clippy::float_cmp)]
53 fn test_parse_header() {
54 let result = super::parse_header_value("text/html, text/plain; q=1.5 , image/png ; q=2.0");
55
56 assert_eq!(result.len(), 3);
57 assert_eq!(result[0].0, "text/html");
58 assert_eq!(result[0].1, 1.0);
59 assert_eq!(result[1].0, "text/plain");
60 assert_eq!(result[1].1, 1.5);
61 assert_eq!(result[2].0, "image/png");
62 assert_eq!(result[2].1, 2.0);
63 }
64}