async_http_codec/body/
common.rs

1use anyhow::bail;
2use http::header::{CONTENT_LENGTH, TRANSFER_ENCODING};
3use http::HeaderMap;
4
5pub(crate) fn length_from_headers(headers: &HeaderMap) -> anyhow::Result<Option<u64>> {
6    let mut chunked = false;
7    for v in headers.get_all(TRANSFER_ENCODING) {
8        if v != "chunked" {
9            bail!("unsupported Transfer-Encoding: {:?}", v)
10        }
11        chunked = true;
12    }
13    if chunked {
14        Ok(None)
15    } else if let Some(v) = headers.get(CONTENT_LENGTH) {
16        Ok(Some(v.to_str()?.parse()?))
17    } else {
18        Ok(Some(0))
19    }
20}