11use futures:: future:: FutureExt ;
22use futures:: StreamExt ;
33use rand:: prelude:: * ;
4+ use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
45use std:: sync:: Arc ;
56use thiserror:: Error ;
67
8+ use crate :: tcp_stream:: CustomTcpStream ;
79use crate :: ConnectToEntry ;
810
911#[ derive( Debug , Clone ) ]
@@ -128,6 +130,7 @@ impl ClientBuilder {
128130 rng : rand:: rngs:: StdRng :: from_entropy ( ) ,
129131 } ,
130132 client : None ,
133+ read_bytes_counter : Arc :: new ( AtomicUsize :: new ( 0 ) ) ,
131134 timeout : self . timeout ,
132135 http_version : self . http_version ,
133136 redirect_limit : self . redirect_limit ,
@@ -195,6 +198,7 @@ pub struct Client {
195198 body : Option < & ' static [ u8 ] > ,
196199 dns : DNS ,
197200 client : Option < hyper:: client:: conn:: SendRequest < hyper:: Body > > ,
201+ read_bytes_counter : Arc < AtomicUsize > ,
198202 timeout : Option < std:: time:: Duration > ,
199203 redirect_limit : usize ,
200204 disable_keepalive : bool ,
@@ -211,6 +215,7 @@ impl Client {
211215 } else {
212216 let stream = tokio:: net:: TcpStream :: connect ( addr) . await ?;
213217 stream. set_nodelay ( true ) ?;
218+ let stream = CustomTcpStream :: new ( stream, self . read_bytes_counter . clone ( ) ) ;
214219 // stream.set_keepalive(std::time::Duration::from_secs(1).into())?;
215220 let ( send, conn) = hyper:: client:: conn:: handshake ( stream) . await ?;
216221 tokio:: spawn ( conn) ;
@@ -225,6 +230,7 @@ impl Client {
225230 ) -> Result < hyper:: client:: conn:: SendRequest < hyper:: Body > , ClientError > {
226231 let stream = tokio:: net:: TcpStream :: connect ( addr) . await ?;
227232 stream. set_nodelay ( true ) ?;
233+ let stream = CustomTcpStream :: new ( stream, self . read_bytes_counter . clone ( ) ) ;
228234
229235 let connector = if self . insecure {
230236 native_tls:: TlsConnector :: builder ( )
@@ -251,6 +257,7 @@ impl Client {
251257 ) -> Result < hyper:: client:: conn:: SendRequest < hyper:: Body > , ClientError > {
252258 let stream = tokio:: net:: TcpStream :: connect ( addr) . await ?;
253259 stream. set_nodelay ( true ) ?;
260+ let stream = CustomTcpStream :: new ( stream, self . read_bytes_counter . clone ( ) ) ;
254261
255262 let mut root_cert_store = rustls:: RootCertStore :: empty ( ) ;
256263 for cert in rustls_native_certs:: load_native_certs ( ) ? {
@@ -331,19 +338,17 @@ impl Client {
331338 connection_time = Some ( ConnectionTime { dns_lookup, dialup } ) ;
332339 }
333340 let request = self . request ( & self . url ) ?;
341+ self . read_bytes_counter . store ( 0 , Ordering :: Relaxed ) ;
334342 match send_request. send_request ( request) . await {
335343 Ok ( res) => {
336344 let ( parts, mut stream) = res. into_parts ( ) ;
337345 let mut status = parts. status ;
338346
339- let mut len_sum = 0 ;
340- while let Some ( chunk) = stream. next ( ) . await {
341- len_sum += chunk?. len ( ) ;
342- }
347+ while stream. next ( ) . await . is_some ( ) { }
343348
344349 if self . redirect_limit != 0 {
345350 if let Some ( location) = parts. headers . get ( "Location" ) {
346- let ( send_request_redirect, new_status, len ) = self
351+ let ( send_request_redirect, new_status) = self
347352 . redirect (
348353 send_request,
349354 & self . url . clone ( ) ,
@@ -354,7 +359,6 @@ impl Client {
354359
355360 send_request = send_request_redirect;
356361 status = new_status;
357- len_sum = len;
358362 }
359363 }
360364
@@ -364,7 +368,7 @@ impl Client {
364368 start,
365369 end,
366370 status,
367- len_bytes : len_sum ,
371+ len_bytes : self . read_bytes_counter . load ( Ordering :: Relaxed ) ,
368372 connection_time,
369373 } ;
370374
@@ -404,7 +408,6 @@ impl Client {
404408 (
405409 hyper:: client:: conn:: SendRequest < hyper:: Body > ,
406410 http:: StatusCode ,
407- usize ,
408411 ) ,
409412 ClientError ,
410413 > ,
@@ -451,28 +454,25 @@ impl Client {
451454 ) ?,
452455 ) ;
453456 }
457+ self . read_bytes_counter . store ( 0 , Ordering :: Relaxed ) ;
454458 let res = send_request. send_request ( request) . await ?;
455459 let ( parts, mut stream) = res. into_parts ( ) ;
456460 let mut status = parts. status ;
457461
458- let mut len_sum = 0 ;
459- while let Some ( chunk) = stream. next ( ) . await {
460- len_sum += chunk?. len ( ) ;
461- }
462+ while stream. next ( ) . await . is_some ( ) { }
462463
463464 if let Some ( location) = parts. headers . get ( "Location" ) {
464- let ( send_request_redirect, new_status, len ) = self
465+ let ( send_request_redirect, new_status) = self
465466 . redirect ( send_request, & url, location, limit - 1 )
466467 . await ?;
467468 send_request = send_request_redirect;
468469 status = new_status;
469- len_sum = len;
470470 }
471471
472472 if let Some ( send_request_base) = send_request_base {
473- Ok ( ( send_request_base, status, len_sum ) )
473+ Ok ( ( send_request_base, status) )
474474 } else {
475- Ok ( ( send_request, status, len_sum ) )
475+ Ok ( ( send_request, status) )
476476 }
477477 }
478478 . boxed ( )
@@ -546,7 +546,6 @@ pub async fn work(
546546 n_tasks : usize ,
547547 n_workers : usize ,
548548) {
549- use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
550549 let counter = Arc :: new ( AtomicUsize :: new ( 0 ) ) ;
551550
552551 let futures = ( 0 ..n_workers)
0 commit comments