1+ use hyper:: service:: { make_service_fn, service_fn} ;
2+ use hyper:: { Body , Client , Request , Response , Server , Uri } ;
3+ use std:: convert:: Infallible ;
4+ use std:: net:: SocketAddr ;
5+
6+ async fn handle_request ( req : Request < Body > ) -> Result < Response < Body > , hyper:: Error > {
7+ // Define the target backend server
8+ let target = "http://example.com" ;
9+
10+ // Build the new URI for the target server
11+ let uri = format ! ( "{}{}" , target, req. uri( ) . path_and_query( ) . map( |x| x. as_str( ) ) . unwrap_or( "" ) )
12+ . parse :: < Uri > ( )
13+ . expect ( "Invalid URI" ) ;
14+
15+ // Create a new request to the target server
16+ let mut new_req = Request :: builder ( )
17+ . method ( req. method ( ) )
18+ . uri ( uri)
19+ . body ( req. into_body ( ) )
20+ . expect ( "Failed to build request" ) ;
21+
22+ // Copy headers from the original request
23+ * new_req. headers_mut ( ) = req. headers ( ) . clone ( ) ;
24+
25+ // Send the request to the target server
26+ let client = Client :: new ( ) ;
27+ let response = client. request ( new_req) . await ?;
28+
29+ Ok ( response)
30+ }
31+
32+ #[ tokio:: main]
33+ async fn main( ) {
34+ // Define the address to listen on
35+ let addr = SocketAddr :: from ( ( [ 127 , 0 , 0 , 1 ] , 3000 ) ) ;
36+
37+ // Create a service to handle incoming requests
38+ let make_service = make_service_fn ( |_conn| async {
39+ Ok :: < _ , Infallible > ( service_fn ( handle_request) )
40+ } ) ;
41+
42+ // Start the server
43+ let server = Server :: bind ( & addr) . serve ( make_service) ;
44+
45+ println ! ( "Reverse proxy running on http://{}" , addr) ;
46+
47+ // Run the server
48+ if let Err ( e) = server. await {
49+ eprintln ! ( "Server error: {}" , e) ;
50+ }
0 commit comments