package controller import ( "arimelody-web/model" "net/http" "slices" "strings" ) // Returns the request's original IP address, resolving the `x-forwarded-for` // header if the request originates from a trusted proxy. func ResolveIP(app *model.AppState, r *http.Request) string { iSplit := strings.LastIndex(r.RemoteAddr, ":") addr := r.RemoteAddr[0:iSplit] if slices.Contains(app.Config.TrustedProxies, addr) { forwardedFor := r.Header.Get("x-forwarded-for") if len(forwardedFor) > 0 { // discard extra IPs; cloudflare tends to append their nodes forwardedFor = strings.Split(forwardedFor, ", ")[0] addr = forwardedFor } } if addr[0] == '[' && addr[len(addr) - 1] == ']' { addr = addr[1:len(addr) - 1] } return addr }