pub struct ContentEncoding { /* private fields */ }Expand description
The codings a response says its body carries.
Read from every Content-Encoding line together: a representation encoded more than once may
arrive comma-joined on one line or split across several, and it is the same list either way.
Implementations§
Source§impl ContentEncoding
impl ContentEncoding
Sourcepub fn codings(&self) -> &[Coding]
pub fn codings(&self) -> &[Coding]
The codings the header carried, in the order it applied them.
Empty for a response that declared none, and for one whose header could not be read.
Sourcepub fn layer(&self, coding: Coding) -> Self
pub fn layer(&self, coding: Coding) -> Self
Add a coding on top of the ones already here.
Applied last, so it is last in the header: the codings are listed in the order they were applied, and a reader unwinds them in reverse.
Examples found in repository?
16async fn main() {
17 let accept = AcceptEncoding::from(DEFAULT_ACCEPT_ENCODING);
18
19 let mut headers = HeaderMap::new();
20 headers.insert("content-encoding", HeaderValue::from_static("gzip"));
21 headers.insert("content-length", HeaderValue::from_static("42"));
22 // Just the header half, so the coding is in hand for the round trip below; `response::decode`
23 // does this and the body together.
24 let coding = ContentEncoding::peel_one_header(&mut headers, &accept)
25 .expect("gzip is in the default Accept-Encoding");
26 println!("negotiated: {coding:?}");
27 println!("headers after decoding: {:?}", headers.keys().count());
28
29 // Round-trip a body through the coding that was negotiated.
30 let original = b"the quick brown fox jumps over the lazy dog".repeat(8);
31 let compressed = compress_buffer(&original, coding.clone())
32 .await
33 .expect("gzip compresses");
34 println!(
35 "{} bytes in, {} bytes out",
36 original.len(),
37 compressed.len()
38 );
39
40 let stream = futures::stream::once(async move { Ok(Bytes::from(compressed)) });
41 let mut decoded = decode_stream(Box::pin(stream), coding);
42 let mut round_tripped = Vec::new();
43 while let Some(chunk) = decoded.next().await {
44 round_tripped.extend_from_slice(&chunk.expect("the body decodes"));
45 }
46 println!("round-tripped intact: {}", round_tripped == original);
47
48 // Compressing a request on top of a coding the caller already applied declares both, in the
49 // order they were applied.
50 let mut request = HeaderMap::new();
51 request.insert("content-encoding", HeaderValue::from_static("br"));
52
53 let layered = ContentEncoding::from(&request).layer(Coding::Gzip);
54 if let Some(value) = layered.to_header_value() {
55 request.insert("content-encoding", value);
56 }
57 println!(
58 "Content-Encoding: {}",
59 request["content-encoding"].to_str().unwrap()
60 );
61}Sourcepub fn to_header_value(&self) -> Option<HeaderValue>
pub fn to_header_value(&self) -> Option<HeaderValue>
The header value these codings make, or None when there are none to declare.
Examples found in repository?
16async fn main() {
17 let accept = AcceptEncoding::from(DEFAULT_ACCEPT_ENCODING);
18
19 let mut headers = HeaderMap::new();
20 headers.insert("content-encoding", HeaderValue::from_static("gzip"));
21 headers.insert("content-length", HeaderValue::from_static("42"));
22 // Just the header half, so the coding is in hand for the round trip below; `response::decode`
23 // does this and the body together.
24 let coding = ContentEncoding::peel_one_header(&mut headers, &accept)
25 .expect("gzip is in the default Accept-Encoding");
26 println!("negotiated: {coding:?}");
27 println!("headers after decoding: {:?}", headers.keys().count());
28
29 // Round-trip a body through the coding that was negotiated.
30 let original = b"the quick brown fox jumps over the lazy dog".repeat(8);
31 let compressed = compress_buffer(&original, coding.clone())
32 .await
33 .expect("gzip compresses");
34 println!(
35 "{} bytes in, {} bytes out",
36 original.len(),
37 compressed.len()
38 );
39
40 let stream = futures::stream::once(async move { Ok(Bytes::from(compressed)) });
41 let mut decoded = decode_stream(Box::pin(stream), coding);
42 let mut round_tripped = Vec::new();
43 while let Some(chunk) = decoded.next().await {
44 round_tripped.extend_from_slice(&chunk.expect("the body decodes"));
45 }
46 println!("round-tripped intact: {}", round_tripped == original);
47
48 // Compressing a request on top of a coding the caller already applied declares both, in the
49 // order they were applied.
50 let mut request = HeaderMap::new();
51 request.insert("content-encoding", HeaderValue::from_static("br"));
52
53 let layered = ContentEncoding::from(&request).layer(Coding::Gzip);
54 if let Some(value) = layered.to_header_value() {
55 request.insert("content-encoding", value);
56 }
57 println!(
58 "Content-Encoding: {}",
59 request["content-encoding"].to_str().unwrap()
60 );
61}Sourcepub fn can_decode_as(&self, accept: &AcceptEncoding) -> Option<Coding>
pub fn can_decode_as(&self, accept: &AcceptEncoding) -> Option<Coding>
The coding the next layer of the body is under, given what the request accepted.
The last coding, being the last applied and so the first to unwind. None leaves the body
as it arrived, which covers a response that declared no coding, one whose outermost coding
this crate cannot decode (identity among them) or the request did not accept, and one
whose header was not readable.
Sourcepub fn peeled(&self) -> Self
pub fn peeled(&self) -> Self
These codings with the outermost removed, as the body stands once it is decoded.
Sourcepub fn peel_one_header(
headers: &mut HeaderMap,
accept: &AcceptEncoding,
) -> Option<Coding>
pub fn peel_one_header( headers: &mut HeaderMap, accept: &AcceptEncoding, ) -> Option<Coding>
Take one layer off headers, returning the coding its body is under.
The headers are left describing the body once that coding has been decoded, which
response::decode does in the same call. Reach for this only to
drive the two halves separately.
Content-Encoding keeps whatever layers remain and goes when none do; Content-Length
goes either way, no longer describing what the caller reads. None leaves headers as
they are.
Examples found in repository?
16async fn main() {
17 let accept = AcceptEncoding::from(DEFAULT_ACCEPT_ENCODING);
18
19 let mut headers = HeaderMap::new();
20 headers.insert("content-encoding", HeaderValue::from_static("gzip"));
21 headers.insert("content-length", HeaderValue::from_static("42"));
22 // Just the header half, so the coding is in hand for the round trip below; `response::decode`
23 // does this and the body together.
24 let coding = ContentEncoding::peel_one_header(&mut headers, &accept)
25 .expect("gzip is in the default Accept-Encoding");
26 println!("negotiated: {coding:?}");
27 println!("headers after decoding: {:?}", headers.keys().count());
28
29 // Round-trip a body through the coding that was negotiated.
30 let original = b"the quick brown fox jumps over the lazy dog".repeat(8);
31 let compressed = compress_buffer(&original, coding.clone())
32 .await
33 .expect("gzip compresses");
34 println!(
35 "{} bytes in, {} bytes out",
36 original.len(),
37 compressed.len()
38 );
39
40 let stream = futures::stream::once(async move { Ok(Bytes::from(compressed)) });
41 let mut decoded = decode_stream(Box::pin(stream), coding);
42 let mut round_tripped = Vec::new();
43 while let Some(chunk) = decoded.next().await {
44 round_tripped.extend_from_slice(&chunk.expect("the body decodes"));
45 }
46 println!("round-tripped intact: {}", round_tripped == original);
47
48 // Compressing a request on top of a coding the caller already applied declares both, in the
49 // order they were applied.
50 let mut request = HeaderMap::new();
51 request.insert("content-encoding", HeaderValue::from_static("br"));
52
53 let layered = ContentEncoding::from(&request).layer(Coding::Gzip);
54 if let Some(value) = layered.to_header_value() {
55 request.insert("content-encoding", value);
56 }
57 println!(
58 "Content-Encoding: {}",
59 request["content-encoding"].to_str().unwrap()
60 );
61}Trait Implementations§
Source§impl Clone for ContentEncoding
impl Clone for ContentEncoding
Source§fn clone(&self) -> ContentEncoding
fn clone(&self) -> ContentEncoding
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more