Skip to content

Commit 6e27563

Browse files
committed
Fix up server
1 parent 49ab4b1 commit 6e27563

File tree

1 file changed

+32
-18
lines changed

1 file changed

+32
-18
lines changed

src/server.rs

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
//! Process HTTP connections on the server.
22
33
use async_std::future::{timeout, Future, TimeoutError};
4-
use async_std::io::{self, BufReader};
4+
use async_std::io::{self, BufRead, BufReader};
55
use async_std::io::{Read, Write};
66
use async_std::prelude::*;
77
use async_std::task::{Context, Poll};
88
use futures_core::ready;
9-
use http_types::{HttpVersion, Method, Request, Response};
10-
use std::convert::TryFrom;
9+
use http_types::{Method, Request, Response};
10+
use std::str::FromStr;
1111
use std::time::Duration;
1212

1313
use std::pin::Pin;
@@ -31,7 +31,11 @@ where
3131

3232
let req = decode(reader).await?;
3333
let mut num_requests = 0;
34-
if let Some(mut req) = req {
34+
if let Some((mut req, stream)) = req {
35+
let mut stream: Option<Box<dyn BufRead + Unpin + Send + 'static>> = match stream {
36+
Some(s) => Some(Box::new(s)),
37+
None => None,
38+
};
3539
loop {
3640
num_requests += 1;
3741
if num_requests > MAX_REQUESTS {
@@ -40,13 +44,22 @@ where
4044

4145
// TODO: what to do when the callback returns Err
4246
let mut res = encode(callback(&mut req).await?).await?;
43-
let stream = req.into_body();
47+
let to_decode = match stream {
48+
None => req.into_body(),
49+
Some(s) => s,
50+
};
4451
io::copy(&mut res, &mut writer).await?;
45-
req = match timeout(timeout_duration, decode(stream)).await {
52+
let (new_request, new_stream) = match timeout(timeout_duration, decode(to_decode)).await
53+
{
4654
Ok(Ok(Some(r))) => r,
4755
Ok(Ok(None)) | Err(TimeoutError { .. }) => break, /* EOF or timeout */
4856
Ok(Err(e)) => return Err(e),
4957
};
58+
req = new_request;
59+
stream = match new_stream {
60+
Some(s) => Some(Box::new(s)),
61+
None => None,
62+
};
5063
}
5164
}
5265

@@ -148,7 +161,7 @@ pub async fn encode(res: Response) -> io::Result<Encoder> {
148161
}
149162

150163
/// Decode an HTTP request on the server.
151-
pub async fn decode<R>(reader: R) -> Result<Option<Request>, Exception>
164+
pub async fn decode<R>(reader: R) -> Result<Option<(Request, Option<BufReader<R>>)>, Exception>
152165
where
153166
R: Read + Unpin + Send + 'static,
154167
{
@@ -184,11 +197,10 @@ where
184197
let uri = httparse_req.path.ok_or_else(|| "No uri found")?;
185198
let uri = url::Url::parse(uri)?;
186199
let version = httparse_req.version.ok_or_else(|| "No version found")?;
187-
let version = match version {
188-
1 => HttpVersion::HTTP1_1,
189-
_ => return Err("Unsupported HTTP version".into()),
190-
};
191-
let mut req = Request::new(version, Method::try_from(method)?, uri);
200+
if version != 1 {
201+
return Err("Unsupported HTTP version".into());
202+
}
203+
let mut req = Request::new(Method::from_str(method)?, uri);
192204
for header in httparse_req.headers.iter() {
193205
req = req.set_header(header.name, std::str::from_utf8(header.value)?)?;
194206
}
@@ -203,14 +215,16 @@ where
203215
.ok()
204216
.and_then(|s| s.parse::<usize>().ok());
205217

206-
if let Some(_len) = length {
207-
// TODO: set len
218+
if let Some(len) = length {
208219
req = req.set_body(reader);
220+
req = req.set_len(len);
221+
222+
// Return the request.
223+
Ok(Some((req, None)))
209224
} else {
210225
return Err("Invalid value for Content-Length".into());
211226
}
212-
};
213-
214-
// Return the request.
215-
Ok(Some(req))
227+
} else {
228+
Ok(Some((req, Some(reader))))
229+
}
216230
}

0 commit comments

Comments
 (0)