Proxy Forwarder HTTP Middleware
The middleware code
import (
"fmt"
"net"
"net/http"
)
// RealIP Middleware
func RealIP(header string, trustedForwarders ...net.IP) func(next http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Obtain host from RemoteAddr
host, port, err := net.SplitHostPort(r.RemoteAddr)
if err != nil {
http.Error(w, fmt.Sprintf("invalid request.RemoteAddr %s", err), http.StatusInternalServerError)
return
}
remoteHost := net.ParseIP(host)
// Check if host is a trusted forwarder and update request.RemoteAddr
for _, forwarderIP := range trustedForwarders {
if remoteHost.Equal(forwarderIP) {
realIp := r.Header.Get(header)
if net.ParseIP(realIp) != nil {
r.RemoteAddr = net.JoinHostPort(realIp, port)
}
break
}
}
next.ServeHTTP(w, r)
})
}
}
Example usage
Last updated
Was this helpful?