# 블로킹 오버로드의 마지막 두 검사 35: if (profile.mode() == ClientMode.DYNAMIC && !capabilities.dynamicTargetStable()) { 36: missing.add("validated DNS pinning for dynamic targets"); 37: } 38: if (profile.mode() == ClientMode.DYNAMIC && !capabilities.validatedDnsPinning()) { 39: // `validatedDnsPinning` was declared on every capability record and read by nothing. It is 40: // the capability that decides whether the SSRF address validation survives to the socket, so 41: // a transport that does not have it cannot serve a dynamic target no matter what its 42: // `dynamicTargetStable` flag says — the two were being conflated. 43: missing.add("call-scoped validated DNS pinning"); 44: } 45: reject(profile, missing); 46: } # 반응형 오버로드의 마지막 검사 64: if (profile.mode() == ClientMode.DYNAMIC && !capabilities.dynamicTargetStable()) { 65: missing.add("validated DNS pinning for dynamic targets"); 66: } 67: reject(profile, missing); 68: } # 이 두 검사에 걸린 유일한 test 39: void rejectsDynamicModeWithoutValidatedPinning() { 40- ClientProfile dynamic = ClientProfiles.builder("webhook").mode(ClientMode.DYNAMIC).build(); 41- assertThatThrownBy( 42- () -> 43- validator.validate( 44- dynamic, BlockingTransportCapabilities.lightweightHttp11AndHttp2())) 45- .isInstanceOf(HttpConfigurationException.class) 46- .hasMessageContaining("validated DNS pinning"); 47- } 48- # 세 플래그를 읽는 곳 전부 TransportCapabilityValidator.java:38: if (profile.mode() == ClientMode.DYNAMIC && !capabilities.validatedDnsPinning()) { TransportCapabilityValidator.java:39: // `validatedDnsPinning` was declared on every capability record and read by nothing. It is ReactiveTransportCapabilities.java:14: boolean validatedDnsPinning, ReactiveTransportCapabilities.java:16: boolean serverSentEvents, ReactiveTransportCapabilities.java:17: boolean cancellationReleasesConnection) { BlockingTransportCapabilities.java:19: boolean validatedDnsPinning, # 출하된 능력 다섯이 그 두 플래그에 넣는 값 apacheClassic validatedDnsPinning=true dynamicTargetStable=true http11AndHttp2 validatedDnsPinning=true dynamicTargetStable=true lightweightHttp11AndHttp2 validatedDnsPinning=false dynamicTargetStable=false reactorNetty validatedDnsPinning=true dynamicTargetStable=true jettyHttp3Experimental validatedDnsPinning=false dynamicTargetStable=false # 반응형 오버로드에 닿는 능력을 정하는 곳 @Bean @ConditionalOnMissingBean(name = "httpClientReactiveTransportProviders") Map httpClientReactiveTransportProviders( ObjectProvider meterRegistry, TlsMaterialProvider tlsMaterialProvider) { Map providers = new EnumMap<>(TransportType.class); providers.put( TransportType.REACTOR_NETTY, new ReactorNettyTransportProvider( Optional.ofNullable(meterRegistry.getIfAvailable()), profile -> materialize(profile, tlsMaterialProvider), HttpClientTransportAutoConfiguration::dynamicTargetPinning)); return Map.copyOf(providers); } # 프로파일 검증기가 동적 모드에 대해 이름으로 막는 전송 173- if (profile.mode() == ClientMode.DYNAMIC 174- && (profile.transport() == TransportType.JDK 175- || profile.transport() == TransportType.JETTY)) { 176: out.add(violation("DYNAMIC_TARGET_TRANSPORT_UNSUPPORTED", profile, "transport"));