AcceptEncoding

Struct AcceptEncoding 

Source
pub struct AcceptEncoding { /* private fields */ }
Expand description

Represents an HTTP Accept-Encoding header with a list of supported encodings and their quality values

Implementations§

Source§

impl AcceptEncoding

Source

pub fn new( encodings: Vec<(Encoding, QualityValue)>, ) -> Result<Self, AcceptEncodingError>

Creates a new AcceptEncoding from a vector of encodings with their quality values.

Examples found in repository?
examples/basic_usage.rs (line 74)
31fn accept_encoding_examples() {
32    println!("1. Accept-Encoding Header Examples");
33    println!("==================================");
34
35    // Example 1a: Encoding Accept-Encoding header values
36    println!("\n1a. Encoding Accept-Encoding header values:");
37    let encodings = vec![
38        (Encoding::Gzip, 1.0),
39        (Encoding::Deflate, 0.8),
40        (Encoding::Br, 0.6),
41        (Encoding::Identity, 0.1),
42    ];
43
44    match encode_header_value(&encodings) {
45        Ok(header_value) => {
46            println!("   Input: {:?}", encodings);
47            println!("   Encoded header: {}", header_value);
48        }
49        Err(e) => println!("   Error encoding: {}", e),
50    }
51
52    // Example 1b: Decoding Accept-Encoding header values
53    println!("\n1b. Decoding Accept-Encoding header values:");
54    let header_string = "gzip, deflate;q=0.8, br;q=0.6, identity;q=0.1";
55    println!("   Input header: {}", header_string);
56
57    match decode_header_value(header_string) {
58        Ok(parsed) => {
59            println!("   Decoded encodings:");
60            for (encoding, quality) in parsed {
61                println!("     {} (q={})", encoding, quality);
62            }
63        }
64        Err(e) => println!("   Error decoding: {}", e),
65    }
66
67    // Example 1c: Working with complex Accept-Encoding values
68    println!("\n1c. Complex Accept-Encoding example:");
69    let complex_header = "gzip;q=1.0, deflate;q=0.5, br;q=0.25, *;q=0.1";
70    println!("   Input: {}", complex_header);
71
72    if let Ok(parsed) = decode_header_value(complex_header) {
73        // Create AcceptEncoding instance
74        if let Ok(accept_encoding) = AcceptEncoding::new(parsed) {
75            println!(
76                "   Created AcceptEncoding with {} encodings",
77                accept_encoding.items().len()
78            );
79
80            // Re-encode it
81            if let Ok(re_encoded) = encode_header_value(accept_encoding.items()) {
82                println!("   Re-encoded: {}", re_encoded);
83            }
84        }
85    }
86}
87
88/// Examples for Content-Encoding header encode/decode functionality  
89#[cfg(feature = "http_crates")]
90fn content_encoding_examples() {
91    println!("\n\n2. Content-Encoding Header Examples");
92    println!("===================================");
93
94    // Example 2a: Creating and encoding Content-Encoding headers
95    println!("\n2a. Creating and encoding Content-Encoding:");
96    let content_encoding = ContentEncoding::new(Encoding::Gzip);
97    println!("   Created ContentEncoding: {:?}", content_encoding);
98
99    // Use with HeaderMap
100    let mut headers = HeaderMap::new();
101    headers.typed_insert(content_encoding);
102
103    if let Some(header_value) = headers.get(http::header::CONTENT_ENCODING) {
104        println!(
105            "   Header value: {}",
106            header_value.to_str().unwrap_or("invalid")
107        );
108    }
109
110    // Example 2b: Decoding Content-Encoding headers
111    println!("\n2b. Decoding Content-Encoding headers:");
112    let test_values = vec!["gzip", "deflate", "br", "zstd"];
113
114    for encoding_str in test_values {
115        println!("   Testing: {}", encoding_str);
116        let header_values = vec![HeaderValue::from_str(encoding_str).unwrap()];
117
118        match ContentEncoding::decode(&mut header_values.iter()) {
119            Ok(decoded) => println!("     Decoded: {:?}", decoded),
120            Err(e) => println!("     Error: {:?}", e),
121        }
122    }
123
124    // Example 2c: Multiple identical values (valid)
125    println!("\n2c. Multiple identical Content-Encoding values:");
126    let identical_values = vec![
127        HeaderValue::from_str("gzip").unwrap(),
128        HeaderValue::from_str("gzip").unwrap(),
129    ];
130
131    match ContentEncoding::decode(&mut identical_values.iter()) {
132        Ok(decoded) => println!("   Multiple identical values decoded: {:?}", decoded),
133        Err(e) => println!("   Error: {:?}", e),
134    }
135
136    // Example 2d: Conflicting values (should error)
137    println!("\n2d. Conflicting Content-Encoding values (should error):");
138    let conflicting_values = vec![
139        HeaderValue::from_str("gzip").unwrap(),
140        HeaderValue::from_str("deflate").unwrap(),
141    ];
142
143    match ContentEncoding::decode(&mut conflicting_values.iter()) {
144        Ok(decoded) => println!("   Unexpectedly decoded: {:?}", decoded),
145        Err(_) => println!("   Correctly rejected conflicting values"),
146    }
147}
148
149#[cfg(not(feature = "http_crates"))]
150fn content_encoding_examples() {
151    println!("\n\n2. Content-Encoding Header Examples");
152    println!("===================================");
153    println!("   (Skipped - http_crates feature not enabled)");
154}
155
156/// Examples for AcceptEncoding advanced functionality
157fn accept_encoding_advanced_examples() {
158    println!("\n\n3. AcceptEncoding Advanced Usage");
159    println!("===============================");
160
161    // Create an AcceptEncoding instance with various encodings
162    let encodings = vec![
163        (Encoding::Gzip, 0.9),
164        (Encoding::Deflate, 0.8),
165        (Encoding::Br, 1.0),       // Highest quality
166        (Encoding::Identity, 0.1), // Lowest quality
167        (Encoding::Zstd, 0.7),
168    ];
169
170    let mut accept_encoding = AcceptEncoding::new(encodings).unwrap();
171    println!("\n3a. Original AcceptEncoding:");
172    println!("   Encodings: {:?}", accept_encoding.items());
173
174    // Example 3a: Finding preferred encoding
175    println!("\n3b. Finding preferred encoding:");
176    if let Some(preferred) = accept_encoding.preferred() {
177        println!("   Preferred encoding: {}", preferred);
178        println!("   (Highest quality value from unsorted list)");
179    }
180
181    // Example 3b: Sorting in descending order (highest quality first)
182    println!("\n3c. Sorting in descending order (highest quality first):");
183    accept_encoding.sort_descending();
184    println!("   After sort_descending():");
185    for (encoding, quality) in accept_encoding.items() {
186        println!("     {} (q={})", encoding, quality);
187    }
188
189    // Now preferred should be first item
190    if let Some(preferred) = accept_encoding.preferred() {
191        println!("   Preferred encoding after sorting: {}", preferred);
192        println!("   (First item in descending sorted list)");
193    }
194
195    // Example 3c: Sorting in ascending order (lowest quality first)
196    println!("\n3d. Sorting in ascending order (lowest quality first):");
197    accept_encoding.sort_ascending();
198    println!("   After sort_ascending():");
199    for (encoding, quality) in accept_encoding.items() {
200        println!("     {} (q={})", encoding, quality);
201    }
202
203    // Now preferred should be last item
204    if let Some(preferred) = accept_encoding.preferred() {
205        println!("   Preferred encoding after ascending sort: {}", preferred);
206        println!("   (Last item in ascending sorted list)");
207    }
208
209    // Example 3d: Demonstrating in-place sorting behavior
210    println!("\n3e. Demonstrating in-place sorting chain:");
211    let encodings2 = vec![
212        (Encoding::Gzip, 0.5),
213        (Encoding::Deflate, 0.9),
214        (Encoding::Br, 0.3),
215    ];
216
217    let mut accept_encoding2 = AcceptEncoding::new(encodings2).unwrap();
218    println!("   Original: {:?}", accept_encoding2.items());
219
220    // Chain sorting operations (returns &mut Self for chaining)
221    accept_encoding2.sort_descending();
222    println!("   Descending: {:?}", accept_encoding2.items());
223
224    // Sort back to ascending
225    accept_encoding2.sort_ascending();
226    println!("   Ascending: {:?}", accept_encoding2.items());
227
228    println!("\n3f. Practical example - Content negotiation:");
229    practical_content_negotiation_example();
230}
231
232/// A practical example showing how to use these functions for content negotiation
233fn practical_content_negotiation_example() {
234    // Simulate a client's Accept-Encoding header
235    let client_header = "br;q=1.0, gzip;q=0.8, deflate;q=0.6, *;q=0.1";
236    println!("   Client Accept-Encoding: {}", client_header);
237
238    // Server supported encodings (in order of preference)
239    let server_supported = vec![Encoding::Gzip, Encoding::Deflate, Encoding::Identity];
240    println!("   Server supported: {:?}", server_supported);
241
242    // Parse client preferences
243    if let Ok(client_encodings) = decode_header_value(client_header) {
244        if let Ok(mut accept_encoding) = AcceptEncoding::new(client_encodings) {
245            // Sort by client preference (highest quality first)
246            accept_encoding.sort_descending();
247
248            // Find the best match
249            let mut selected_encoding = None;
250            for (encoding, quality) in accept_encoding.items() {
251                if server_supported.contains(encoding) && *quality > 0.0 {
252                    selected_encoding = Some(encoding);
253                    break;
254                }
255            }
256
257            match selected_encoding {
258                Some(encoding) => {
259                    println!("   Selected encoding: {}", encoding);
260                    println!("   Server should use Content-Encoding: {}", encoding);
261                }
262                None => println!("   No acceptable encoding found"),
263            }
264        }
265    }
266}
More examples
Hide additional examples
examples/accept_encoding_preferred.rs (line 23)
11fn main() {
12    println!("=== AcceptEncoding Preferred and Sorting Examples ===\n");
13
14    // Create an AcceptEncoding with different quality values
15    let encodings = vec![
16        (Encoding::Gzip, 0.7),
17        (Encoding::Deflate, 0.9), // This should be preferred (highest quality)
18        (Encoding::Br, 1.0),      // Highest quality, but might not be allowed by server
19        (Encoding::Identity, 0.1),
20        (Encoding::Zstd, 0.8), // High quality compression
21    ];
22
23    let mut accept_encoding = AcceptEncoding::new(encodings).unwrap();
24
25    println!("Original encodings:");
26    print_encodings(&accept_encoding);
27
28    // Find preferred encoding from unsorted list
29    println!("\n1. Finding preferred encoding (unsorted) - preferred():");
30    if let Some(preferred) = accept_encoding.preferred() {
31        println!(
32            "   Preferred: {} (finds highest quality from unsorted list)",
33            preferred
34        );
35    }
36
37    // Example server capabilities - let's say server only supports some encodings
38    let server_supported = vec![Encoding::Gzip, Encoding::Deflate, Encoding::Identity];
39
40    println!("\n2. Server-side filtering with preferred_allowed():");
41    println!("   Server supports: {:?}", server_supported);
42    if let Some(preferred_allowed) = accept_encoding.preferred_allowed(server_supported.iter()) {
43        println!(
44            "   Preferred (server filtered): {} (highest quality that server supports)",
45            preferred_allowed
46        );
47    }
48
49    // Compare different server capabilities
50    let limited_server = vec![Encoding::Identity]; // Very limited server
51    println!("\n   Limited server supports only: {:?}", limited_server);
52    if let Some(preferred_limited) = accept_encoding.preferred_allowed(limited_server.iter()) {
53        println!(
54            "   Preferred (limited server): {} (only available option)",
55            preferred_limited
56        );
57    } else {
58        println!("   No acceptable encoding found for limited server");
59    }
60
61    let advanced_server = vec![Encoding::Br, Encoding::Zstd, Encoding::Gzip]; // Advanced server
62    println!("\n   Advanced server supports: {:?}", advanced_server);
63    if let Some(preferred_advanced) = accept_encoding.preferred_allowed(advanced_server.iter()) {
64        println!(
65            "   Preferred (advanced server): {} (best match from advanced capabilities)",
66            preferred_advanced
67        );
68    }
69
70    // Sort descending (highest quality first) - modifies in place
71    println!("\n3. After sorting descending (in-place):");
72    accept_encoding.sort_descending();
73    print_encodings(&accept_encoding);
74
75    if let Some(preferred) = accept_encoding.preferred() {
76        println!(
77            "   Preferred: {} (first item when sorted descending)",
78            preferred
79        );
80    }
81
82    // Test preferred_allowed with sorted list
83    println!("\n   Server-side filtering after sorting descending:");
84    if let Some(preferred_allowed) = accept_encoding.preferred_allowed(server_supported.iter()) {
85        println!(
86            "   Preferred (server filtered): {} (efficiently finds first match in sorted list)",
87            preferred_allowed
88        );
89    }
90
91    // Sort ascending (lowest quality first) - modifies in place
92    println!("\n4. After sorting ascending (in-place):");
93    accept_encoding.sort_ascending();
94    print_encodings(&accept_encoding);
95
96    if let Some(preferred) = accept_encoding.preferred() {
97        println!(
98            "   Preferred: {} (last item when sorted ascending)",
99            preferred
100        );
101    }
102
103    // Test preferred_allowed with ascending sorted list
104    println!("\n   Server-side filtering after sorting ascending:");
105    if let Some(preferred_allowed) = accept_encoding.preferred_allowed(server_supported.iter()) {
106        println!(
107            "   Preferred (server filtered): {} (efficiently finds best match from end)",
108            preferred_allowed
109        );
110    }
111
112    // Demonstrate chaining - sort methods return &mut Self for chaining
113    println!("\n5. Method chaining example:");
114    let encodings2 = vec![
115        (Encoding::Gzip, 0.3),
116        (Encoding::Deflate, 0.8),
117        (Encoding::Br, 0.6),
118    ];
119
120    let mut accept_encoding2 = AcceptEncoding::new(encodings2).unwrap();
121
122    // Chain operations
123    let preferred_after_desc_sort = accept_encoding2.sort_descending().preferred().cloned(); // Clone the encoding to avoid borrowing issues
124
125    println!(
126        "   After chaining sort_descending().preferred(): {:?}",
127        preferred_after_desc_sort
128    );
129
130    // Sort back and get preferred
131    let preferred_after_asc_sort = accept_encoding2.sort_ascending().preferred().cloned();
132
133    println!(
134        "   After chaining sort_ascending().preferred(): {:?}",
135        preferred_after_asc_sort
136    );
137
138    // Demonstrate with equal quality values
139    println!("\n6. Equal quality values example:");
140    let equal_encodings = vec![
141        (Encoding::Gzip, 0.8),
142        (Encoding::Deflate, 0.8), // Same quality
143        (Encoding::Br, 0.8),      // Same quality
144    ];
145
146    let mut equal_accept = AcceptEncoding::new(equal_encodings).unwrap();
147    println!("   Original (all equal quality):");
148    print_encodings(&equal_accept);
149
150    if let Some(preferred) = equal_accept.preferred() {
151        println!(
152            "   Preferred from equal qualities: {} (first found with max quality)",
153            preferred
154        );
155    }
156
157    // Test server filtering with equal qualities
158    let partial_server = vec![Encoding::Deflate, Encoding::Br];
159    if let Some(preferred_filtered) = equal_accept.preferred_allowed(partial_server.iter()) {
160        println!(
161            "   Preferred (server filtered from equal qualities): {} (first allowed match)",
162            preferred_filtered
163        );
164    }
165
166    equal_accept.sort_descending();
167    println!("   After sort_descending (stable sort preserves original order for equal elements):");
168    print_encodings(&equal_accept);
169
170    // Demonstrate practical content negotiation scenario
171    println!("\n7. Practical content negotiation scenario:");
172    practical_negotiation_example();
173}
174
175fn print_encodings(accept_encoding: &AcceptEncoding) {
176    for (encoding, quality) in accept_encoding.items() {
177        println!("     {} (q={})", encoding, quality);
178    }
179}
180
181/// Demonstrates practical content negotiation comparing both methods
182fn practical_negotiation_example() {
183    println!(
184        "   Scenario: Client sends 'Accept-Encoding: br;q=1.0, zstd;q=0.9, gzip;q=0.7, deflate;q=0.5'"
185    );
186
187    let client_preferences = vec![
188        (Encoding::Br, 1.0),      // Client's top choice
189        (Encoding::Zstd, 0.9),    // Second choice
190        (Encoding::Gzip, 0.7),    // Third choice
191        (Encoding::Deflate, 0.5), // Fallback
192    ];
193
194    let accept_encoding = AcceptEncoding::new(client_preferences).unwrap();
195
196    // Method 1: preferred() - ignores server capabilities
197    if let Some(client_preferred) = accept_encoding.preferred() {
198        println!(
199            "   preferred(): {} (client's top choice, ignoring server)",
200            client_preferred
201        );
202    }
203
204    // Different server scenarios
205    let scenarios = vec![
206        (
207            "Basic server",
208            vec![Encoding::Gzip, Encoding::Deflate, Encoding::Identity],
209        ),
210        (
211            "Advanced server",
212            vec![Encoding::Br, Encoding::Zstd, Encoding::Gzip],
213        ),
214        ("Legacy server", vec![Encoding::Deflate, Encoding::Identity]),
215        (
216            "Modern server",
217            vec![
218                Encoding::Br,
219                Encoding::Zstd,
220                Encoding::Gzip,
221                Encoding::Deflate,
222            ],
223        ),
224    ];
225
226    for (server_name, server_caps) in scenarios {
227        print!("   {}: supports {:?}", server_name, server_caps);
228
229        if let Some(negotiated) = accept_encoding.preferred_allowed(server_caps.iter()) {
230            println!(" → selected: {}", negotiated);
231        } else {
232            println!(" → no acceptable encoding found");
233        }
234    }
235
236    println!("\n   Key difference:");
237    println!("   - preferred(): Returns client's top choice regardless of server capabilities");
238    println!("   - preferred_allowed(): Returns best mutually supported encoding");
239    println!("   - Both methods honor the current sorting state for efficiency");
240}
Source

