main.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "log"
  6. "net/http"
  7. "net/http/httputil"
  8. "net/url"
  9. )
  10. func main() {
  11. var listenAddr string
  12. var targetAddr string
  13. flag.StringVar(&listenAddr, "l", "", "Listen address")
  14. flag.StringVar(&targetAddr, "t", "", "Target address")
  15. flag.Parse()
  16. if listenAddr == "" || targetAddr == "" {
  17. flag.Usage()
  18. return
  19. }
  20. mux := http.NewServeMux()
  21. u, err := url.Parse(targetAddr)
  22. if err != nil {
  23. fmt.Println("URL error:", err)
  24. return
  25. }
  26. rproxy := httputil.NewSingleHostReverseProxy(u)
  27. fmt.Println("Listening at:", listenAddr)
  28. mux.HandleFunc("/", LogHandler(rproxy.ServeHTTP))
  29. err = http.ListenAndServe(listenAddr, mux)
  30. if err != nil {
  31. fmt.Println("Err:", err)
  32. }
  33. }
  34. type qlogHandler struct {
  35. http.ResponseWriter
  36. statusCode int
  37. }
  38. func (q *qlogHandler) WriteHeader(statusCode int) {
  39. q.statusCode = statusCode
  40. q.ResponseWriter.WriteHeader(statusCode)
  41. }
  42. func LogHandler(next http.HandlerFunc) http.HandlerFunc {
  43. return func(w http.ResponseWriter, r *http.Request) {
  44. l := &qlogHandler{w, 200}
  45. next(l, r)
  46. log.Printf("%d - %s %s", l.statusCode, r.Method, r.URL)
  47. }
  48. }