use std::fmt;
use std::time::Duration;
use super::certificate::Certificate;
use super::header::HeaderVec;
use super::ip::IpAddr;
use super::url::Url;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Response {
pub version: HttpVersion,
pub status: u32,
pub headers: HeaderVec,
pub body: Vec<u8>,
pub duration: Duration,
pub url: Url,
pub certificate: Option<Certificate>,
pub ip_addr: IpAddr,
}
impl Response {
#[allow(clippy::too_many_arguments)]
pub fn new(
version: HttpVersion,
status: u32,
headers: HeaderVec,
body: Vec<u8>,
duration: Duration,
url: Url,
certificate: Option<Certificate>,
ip_addr: IpAddr,
) -> Self {
Response {
version,
status,
headers,
body,
duration,
url,
certificate,
ip_addr,
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum HttpVersion {
Http10,
Http11,
Http2,
Http3,
}
impl fmt::Display for HttpVersion {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let value = match self {
HttpVersion::Http10 => "HTTP/1.0",
HttpVersion::Http11 => "HTTP/1.1",
HttpVersion::Http2 => "HTTP/2",
HttpVersion::Http3 => "HTTP/3",
};
write!(f, "{value}")
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::http::Header;
#[test]
fn get_header_values() {
let mut headers = HeaderVec::new();
headers.push(Header::new("Content-Length", "12"));
let response = Response {
version: HttpVersion::Http10,
status: 200,
headers,
body: vec![],
duration: Default::default(),
url: "http://localhost".parse().unwrap(),
certificate: None,
ip_addr: Default::default(),
};
assert_eq!(response.headers.values("Content-Length"), vec!["12"]);
assert!(response.headers.values("Unknown").is_empty());
}
}