pub fn items(&self) -> &[(Encoding, QualityValue)]

Returns a reference to the internal vector of encodings and their quality values.

Examples found in repository?
examples/accept_encoding_preferred.rs (line 176)
175fn print_encodings(accept_encoding: &AcceptEncoding) {
176    for (encoding, quality) in accept_encoding.items() {
177        println!("     {} (q={})", encoding, quality);
178    }
179}
More examples
Hide additional examples
examples/basic_usage.rs (line 77)
31fn accept_encoding_examples() {
32    println!("1. Accept-Encoding Header Examples");
33    println!("==================================");
34
35    // Example 1a: Encoding Accept-Encoding header values
36    println!("\n1a. Encoding Accept-Encoding header values:");
37    let encodings = vec![
38        (Encoding::Gzip, 1.0),
39        (Encoding::Deflate, 0.8),
40        (Encoding::Br, 0.6),
41        (Encoding::Identity, 0.1),
42    ];
43
44    match encode_header_value(&encodings) {
45        Ok(header_value) => {
46            println!("   Input: {:?}", encodings);
47            println!("   Encoded header: {}", header_value);
48        }
49        Err(e) => println!("   Error encoding: {}", e),
50    }
51
52    // Example 1b: Decoding Accept-Encoding header values
53    println!("\n1b. Decoding Accept-Encoding header values:");
54    let header_string = "gzip, deflate;q=0.8, br;q=0.6, identity;q=0.1";
55    println!("   Input header: {}", header_string);
56
57    match decode_header_value(header_string) {
58        Ok(parsed) => {
59            println!("   Decoded encodings:");
60            for (encoding, quality) in parsed {
61                println!("     {} (q={})", encoding, quality);
62            }
63        }
64        Err(e) => println!("   Error decoding: {}", e),
65    }
66
67    // Example 1c: Working with complex Accept-Encoding values
68    println!("\n1c. Complex Accept-Encoding example:");
69    let complex_header = "gzip;q=1.0, deflate;q=0.5, br;q=0.25, *;q=0.1";
70    println!("   Input: {}", complex_header);
71
72    if let Ok(parsed) = decode_header_value(complex_header) {
73        // Create AcceptEncoding instance
74        if let Ok(accept_encoding) = AcceptEncoding::new(parsed) {
75            println!(
76                "   Created AcceptEncoding with {} encodings",
77                accept_encoding.items().len()
78            );
79
80            // Re-encode it
81            if let Ok(re_encoded) = encode_header_value(accept_encoding.items()) {
82                println!("   Re-encoded: {}", re_encoded);
83            }
84        }
85    }
86}
87
88/// Examples for Content-Encoding header encode/decode functionality  
89#[cfg(feature = "http_crates")]
90fn content_encoding_examples() {
91    println!("\n\n2. Content-Encoding Header Examples");
92    println!("===================================");
93
94    // Example 2a: Creating and encoding Content-Encoding headers
95    println!("\n2a. Creating and encoding Content-Encoding:");
96    let content_encoding = ContentEncoding::new(Encoding::Gzip);
97    println!("   Created ContentEncoding: {:?}", content_encoding);
98
99    // Use with HeaderMap
100    let mut headers = HeaderMap::new();
101    headers.typed_insert(content_encoding);
102
103    if let Some(header_value) = headers.get(http::header::CONTENT_ENCODING) {
104        println!(
105            "   Header value: {}",
106            header_value.to_str().unwrap_or("invalid")
107        );
108    }
109
110    // Example 2b: Decoding Content-Encoding headers
111    println!("\n2b. Decoding Content-Encoding headers:");
112    let test_values = vec!["gzip", "deflate", "br", "zstd"];
113
114    for encoding_str in test_values {
115        println!("   Testing: {}", encoding_str);
116        let header_values = vec![HeaderValue::from_str(encoding_str).unwrap()];
117
118        match ContentEncoding::decode(&mut header_values.iter()) {
119            Ok(decoded) => println!("     Decoded: {:?}", decoded),
120            Err(e) => println!("     Error: {:?}", e),
121        }
122    }
123
124    // Example 2c: Multiple identical values (valid)
125    println!("\n2c. Multiple identical Content-Encoding values:");
126    let identical_values = vec![
127        HeaderValue::from_str("gzip").unwrap(),
128        HeaderValue::from_str("gzip").unwrap(),
129    ];
130
131    match ContentEncoding::decode(&mut identical_values.iter()) {
132        Ok(decoded) => println!("   Multiple identical values decoded: {:?}", decoded),
133        Err(e) => println!("   Error: {:?}", e),
134    }
135
136    // Example 2d: Conflicting values (should error)
137    println!("\n2d. Conflicting Content-Encoding values (should error):");
138    let conflicting_values = vec![
139        HeaderValue::from_str("gzip").unwrap(),
140        HeaderValue::from_str("deflate").unwrap(),
141    ];
142
143    match ContentEncoding::decode(&mut conflicting_values.iter()) {
144        Ok(decoded) => println!("   Unexpectedly decoded: {:?}", decoded),
145        Err(_) => println!("   Correctly rejected conflicting values"),
146    }
147}
148
149#[cfg(not(feature = "http_crates"))]
150fn content_encoding_examples() {
151    println!("\n\n2. Content-Encoding Header Examples");
152    println!("===================================");
153    println!("   (Skipped - http_crates feature not enabled)");
154}
155
156/// Examples for AcceptEncoding advanced functionality
157fn accept_encoding_advanced_examples() {
158    println!("\n\n3. AcceptEncoding Advanced Usage");
159    println!("===============================");
160
161    // Create an AcceptEncoding instance with various encodings
162    let encodings = vec![
163        (Encoding::Gzip, 0.9),
164        (Encoding::Deflate, 0.8),
165        (Encoding::Br, 1.0),       // Highest quality
166        (Encoding::Identity, 0.1), // Lowest quality
167        (Encoding::Zstd, 0.7),
168    ];
169
170    let mut accept_encoding = AcceptEncoding::new(encodings).unwrap();
171    println!("\n3a. Original AcceptEncoding:");
172    println!("   Encodings: {:?}", accept_encoding.items());
173
174    // Example 3a: Finding preferred encoding
175    println!("\n3b. Finding preferred encoding:");
176    if let Some(preferred) = accept_encoding.preferred() {
177        println!("   Preferred encoding: {}", preferred);
178        println!("   (Highest quality value from unsorted list)");
179    }
180
181    // Example 3b: Sorting in descending order (highest quality first)
182    println!("\n3c. Sorting in descending order (highest quality first):");
183    accept_encoding.sort_descending();
184    println!("   After sort_descending():");
185    for (encoding, quality) in accept_encoding.items() {
186        println!("     {} (q={})", encoding, quality);
187    }
188
189    // Now preferred should be first item
190    if let Some(preferred) = accept_encoding.preferred() {
191        println!("   Preferred encoding after sorting: {}", preferred);
192        println!("   (First item in descending sorted list)");
193    }
194
195    // Example 3c: Sorting in ascending order (lowest quality first)
196    println!("\n3d. Sorting in ascending order (lowest quality first):");
197    accept_encoding.sort_ascending();
198    println!("   After sort_ascending():");
199    for (encoding, quality) in accept_encoding.items() {
200        println!("     {} (q={})", encoding, quality);
201    }
202
203    // Now preferred should be last item
204    if let Some(preferred) = accept_encoding.preferred() {
205        println!("   Preferred encoding after ascending sort: {}", preferred);
206        println!("   (Last item in ascending sorted list)");
207    }
208
209    // Example 3d: Demonstrating in-place sorting behavior
210    println!("\n3e. Demonstrating in-place sorting chain:");
211    let encodings2 = vec![
212        (Encoding::Gzip, 0.5),
213        (Encoding::Deflate, 0.9),
214        (Encoding::Br, 0.3),
215    ];
216
217    let mut accept_encoding2 = AcceptEncoding::new(encodings2).unwrap();
218    println!("   Original: {:?}", accept_encoding2.items());
219
220    // Chain sorting operations (returns &mut Self for chaining)
221    accept_encoding2.sort_descending();
222    println!("   Descending: {:?}", accept_encoding2.items());
223
224    // Sort back to ascending
225    accept_encoding2.sort_ascending();
226    println!("   Ascending: {:?}", accept_encoding2.items());
227
228    println!("\n3f. Practical example - Content negotiation:");
229    practical_content_negotiation_example();
230}
231
232/// A practical example showing how to use these functions for content negotiation
233fn practical_content_negotiation_example() {
234    // Simulate a client's Accept-Encoding header
235    let client_header = "br;q=1.0, gzip;q=0.8, deflate;q=0.6, *;q=0.1";
236    println!("   Client Accept-Encoding: {}", client_header);
237
238    // Server supported encodings (in order of preference)
239    let server_supported = vec![Encoding::Gzip, Encoding::Deflate, Encoding::Identity];
240    println!("   Server supported: {:?}", server_supported);
241
242    // Parse client preferences
243    if let Ok(client_encodings) = decode_header_value(client_header) {
244        if let Ok(mut accept_encoding) = AcceptEncoding::new(client_encodings) {
245            // Sort by client preference (highest quality first)
246            accept_encoding.sort_descending();
247
248            // Find the best match
249            let mut selected_encoding = None;
250            for (encoding, quality) in accept_encoding.items() {
251                if server_supported.contains(encoding) && *quality > 0.0 {
252                    selected_encoding = Some(encoding);
253                    break;
254                }
255            }
256
257            match selected_encoding {
258                Some(encoding) => {
259                    println!("   Selected encoding: {}", encoding);
260                    println!("   Server should use Content-Encoding: {}", encoding);
261                }
262                None => println!("   No acceptable encoding found"),
263            }
264        }
265    }
266}
Source

