Apply attributes to the underlying HTTP request
See gh-29958
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user