// If we didn't find it and aren't configured to reject, simply
// don't trust it
if!rejectNonAuthz{
h.ServeHTTP(w,r)
return
}
respondError(w,http.StatusBadRequest,fmt.Errorf("client address not authorized for x-forwarded-for and configured to reject connection"))
return
}
// At this point we have at least one value and it's authorized
// Split comma separated ones, which are common. This brings it in line
// to the multiple-header case.
varacc[]string
for_,header:=rangeheaders{
vals:=strings.Split(header,",")
for_,v:=rangevals{
acc=append(acc,strings.TrimSpace(v))
}
}
indexToUse:=len(acc)-1-hopSkips
ifindexToUse<0{
// This is likely an error in either configuration or other
// infrastructure. We could either deny the request, or we
// could simply not trust the value. Denying the request is
// "safer" since if this logic is configured at all there may
// be an assumption it can always be trusted. Given that we can
// deny accepting the request at all if it's not from an
// authorized address, if we're at this point the address is
// authorized (or we've turned off explicit rejection) and we
// should assume that what comes in should be properly
// formatted.
respondError(w,http.StatusBadRequest,fmt.Errorf("malformed x-forwarded-for configuration or request, hops to skip (%d) would skip before earliest chain link (chain length %d)",hopSkips,len(headers)))