Initial Commit
This commit is contained in:
37
http.go
Normal file
37
http.go
Normal file
@@ -0,0 +1,37 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"net"
|
||||
"net/http"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// realIP is a middleware that extracts the real IP from the headers of
|
||||
// an HTTP requests and modifies the request for the next handler.
|
||||
func realIP(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
if ip := realIPFromHeaders(r); ip != "" {
|
||||
r.RemoteAddr = net.JoinHostPort(ip, "0")
|
||||
}
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
|
||||
// realIPFromHeaders extracts the real IP from the headers of an HTTP request
|
||||
func realIPFromHeaders(r *http.Request) string {
|
||||
xff := r.Header.Get("X-Forwarded-For")
|
||||
if xff != "" {
|
||||
parts := strings.Split(xff, ",")
|
||||
if len(parts) > 0 {
|
||||
ip := strings.TrimSpace(parts[0])
|
||||
if ip != "" {
|
||||
return ip
|
||||
}
|
||||
}
|
||||
}
|
||||
xrip := strings.TrimSpace(r.Header.Get("X-Real-IP"))
|
||||
if xrip != "" {
|
||||
return xrip
|
||||
}
|
||||
return ""
|
||||
}
|
||||
Reference in New Issue
Block a user