|
@@ -0,0 +1,60 @@
|
|
|
+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)
|
|
|
+ }
|
|
|
+}
|