Apply attributes to the underlying HTTP request

See gh-29958
This commit is contained in:
PhilKes
2023-02-11 14:12:18 +01:00
committed by rstoyanchev
parent 282ee02419
commit 052b6357c8
26 changed files with 374 additions and 24 deletions

View File

@@ -34,14 +34,18 @@ import java.time.Duration;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import io.netty.util.Attribute;
import io.netty.util.AttributeKey;
import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.MockWebServer;
import okhttp3.mockwebserver.RecordedRequest;
import org.eclipse.jetty.client.Request;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Named;
import org.junit.jupiter.api.Test;
@@ -50,6 +54,7 @@ import org.junit.jupiter.params.provider.MethodSource;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.publisher.Sinks;
import reactor.netty.channel.ChannelOperations;
import reactor.netty.http.client.HttpClient;
import reactor.netty.resources.ConnectionProvider;
import reactor.test.StepVerifier;
@@ -186,6 +191,67 @@ class WebClientIntegrationTests {
});
}
@ParameterizedWebClientTest
void applyAttributesInNativeRequest(ClientHttpConnector connector) {
startServer(connector);
connector.setApplyAttributes(true);
checkAttributesInNativeRequest(true);
}
@ParameterizedWebClientTest
void dontApplyAttributesInNativeRequest(ClientHttpConnector connector) {
startServer(connector);
connector.setApplyAttributes(false);
checkAttributesInNativeRequest(false);
}
private void checkAttributesInNativeRequest(boolean expectAttributesApplied){
prepareResponse(response -> {});
final AtomicReference<Object> nativeRequest = new AtomicReference<>();
Mono<Void> result = this.webClient.get()
.uri("/pojo")
.attribute("foo","bar")
.httpRequest(clientHttpRequest -> nativeRequest.set(clientHttpRequest.getNativeRequest()))
.retrieve()
.bodyToMono(Void.class);
StepVerifier.create(result)
.expectComplete()
.verify();
if (nativeRequest.get() instanceof ChannelOperations<?,?> nativeReq) {
Attribute<Map<String, Object>> attributes = nativeReq.channel().attr(AttributeKey.valueOf("attributes"));
if (expectAttributesApplied) {
assertThat(attributes.get()).isNotNull();
assertThat(attributes.get()).containsEntry("foo", "bar");
}
else {
assertThat(attributes.get()).isNull();
}
}
else if (nativeRequest.get() instanceof reactor.netty5.channel.ChannelOperations<?,?> nativeReq) {
io.netty5.util.Attribute<Map<String, Object>> attributes = nativeReq.channel().attr(io.netty5.util.AttributeKey.valueOf("attributes"));
if (expectAttributesApplied) {
assertThat(attributes.get()).isNotNull();
assertThat(attributes.get()).containsEntry("foo", "bar");
}
else {
assertThat(attributes.get()).isNull();
}
}
else if (nativeRequest.get() instanceof Request nativeReq) {
if (expectAttributesApplied) {
assertThat(nativeReq.getAttributes()).containsEntry("foo", "bar");
}
else {
assertThat(nativeReq.getAttributes()).doesNotContainEntry("foo", "bar");
}
}
else if (nativeRequest.get() instanceof org.apache.hc.core5.http.HttpRequest nativeReq) {
// TODO get attributes from HttpClientContext
}
}
@ParameterizedWebClientTest
void retrieveJsonWithParameterizedTypeReference(ClientHttpConnector connector) {
startServer(connector);