78 lines
1.4 KiB
Go
78 lines
1.4 KiB
Go
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))
|
|
}
|