1use http_encoding_headers::{
9 AcceptEncodingDecodeError, AcceptEncodingEncodeError, ContentEncoding, Encoding,
10 decode_header_value, encode_header_value,
11};
12
13#[cfg(feature = "http_crates")]
14use headers::Header;
15#[cfg(feature = "http_crates")]
16use http::HeaderValue;
17
18fn main() {
19 println!("=== Encoding and Decoding Examples ===\n");
20
21 accept_encoding_encode_decode_examples();
23
24 content_encoding_examples();
26
27 error_handling_examples();
29}
30
31fn accept_encoding_encode_decode_examples() {
32 println!("1. Accept-Encoding Encode/Decode");
33 println!("=================================");
34
35 println!("\n1a. Basic encoding:");
37 let encodings = vec![
38 (Encoding::Gzip, 1.0),
39 (Encoding::Deflate, 0.8),
40 (Encoding::Br, 0.6),
41 ];
42
43 match encode_header_value(&encodings) {
44 Ok(encoded) => println!(" Encoded: {}", encoded),
45 Err(e) => println!(" Error: {}", e),
46 }
47
48 println!("\n1b. Quality value formatting:");
50 let encodings_with_various_qualities = vec![
51 (Encoding::Gzip, 1.0), (Encoding::Deflate, 0.500), (Encoding::Br, 0.123), (Encoding::Identity, 0.100), ];
56
57 match encode_header_value(&encodings_with_various_qualities) {
58 Ok(encoded) => {
59 println!(" Input qualities: [1.0, 0.500, 0.123, 0.100]");
60 println!(" Encoded: {}", encoded);
61 println!(" (Note: q=1.0 omitted, trailing zeros trimmed)");
62 }
63 Err(e) => println!(" Error: {}", e),
64 }
65
66 println!("\n1c. Basic decoding:");
68 let header_values = vec![
69 "gzip",
70 "gzip, deflate",
71 "gzip, deflate;q=0.8, br;q=0.6",
72 "br;q=1.0, gzip;q=0.8, deflate;q=0.5, *;q=0.1",
73 ];
74
75 for header in header_values {
76 println!(" Decoding: \"{}\"", header);
77 match decode_header_value(header) {
78 Ok(parsed) => {
79 println!(" Result:");
80 for (encoding, quality) in parsed {
81 println!(" {} (q={})", encoding, quality);
82 }
83 }
84 Err(e) => println!(" Error: {}", e),
85 }
86 println!();
87 }
88
89 println!("1d. Round-trip encoding/decoding:");
91 let original = vec![
92 (Encoding::Gzip, 1.0),
93 (Encoding::Deflate, 0.8),
94 (Encoding::Custom("custom-encoding".to_string()), 0.5),
95 ];
96
97 println!(" Original: {:?}", original);
98
99 if let Ok(encoded) = encode_header_value(&original) {
100 println!(" Encoded: {}", encoded);
101
102 if let Ok(decoded) = decode_header_value(&encoded) {
103 println!(" Decoded: {:?}", decoded);
104
105 let matches = original.len() == decoded.len()
107 && original
108 .iter()
109 .zip(decoded.iter())
110 .all(|((enc1, q1), (enc2, q2))| enc1 == enc2 && (q1 - q2).abs() < f32::EPSILON);
111 println!(" Round-trip successful: {}", matches);
112 }
113 }
114}
115
116#[cfg(feature = "http_crates")]
117fn content_encoding_examples() {
118 println!("\n\n2. Content-Encoding Examples");
119 println!("============================");
120
121 println!("\n2a. Creating Content-Encoding headers:");
123 let encodings_to_test = vec![
124 Encoding::Gzip,
125 Encoding::Deflate,
126 Encoding::Br,
127 Encoding::Zstd,
128 Encoding::Custom("lz4".to_string()),
129 ];
130
131 for encoding in encodings_to_test {
132 let content_encoding = ContentEncoding::new(encoding);
133 println!(" Created: {:?}", content_encoding);
134
135 let mut values = Vec::new();
137 content_encoding.encode(&mut values);
138
139 if let Some(header_value) = values.first() {
140 if let Ok(as_str) = header_value.to_str() {
141 println!(" Header value: {}", as_str);
142 }
143 }
144 }
145
146 println!("\n2b. Decoding Content-Encoding headers:");
148 let test_headers = vec!["gzip", "deflate", "br", "zstd", "custom-encoding"];
149
150 for header_str in test_headers {
151 println!(" Decoding: \"{}\"", header_str);
152
153 let header_values = vec![HeaderValue::from_str(header_str).unwrap()];
154 match ContentEncoding::decode(&mut header_values.iter()) {
155 Ok(decoded) => {
156 println!(" Success: {:?}", decoded);
157 println!(" Encoding: {:?}", decoded.encoding());
158 }
159 Err(e) => println!(" Error: {:?}", e),
160 }
161 }
162}
163
164#[cfg(not(feature = "http_crates"))]
165fn content_encoding_examples() {
166 println!("\n\n2. Content-Encoding Examples");
167 println!("============================");
168 println!(" (Skipped - http_crates feature not enabled)");
169}
170
171fn error_handling_examples() {
172 println!("\n\n3. Error Handling Examples");
173 println!("==========================");
174
175 println!("\n3a. Accept-Encoding encoding errors:");
177
178 match encode_header_value(&[]) {
180 Ok(_) => println!(" Unexpected success"),
181 Err(AcceptEncodingEncodeError::EmptyEncodings) => {
182 println!(" ✓ Correctly caught empty encodings error");
183 }
184 Err(_) => println!(" Unexpected error type"),
185 }
186
187 println!("\n3b. Accept-Encoding decoding errors:");
189
190 let invalid_headers = vec![
191 "", " , gzip", ";q=1.0", "gzip;q=invalid", "gzip;foo=bar", ];
197
198 for invalid_header in invalid_headers {
199 println!(" Testing: \"{}\"", invalid_header);
200 match decode_header_value(invalid_header) {
201 Ok(_) => println!(" Unexpected success"),
202 Err(AcceptEncodingDecodeError::EmptyEncodingName) => {
203 println!(" ✓ Empty encoding name error");
204 }
205 Err(AcceptEncodingDecodeError::EmptyEncodingWeightTuple) => {
206 println!(" ✓ Empty encoding weight tuple error");
207 }
208 Err(AcceptEncodingDecodeError::InvalidQualityValue(val)) => {
209 println!(" ✓ Invalid quality value error: {}", val);
210 }
211 Err(AcceptEncodingDecodeError::UnexpectedDirective(directive)) => {
212 println!(" ✓ Unexpected directive error: {}", directive);
213 }
214 Err(_) => println!(" ✓ Other decode error"),
215 }
216 }
217
218 #[cfg(feature = "http_crates")]
219 {
220 println!("\n3c. Content-Encoding conflicting values:");
222 let conflicting = vec![
223 HeaderValue::from_str("gzip").unwrap(),
224 HeaderValue::from_str("deflate").unwrap(),
225 ];
226
227 match ContentEncoding::decode(&mut conflicting.iter()) {
228 Ok(_) => println!(" Unexpected success"),
229 Err(_) => println!(" ✓ Correctly rejected conflicting Content-Encoding values"),
230 }
231 }
232}