http: Don't modify req, create clone instead

This commit is contained in:
Sasha Koshka 2024-12-27 00:16:50 -05:00
parent 0c8c34d81d
commit 6c73ec0f88

View File

@ -75,22 +75,27 @@ func (this *Handler) Configure (config step.Meta) error {
}
func (this *Handler) ServeHTTP (res http.ResponseWriter, req *http.Request) {
filesystem := this.Environment.GetFS()
// get the real client IP
remoteAddrStr := req.RemoteAddr
realRemoteAddr := req.RemoteAddr
if addr := req.Header.Get("CF-Connecting-IP"); addr != "" {
if this.TrustCFConnectingIP {
proxy := req.RemoteAddr
req.RemoteAddr = addr
remoteAddrStr = fmt.Sprintf("%s --CF-> %s", addr, proxy)
realRemoteAddr = addr
remoteAddrStr = fmt.Sprintf("%s --CF-> %s", addr, req.RemoteAddr)
}
} else if addr := req.Header.Get("X-Forwarded-For"); addr != "" {
if this.TrustXForwardedFor {
proxy := req.RemoteAddr
req.RemoteAddr = addr
remoteAddrStr = fmt.Sprintf("%s --XF-> %s", addr, proxy)
realRemoteAddr = addr
remoteAddrStr = fmt.Sprintf("%s --XF-> %s", addr, req.RemoteAddr)
}
}
// make req clone with correct ip
req = req.Clone(req.Context())
req.RemoteAddr = realRemoteAddr
log.Println("(i)", req.Method, req.URL, "from", remoteAddrStr)
filesystem := this.Environment.GetFS()
// rate limit
err := this.rateLimit(req, "", this.RateLimit)