irox_networking/http/
client.rs

1// SPDX-License-Identifier: MIT
2// Copyright 2023 IROX Contributors
3//
4
5use 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}