| 257 | } |
| 258 | |
| 259 | async fn tls_proxy( |
| 260 | globals: Arc<Globals>, |
| 261 | binlen: [u8; 2], |
| 262 | mut client_connection: TcpStream, |
| 263 | ) -> Result<(), Error> { |
| 264 | let tls_upstream_addr = match &globals.tls_upstream_addr { |
| 265 | None => return Ok(()), |
| 266 | Some(tls_upstream_addr) => tls_upstream_addr, |
| 267 | }; |
| 268 | let socket = match globals.external_addr { |
| 269 | Some(x @ SocketAddr::V4(_)) => { |
| 270 | let socket = TcpSocket::new_v4()?; |
| 271 | socket.set_reuseaddr(true).ok(); |
| 272 | socket.bind(x)?; |
| 273 | socket |
| 274 | } |
| 275 | Some(x @ SocketAddr::V6(_)) => { |
| 276 | let socket = TcpSocket::new_v6()?; |
| 277 | socket.set_reuseaddr(true).ok(); |
| 278 | socket.bind(x)?; |
| 279 | socket |
| 280 | } |
| 281 | None => match tls_upstream_addr { |
| 282 | SocketAddr::V4(_) => TcpSocket::new_v4()?, |
| 283 | SocketAddr::V6(_) => TcpSocket::new_v6()?, |
| 284 | }, |
| 285 | }; |
| 286 | let mut ext_socket = socket.connect(*tls_upstream_addr).await?; |
| 287 | let (mut erh, mut ewh) = ext_socket.split(); |
| 288 | let (mut rh, mut wh) = client_connection.split(); |
| 289 | ewh.write_all(&binlen).await?; |
| 290 | let fut_proxy_1 = tokio::io::copy(&mut rh, &mut ewh); |
| 291 | let fut_proxy_2 = tokio::io::copy(&mut erh, &mut wh); |
| 292 | match join!(fut_proxy_1, fut_proxy_2) { |
| 293 | (Ok(_), Ok(_)) => Ok(()), |
| 294 | _ => bail!("TLS proxy error"), |
| 295 | } |
| 296 | } |
| 297 | |
| 298 | async fn tcp_acceptor(globals: Arc<Globals>, tcp_listener: TcpListener) -> Result<(), Error> { |
| 299 | let runtime_handle = globals.runtime_handle.clone(); |