package main import ( "flag" "fmt" "log" "net/http" "net/http/httputil" "net/url" ) func main() { var listenAddr string var targetAddr string flag.StringVar(&listenAddr, "l", "", "Listen address") flag.StringVar(&targetAddr, "t", "", "Target address") flag.Parse() if listenAddr == "" || targetAddr == "" { flag.Usage() return } mux := http.NewServeMux() u, err := url.Parse(targetAddr) if err != nil { fmt.Println("URL error:", err) return } rproxy := httputil.NewSingleHostReverseProxy(u) fmt.Println("Listening at:", listenAddr) mux.HandleFunc("/", LogHandler(rproxy.ServeHTTP)) err = http.ListenAndServe(listenAddr, mux) if err != nil { fmt.Println("Err:", err) } } type qlogHandler struct { http.ResponseWriter statusCode int } func (q *qlogHandler) WriteHeader(statusCode int) { q.statusCode = statusCode q.ResponseWriter.WriteHeader(statusCode) } func LogHandler(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { l := &qlogHandler{w, 200} next(l, r) log.Printf("%d - %s %s", l.statusCode, r.Method, r.URL) } }