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?