1
- use anyhow:: { Context , Result } ;
1
+ use anyhow:: { Context as _ , Result } ;
2
2
use async_shutdown:: { ShutdownManager , ShutdownSignal } ;
3
- use std:: net:: SocketAddr ;
3
+ use std:: task:: { Context , Poll } ;
4
+ use std:: { net:: SocketAddr , pin:: Pin } ;
4
5
use tokio_stream:: { wrappers:: ReceiverStream , StreamExt } ;
5
6
use tonic:: { transport:: Channel , Response , Status , Streaming } ;
6
7
use tracing:: { debug, error, info, instrument, span} ;
@@ -12,6 +13,7 @@ use tokio::{
12
13
sync:: { mpsc, oneshot} ,
13
14
} ;
14
15
16
+ use crate :: io:: AsyncUdpSocket ;
15
17
use crate :: {
16
18
constant,
17
19
io:: { StreamingReader , StreamingWriter , TrafficToServerWrapper } ,
@@ -331,7 +333,7 @@ async fn handle_work_traffic(
331
333
332
334
// write the data streaming response to transfer_tx,
333
335
// then forward_traffic_to_local can read the data from transfer_rx
334
- let ( transfer_tx, mut transfer_rx) = mpsc:: channel :: < TrafficToClient > ( 64 ) ;
336
+ let ( transfer_tx, transfer_rx) = mpsc:: channel :: < TrafficToClient > ( 64 ) ;
335
337
336
338
let ( local_conn_established_tx, local_conn_established_rx) = mpsc:: channel :: < ( ) > ( 1 ) ;
337
339
let mut local_conn_established_rx = Some ( local_conn_established_rx) ;
@@ -375,7 +377,7 @@ async fn handle_work_traffic(
375
377
} ) ;
376
378
377
379
let wrapper = TrafficToServerWrapper :: new ( connection_id. clone ( ) ) ;
378
- let mut writer = StreamingWriter :: new ( streaming_tx. clone ( ) , wrapper) ;
380
+ let writer = StreamingWriter :: new ( streaming_tx. clone ( ) , wrapper) ;
379
381
380
382
if is_udp {
381
383
tokio:: spawn ( async move {
@@ -410,30 +412,16 @@ async fn handle_work_traffic(
410
412
411
413
local_conn_established_tx. send ( ( ) ) . await . unwrap ( ) ;
412
414
413
- let read_transfer_send_to_local = async {
414
- while let Some ( buf) = transfer_rx. recv ( ) . await {
415
- socket. send ( & buf. data ) . await . unwrap ( ) ;
416
- }
417
- } ;
418
-
419
- let read_local_send_to_server = async {
420
- loop {
421
- let mut buf = vec ! [ 0u8 ; 65507 ] ;
422
- let result = socket. recv ( & mut buf) . await ;
423
- match result {
424
- Ok ( n) => {
425
- writer. write_all ( & buf[ ..n] ) . await . unwrap ( ) ;
426
- }
427
- Err ( err) => {
428
- error ! ( err = ?err, "failed to read from local endpoint" ) ;
429
- break ;
430
- }
431
- }
432
- }
433
- writer. shutdown ( ) . await . unwrap ( ) ;
434
- } ;
435
-
436
- tokio:: join!( read_transfer_send_to_local, read_local_send_to_server) ;
415
+ if let Err ( err) = forward_traffic_to_local (
416
+ AsyncUdpSocket :: new ( & socket) ,
417
+ AsyncUdpSocket :: new ( & socket) ,
418
+ StreamingReader :: new ( transfer_rx) ,
419
+ writer,
420
+ )
421
+ . await
422
+ {
423
+ debug ! ( "failed to forward traffic to local: {:?}" , err) ;
424
+ }
437
425
} ) ;
438
426
} else {
439
427
tokio:: spawn ( async move {
@@ -485,8 +473,8 @@ async fn handle_work_traffic(
485
473
async fn forward_traffic_to_local (
486
474
local_r : impl AsyncRead + Unpin ,
487
475
mut local_w : impl AsyncWrite + Unpin ,
488
- remote_r : StreamingReader < TrafficToClient > ,
489
- mut remote_w : StreamingWriter < TrafficToServer > ,
476
+ remote_r : impl AsyncRead + Unpin ,
477
+ mut remote_w : impl AsyncWrite + Unpin ,
490
478
) -> Result < ( ) > {
491
479
let remote_to_me_to_local = async {
492
480
// read from remote, write to local
0 commit comments