unixproxy/main.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))
}