pub fn sort_descending(&mut self) -> &mut Self

Sorts the encodings by quality value in descending order and returns self.

Examples found in repository?
examples/basic_usage.rs (line 183)
157fn accept_encoding_advanced_examples() {
158    println!("\n\n3. AcceptEncoding Advanced Usage");
159    println!("===============================");
160
161    // Create an AcceptEncoding instance with various encodings
162    let encodings = vec![
163        (Encoding::Gzip, 0.9),
164        (Encoding::Deflate, 0.8),
165        (Encoding::Br, 1.0),       // Highest quality
166        (Encoding::Identity, 0.1), // Lowest quality
167        (Encoding::Zstd, 0.7),
168    ];
169
170    let mut accept_encoding = AcceptEncoding::new(encodings).unwrap();
171    println!("\n3a. Original AcceptEncoding:");
172    println!("   Encodings: {:?}", accept_encoding.items());
173
174    // Example 3a: Finding preferred encoding
175    println!("\n3b. Finding preferred encoding:");
176    if let Some(preferred) = accept_encoding.preferred() {
177        println!("   Preferred encoding: {}", preferred);
178        println!("   (Highest quality value from unsorted list)");
179    }
180
181    // Example 3b: Sorting in descending order (highest quality first)
182    println!("\n3c. Sorting in descending order (highest quality first):");
183    accept_encoding.sort_descending();
184    println!("   After sort_descending():");
185    for (encoding, quality) in accept_encoding.items() {
186        println!("     {} (q={})", encoding, quality);
187    }
188
189    // Now preferred should be first item
190    if let Some(preferred) = accept_encoding.preferred() {
191        println!("   Preferred encoding after sorting: {}", preferred);
192        println!("   (First item in descending sorted list)");
193    }
194
195    // Example 3c: Sorting in ascending order (lowest quality first)
196    println!("\n3d. Sorting in ascending order (lowest quality first):");
197    accept_encoding.sort_ascending();
198    println!("   After sort_ascending():");
199    for (encoding, quality) in accept_encoding.items() {
200        println!("     {} (q={})", encoding, quality);
201    }
202
203    // Now preferred should be last item
204    if let Some(preferred) = accept_encoding.preferred() {
205        println!("   Preferred encoding after ascending sort: {}", preferred);
206        println!("   (Last item in ascending sorted list)");
207    }
208
209    // Example 3d: Demonstrating in-place sorting behavior
210    println!("\n3e. Demonstrating in-place sorting chain:");
211    let encodings2 = vec![
212        (Encoding::Gzip, 0.5),
213        (Encoding::Deflate, 0.9),
214        (Encoding::Br, 0.3),
215    ];
216
217    let mut accept_encoding2 = AcceptEncoding::new(encodings2).unwrap();
218    println!("   Original: {:?}", accept_encoding2.items());
219
220    // Chain sorting operations (returns &mut Self for chaining)
221    accept_encoding2.sort_descending();
222    println!("   Descending: {:?}", accept_encoding2.items());
223
224    // Sort back to ascending
225    accept_encoding2.sort_ascending();
226    println!("   Ascending: {:?}", accept_encoding2.items());
227
228    println!("\n3f. Practical example - Content negotiation:");
229    practical_content_negotiation_example();
230}
231
232/// A practical example showing how to use these functions for content negotiation
233fn practical_content_negotiation_example() {
234    // Simulate a client's Accept-Encoding header
235    let client_header = "br;q=1.0, gzip;q=0.8, deflate;q=0.6, *;q=0.1";
236    println!("   Client Accept-Encoding: {}", client_header);
237
238    // Server supported encodings (in order of preference)
239    let server_supported = vec![Encoding::Gzip, Encoding::Deflate, Encoding::Identity];
240    println!("   Server supported: {:?}", server_supported);
241
242    // Parse client preferences
243    if let Ok(client_encodings) = decode_header_value(client_header) {
244        if let Ok(mut accept_encoding) = AcceptEncoding::new(client_encodings) {
245            // Sort by client preference (highest quality first)
246            accept_encoding.sort_descending();
247
248            // Find the best match
249            let mut selected_encoding = None;
250            for (encoding, quality) in accept_encoding.items() {
251                if server_supported.contains(encoding) && *quality > 0.0 {
252                    selected_encoding = Some(encoding);
253                    break;
254                }
255            }
256
257            match selected_encoding {
258                Some(encoding) => {
259                    println!("   Selected encoding: {}", encoding);
260                    println!("   Server should use Content-Encoding: {}", encoding);
261                }
262                None => println!("   No acceptable encoding found"),
263            }
264        }
265    }
266}
More examples
Hide additional examples
examples/accept_encoding_preferred.rs (line 72)
11fn main() {
12    println!("=== AcceptEncoding Preferred and Sorting Examples ===\n");
13
14    // Create an AcceptEncoding with different quality values
15    let encodings = vec![
16        (Encoding::Gzip, 0.7),
17        (Encoding::Deflate, 0.9), // This should be preferred (highest quality)
18        (Encoding::Br, 1.0),      // Highest quality, but might not be allowed by server
19        (Encoding::Identity, 0.1),
20        (Encoding::Zstd, 0.8), // High quality compression
21    ];
22
23    let mut accept_encoding = AcceptEncoding::new(encodings).unwrap();
24
25    println!("Original encodings:");
26    print_encodings(&accept_encoding);
27
28    // Find preferred encoding from unsorted list
29    println!("\n1. Finding preferred encoding (unsorted) - preferred():");
30    if let Some(preferred) = accept_encoding.preferred() {
31        println!(
32            "   Preferred: {} (finds highest quality from unsorted list)",
33            preferred
34        );
35    }
36
37    // Example server capabilities - let's say server only supports some encodings
38    let server_supported = vec![Encoding::Gzip, Encoding::Deflate, Encoding::Identity];
39
40    println!("\n2. Server-side filtering with preferred_allowed():");
41    println!("   Server supports: {:?}", server_supported);
42    if let Some(preferred_allowed) = accept_encoding.preferred_allowed(server_supported.iter()) {
43        println!(
44            "   Preferred (server filtered): {} (highest quality that server supports)",
45            preferred_allowed
46        );
47    }
48
49    // Compare different server capabilities
50    let limited_server = vec![Encoding::Identity]; // Very limited server
51    println!("\n   Limited server supports only: {:?}", limited_server);
52    if let Some(preferred_limited) = accept_encoding.preferred_allowed(limited_server.iter()) {
53        println!(
54            "   Preferred (limited server): {} (only available option)",
55            preferred_limited
56        );
57    } else {
58        println!("   No acceptable encoding found for limited server");
59    }
60
61    let advanced_server = vec![Encoding::Br, Encoding::Zstd, Encoding::Gzip]; // Advanced server
62    println!("\n   Advanced server supports: {:?}", advanced_server);
63    if let Some(preferred_advanced) = accept_encoding.preferred_allowed(advanced_server.iter()) {
64        println!(
65            "   Preferred (advanced server): {} (best match from advanced capabilities)",
66            preferred_advanced
67        );
68    }
69
70    // Sort descending (highest quality first) - modifies in place
71    println!("\n3. After sorting descending (in-place):");
72    accept_encoding.sort_descending();
73    print_encodings(&accept_encoding);
74
75    if let Some(preferred) = accept_encoding.preferred() {
76        println!(
77            "   Preferred: {} (first item when sorted descending)",
78            preferred
79        );
80    }
81
82    // Test preferred_allowed with sorted list
83    println!("\n   Server-side filtering after sorting descending:");
84    if let Some(preferred_allowed) = accept_encoding.preferred_allowed(server_supported.iter()) {
85        println!(
86            "   Preferred (server filtered): {} (efficiently finds first match in sorted list)",
87            preferred_allowed
88        );
89    }
90
91    // Sort ascending (lowest quality first) - modifies in place
92    println!("\n4. After sorting ascending (in-place):");
93    accept_encoding.sort_ascending();
94    print_encodings(&accept_encoding);
95
96    if let Some(preferred) = accept_encoding.preferred() {
97        println!(
98            "   Preferred: {} (last item when sorted ascending)",
99            preferred
100        );
101    }
102
103    // Test preferred_allowed with ascending sorted list
104    println!("\n   Server-side filtering after sorting ascending:");
105    if let Some(preferred_allowed) = accept_encoding.preferred_allowed(server_supported.iter()) {
106        println!(
107            "   Preferred (server filtered): {} (efficiently finds best match from end)",
108            preferred_allowed
109        );
110    }
111
112    // Demonstrate chaining - sort methods return &mut Self for chaining
113    println!("\n5. Method chaining example:");
114    let encodings2 = vec![
115        (Encoding::Gzip, 0.3),
116        (Encoding::Deflate, 0.8),
117        (Encoding::Br, 0.6),
118    ];
119
120    let mut accept_encoding2 = AcceptEncoding::new(encodings2).unwrap();
121
122    // Chain operations
123    let preferred_after_desc_sort = accept_encoding2.sort_descending().preferred().cloned(); // Clone the encoding to avoid borrowing issues
124
125    println!(
126        "   After chaining sort_descending().preferred(): {:?}",
127        preferred_after_desc_sort
128    );
129
130    // Sort back and get preferred
131    let preferred_after_asc_sort = accept_encoding2.sort_ascending().preferred().cloned();
132
133    println!(
134        "   After chaining sort_ascending().preferred(): {:?}",
135        preferred_after_asc_sort
136    );
137
138    // Demonstrate with equal quality values
139    println!("\n6. Equal quality values example:");
140    let equal_encodings = vec![
141        (Encoding::Gzip, 0.8),
142        (Encoding::Deflate, 0.8), // Same quality
143        (Encoding::Br, 0.8),      // Same quality
144    ];
145
146    let mut equal_accept = AcceptEncoding::new(equal_encodings).unwrap();
147    println!("   Original (all equal quality):");
148    print_encodings(&equal_accept);
149
150    if let Some(preferred) = equal_accept.preferred() {
151        println!(
152            "   Preferred from equal qualities: {} (first found with max quality)",
153            preferred
154        );
155    }
156
157    // Test server filtering with equal qualities
158    let partial_server = vec![Encoding::Deflate, Encoding::Br];
159    if let Some(preferred_filtered) = equal_accept.preferred_allowed(partial_server.iter()) {
160        println!(
161            "   Preferred (server filtered from equal qualities): {} (first allowed match)",
162            preferred_filtered
163        );
164    }
165
166    equal_accept.sort_descending();
167    println!("   After sort_descending (stable sort preserves original order for equal elements):");
168    print_encodings(&equal_accept);
169
170    // Demonstrate practical content negotiation scenario
171    println!("\n7. Practical content negotiation scenario:");
172    practical_negotiation_example();
173}
Source

