github.com/abczzz13/clientip/classify.go:40: ClassifyError 100.0% github.com/abczzz13/clientip/classify.go:65: String 22.2% github.com/abczzz13/clientip/config.go:17: applyOption 100.0% github.com/abczzz13/clientip/config.go:48: String 100.0% github.com/abczzz13/clientip/config.go:60: valid 100.0% github.com/abczzz13/clientip/config.go:131: WithTrustedProxies 100.0% github.com/abczzz13/clientip/config.go:140: WithMinTrustedProxies 0.0% github.com/abczzz13/clientip/config.go:149: WithMaxTrustedProxies 0.0% github.com/abczzz13/clientip/config.go:159: WithAllowPrivateIPs 0.0% github.com/abczzz13/clientip/config.go:169: WithAllowedReservedClientPrefixes 0.0% github.com/abczzz13/clientip/config.go:177: WithMaxChainLength 100.0% github.com/abczzz13/clientip/config.go:187: WithChainSelection 0.0% github.com/abczzz13/clientip/config.go:195: WithDebugInfo 0.0% github.com/abczzz13/clientip/config.go:206: WithSources 100.0% github.com/abczzz13/clientip/config.go:215: WithLogger 0.0% github.com/abczzz13/clientip/config.go:224: WithObserver 100.0% github.com/abczzz13/clientip/config.go:233: defaultOptions 100.0% github.com/abczzz13/clientip/config.go:243: LoopbackProxyPrefixes 100.0% github.com/abczzz13/clientip/config.go:249: PrivateProxyPrefixes 100.0% github.com/abczzz13/clientip/config.go:254: LocalProxyPrefixes 100.0% github.com/abczzz13/clientip/config.go:263: ProxyPrefixesFromAddrs 100.0% github.com/abczzz13/clientip/config.go:307: validate 92.3% github.com/abczzz13/clientip/config.go:355: validateSourcePriority 95.5% github.com/abczzz13/clientip/config.go:412: mustParsePrefix 75.0% github.com/abczzz13/clientip/config.go:420: clonePrefixes 100.0% github.com/abczzz13/clientip/config.go:424: cloneSources 100.0% github.com/abczzz13/clientip/config.go:430: isNilValue 83.3% github.com/abczzz13/clientip/config.go:446: normalizePrefixes 100.0% github.com/abczzz13/clientip/config.go:458: normalizeTrustedProxyPrefixes 100.0% github.com/abczzz13/clientip/config.go:462: normalizeReservedClientPrefixes 100.0% github.com/abczzz13/clientip/config.go:466: mergeUniquePrefixes 86.7% github.com/abczzz13/clientip/config.go:493: defaultConfig 100.0% github.com/abczzz13/clientip/config.go:511: configFromPublic 100.0% github.com/abczzz13/clientip/extractor.go:33: newExtractor 100.0% github.com/abczzz13/clientip/extractor.go:50: Extract 100.0% github.com/abczzz13/clientip/extractor.go:73: ExtractInput 100.0% github.com/abczzz13/clientip/extractor.go:88: extractRequestView 88.9% github.com/abczzz13/clientip/extractor.go:155: extractFromRemoteAddr 100.0% github.com/abczzz13/clientip/extractor.go:167: buildConfiguredSources 100.0% github.com/abczzz13/clientip/input.go:24: Values 0.0% github.com/abczzz13/clientip/input.go:47: requestInputContext 100.0% github.com/abczzz13/clientip/observability.go:41: WarnContext 0.0% github.com/abczzz13/clientip/observability.go:53: OnResolved 0.0% github.com/abczzz13/clientip/parse_chain_capacity.go:11: chainPartsCapacity 91.7% github.com/abczzz13/clientip/parse_chain_capacity.go:54: trimHTTPWhitespace 100.0% github.com/abczzz13/clientip/parse_errors.go:10: Error 0.0% github.com/abczzz13/clientip/parse_forwarded.go:13: parseForwardedValues 95.0% github.com/abczzz13/clientip/parse_forwarded.go:55: parseForwardedElement 95.7% github.com/abczzz13/clientip/parse_forwarded.go:98: scanForwardedSegments 96.4% github.com/abczzz13/clientip/parse_forwarded.go:150: parseForwardedForValue 100.0% github.com/abczzz13/clientip/parse_forwarded.go:173: unquoteForwardedValue 92.0% github.com/abczzz13/clientip/parse_ip.go:10: normalizeIP 100.0% github.com/abczzz13/clientip/parse_ip.go:23: parseChainIP 89.5% github.com/abczzz13/clientip/parse_ip.go:59: parseIP 87.5% github.com/abczzz13/clientip/parse_ip.go:103: parseRemoteAddr 100.0% github.com/abczzz13/clientip/parse_ip.go:117: parseHostIP 100.0% github.com/abczzz13/clientip/parse_ip.go:126: looksLikeHostPort 100.0% github.com/abczzz13/clientip/parse_ip.go:144: splitHostPortHost 100.0% github.com/abczzz13/clientip/parse_ip.go:153: parseNormalizedIP 100.0% github.com/abczzz13/clientip/parse_ip.go:167: trimMatchedPair 100.0% github.com/abczzz13/clientip/parse_ip.go:179: trimMatchedChar 100.0% github.com/abczzz13/clientip/parse_remote_addr.go:12: ParseRemoteAddr 100.0% github.com/abczzz13/clientip/parse_xff.go:11: parseXFFValues 96.2% github.com/abczzz13/clientip/presets.go:7: PresetDirectConnection 100.0% github.com/abczzz13/clientip/presets.go:18: PresetLoopbackReverseProxy 100.0% github.com/abczzz13/clientip/presets.go:30: PresetVMReverseProxy 100.0% github.com/abczzz13/clientip/resolver.go:29: NoFallback 0.0% github.com/abczzz13/clientip/resolver.go:32: RemoteAddrFallback 100.0% github.com/abczzz13/clientip/resolver.go:40: StaticFallback 100.0% github.com/abczzz13/clientip/resolver.go:63: String 100.0% github.com/abczzz13/clientip/resolver.go:107: OK 100.0% github.com/abczzz13/clientip/resolver.go:113: Classify 100.0% github.com/abczzz13/clientip/resolver.go:129: New 77.8% github.com/abczzz13/clientip/resolver.go:150: Resolve 100.0% github.com/abczzz13/clientip/resolver.go:171: ResolveOperational 92.3% github.com/abczzz13/clientip/resolver.go:197: ResolveInput 80.0% github.com/abczzz13/clientip/resolver.go:211: ResolveInputOperational 88.9% github.com/abczzz13/clientip/resolver.go:230: ResolveHeaders 100.0% github.com/abczzz13/clientip/resolver.go:236: Middleware 100.0% github.com/abczzz13/clientip/resolver.go:247: FromContext 75.0% github.com/abczzz13/clientip/resolver.go:255: resolveStrictRequest 100.0% github.com/abczzz13/clientip/resolver.go:260: resolveStrictInput 100.0% github.com/abczzz13/clientip/resolver.go:265: observe 66.7% github.com/abczzz13/clientip/resolver.go:272: applyFallback 87.5% github.com/abczzz13/clientip/resolver.go:296: fallbackReasonFromError 62.5% github.com/abczzz13/clientip/resolver.go:315: isResolverTerminalContextError 100.0% github.com/abczzz13/clientip/source.go:62: builtinSource 100.0% github.com/abczzz13/clientip/source.go:72: HeaderSource 100.0% github.com/abczzz13/clientip/source.go:76: canonicalSource 100.0% github.com/abczzz13/clientip/source.go:87: sourceFromString 83.3% github.com/abczzz13/clientip/source.go:115: sourceFromExact 71.4% github.com/abczzz13/clientip/source.go:136: canonicalizeSources 100.0% github.com/abczzz13/clientip/source.go:148: String 100.0% github.com/abczzz13/clientip/source.go:156: Equal 100.0% github.com/abczzz13/clientip/source.go:160: name 100.0% github.com/abczzz13/clientip/source.go:179: valid 100.0% github.com/abczzz13/clientip/source.go:191: headerKey 100.0% github.com/abczzz13/clientip/source.go:206: marshalValue 66.7% github.com/abczzz13/clientip/source.go:218: MarshalText 100.0% github.com/abczzz13/clientip/source.go:226: UnmarshalText 75.0% github.com/abczzz13/clientip/source.go:236: MarshalJSON 100.0% github.com/abczzz13/clientip/source.go:241: UnmarshalJSON 71.4% github.com/abczzz13/clientip/source.go:255: normalizeSourceName 100.0% github.com/abczzz13/clientip/source.go:259: sourceHeaderKeys 100.0% github.com/abczzz13/clientip/source.go:280: sourceHeaderKey 85.7% github.com/abczzz13/clientip/source_chain_extract.go:27: extract 100.0% github.com/abczzz13/clientip/source_chain_extract.go:101: analyzeChain 83.3% github.com/abczzz13/clientip/source_chain_extract.go:114: chainSeparator 100.0% github.com/abczzz13/clientip/source_execution.go:12: extractChainSource 100.0% github.com/abczzz13/clientip/source_execution.go:34: extractSingleHeaderSource 100.0% github.com/abczzz13/clientip/source_execution.go:46: extractRemoteAddrSource 50.0% github.com/abczzz13/clientip/source_execution.go:60: logSecurityWarning 100.0% github.com/abczzz13/clientip/source_execution.go:76: proxyValidationWarningDetails 80.0% github.com/abczzz13/clientip/source_execution.go:89: logProxyValidationWarning 80.0% github.com/abczzz13/clientip/source_execution.go:113: handleChainError 85.7% github.com/abczzz13/clientip/source_execution.go:140: adaptChainFailure 66.7% github.com/abczzz13/clientip/source_execution.go:187: adaptSingleHeaderFailure 50.0% github.com/abczzz13/clientip/source_execution.go:231: adaptRemoteAddrFailure 66.7% github.com/abczzz13/clientip/source_execution.go:251: adaptForwardedParseError 66.7% github.com/abczzz13/clientip/source_execution.go:264: adaptXFFParseError 66.7% github.com/abczzz13/clientip/source_execution.go:272: adaptChainLengthError 100.0% github.com/abczzz13/clientip/source_execution.go:287: proxyCountError 75.0% github.com/abczzz13/clientip/source_remote_addr_extract.go:9: extract 100.0% github.com/abczzz13/clientip/source_request.go:22: context 66.7% github.com/abczzz13/clientip/source_request.go:30: remoteAddr 100.0% github.com/abczzz13/clientip/source_request.go:34: path 100.0% github.com/abczzz13/clientip/source_request.go:40: valuesCanonical 100.0% github.com/abczzz13/clientip/source_request.go:54: requestViewFromRequest 83.3% github.com/abczzz13/clientip/source_request.go:74: requestViewFromInput 100.0% github.com/abczzz13/clientip/source_single_header.go:16: extract 100.0% github.com/abczzz13/clientip/trust_chain.go:25: isTrustedProxy 100.0% github.com/abczzz13/clientip/trust_chain.go:45: validateProxyCountPolicy 100.0% github.com/abczzz13/clientip/trust_chain.go:65: analyzeChainRightmost 100.0% github.com/abczzz13/clientip/trust_chain.go:108: analyzeChainLeftmost 90.9% github.com/abczzz13/clientip/trust_client_ip.go:47: init 100.0% github.com/abczzz13/clientip/trust_client_ip.go:68: markIPv4SpecialOctets 100.0% github.com/abczzz13/clientip/trust_client_ip.go:83: evaluateClientIP 100.0% github.com/abczzz13/clientip/trust_client_ip.go:110: isReservedIP 90.0% github.com/abczzz13/clientip/trust_client_ip.go:131: isAllowlistedReservedClientIP 100.0% github.com/abczzz13/clientip/trust_matcher.go:21: newPrefixMatcher 87.5% github.com/abczzz13/clientip/trust_matcher.go:64: contains 90.9% github.com/abczzz13/clientip/trust_matcher.go:87: insertPrefix 100.0% github.com/abczzz13/clientip/trust_matcher.go:108: trieContains 84.6% github.com/abczzz13/clientip/trust_matcher.go:134: addrBit 100.0% github.com/abczzz13/clientip/types.go:57: Error 100.0% github.com/abczzz13/clientip/types.go:62: Unwrap 100.0% github.com/abczzz13/clientip/types.go:67: SourceName 0.0% github.com/abczzz13/clientip/types.go:72: SourceValue 0.0% github.com/abczzz13/clientip/types.go:89: Error 100.0% github.com/abczzz13/clientip/types.go:113: Error 100.0% github.com/abczzz13/clientip/types.go:133: Error 100.0% github.com/abczzz13/clientip/types.go:152: Error 100.0% github.com/abczzz13/clientip/types.go:166: Error 100.0% github.com/abczzz13/clientip/types.go:208: ParseCIDRs 100.0% total: (statements) 90.1%