@@ -193,44 +193,52 @@ fn id_of_output(output: &Output) -> Result<RequestId> {
193
193
mod tests {
194
194
use super :: * ;
195
195
use crate :: Error :: Rpc ;
196
+ use bytes:: Bytes ;
197
+ use http_body_util:: { BodyExt , Full } ;
196
198
use jsonrpc_core:: ErrorCode ;
197
199
use std:: net:: TcpListener ;
198
200
199
201
fn get_available_port ( ) -> Option < u16 > {
200
202
Some ( TcpListener :: bind ( ( "127.0.0.1" , 0 ) ) . ok ( ) ?. local_addr ( ) . ok ( ) ?. port ( ) )
201
203
}
202
204
203
- async fn server ( req : hyper:: Request < hyper:: Body > ) -> hyper:: Result < hyper:: Response < hyper:: Body > > {
204
- use hyper:: body:: HttpBody ;
205
-
205
+ async fn server ( req : hyper:: Request < hyper:: body:: Incoming > ) -> hyper:: Result < hyper:: Response < Full < Bytes > > > {
206
206
let expected = r#"{"jsonrpc":"2.0","method":"eth_getAccounts","params":[],"id":0}"# ;
207
207
let response = r#"{"jsonrpc":"2.0","id":0,"result":"x"}"# ;
208
208
209
209
assert_eq ! ( req. method( ) , & hyper:: Method :: POST ) ;
210
210
assert_eq ! ( req. uri( ) . path( ) , "/" ) ;
211
211
let mut content: Vec < u8 > = vec ! [ ] ;
212
- let mut body = req. into_body ( ) ;
213
- while let Some ( Ok ( chunk ) ) = body. data ( ) . await {
214
- content. extend ( & * chunk ) ;
215
- }
212
+ let body = req. into_body ( ) ;
213
+ let body = body. collect ( ) . await ? . to_bytes ( ) . to_vec ( ) ;
214
+ content. extend ( body ) ;
215
+
216
216
assert_eq ! ( std:: str :: from_utf8( & * content) , Ok ( expected) ) ;
217
217
218
- Ok ( hyper:: Response :: new ( response . into ( ) ) )
218
+ Ok ( hyper:: Response :: new ( Full :: new ( Bytes :: from ( response ) ) ) )
219
219
}
220
220
221
221
#[ tokio:: test]
222
222
async fn should_make_a_request ( ) {
223
- use hyper:: service:: { make_service_fn, service_fn} ;
224
-
223
+ use hyper:: service:: service_fn;
224
+ use hyper_util:: {
225
+ rt:: { TokioExecutor , TokioIo } ,
226
+ server:: conn:: auto,
227
+ } ;
228
+ use tokio:: net:: TcpListener ;
225
229
// given
226
230
let addr = format ! ( "127.0.0.1:{}" , get_available_port( ) . unwrap( ) ) ;
227
- // start server
228
- let service = make_service_fn ( |_| async { Ok :: < _ , hyper:: Error > ( service_fn ( server) ) } ) ;
229
- let server = hyper:: Server :: bind ( & addr. parse ( ) . unwrap ( ) ) . serve ( service) ;
230
231
let addr_clone = addr. clone ( ) ;
232
+ // start server
233
+ let listener = TcpListener :: bind ( addr. clone ( ) ) . await . unwrap ( ) ;
231
234
tokio:: spawn ( async move {
232
235
println ! ( "Listening on http://{}" , addr_clone) ;
233
- server. await . unwrap ( ) ;
236
+ let ( stream, _) = listener. accept ( ) . await . unwrap ( ) ;
237
+ let io = TokioIo :: new ( stream) ;
238
+ auto:: Builder :: new ( TokioExecutor :: new ( ) )
239
+ . serve_connection ( io, service_fn ( server) )
240
+ . await
241
+ . unwrap ( ) ;
234
242
} ) ;
235
243
236
244
// when
@@ -245,9 +253,15 @@ mod tests {
245
253
246
254
#[ tokio:: test]
247
255
async fn catch_generic_json_error_for_batched_request ( ) {
248
- use hyper:: service:: { make_service_fn, service_fn} ;
249
-
250
- async fn handler ( _req : hyper:: Request < hyper:: Body > ) -> hyper:: Result < hyper:: Response < hyper:: Body > > {
256
+ use http_body_util:: Full ;
257
+ use hyper:: service:: service_fn;
258
+ use hyper_util:: {
259
+ rt:: { TokioExecutor , TokioIo } ,
260
+ server:: conn:: auto,
261
+ } ;
262
+ use tokio:: net:: TcpListener ;
263
+
264
+ async fn handler ( _req : hyper:: Request < hyper:: body:: Incoming > ) -> hyper:: Result < hyper:: Response < Full < Bytes > > > {
251
265
let response = r#"{
252
266
"jsonrpc":"2.0",
253
267
"error":{
@@ -256,18 +270,22 @@ mod tests {
256
270
},
257
271
"id":null
258
272
}"# ;
259
- Ok ( hyper:: Response :: < hyper :: Body > :: new ( response. into ( ) ) )
273
+ Ok ( hyper:: Response :: new ( Full :: new ( Bytes :: from ( response) ) ) )
260
274
}
261
275
262
- // given
276
+ // Given
263
277
let addr = format ! ( "127.0.0.1:{}" , get_available_port( ) . unwrap( ) ) ;
264
- // start server
265
- let service = make_service_fn ( |_| async { Ok :: < _ , hyper:: Error > ( service_fn ( handler) ) } ) ;
266
- let server = hyper:: Server :: bind ( & addr. parse ( ) . unwrap ( ) ) . serve ( service) ;
267
278
let addr_clone = addr. clone ( ) ;
279
+ // start server
280
+ let listener = TcpListener :: bind ( addr. clone ( ) ) . await . unwrap ( ) ;
268
281
tokio:: spawn ( async move {
269
282
println ! ( "Listening on http://{}" , addr_clone) ;
270
- server. await . unwrap ( ) ;
283
+ let ( stream, _) = listener. accept ( ) . await . unwrap ( ) ;
284
+ let io = TokioIo :: new ( stream) ;
285
+ auto:: Builder :: new ( TokioExecutor :: new ( ) )
286
+ . serve_connection ( io, service_fn ( handler) )
287
+ . await
288
+ . unwrap ( ) ;
271
289
} ) ;
272
290
273
291
// when
0 commit comments