unixproxy/main.go

78 lines
1.4 KiB
Go
Raw Permalink Normal View History

2020-07-06 14:30:11 +00:00
package main
import (
"flag"
"log"
"net"
"net/http"
"net/http/httputil"
"net/url"
"os"
)
type myConfig struct {
MyURL string
MySock string
2020-07-08 17:37:37 +00:00
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)
})
2020-07-06 14:30:11 +00:00
}
func main() {
var c myConfig
flag.StringVar(&c.MyURL, "url", "", "URL to proxy to")
flag.StringVar(&c.MySock, "unix", "", "Unix socket to listen on")
2020-07-08 17:37:37 +00:00
flag.StringVar(&c.Strip, "strip", "", "Strip prefix from reqeusts")
flag.BoolVar(&c.Log, "log", false, "Log requests to stdout")
2020-07-06 14:30:11 +00:00
flag.Parse()
if c.MySock == "" {
log.Fatal("sock argument required")
}
2020-07-08 15:23:10 +00:00
rpURL, err := url.Parse(c.MyURL)
2020-07-06 14:30:11 +00:00
if err != nil {
log.Fatal(err)
}
if err := os.RemoveAll(c.MySock); err != nil {
log.Fatal(err)
}
2020-07-08 17:56:39 +00:00
if c.Strip == "" {
c.Strip = "/"
}
2020-07-06 14:30:11 +00:00
frontendProxy := httputil.NewSingleHostReverseProxy(rpURL)
2020-08-22 17:47:32 +00:00
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))
2020-07-06 14:30:11 +00:00
} else {
srv.Handler = http.StripPrefix(c.Strip, frontendProxy)
}
}
2020-09-10 15:16:24 +00:00
2020-07-06 14:30:11 +00:00
unixListener, err := net.Listen("unix", c.MySock)
2020-09-10 15:16:24 +00:00
os.Chmod(c.MySock, 0777)
2020-07-06 14:30:11 +00:00
if err != nil {
log.Fatal(err)
}
log.Fatal(srv.Serve(unixListener))
}