@@ -1215,6 +1215,83 @@ mod dispatch_impl {
1215
1215
assert_eq ! ( connects. load( Ordering :: Relaxed ) , 2 ) ;
1216
1216
}
1217
1217
1218
+ #[ test]
1219
+ fn client_keep_alive_when_response_before_request_body_ends ( ) {
1220
+ use futures_timer:: Delay ;
1221
+ let _ = pretty_env_logger:: try_init ( ) ;
1222
+ let server = TcpListener :: bind ( "127.0.0.1:0" ) . unwrap ( ) ;
1223
+ let addr = server. local_addr ( ) . unwrap ( ) ;
1224
+ let mut rt = Runtime :: new ( ) . unwrap ( ) ;
1225
+
1226
+ let connector = DebugConnector :: new ( ) ;
1227
+ let connects = connector. connects . clone ( ) ;
1228
+
1229
+ let client = Client :: builder ( )
1230
+ . build ( connector) ;
1231
+
1232
+ let ( tx1, rx1) = oneshot:: channel ( ) ;
1233
+ let ( tx2, rx2) = oneshot:: channel ( ) ;
1234
+ let ( tx3, rx3) = oneshot:: channel ( ) ;
1235
+ thread:: spawn ( move || {
1236
+ let mut sock = server. accept ( ) . unwrap ( ) . 0 ;
1237
+ sock. set_read_timeout ( Some ( Duration :: from_secs ( 5 ) ) ) . unwrap ( ) ;
1238
+ sock. set_write_timeout ( Some ( Duration :: from_secs ( 5 ) ) ) . unwrap ( ) ;
1239
+ let mut buf = [ 0 ; 4096 ] ;
1240
+ sock. read ( & mut buf) . expect ( "read 1" ) ;
1241
+ sock. write_all ( b"HTTP/1.1 200 OK\r \n Content-Length: 0\r \n \r \n " ) . expect ( "write 1" ) ;
1242
+ // after writing the response, THEN stream the body
1243
+ let _ = tx1. send ( ( ) ) ;
1244
+
1245
+ sock. read ( & mut buf) . expect ( "read 2" ) ;
1246
+ let _ = tx2. send ( ( ) ) ;
1247
+
1248
+ let n2 = sock. read ( & mut buf) . expect ( "read 3" ) ;
1249
+ assert_ne ! ( n2, 0 ) ;
1250
+ let second_get = "GET /b HTTP/1.1\r \n " ;
1251
+ assert_eq ! ( s( & buf[ ..second_get. len( ) ] ) , second_get) ;
1252
+ sock. write_all ( b"HTTP/1.1 200 OK\r \n Content-Length: 0\r \n \r \n " ) . expect ( "write 2" ) ;
1253
+ let _ = tx3. send ( ( ) ) ;
1254
+ } ) ;
1255
+
1256
+
1257
+ assert_eq ! ( connects. load( Ordering :: Relaxed ) , 0 ) ;
1258
+
1259
+ let delayed_body = rx1
1260
+ . map_err ( |_| -> hyper:: Error { panic ! ( "rx1" ) } )
1261
+ . and_then ( |_| Delay :: new ( Duration :: from_millis ( 200 ) ) . map_err ( |_| panic ! ( "delay" ) ) )
1262
+ . into_stream ( )
1263
+ . map ( |_| "hello a" ) ;
1264
+
1265
+ let rx = rx2. expect ( "thread panicked" ) ;
1266
+ let req = Request :: builder ( )
1267
+ . method ( "POST" )
1268
+ . uri ( & * format ! ( "http://{}/a" , addr) )
1269
+ . body ( Body :: wrap_stream ( delayed_body) )
1270
+ . unwrap ( ) ;
1271
+ let client2 = client. clone ( ) ;
1272
+
1273
+ // req 1
1274
+ let fut = client. request ( req)
1275
+ . join ( rx)
1276
+ . and_then ( |_| Delay :: new ( Duration :: from_millis ( 200 ) ) . expect ( "delay" ) )
1277
+ // req 2
1278
+ . and_then ( move |( ) | {
1279
+ let rx = rx3. expect ( "thread panicked" ) ;
1280
+ let req = Request :: builder ( )
1281
+ . uri ( & * format ! ( "http://{}/b" , addr) )
1282
+ . body ( Body :: empty ( ) )
1283
+ . unwrap ( ) ;
1284
+ client2
1285
+ . request ( req)
1286
+ . join ( rx)
1287
+ . map ( |_| ( ) )
1288
+ } ) ;
1289
+
1290
+ rt. block_on ( fut) . unwrap ( ) ;
1291
+
1292
+ assert_eq ! ( connects. load( Ordering :: Relaxed ) , 1 ) ;
1293
+ }
1294
+
1218
1295
#[ test]
1219
1296
fn connect_proxy_sends_absolute_uri ( ) {
1220
1297
let _ = pretty_env_logger:: try_init ( ) ;
0 commit comments