如何将 AWS CRT HTTP 客户端与 Hoverfly 结合使用?

问题描述 投票:0回答:1

我想实现 AwsCrtHttpClient 并使用 Hoverfly 拦截单元测试中的 HTTP 请求,但 Hoverfly 不拦截请求。客户端初始化如下:

private static final SdkHttpClient httpClient = AwsCrtHttpClient.builder().build();
。虽然有修改代理设置的选项(我已经尝试过),但 Hoverfly 仍然没有拦截请求。

我也尝试过:

private static final SdkHttpClient httpClient = AwsCrtHttpClient.builder()
        .proxyConfiguration(ProxyConfiguration.builder()
                .host("localhost")
                .port(8500)
                .build())
        .build();

private static final SdkHttpClient httpClient = AwsCrtHttpClient.builder()
        .proxyConfiguration(ProxyConfiguration.builder()
                .host(System.getProperty("http.proxyHost"))
                .port(Integer.parseInt(System.getProperty("http.proxyPort")))
                .build())
        .build();

private static final SdkHttpClient httpClient = AwsCrtHttpClient.builder()
        .proxyConfiguration(ProxyConfiguration.builder()
                .useSystemPropertyValues(true)
                .build())
        .build();

Hoverfly 不会拦截具有任何这些配置的请求。根据AWS文档(here),代理设置似乎没有必要手动配置为

SDK 会查找外部设置来配置默认代理配置。

此外,Hoverfly 配置应该正确,因为我正在从默认 Java HTTP 客户端迁移到使用 AWS CRT HTTP 客户端,并且请求之前已被拦截。作为参考,我在测试类中使用

@ExtendWith(HoverflyExtension.class)
注释,并使用
hoverfly.simulate(dsl(service(uri).anyMethod().willReturn(success().body("success"))))
模拟端点。我将hoverfly-java-junit5与Java 11一起使用。我仍然可以看到Hoverfly日志正确初始化。以下是一些与初始化相关的日志:

[Thread-1] INFO hoverfly - Default proxy port has been overwritten port=50022
[Thread-1] INFO hoverfly - Default admin port has been overwritten port=50023
[Thread-1] INFO hoverfly - Using memory backend 
[Thread-1] INFO hoverfly - Proxy prepared... Destination=. Mode=simulate ProxyPort=50022
[Thread-1] INFO hoverfly - current proxy configuration destination=. mode=simulate port=50022
[Thread-1] INFO hoverfly - serving proxy 
[Thread-1] INFO hoverfly - Admin interface is starting... AdminPort=50023
[main] INFO io.specto.hoverfly.junit.core.Hoverfly - A local Hoverfly with version v1.8.0 is ready
[Thread-1] INFO hoverfly - Mode has been changed mode=simulate
[main] INFO io.specto.hoverfly.junit.core.ProxyConfigurer - Setting proxy host to localhost
[main] INFO io.specto.hoverfly.junit.core.ProxyConfigurer - Setting proxy proxyPort to 50022
[main] INFO io.specto.hoverfly.junit.core.Hoverfly - Importing simulation data to Hoverfly

最后,使用以下逻辑正确进行 HTTP 调用(即,我通过公共互联网从非模拟端点获取响应):

SdkHttpRequest.Builder sdkHttpRequestBuilder = SdkHttpRequest.builder().uri(new URI(uri)).method(method);
// Conditionally append headers with sdkHttpRequestBuilder.appendHeader(headerName, headerValue);
// ...
SdkHttpRequest sdkHttpRequest = sdkHttpRequestBuilder
        .appendHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.getMimeType())
        .build();
HttpExecuteResponse response = httpClient.prepareRequest(HttpExecuteRequest.builder().request(sdkHttpRequest).build()).call();

为什么 Hoverfly 使用默认 HTTP 客户端而不是 AWS CRT HTTP 客户端来处理旧逻辑?之前的 HTTP 请求是这样的:

private static final HttpClient httpClient = HttpClient.newHttpClient();
// Prepare request
// ...
HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());

我正在此 AWS CRT HTTP 客户端或 Hoverfly 上寻找一些低级设置,我可以对其进行修改以确保请求被 Hoverfly 拦截。

java mocking junit5 aws-sdk-java-2.0 hoverfly
1个回答
0
投票

解决方案是将 Hoverfly 配置中的

proxyLocalHost
标志设置为
true
。这是因为 AWS CRT HTTP 客户端中的客户端构建器逻辑正在读取 Hoverfly 环境变量“http.nonProxyHosts”的默认值,然后使用其构建器逻辑将客户端的代理配置设置为
null
。解决方法是修改 Hoverfly 配置,将
proxyLocalHost
标志设置为
true
,如下所示:

@HoverflyCore(config = @HoverflyConfig(proxyLocalHost = true))
@ExtendWith(HoverflyExtension.class)
class MyTest {
// ...

这会将

proxyLocalHost
环境变量设置为
""
,并允许默认 AWS CRT HTTP 客户端代理到本地主机。

© www.soinside.com 2019 - 2024. All rights reserved.