Created
March 13, 2026 13:13
-
-
Save mbroadst/2c8b72973c41c49da8dd36b57e479035 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| use async_trait::async_trait; | |
| use pingora_core::server::Server; | |
| use pingora_core::services::listening::Service; | |
| use pingora_core::upstreams::peer::HttpPeer; // Note: L4 usually doesn't need this | |
| use tokio::net::TcpStream; | |
| use pingora_core::Result; | |
| use pingora_core::modules::Module; | |
| // 1. Define the L4 Proxy Service | |
| pub struct L4Proxy { | |
| backend_addr: String, | |
| } | |
| #[async_trait] | |
| impl Service for L4Proxy { | |
| async fn handle_connection(&self, downstream_stream: tokio::net::TcpStream) { | |
| // 2. Connect to the backend | |
| let mut upstream_stream = match TcpStream::connect(&self.backend_addr).await { | |
| Ok(stream) => stream, | |
| Err(e) => { | |
| eprintln!("Failed to connect to backend: {}", e); | |
| return; | |
| } | |
| }; | |
| // 3. Passthrough: Copy bytes between downstream and upstream | |
| let (mut client_reader, mut client_writer) = downstream_stream.into_split(); | |
| let (mut server_reader, mut server_writer) = upstream_stream.into_split(); | |
| let client_to_server = tokio::io::copy(&mut client_reader, &mut server_writer); | |
| let server_to_client = tokio::io::copy(&mut server_reader, &mut client_writer); | |
| // Run both directions concurrently | |
| let _ = tokio::try_join!(client_to_server, server_to_client); | |
| } | |
| } | |
| fn main() { | |
| let mut my_server = Server::new(None).unwrap(); | |
| my_server.bootstrap(); | |
| // 4. Configure the service to listen | |
| let mut l4_service = L4Proxy { | |
| backend_addr: "127.0.0.1:8080".to_string(), | |
| }; | |
| // Example: listen on 0.0.0.0:6188 | |
| // l4_service.add_tcp("0.0.0.0:6188"); | |
| // Note: The above Service trait implementation needs to be | |
| // wrapped in a running service in a real Pingora application. | |
| // my_server.add_service(l4_service); | |
| // my_server.run_forever(); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment