package main import ( "flag" "log" "net" "net/http" "net/http/httputil" "net/url" "os" ) type myConfig struct { MyURL string MySock string Strip string Log bool } func logRequest(handler http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Printf("%s %s %s\n", r.RemoteAddr, r.Method, r.URL) handler.ServeHTTP(w, r) }) } func main() { var c myConfig flag.StringVar(&c.MyURL, "url", "", "URL to proxy to") flag.StringVar(&c.MySock, "unix", "", "Unix socket to listen on") flag.StringVar(&c.Strip, "strip", "", "Strip prefix from reqeusts") flag.BoolVar(&c.Log, "log", false, "Log requests to stdout") flag.Parse() if c.MySock == "" { log.Fatal("sock argument required") } rpURL, err := url.Parse(c.MyURL) if err != nil { log.Fatal(err) } if err := os.RemoveAll(c.MySock); err != nil { log.Fatal(err) } if c.Strip == "" { c.Strip = "/" } frontendProxy := httputil.NewSingleHostReverseProxy(rpURL) srv := &http.Server{} if c.Strip == "" { if c.Log { srv.Handler = logRequest(frontendProxy) } else { srv.Handler = frontendProxy } } else { if c.Log { srv.Handler = logRequest(http.StripPrefix(c.Strip, frontendProxy)) } else { srv.Handler = http.StripPrefix(c.Strip, frontendProxy) } } unixListener, err := net.Listen("unix", c.MySock) os.Chmod(c.MySock, 0777) if err != nil { log.Fatal(err) } log.Fatal(srv.Serve(unixListener)) }