spacegate_kernel/utils/
with_length_or_chunked.rs

1use crate::SgBody;
2use hyper::{body::Body, header::HeaderValue, Request, Response};
3
4const CHUNKED: &str = "chunked";
5#[allow(dead_code)]
6/// Set the content length header or transfer encoding to chunked for Request.
7pub fn req_length_or_chunked(req: &mut Request<SgBody>) {
8    if let Some(len) = req.body().size_hint().exact() {
9        req.headers_mut().remove(hyper::header::TRANSFER_ENCODING);
10        req.headers_mut().insert(
11            hyper::header::CONTENT_LENGTH,
12            HeaderValue::from_str(len.to_string().as_str()).expect("digits should be valid header char"),
13        );
14    } else {
15        req.headers_mut().remove(hyper::header::CONTENT_LENGTH);
16        if let Some(len) = req.body().get_dumped().map(hyper::body::Bytes::len) {
17            req.headers_mut().remove(hyper::header::TRANSFER_ENCODING);
18            req.headers_mut().insert(
19                hyper::header::CONTENT_LENGTH,
20                HeaderValue::from_str(len.to_string().as_str()).expect("digits should be valid header char"),
21            );
22        } else if !req.headers().get_all(hyper::header::TRANSFER_ENCODING).iter().any(|v| v.as_bytes() == CHUNKED.as_bytes()) {
23            req.headers_mut().append(hyper::header::TRANSFER_ENCODING, HeaderValue::from_static(CHUNKED));
24        }
25    }
26}
27
28/// Set the content length header or transfer encoding to chunked for Response.
29pub fn with_length_or_chunked(resp: &mut Response<SgBody>) {
30    if let Some(len) = resp.body().size_hint().exact() {
31        resp.headers_mut().remove(hyper::header::TRANSFER_ENCODING);
32        resp.headers_mut().insert(
33            hyper::header::CONTENT_LENGTH,
34            HeaderValue::from_str(len.to_string().as_str()).expect("digits should be valid header char"),
35        );
36    } else {
37        resp.headers_mut().remove(hyper::header::CONTENT_LENGTH);
38        if let Some(len) = resp.body().get_dumped().map(hyper::body::Bytes::len) {
39            resp.headers_mut().remove(hyper::header::TRANSFER_ENCODING);
40            resp.headers_mut().insert(
41                hyper::header::CONTENT_LENGTH,
42                HeaderValue::from_str(len.to_string().as_str()).expect("digits should be valid header char"),
43            );
44        } else if !resp.headers().get_all(hyper::header::TRANSFER_ENCODING).iter().any(|v| v.as_bytes() == CHUNKED.as_bytes()) {
45            resp.headers_mut().append(hyper::header::TRANSFER_ENCODING, HeaderValue::from_static(CHUNKED));
46        }
47    }
48}