На основе примера Токио в https://github.com/tokio-rs/tokio/blob/master/examples/proxy.rs
let (mut ri, mut wi) = inbound.split();
let (mut ro, mut wo) = outbound.split();
let client_to_server = io::copy(&mut ri, &mut wo);
let server_to_client = io::copy(&mut ro, &mut wi);
try_join(client_to_server, server_to_client).await?;
Ok(())
У меня есть измененная версия, чтобы я мог обрабатывать завершение каждого соединения, как в:
// Server will disconnect their side normally 8s later, from what I've observed
let server_to_client = io::copy(&mut ro, &mut wi).map(|f| {
server_session_time = server_start_time.elapsed().unwrap();
f
});
// Normally, this will stop first, as the client disconnects as soon as he has the results...
let client_to_server = io::copy(&mut ri, &mut wo).map(|f| {
client_session_time = client_start_time.elapsed().unwrap();
f
});
// Join on both
match try_join(client_to_server, server_to_client).await {...}
Это позволило мне правильно рассчитать время соединения для клиентской стороны, так как клиенты сразу закрывают соединение при получении ответа, в то время как прокси-сервер, кажется, берет (в моем случае 8), чтобы закрыть. Учитывая эту структуру кода, есть ли возможность разорвать нисходящее соединение с server_to_client, как только я выйду из будущего client_to_server (то есть не буду ждать 8 секунд, которые, как я наблюдаю, требуется для завершения работы)?
Спасибо