pub fn sort_ascending(&mut self) -> &mut Self

Sorts the encodings by quality value in ascending order and returns self.

Examples found in repository?
examples/basic_usage.rs (line 197)
157fn accept_encoding_advanced_examples() {
158    println!("\n\n3. AcceptEncoding Advanced Usage");
159    println!("===============================");
160
161    // Create an AcceptEncoding instance with various encodings
162    let encodings = vec![
163        (Encoding::Gzip, 0.9),
164        (Encoding::Deflate, 0.8),
165        (Encoding::Br, 1.0),       // Highest quality
166        (Encoding::Identity, 0.1), // Lowest quality
167        (Encoding::Zstd, 0.7),
168    ];
169
170    let mut accept_encoding = AcceptEncoding::new(encodings).unwrap();
171    println!("\n3a. Original AcceptEncoding:");
172    println!("   Encodings: {:?}", accept_encoding.items());
173
174    // Example 3a: Finding preferred encoding
175    println!("\n3b. Finding preferred encoding:");
176    if let Some(preferred) = accept_encoding.preferred() {
177        println!("   Preferred encoding: {}", preferred);
178        println!("   (Highest quality value from unsorted list)");
179    }
180
181    // Example 3b: Sorting in descending order (highest quality first)
182    println!("\n3c. Sorting in descending order (highest quality first):");
183    accept_encoding.sort_descending();
184    println!("   After sort_descending():");
185    for (encoding, quality) in accept_encoding.items() {
186        println!("     {} (q={})", encoding, quality);
187    }
188
189    // Now preferred should be first item
190    if let Some(preferred) = accept_encoding.preferred() {
191        println!("   Preferred encoding after sorting: {}", preferred);
192        println!("   (First item in descending sorted list)");
193    }
194
195    // Example 3c: Sorting in ascending order (lowest quality first)
196    println!("\n3d. Sorting in ascending order (lowest quality first):");
197    accept_encoding.sort_ascending();
198    println!("   After sort_ascending():");
199    for (encoding, quality) in accept_encoding.items() {
200        println!("     {} (q={})", encoding, quality);
201    }
202
203    // Now preferred should be last item
204    if let Some(preferred) = accept_encoding.preferred() {
205        println!("   Preferred encoding after ascending sort: {}", preferred);
206        println!("   (Last item in ascending sorted list)");
207    }
208
209    // Example 3d: Demonstrating in-place sorting behavior
210    println!("\n3e. Demonstrating in-place sorting chain:");
211    let encodings2 = vec![
212        (Encoding::Gzip, 0.5),
213        (Encoding::Deflate, 0.9),
214        (Encoding::Br, 0.3),
215    ];
216
217    let mut accept_encoding2 = AcceptEncoding::new(encodings2).unwrap();
218    println!("   Original: {:?}", accept_encoding2.items());
219
220    // Chain sorting operations (returns &mut Self for chaining)
221    accept_encoding2.sort_descending();
222    println!("   Descending: {:?}", accept_encoding2.items());
223
224    // Sort back to ascending
225    accept_encoding2.sort_ascending();
226    println!("   Ascending: {:?}", accept_encoding2.items());
227
228    println!("\n3f. Practical example - Content negotiation:");
229    practical_content_negotiation_example();
230}
More examples
Hide additional examples
examples/accept_encoding_preferred.rs (line 93)
11fn main() {
12    println!("=== AcceptEncoding Preferred and Sorting Examples ===\n");
13
14    // Create an AcceptEncoding with different quality values
15    let encodings = vec![
16        (Encoding::Gzip, 0.7),
17        (Encoding::Deflate, 0.9), // This should be preferred (highest quality)
18        (Encoding::Br, 1.0),      // Highest quality, but might not be allowed by server
19        (Encoding::Identity, 0.1),
20        (Encoding::Zstd, 0.8), // High quality compression
21    ];
22
23    let mut accept_encoding = AcceptEncoding::new(encodings).unwrap();
24
25    println!("Original encodings:");
26    print_encodings(&accept_encoding);
27
28    // Find preferred encoding from unsorted list
29    println!("\n1. Finding preferred encoding (unsorted) - preferred():");
30    if let Some(preferred) = accept_encoding.preferred() {
31        println!(
32            "   Preferred: {} (finds highest quality from unsorted list)",
33            preferred
34        );
35    }
36
37    // Example server capabilities - let's say server only supports some encodings
38    let server_supported = vec![Encoding::Gzip, Encoding::Deflate, Encoding::Identity];
39
40    println!("\n2. Server-side filtering with preferred_allowed():");
41    println!("   Server supports: {:?}", server_supported);
42    if let Some(preferred_allowed) = accept_encoding.preferred_allowed(server_supported.iter()) {
43        println!(
44            "   Preferred (server filtered): {} (highest quality that server supports)",
45            preferred_allowed
46        );
47    }
48
49    // Compare different server capabilities
50    let limited_server = vec![Encoding::Identity]; // Very limited server
51    println!("\n   Limited server supports only: {:?}", limited_server);
52    if let Some(preferred_limited) = accept_encoding.preferred_allowed(limited_server.iter()) {
53        println!(
54            "   Preferred (limited server): {} (only available option)",
55            preferred_limited
56        );
57    } else {
58        println!("   No acceptable encoding found for limited server");
59    }
60
61    let advanced_server = vec![Encoding::Br, Encoding::Zstd, Encoding::Gzip]; // Advanced server
62    println!("\n   Advanced server supports: {:?}", advanced_server);
63    if let Some(preferred_advanced) = accept_encoding.preferred_allowed(advanced_server.iter()) {
64        println!(
65            "   Preferred (advanced server): {} (best match from advanced capabilities)",
66            preferred_advanced
67        );
68    }
69
70    // Sort descending (highest quality first) - modifies in place
71    println!("\n3. After sorting descending (in-place):");
72    accept_encoding.sort_descending();
73    print_encodings(&accept_encoding);
74
75    if let Some(preferred) = accept_encoding.preferred() {
76        println!(
77            "   Preferred: {} (first item when sorted descending)",
78            preferred
79        );
80    }
81
82    // Test preferred_allowed with sorted list
83    println!("\n   Server-side filtering after sorting descending:");
84    if let Some(preferred_allowed) = accept_encoding.preferred_allowed(server_supported.iter()) {
85        println!(
86            "   Preferred (server filtered): {} (efficiently finds first match in sorted list)",
87            preferred_allowed
88        );
89    }
90
91    // Sort ascending (lowest quality first) - modifies in place
92    println!("\n4. After sorting ascending (in-place):");
93    accept_encoding.sort_ascending();
94    print_encodings(&accept_encoding);
95
96    if let Some(preferred) = accept_encoding.preferred() {
97        println!(
98            "   Preferred: {} (last item when sorted ascending)",
99            preferred
100        );
101    }
102
103    // Test preferred_allowed with ascending sorted list
104    println!("\n   Server-side filtering after sorting ascending:");
105    if let Some(preferred_allowed) = accept_encoding.preferred_allowed(server_supported.iter()) {
106        println!(
107            "   Preferred (server filtered): {} (efficiently finds best match from end)",
108            preferred_allowed
109        );
110    }
111
112    // Demonstrate chaining - sort methods return &mut Self for chaining
113    println!("\n5. Method chaining example:");
114    let encodings2 = vec![
115        (Encoding::Gzip, 0.3),
116        (Encoding::Deflate, 0.8),
117        (Encoding::Br, 0.6),
118    ];
119
120    let mut accept_encoding2 = AcceptEncoding::new(encodings2).unwrap();
121
122    // Chain operations
123    let preferred_after_desc_sort = accept_encoding2.sort_descending().preferred().cloned(); // Clone the encoding to avoid borrowing issues
124
125    println!(
126        "   After chaining sort_descending().preferred(): {:?}",
127        preferred_after_desc_sort
128    );
129
130    // Sort back and get preferred
131    let preferred_after_asc_sort = accept_encoding2.sort_ascending().preferred().cloned();
132
133    println!(
134        "   After chaining sort_ascending().preferred(): {:?}",
135        preferred_after_asc_sort
136    );
137
138    // Demonstrate with equal quality values
139    println!("\n6. Equal quality values example:");
140    let equal_encodings = vec![
141        (Encoding::Gzip, 0.8),
142        (Encoding::Deflate, 0.8), // Same quality
143        (Encoding::Br, 0.8),      // Same quality
144    ];
145
146    let mut equal_accept = AcceptEncoding::new(equal_encodings).unwrap();
147    println!("   Original (all equal quality):");
148    print_encodings(&equal_accept);
149
150    if let Some(preferred) = equal_accept.preferred() {
151        println!(
152            "   Preferred from equal qualities: {} (first found with max quality)",
153            preferred
154        );
155    }
156
157    // Test server filtering with equal qualities
158    let partial_server = vec![Encoding::Deflate, Encoding::Br];
159    if let Some(preferred_filtered) = equal_accept.preferred_allowed(partial_server.iter()) {
160        println!(
161            "   Preferred (server filtered from equal qualities): {} (first allowed match)",
162            preferred_filtered
163        );
164    }
165
166    equal_accept.sort_descending();
167    println!("   After sort_descending (stable sort preserves original order for equal elements):");
168    print_encodings(&equal_accept);
169
170    // Demonstrate practical content negotiation scenario
171    println!("\n7. Practical content negotiation scenario:");
172    practical_negotiation_example();
173}
Source

