package helper import ( "adams549659584/go-proxy-bingai/common" "bufio" "fmt" "net" "net/http" "strings" ) type responseWriter struct { http.ResponseWriter StatusCode int } func NewResponseWriter(w http.ResponseWriter) *responseWriter { return &responseWriter{w, http.StatusOK} } func (rw *responseWriter) WriteHeader(code int) { rw.StatusCode = code rw.ResponseWriter.WriteHeader(code) } func (rw *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { hijacker, ok := rw.ResponseWriter.(http.Hijacker) if !ok { return nil, nil, fmt.Errorf("the ResponseWriter doesn't support the Hijacker interface") } return hijacker.Hijack() } func (rw *responseWriter) Flush() { flusher, ok := rw.ResponseWriter.(http.Flusher) if ok { flusher.Flush() } } func Middleware(next http.HandlerFunc) http.HandlerFunc { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if common.SB && !strings.HasPrefix(r.URL.Path, "/web/") { w.WriteHeader(http.StatusUnavailableForLegalReasons) return } wr := NewResponseWriter(w) next(wr, r) ip := r.Header.Get("X-Real-IP") if ip == "" { ip = strings.Split(r.Header.Get("X-Forwarded-For"), ", ")[0] } if ip == "" { ip = strings.Split(r.RemoteAddr, ":")[0] } if strings.HasPrefix(r.URL.Path, "/web/") { common.Logger.Debug("%s - %s %s - %d - %s", ip, r.Method, r.URL.Path, wr.StatusCode, r.Header.Get("User-Agent")) } else { common.Logger.Info("%s - %s %s - %d - %s", ip, r.Method, r.URL.Path, wr.StatusCode, r.Header.Get("User-Agent")) } }) }