use crate::primitives::connection_info::ConnectionInfo;
use crate::primitives::request_body::RequestBody;
use crate::primitives::request_head::RequestHead;
#[derive(Debug)]
pub struct Request {
head: RequestHead,
body: RequestBody,
connection: ConnectionInfo,
}
impl Request {
pub fn new(head: RequestHead, body: RequestBody, connection: ConnectionInfo) -> Self {
Self {
head,
body,
connection,
}
}
pub fn head(&self) -> &RequestHead {
&self.head
}
pub fn body(&self) -> &RequestBody {
&self.body
}
pub fn into_parts(self) -> (RequestHead, RequestBody, ConnectionInfo) {
(self.head, self.body, self.connection)
}
pub fn into_body(self) -> RequestBody {
self.body
}
pub fn connection(&self) -> &ConnectionInfo {
&self.connection
}
pub fn into_head_and_body(self) -> (RequestHead, RequestBody) {
(self.head, self.body)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::primitives::connection_info::{ConnectionInfo, Scheme};
use crate::primitives::header_block::HeaderBlock;
use crate::primitives::method::Method;
use crate::primitives::request_body::RequestBody;
use crate::primitives::request_target::RequestTarget;
use crate::primitives::version::HttpVersion;
use std::net::SocketAddr;
fn test_connection() -> ConnectionInfo {
ConnectionInfo {
local_addr: "127.0.0.1:8000".parse::<SocketAddr>().unwrap(),
remote_addr: "127.0.0.1:12345".parse::<SocketAddr>().unwrap(),
scheme: Scheme::Http,
tls: None,
}
}
fn test_head() -> RequestHead {
RequestHead::new(
Method::get(),
RequestTarget::parse("/test").unwrap(),
HttpVersion::Http11,
HeaderBlock::new(),
)
}
#[test]
fn request_construction() {
let req = Request::new(test_head(), RequestBody::empty(), test_connection());
assert_eq!(req.head().method().as_str(), "GET");
assert!(
req.body().is_complete()
|| req.body().state() == crate::primitives::request_body::BodyState::Unread
);
}
#[test]
fn request_into_parts() {
let req = Request::new(test_head(), RequestBody::empty(), test_connection());
let (head, _body, conn) = req.into_parts();
assert_eq!(head.method().as_str(), "GET");
assert_eq!(conn.scheme, Scheme::Http);
}
#[test]
fn request_into_body() {
let req = Request::new(test_head(), RequestBody::empty(), test_connection());
let body = req.into_body();
assert!(body.declared_length().is_none() || body.declared_length() == Some(0));
}
#[test]
fn request_connection() {
let req = Request::new(test_head(), RequestBody::empty(), test_connection());
assert_eq!(req.connection().scheme, Scheme::Http);
}
}