1
1
use std:: error:: Error ;
2
2
3
3
use bytes:: Bytes ;
4
- use h2:: server;
4
+ use h2:: server:: { self , SendResponse } ;
5
+ use h2:: RecvStream ;
6
+ use http:: Request ;
5
7
use tokio:: net:: { TcpListener , TcpStream } ;
6
8
7
9
#[ tokio:: main]
@@ -15,30 +17,49 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
15
17
loop {
16
18
if let Ok ( ( socket, _peer_addr) ) = listener. accept ( ) . await {
17
19
tokio:: spawn ( async move {
18
- if let Err ( e) = handle ( socket) . await {
20
+ if let Err ( e) = serve ( socket) . await {
19
21
println ! ( " -> err={:?}" , e) ;
20
22
}
21
23
} ) ;
22
24
}
23
25
}
24
26
}
25
27
26
- async fn handle ( socket : TcpStream ) -> Result < ( ) , Box < dyn Error + Send + Sync > > {
28
+ async fn serve ( socket : TcpStream ) -> Result < ( ) , Box < dyn Error + Send + Sync > > {
27
29
let mut connection = server:: handshake ( socket) . await ?;
28
30
println ! ( "H2 connection bound" ) ;
29
31
30
32
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
+ }
34
44
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) ;
36
50
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 ( ) ) ;
39
56
}
40
57
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 ) ?;
42
63
43
64
Ok ( ( ) )
44
65
}
0 commit comments