irox_networking/http/
client.rs1use std::net::TcpStream;
6use std::str::FromStr;
7
8use crate::address::IPv4Address;
9use crate::error::Error;
10use crate::http::{HttpProtocol, HttpRequest, HttpResponse};
11
12pub const DEFAULT_USER_AGENT: &str = "irox-networking/0.1.0";
13
14pub struct Client;
15
16impl Client {
17 pub fn request(&mut self, req: HttpRequest) -> Result<HttpResponse, Error> {
18 let url = &req.url;
19 let ip = IPv4Address::from_str(url.host())?;
20 let Some(port) = url.port().or_else(|| {
21 let Ok(port) = HttpProtocol::from_str(&url.scheme) else {
22 return None;
23 };
24 Some(port.port())
25 }) else {
26 return Error::missing_port_err(format!(
27 "Port must be specified for unknown URL scheme: {}",
28 url.scheme
29 ));
30 };
31 let mut stream = TcpStream::connect(ip.sockaddr(port))?;
32 req.write_to(&mut stream)?;
33
34 let result = HttpResponse::create_from(stream)?;
35
36 Ok(result)
37 }
38}
39
40#[cfg(test)]
41mod test {
42 use std::str::FromStr;
43
44 use log::Level;
45
46 use crate::http::{Client, HttpRequest};
47 use crate::url::{UrlError, URL};
48
49 #[test]
50 #[ignore]
51 pub fn test() -> Result<(), UrlError> {
52 irox_log::init_console_level(Level::Debug);
53 let req = HttpRequest::new(URL::from_str("http://10.169.0.27:8080/get")?);
54 let resp = Client.request(req).expect("No errors!");
55 println!("{resp:?}");
56 Ok(())
57 }
58}