Skip to content

Commit fea3ae6

Browse files
noxkornelski
andauthored
Read body in the example server (#544)
Co-authored-by: Kornel Lesiński <[email protected]>
1 parent 5c72713 commit fea3ae6

File tree

2 files changed

+36
-13
lines changed

2 files changed

+36
-13
lines changed

examples/server.rs

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
use std::error::Error;
22

33
use bytes::Bytes;
4-
use h2::server;
4+
use h2::server::{self, SendResponse};
5+
use h2::RecvStream;
6+
use http::Request;
57
use tokio::net::{TcpListener, TcpStream};
68

79
#[tokio::main]
@@ -15,30 +17,49 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
1517
loop {
1618
if let Ok((socket, _peer_addr)) = listener.accept().await {
1719
tokio::spawn(async move {
18-
if let Err(e) = handle(socket).await {
20+
if let Err(e) = serve(socket).await {
1921
println!(" -> err={:?}", e);
2022
}
2123
});
2224
}
2325
}
2426
}
2527

26-
async fn handle(socket: TcpStream) -> Result<(), Box<dyn Error + Send + Sync>> {
28+
async fn serve(socket: TcpStream) -> Result<(), Box<dyn Error + Send + Sync>> {
2729
let mut connection = server::handshake(socket).await?;
2830
println!("H2 connection bound");
2931

3032
while let Some(result) = connection.accept().await {
31-
let (request, mut respond) = result?;
32-
println!("GOT request: {:?}", request);
33-
let response = http::Response::new(());
33+
let (request, respond) = result?;
34+
tokio::spawn(async move {
35+
if let Err(e) = handle_request(request, respond).await {
36+
println!("error while handling request: {}", e);
37+
}
38+
});
39+
}
40+
41+
println!("~~~~~~~~~~~ H2 connection CLOSE !!!!!! ~~~~~~~~~~~");
42+
Ok(())
43+
}
3444

35-
let mut send = respond.send_response(response, false)?;
45+
async fn handle_request(
46+
mut request: Request<RecvStream>,
47+
mut respond: SendResponse<Bytes>,
48+
) -> Result<(), Box<dyn Error + Send + Sync>> {
49+
println!("GOT request: {:?}", request);
3650

37-
println!(">>>> sending data");
38-
send.send_data(Bytes::from_static(b"hello world"), true)?;
51+
let body = request.body_mut();
52+
while let Some(data) = body.data().await {
53+
let data = data?;
54+
println!("<<<< recv {:?}", data);
55+
let _ = body.flow_control().release_capacity(data.len());
3956
}
4057

41-
println!("~~~~~~~~~~~~~~~~~~~~~~~~~~~ H2 connection CLOSE !!!!!! ~~~~~~~~~~~");
58+
let response = http::Response::new(());
59+
let mut send = respond.send_response(response, false)?;
60+
println!(">>>> send");
61+
send.send_data(Bytes::from_static(b"hello "), false)?;
62+
send.send_data(Bytes::from_static(b"world\n"), true)?;
4263

4364
Ok(())
4465
}

src/server.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,11 @@ pub struct Handshake<T, B: Buf = Bytes> {
182182
/// # async fn doc<T: AsyncRead + AsyncWrite + Unpin>(my_io: T) {
183183
/// let mut server = server::handshake(my_io).await.unwrap();
184184
/// while let Some(request) = server.accept().await {
185-
/// let (request, respond) = request.unwrap();
186-
/// // Process the request and send the response back to the client
187-
/// // using `respond`.
185+
/// tokio::spawn(async move {
186+
/// let (request, respond) = request.unwrap();
187+
/// // Process the request and send the response back to the client
188+
/// // using `respond`.
189+
/// });
188190
/// }
189191
/// # }
190192
/// #

0 commit comments

Comments
 (0)