pub fn preferred(&self) -> Option<&Encoding>

Returns the highest-preference encoding.

Examples found in repository?
examples/basic_usage.rs (line 176)
157fn accept_encoding_advanced_examples() {
158    println!("\n\n3. AcceptEncoding Advanced Usage");
159    println!("===============================");
160
161    // Create an AcceptEncoding instance with various encodings
162    let encodings = vec![
163        (Encoding::Gzip, 0.9),
164        (Encoding::Deflate, 0.8),
165        (Encoding::Br, 1.0),       // Highest quality
166        (Encoding::Identity, 0.1), // Lowest quality
167        (Encoding::Zstd, 0.7),
168    ];
169
170    let mut accept_encoding = AcceptEncoding::new(encodings).unwrap();
171    println!("\n3a. Original AcceptEncoding:");
172    println!("   Encodings: {:?}", accept_encoding.items());
173
174    // Example 3a: Finding preferred encoding
175    println!("\n3b. Finding preferred encoding:");
176    if let Some(preferred) = accept_encoding.preferred() {
177        println!("   Preferred encoding: {}", preferred);
178        println!("   (Highest quality value from unsorted list)");
179    }
180
181    // Example 3b: Sorting in descending order (highest quality first)
182    println!("\n3c. Sorting in descending order (highest quality first):");
183    accept_encoding.sort_descending();
184    println!("   After sort_descending():");
185    for (encoding, quality) in accept_encoding.items() {
186        println!("     {} (q={})", encoding, quality);
187    }
188
189    // Now preferred should be first item
190    if let Some(preferred) = accept_encoding.preferred() {
191        println!("   Preferred encoding after sorting: {}", preferred);
192        println!("   (First item in descending sorted list)");
193    }
194
195    // Example 3c: Sorting in ascending order (lowest quality first)
196    println!("\n3d. Sorting in ascending order (lowest quality first):");
197    accept_encoding.sort_ascending();
198    println!("   After sort_ascending():");
199    for (encoding, quality) in accept_encoding.items() {
200        println!("     {} (q={})", encoding, quality);
201    }
202
203    // Now preferred should be last item
204    if let Some(preferred) = accept_encoding.preferred() {
205        println!("   Preferred encoding after ascending sort: {}", preferred);
206        println!("   (Last item in ascending sorted list)");
207    }
208
209    // Example 3d: Demonstrating in-place sorting behavior
210    println!("\n3e. Demonstrating in-place sorting chain:");
211    let encodings2 = vec![
212        (Encoding::Gzip, 0.5),
213        (Encoding::Deflate, 0.9),
214        (Encoding::Br, 0.3),
215    ];
216
217    let mut accept_encoding2 = AcceptEncoding::new(encodings2).unwrap();
218    println!("   Original: {:?}", accept_encoding2.items());
219
220    // Chain sorting operations (returns &mut Self for chaining)
221    accept_encoding2.sort_descending();
222    println!("   Descending: {:?}", accept_encoding2.items());
223
224    // Sort back to ascending
225    accept_encoding2.sort_ascending();
226    println!("   Ascending: {:?}", accept_encoding2.items());
227
228    println!("\n3f. Practical example - Content negotiation:");
229    practical_content_negotiation_example();
230}
More examples
Hide additional examples
examples/accept_encoding_preferred.rs (line 30)
11fn main() {
12    println!("=== AcceptEncoding Preferred and Sorting Examples ===\n");
13
14    // Create an AcceptEncoding with different quality values
15    let encodings = vec![
16        (Encoding::Gzip, 0.7),
17        (Encoding::Deflate, 0.9), // This should be preferred (highest quality)
18        (Encoding::Br, 1.0),      // Highest quality, but might not be allowed by server
19        (Encoding::Identity, 0.1),
20        (Encoding::Zstd, 0.8), // High quality compression
21    ];
22
23    let mut accept_encoding = AcceptEncoding::new(encodings).unwrap();
24
25    println!("Original encodings:");
26    print_encodings(&accept_encoding);
27
28    // Find preferred encoding from unsorted list
29    println!("\n1. Finding preferred encoding (unsorted) - preferred():");
30    if let Some(preferred) = accept_encoding.preferred() {
31        println!(
32            "   Preferred: {} (finds highest quality from unsorted list)",
33            preferred
34        );
35    }
36
37    // Example server capabilities - let's say server only supports some encodings
38    let server_supported = vec![Encoding::Gzip, Encoding::Deflate, Encoding::Identity];
39
40    println!("\n2. Server-side filtering with preferred_allowed():");
41    println!("   Server supports: {:?}", server_supported);
42    if let Some(preferred_allowed) = accept_encoding.preferred_allowed(server_supported.iter()) {
43        println!(
44            "   Preferred (server filtered): {} (highest quality that server supports)",
45            preferred_allowed
46        );
47    }
48
49    // Compare different server capabilities
50    let limited_server = vec![Encoding::Identity]; // Very limited server
51    println!("\n   Limited server supports only: {:?}", limited_server);
52    if let Some(preferred_limited) = accept_encoding.preferred_allowed(limited_server.iter()) {
53        println!(
54            "   Preferred (limited server): {} (only available option)",
55            preferred_limited
56        );
57    } else {
58        println!("   No acceptable encoding found for limited server");
59    }
60
61    let advanced_server = vec![Encoding::Br, Encoding::Zstd, Encoding::Gzip]; // Advanced server
62    println!("\n   Advanced server supports: {:?}", advanced_server);
63    if let Some(preferred_advanced) = accept_encoding.preferred_allowed(advanced_server.iter()) {
64        println!(
65            "   Preferred (advanced server): {} (best match from advanced capabilities)",
66            preferred_advanced
67        );
68    }
69
70    // Sort descending (highest quality first) - modifies in place
71    println!("\n3. After sorting descending (in-place):");
72    accept_encoding.sort_descending();
73    print_encodings(&accept_encoding);
74
75    if let Some(preferred) = accept_encoding.preferred() {
76        println!(
77            "   Preferred: {} (first item when sorted descending)",
78            preferred
79        );
80    }
81
82    // Test preferred_allowed with sorted list
83    println!("\n   Server-side filtering after sorting descending:");
84    if let Some(preferred_allowed) = accept_encoding.preferred_allowed(server_supported.iter()) {
85        println!(
86            "   Preferred (server filtered): {} (efficiently finds first match in sorted list)",
87            preferred_allowed
88        );
89    }
90
91    // Sort ascending (lowest quality first) - modifies in place
92    println!("\n4. After sorting ascending (in-place):");
93    accept_encoding.sort_ascending();
94    print_encodings(&accept_encoding);
95
96    if let Some(preferred) = accept_encoding.preferred() {
97        println!(
98            "   Preferred: {} (last item when sorted ascending)",
99            preferred
100        );
101    }
102
103    // Test preferred_allowed with ascending sorted list
104    println!("\n   Server-side filtering after sorting ascending:");
105    if let Some(preferred_allowed) = accept_encoding.preferred_allowed(server_supported.iter()) {
106        println!(
107            "   Preferred (server filtered): {} (efficiently finds best match from end)",
108            preferred_allowed
109        );
110    }
111
112    // Demonstrate chaining - sort methods return &mut Self for chaining
113    println!("\n5. Method chaining example:");
114    let encodings2 = vec![
115        (Encoding::Gzip, 0.3),
116        (Encoding::Deflate, 0.8),
117        (Encoding::Br, 0.6),
118    ];
119
120    let mut accept_encoding2 = AcceptEncoding::new(encodings2).unwrap();
121
122    // Chain operations
123    let preferred_after_desc_sort = accept_encoding2.sort_descending().preferred().cloned(); // Clone the encoding to avoid borrowing issues
124
125    println!(
126        "   After chaining sort_descending().preferred(): {:?}",
127        preferred_after_desc_sort
128    );
129
130    // Sort back and get preferred
131    let preferred_after_asc_sort = accept_encoding2.sort_ascending().preferred().cloned();
132
133    println!(
134        "   After chaining sort_ascending().preferred(): {:?}",
135        preferred_after_asc_sort
136    );
137
138    // Demonstrate with equal quality values
139    println!("\n6. Equal quality values example:");
140    let equal_encodings = vec![
141        (Encoding::Gzip, 0.8),
142        (Encoding::Deflate, 0.8), // Same quality
143        (Encoding::Br, 0.8),      // Same quality
144    ];
145
146    let mut equal_accept = AcceptEncoding::new(equal_encodings).unwrap();
147    println!("   Original (all equal quality):");
148    print_encodings(&equal_accept);
149
150    if let Some(preferred) = equal_accept.preferred() {
151        println!(
152            "   Preferred from equal qualities: {} (first found with max quality)",
153            preferred
154        );
155    }
156
157    // Test server filtering with equal qualities
158    let partial_server = vec![Encoding::Deflate, Encoding::Br];
159    if let Some(preferred_filtered) = equal_accept.preferred_allowed(partial_server.iter()) {
160        println!(
161            "   Preferred (server filtered from equal qualities): {} (first allowed match)",
162            preferred_filtered
163        );
164    }
165
166    equal_accept.sort_descending();
167    println!("   After sort_descending (stable sort preserves original order for equal elements):");
168    print_encodings(&equal_accept);
169
170    // Demonstrate practical content negotiation scenario
171    println!("\n7. Practical content negotiation scenario:");
172    practical_negotiation_example();
173}
174
175fn print_encodings(accept_encoding: &AcceptEncoding) {
176    for (encoding, quality) in accept_encoding.items() {
177        println!("     {} (q={})", encoding, quality);
178    }
179}
180
181/// Demonstrates practical content negotiation comparing both methods
182fn practical_negotiation_example() {
183    println!(
184        "   Scenario: Client sends 'Accept-Encoding: br;q=1.0, zstd;q=0.9, gzip;q=0.7, deflate;q=0.5'"
185    );
186
187    let client_preferences = vec![
188        (Encoding::Br, 1.0),      // Client's top choice
189        (Encoding::Zstd, 0.9),    // Second choice
190        (Encoding::Gzip, 0.7),    // Third choice
191        (Encoding::Deflate, 0.5), // Fallback
192    ];
193
194    let accept_encoding = AcceptEncoding::new(client_preferences).unwrap();
195
196    // Method 1: preferred() - ignores server capabilities
197    if let Some(client_preferred) = accept_encoding.preferred() {
198        println!(
199            "   preferred(): {} (client's top choice, ignoring server)",
200            client_preferred
201        );
202    }
203
204    // Different server scenarios
205    let scenarios = vec![
206        (
207            "Basic server",
208            vec![Encoding::Gzip, Encoding::Deflate, Encoding::Identity],
209        ),
210        (
211            "Advanced server",
212            vec![Encoding::Br, Encoding::Zstd, Encoding::Gzip],
213        ),
214        ("Legacy server", vec![Encoding::Deflate, Encoding::Identity]),
215        (
216            "Modern server",
217            vec![
218                Encoding::Br,
219                Encoding::Zstd,
220                Encoding::Gzip,
221                Encoding::Deflate,
222            ],
223        ),
224    ];
225
226    for (server_name, server_caps) in scenarios {
227        print!("   {}: supports {:?}", server_name, server_caps);
228
229        if let Some(negotiated) = accept_encoding.preferred_allowed(server_caps.iter()) {
230            println!(" → selected: {}", negotiated);
231        } else {
232            println!(" → no acceptable encoding found");
233        }
234    }
235
236    println!("\n   Key difference:");
237    println!("   - preferred(): Returns client's top choice regardless of server capabilities");
238    println!("   - preferred_allowed(): Returns best mutually supported encoding");
239    println!("   - Both methods honor the current sorting state for efficiency");
240}
Source

