1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
use crate::Body; use http::{HeaderValue, StatusCode, Version}; use hyper::HeaderMap; use std::ops::{Deref, DerefMut}; pub struct Response { pub status: StatusCode, pub version: Version, pub headers: HeaderMap<HeaderValue>, body: Body, } impl Response { pub fn new() -> Self { Self { status: StatusCode::default(), version: Version::default(), headers: HeaderMap::default(), body: Body::new(), } } fn into_resp(self) -> http::Response<hyper::Body> { let (mut parts, _) = http::Response::new(()).into_parts(); let Response { status, version, headers, body, } = self; parts.status = status; parts.version = version; parts.headers = headers; http::Response::from_parts(parts, body.stream().into()) } } impl Deref for Response { type Target = Body; #[inline] fn deref(&self) -> &Self::Target { &self.body } } impl DerefMut for Response { #[inline] fn deref_mut(&mut self) -> &mut Self::Target { &mut self.body } } impl From<Response> for http::Response<hyper::Body> { fn from(value: Response) -> Self { value.into_resp() } } impl Default for Response { fn default() -> Self { Self::new() } }