@@ -31,7 +31,7 @@ mod metadata_cache;
3131use std:: env;
3232use std:: fmt:: Display ;
3333use std:: io:: Read ;
34- use std:: path:: PathBuf ;
34+ use std:: path:: { Path , PathBuf } ;
3535use std:: sync:: OnceLock ;
3636use std:: time:: Duration ;
3737
@@ -538,11 +538,29 @@ fn handle_get_request(request: Request, config: &ProxyConfig) {
538538 } ;
539539}
540540
541- /// Runs HTTP proxy server forever.
542- fn main_loop ( listen_addr : & str , config : & ProxyConfig ) -> ! {
543- info ! ( "proxy: starting HTTP server at: {listen_addr}" ) ;
541+ /// Server listening address
542+ enum ListenAddress {
543+ /// IP address + port
544+ SocketAddr ( String ) ,
545+ /// Unix domain socket path
546+ UnixPath ( String ) ,
547+ }
544548
545- let server = Server :: http ( listen_addr) . expect ( "failed to start the HTTP server" ) ;
549+ /// Runs HTTP proxy server forever.
550+ fn main_loop ( listen_addr : & ListenAddress , config : & ProxyConfig ) -> ! {
551+ let server = match listen_addr {
552+ ListenAddress :: SocketAddr ( addr) => {
553+ info ! ( "proxy: starting HTTP server at: {addr}" ) ;
554+ Server :: http ( addr) . expect ( "failed to start the HTTP server" )
555+ }
556+ ListenAddress :: UnixPath ( path) => {
557+ info ! ( "proxy: starting HTTP server at Unix socket {path}" ) ;
558+ let path = Path :: new ( path) ;
559+ // Reap stale socket files before binding.
560+ std:: fs:: remove_file ( path) . ok ( ) ;
561+ Server :: http_unix ( path) . expect ( "failed to start the HTTP server" )
562+ }
563+ } ;
546564
547565 // Main HTTP request accept loop.
548566 loop {
@@ -583,6 +601,7 @@ fn usage() {
583601 println ! ( " -h, --help print help and exit" ) ;
584602 println ! ( " -V, --version print version and exit" ) ;
585603 println ! ( " -L, --listen ADDRESS:PORT address and port to listen at (0.0.0.0:3080)" ) ;
604+ println ! ( " --listen-unix PATH Unix domain socket path to listen at" ) ;
586605 println ! ( " -U, --upstream-url URL upstream download URL (https://crates.io/)" ) ;
587606 println ! ( " -I, --index-url URL upstream index URL (https://index.crates.io/)" ) ;
588607 println ! ( " -S, --proxy-url URL this proxy server URL (http://localhost:3080/)" ) ;
@@ -626,7 +645,11 @@ fn main() {
626645 verbose += 1 ;
627646 }
628647
629- let listen_addr = args
648+ let listen_addr_unix = args
649+ . opt_value_from_str ( "--listen-unix" )
650+ . expect ( "bad listen socket path" ) ;
651+
652+ let listen_addr_ip = args
630653 . opt_value_from_str ( [ "-L" , "--listen" ] )
631654 . expect ( "bad listen address argument" )
632655 . unwrap_or_else ( || LISTEN_ADDRESS . to_string ( ) ) ;
@@ -703,6 +726,11 @@ fn main() {
703726 cache_ttl,
704727 } ;
705728
729+ let listen_addr = match listen_addr_unix {
730+ Some ( unix_path) => ListenAddress :: UnixPath ( unix_path) ,
731+ None => ListenAddress :: SocketAddr ( listen_addr_ip) ,
732+ } ;
733+
706734 // Start the main HTTP server.
707735 main_loop ( & listen_addr, & config)
708736}
0 commit comments