package httpx import ( "net" "strings" ) // IsLoopbackHost reports whether a request Host ("host" or "host:port") names a // loopback origin. // // It gates the passkey nudge (SPEC-006 §8): a passkey registered at // `127.0.0.1` binds the Relying Party ID `127.0.0.1` and is UNUSABLE at the // public domain (O-13/D-041), so the nudge is suppressed on loopback. An // empty/unknown host is treated as loopback — fail closed, so an origin we // cannot classify never triggers the nudge. func IsLoopbackHost(hostport string) bool { host := strings.TrimSpace(hostport) if h, _, err := net.SplitHostPort(host); err == nil { host = h } host = strings.Trim(strings.TrimSpace(host), "[]") if host == "" { return true } if strings.EqualFold(host, "localhost") { return true } ip := net.ParseIP(host) return ip != nil && ip.IsLoopback() }