pub fn preferred_allowed<'a>( &'a self, allowed: impl Iterator<Item = &'a Encoding>, ) -> Option<&'a Encoding>

Returns the highest-preference encoding that is also present in allowed. Honors current sorting state (Ascending/Descending/Unsorted) like preferred.

Examples found in repository?
examples/accept_encoding_preferred.rs (line 42)
11fn main() {
12    println!("=== AcceptEncoding Preferred and Sorting Examples ===\n");
13
14    // Create an AcceptEncoding with different quality values
15    let encodings = vec![
16        (Encoding::Gzip, 0.7),
17        (Encoding::Deflate, 0.9), // This should be preferred (highest quality)
18        (Encoding::Br, 1.0),      // Highest quality, but might not be allowed by server
19        (Encoding::Identity, 0.1),
20        (Encoding::Zstd, 0.8), // High quality compression
21    ];
22
23    let mut accept_encoding = AcceptEncoding::new(encodings).unwrap();
24
25    println!("Original encodings:");
26    print_encodings(&accept_encoding);
27
28    // Find preferred encoding from unsorted list
29    println!("\n1. Finding preferred encoding (unsorted) - preferred():");
30    if let Some(preferred) = accept_encoding.preferred() {
31        println!(
32            "   Preferred: {} (finds highest quality from unsorted list)",
33            preferred
34        );
35    }
36
37    // Example server capabilities - let's say server only supports some encodings
38    let server_supported = vec![Encoding::Gzip, Encoding::Deflate, Encoding::Identity];
39
40    println!("\n2. Server-side filtering with preferred_allowed():");
41    println!("   Server supports: {:?}", server_supported);
42    if let Some(preferred_allowed) = accept_encoding.preferred_allowed(server_supported.iter()) {
43        println!(
44            "   Preferred (server filtered): {} (highest quality that server supports)",
45            preferred_allowed
46        );
47    }
48
49    // Compare different server capabilities
50    let limited_server = vec![Encoding::Identity]; // Very limited server
51    println!("\n   Limited server supports only: {:?}", limited_server);
52    if let Some(preferred_limited) = accept_encoding.preferred_allowed(limited_server.iter()) {
53        println!(
54            "   Preferred (limited server): {} (only available option)",
55            preferred_limited
56        );
57    } else {
58        println!("   No acceptable encoding found for limited server");
59    }
60
61    let advanced_server = vec![Encoding::Br, Encoding::Zstd, Encoding::Gzip]; // Advanced server
62    println!("\n   Advanced server supports: {:?}", advanced_server);
63    if let Some(preferred_advanced) = accept_encoding.preferred_allowed(advanced_server.iter()) {
64        println!(
65            "   Preferred (advanced server): {} (best match from advanced capabilities)",
66            preferred_advanced
67        );
68    }
69
70    // Sort descending (highest quality first) - modifies in place
71    println!("\n3. After sorting descending (in-place):");
72    accept_encoding.sort_descending();
73    print_encodings(&accept_encoding);
74
75    if let Some(preferred) = accept_encoding.preferred() {
76        println!(
77            "   Preferred: {} (first item when sorted descending)",
78            preferred
79        );
80    }
81
82    // Test preferred_allowed with sorted list
83    println!("\n   Server-side filtering after sorting descending:");
84    if let Some(preferred_allowed) = accept_encoding.preferred_allowed(server_supported.iter()) {
85        println!(
86            "   Preferred (server filtered): {} (efficiently finds first match in sorted list)",
87            preferred_allowed
88        );
89    }
90
91    // Sort ascending (lowest quality first) - modifies in place
92    println!("\n4. After sorting ascending (in-place):");
93    accept_encoding.sort_ascending();
94    print_encodings(&accept_encoding);
95
96    if let Some(preferred) = accept_encoding.preferred() {
97        println!(
98            "   Preferred: {} (last item when sorted ascending)",
99            preferred
100        );
101    }
102
103    // Test preferred_allowed with ascending sorted list
104    println!("\n   Server-side filtering after sorting ascending:");
105    if let Some(preferred_allowed) = accept_encoding.preferred_allowed(server_supported.iter()) {
106        println!(
107            "   Preferred (server filtered): {} (efficiently finds best match from end)",
108            preferred_allowed
109        );
110    }
111
112    // Demonstrate chaining - sort methods return &mut Self for chaining
113    println!("\n5. Method chaining example:");
114    let encodings2 = vec![
115        (Encoding::Gzip, 0.3),
116        (Encoding::Deflate, 0.8),
117        (Encoding::Br, 0.6),
118    ];
119
120    let mut accept_encoding2 = AcceptEncoding::new(encodings2).unwrap();
121
122    // Chain operations
123    let preferred_after_desc_sort = accept_encoding2.sort_descending().preferred().cloned(); // Clone the encoding to avoid borrowing issues
124
125    println!(
126        "   After chaining sort_descending().preferred(): {:?}",
127        preferred_after_desc_sort
128    );
129
130    // Sort back and get preferred
131    let preferred_after_asc_sort = accept_encoding2.sort_ascending().preferred().cloned();
132
133    println!(
134        "   After chaining sort_ascending().preferred(): {:?}",
135        preferred_after_asc_sort
136    );
137
138    // Demonstrate with equal quality values
139    println!("\n6. Equal quality values example:");
140    let equal_encodings = vec![
141        (Encoding::Gzip, 0.8),
142        (Encoding::Deflate, 0.8), // Same quality
143        (Encoding::Br, 0.8),      // Same quality
144    ];
145
146    let mut equal_accept = AcceptEncoding::new(equal_encodings).unwrap();
147    println!("   Original (all equal quality):");
148    print_encodings(&equal_accept);
149
150    if let Some(preferred) = equal_accept.preferred() {
151        println!(
152            "   Preferred from equal qualities: {} (first found with max quality)",
153            preferred
154        );
155    }
156
157    // Test server filtering with equal qualities
158    let partial_server = vec![Encoding::Deflate, Encoding::Br];
159    if let Some(preferred_filtered) = equal_accept.preferred_allowed(partial_server.iter()) {
160        println!(
161            "   Preferred (server filtered from equal qualities): {} (first allowed match)",
162            preferred_filtered
163        );
164    }
165
166    equal_accept.sort_descending();
167    println!("   After sort_descending (stable sort preserves original order for equal elements):");
168    print_encodings(&equal_accept);
169
170    // Demonstrate practical content negotiation scenario
171    println!("\n7. Practical content negotiation scenario:");
172    practical_negotiation_example();
173}
174
175fn print_encodings(accept_encoding: &AcceptEncoding) {
176    for (encoding, quality) in accept_encoding.items() {
177        println!("     {} (q={})", encoding, quality);
178    }
179}
180
181/// Demonstrates practical content negotiation comparing both methods
182fn practical_negotiation_example() {
183    println!(
184        "   Scenario: Client sends 'Accept-Encoding: br;q=1.0, zstd;q=0.9, gzip;q=0.7, deflate;q=0.5'"
185    );
186
187    let client_preferences = vec![
188        (Encoding::Br, 1.0),      // Client's top choice
189        (Encoding::Zstd, 0.9),    // Second choice
190        (Encoding::Gzip, 0.7),    // Third choice
191        (Encoding::Deflate, 0.5), // Fallback
192    ];
193
194    let accept_encoding = AcceptEncoding::new(client_preferences).unwrap();
195
196    // Method 1: preferred() - ignores server capabilities
197    if let Some(client_preferred) = accept_encoding.preferred() {
198        println!(
199            "   preferred(): {} (client's top choice, ignoring server)",
200            client_preferred
201        );
202    }
203
204    // Different server scenarios
205    let scenarios = vec![
206        (
207            "Basic server",
208            vec![Encoding::Gzip, Encoding::Deflate, Encoding::Identity],
209        ),
210        (
211            "Advanced server",
212            vec![Encoding::Br, Encoding::Zstd, Encoding::Gzip],
213        ),
214        ("Legacy server", vec![Encoding::Deflate, Encoding::Identity]),
215        (
216            "Modern server",
217            vec![
218                Encoding::Br,
219                Encoding::Zstd,
220                Encoding::Gzip,
221                Encoding::Deflate,
222            ],
223        ),
224    ];
225
226    for (server_name, server_caps) in scenarios {
227        print!("   {}: supports {:?}", server_name, server_caps);
228
229        if let Some(negotiated) = accept_encoding.preferred_allowed(server_caps.iter()) {
230            println!(" → selected: {}", negotiated);
231        } else {
232            println!(" → no acceptable encoding found");
233        }
234    }
235
236    println!("\n   Key difference:");
237    println!("   - preferred(): Returns client's top choice regardless of server capabilities");
238    println!("   - preferred_allowed(): Returns best mutually supported encoding");
239    println!("   - Both methods honor the current sorting state for efficiency");
240}

Trait Implementations§

Source§

impl Clone for AcceptEncoding

Source§

fn clone(&self) -> AcceptEncoding

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Header for AcceptEncoding

Available on crate feature http_crates only.
Source§

fn name() -> &'static HeaderName

The name of this header.
Source§

fn decode<'i, I>(values: &mut I) -> Result<Self, Error>
where Self: Sized, I: Iterator<Item = &'i HeaderValue>,

Decode this type from an iterator of HeaderValues.
Source§

fn encode<E: Extend<HeaderValue>>(&self, values: &mut E)

Encode this type to a HeaderMap. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.