zip_static_handler/
actix.rs

1use crate::handler::Handler;
2use crate::http::headers::Line;
3use crate::http::request::Request;
4use crate::http::response::StatusCode;
5use actix_web::body::EitherBody;
6use actix_web::{HttpRequest, HttpResponse};
7use bytes::Bytes;
8use std::str::from_utf8;
9
10impl Handler {
11    pub fn handle_actix_request(
12        &self,
13        request: HttpRequest,
14    ) -> HttpResponse<EitherBody<Bytes, ()>> {
15        self.handle(RequestAdapter { inner: request })
16    }
17}
18
19struct RequestAdapter {
20    inner: HttpRequest,
21}
22
23impl Request<HttpResponse<EitherBody<Bytes, ()>>> for RequestAdapter {
24    fn method(&self) -> &[u8] {
25        self.inner.method().as_str().as_bytes()
26    }
27
28    fn path(&self) -> &[u8] {
29        self.inner.uri().path().as_bytes()
30    }
31
32    fn first_header_value(&self, key: &'static [u8]) -> Option<&[u8]> {
33        from_utf8(key)
34            .ok()
35            .and_then(|key| self.inner.headers().get(key).map(|it| it.as_bytes()))
36    }
37
38    fn response<'a>(
39        self,
40        code: StatusCode,
41        headers: impl Iterator<Item = &'a Line>,
42        body: Option<Bytes>,
43    ) -> HttpResponse<EitherBody<Bytes, ()>> {
44        let code: u16 = code.into();
45        let mut builder = HttpResponse::build(actix_web::http::StatusCode::from_u16(code).unwrap());
46        headers.for_each(|line| {
47            builder.append_header((line.key, line.value.as_ref()));
48        });
49        let body = body
50            .map(|body| EitherBody::Left { body })
51            .unwrap_or_else(|| EitherBody::Right { body: () });
52        builder.message_body(body).unwrap()
53    }
54}