Skip to content

Commit 1e69f61

Browse files
Update HttpStream
1 parent c960675 commit 1e69f61

File tree

11 files changed

+201
-167
lines changed

11 files changed

+201
-167
lines changed

crates/client/src/main.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::{
66
process,
77
};
88

9-
use http::{HttpMethod, HttpRequest, HttpStream};
9+
use http::{HttpMethod, HttpRequest};
1010
mod config;
1111
use config::ClientConfig;
1212

@@ -57,7 +57,6 @@ pub fn main() -> http::Result<()> {
5757
process::exit(1);
5858
}
5959
};
60-
let tcp = HttpStream::from(tcp);
6160
let mut result = req.send_to(tcp).unwrap_or_else(|err| {
6261
eprint!("ERROR: {err}");
6362
process::exit(1);

crates/http/Cargo.toml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,19 @@ path = "src/lib.rs"
1616
base64 = { package = "rb64", version = ">=0.1.0", git = "https://github.com/saulvaldelvira/rb64" }
1717
url = { package = "url-utils", version = ">=0.1.0", path = "../url" }
1818

19+
[dependencies.rustls]
20+
version = "0.23.28"
21+
optional = true
22+
default-features = false
23+
features = ["std"]
24+
1925
[dependencies.builders]
2026
package = "builders"
2127
default-features = false
2228
features = ["builder"]
23-
version = ">=0.1.0"
29+
version = ">=0.5.0"
2430
git = "https://github.com/saulvaldelvira/builders"
2531

32+
[features]
33+
default = []
34+
tls = ["dep:rustls"]

crates/http/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
//! .url("/")
1313
//! .build().unwrap();
1414
//! let tcp = TcpStream::connect("127.0.0.1:80").unwrap();
15-
//! req.send_to(HttpStream::from(tcp)).unwrap();
15+
//! req.send_to(tcp).unwrap();
1616
//! ```
1717
1818
pub mod encoding;

crates/http/src/request/mod.rs

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,29 @@
11
/* pub mod handler; */
22
use builders::Builder;
33
mod parse;
4+
use core::fmt;
45
use std::{
56
collections::HashMap,
67
env,
78
ffi::OsStr,
8-
io::{BufReader, Read, Write},
9+
io::{BufRead, BufReader, Read, Write},
910
path::Path,
1011
};
1112

1213
use parse::parse_request;
1314

14-
use crate::{HttpMethod, HttpResponse, HttpStream, Result, StatusCode, encoding::Chunked};
15+
use crate::{
16+
HttpMethod, HttpResponse, HttpStream, Result, StatusCode,
17+
encoding::Chunked,
18+
stream::{self, IntoHttpStream},
19+
};
1520

1621
/// HTTP Request
1722
///
1823
/// Represents an HTTP request
19-
#[derive(Builder, Debug)]
24+
#[derive(Builder)]
2025
pub struct HttpRequest {
26+
#[builder(def = { HttpMethod::GET })]
2127
method: HttpMethod,
2228
url: Box<str>,
2329
#[builder(map = "header")]
@@ -28,35 +34,55 @@ pub struct HttpRequest {
2834
response_headers: HashMap<Box<str>, Box<str>>,
2935
#[builder(def = 1.0)]
3036
version: f32,
31-
#[builder(disabled = true)]
32-
#[builder(def = { BufReader::new(HttpStream::dummy()) })]
33-
stream: BufReader<HttpStream>,
37+
#[builder(def = { BufReader::new(stream::dummy())} )]
38+
stream: BufReader<Box<dyn HttpStream>>,
3439
#[builder(def = 200u16)]
3540
status: u16,
3641
#[builder(optional = true)]
3742
body: Option<Box<[u8]>>,
3843
}
3944

45+
impl fmt::Debug for HttpRequest {
46+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
47+
f.debug_struct("HttpRequest")
48+
.field("method", &self.method)
49+
.field("url", &self.url)
50+
.field("headers", &self.headers)
51+
.field("params", &self.params)
52+
.field("response_headers", &self.response_headers)
53+
.field("version", &self.version)
54+
.field("status", &self.status)
55+
.field("body", &self.body)
56+
.finish()
57+
}
58+
}
59+
4060
impl HttpRequest {
4161
/// Read and parse an HTTP request from the given [`HttpStream`]
42-
pub fn parse(stream: impl Into<HttpStream>) -> Result<Self> {
43-
let stream = BufReader::new(stream.into());
44-
parse_request(stream)
62+
pub fn parse<S: IntoHttpStream>(stream: S) -> Result<Self> {
63+
let stream: Box<dyn HttpStream> = Box::new(stream.into_http_stream());
64+
parse_request(BufReader::new(stream))
4565
}
66+
4667
#[inline]
4768
pub fn keep_alive(self) -> Result<Self> {
4869
let mut req = parse_request(self.stream)?;
4970
req.set_header("Connection", "keep-alive");
5071
Ok(req)
5172
}
73+
74+
#[inline]
75+
pub fn stream(&self) -> &BufReader<Box<dyn HttpStream>> {
76+
&self.stream
77+
}
78+
5279
#[inline]
53-
#[must_use]
54-
pub fn stream(&self) -> &HttpStream {
55-
self.stream.get_ref()
80+
pub fn stream_mut(&mut self) -> &mut BufReader<Box<dyn HttpStream>> {
81+
&mut self.stream
5682
}
83+
5784
/// Url of the request
5885
#[inline]
59-
#[must_use]
6086
pub fn url(&self) -> &str {
6187
&self.url
6288
}
@@ -120,7 +146,8 @@ impl HttpRequest {
120146
///
121147
/// # Errors
122148
/// If the transfer fails, returns the error
123-
pub fn send_to(&self, mut stream: HttpStream) -> crate::Result<HttpResponse> {
149+
pub fn send_to<Out: IntoHttpStream>(&self, stream: Out) -> crate::Result<HttpResponse> {
150+
let mut stream = stream.into_http_stream();
124151
self.write_to(&mut stream)?;
125152
stream.flush()?;
126153
HttpResponse::parse(stream)
@@ -230,8 +257,8 @@ impl HttpRequest {
230257
/// [`stream`]'s availability
231258
///
232259
/// [`stream`]: HttpStream
233-
pub fn has_body(&self) -> Result<bool> {
234-
Ok(self.body.is_some() || self.stream.get_ref().is_ready()?)
260+
pub fn has_body(&mut self) -> Result<bool> {
261+
Ok(self.body.is_some() || !self.stream.fill_buf()?.is_empty())
235262
}
236263

237264
/// Reads the request body into [writer](Write)

crates/http/src/request/parse.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::{
55

66
use crate::{HttpStream, Result, err, request::HttpRequest};
77

8-
pub(super) fn parse_request(mut stream: BufReader<HttpStream>) -> Result<HttpRequest> {
8+
pub(super) fn parse_request(mut stream: BufReader<Box<dyn HttpStream>>) -> Result<HttpRequest> {
99
let mut line = String::new();
1010
/* Parse request line */
1111
stream.read_line(&mut line)?;

crates/http/src/response/mod.rs

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,27 @@
1+
use core::fmt;
12
use std::{
23
collections::HashMap,
3-
io::{self, BufReader, Read, Write},
4+
io::{self, BufRead, BufReader, Read, Write},
45
};
56

67
use builders::Builder;
78
use parse::parse_response;
89

9-
use crate::{HttpStream, Result};
10+
use crate::{
11+
HttpStream, Result,
12+
stream::{self, IntoHttpStream},
13+
};
1014

1115
mod parse;
1216

1317
/// An Http response
14-
#[derive(Builder, Debug)]
18+
#[derive(Builder)]
1519
pub struct HttpResponse {
1620
#[builder(map = "header")]
1721
headers: HashMap<String, String>,
1822
#[builder(disabled = true)]
19-
#[builder(def = { BufReader::new(HttpStream::dummy()) })]
20-
stream: BufReader<HttpStream>,
23+
#[builder(def = { BufReader::new(stream::dummy())} )]
24+
stream: BufReader<Box<dyn HttpStream>>,
2125
#[builder(def = 200u16)]
2226
status: u16,
2327
#[builder(optional = true)]
@@ -26,10 +30,21 @@ pub struct HttpResponse {
2630
version: f32,
2731
}
2832

33+
impl fmt::Debug for HttpResponse {
34+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
35+
f.debug_struct("HttpResponse")
36+
.field("headers", &self.headers)
37+
.field("status", &self.status)
38+
.field("body", &self.body)
39+
.field("version", &self.version)
40+
.finish()
41+
}
42+
}
43+
2944
impl HttpResponse {
30-
pub fn parse(stream: impl Into<HttpStream>) -> crate::Result<Self> {
31-
let stream = BufReader::new(stream.into());
32-
parse_response(stream)
45+
pub fn parse<S: IntoHttpStream>(stream: S) -> crate::Result<Self> {
46+
let stream: Box<dyn HttpStream> = Box::new(stream.into_http_stream());
47+
parse_response(BufReader::new(stream))
3348
}
3449
#[inline]
3550
#[must_use]
@@ -115,8 +130,8 @@ impl HttpResponse {
115130
/// [`stream`]'s availability
116131
///
117132
/// [`stream`]: HttpStream
118-
pub fn has_body(&self) -> Result<bool> {
119-
Ok(self.stream.get_ref().is_ready()?)
133+
pub fn has_body(&mut self) -> Result<bool> {
134+
Ok(self.body.is_some() || !self.stream.fill_buf()?.is_empty())
120135
}
121136

122137
/// Reads the response's body into [writer](Write)

crates/http/src/response/parse.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ use std::{
66
use super::HttpResponse;
77
use crate::{HttpStream, err};
88

9-
pub(super) fn parse_response(mut stream: BufReader<HttpStream>) -> crate::Result<HttpResponse> {
9+
pub(super) fn parse_response(
10+
mut stream: BufReader<Box<dyn HttpStream>>,
11+
) -> crate::Result<HttpResponse> {
1012
let mut line = String::new();
1113
/* Parse request line */
1214
stream.read_line(&mut line)?;

0 commit comments

Comments
 (0)