Skip to content

Commit 0e9ecb6

Browse files
committed
Shortcut handling of bodyToFlux(DataBuffer.class)
Given that the body is a Flux<DataBuffer> there probably could be a Flux<DataBuffer> body(); At least bodyToFlux(DataBuffer.class) which is used when mutating and is a common case should not incur overhead. See gh-24680
1 parent 67a06f5 commit 0e9ecb6

File tree

2 files changed

+27
-18
lines changed

2 files changed

+27
-18
lines changed

spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultClientResponse.java

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
import org.springframework.core.ParameterizedTypeReference;
3232
import org.springframework.core.codec.Hints;
33+
import org.springframework.core.io.buffer.DataBuffer;
3334
import org.springframework.core.io.buffer.DataBufferUtils;
3435
import org.springframework.http.HttpHeaders;
3536
import org.springframework.http.HttpRequest;
@@ -66,6 +67,8 @@ class DefaultClientResponse implements ClientResponse {
6667

6768
private final Supplier<HttpRequest> requestSupplier;
6869

70+
private final BodyExtractor.Context bodyExtractorContext;
71+
6972

7073
public DefaultClientResponse(ClientHttpResponse response, ExchangeStrategies strategies,
7174
String logPrefix, String requestDescription, Supplier<HttpRequest> requestSupplier) {
@@ -76,6 +79,22 @@ public DefaultClientResponse(ClientHttpResponse response, ExchangeStrategies str
7679
this.logPrefix = logPrefix;
7780
this.requestDescription = requestDescription;
7881
this.requestSupplier = requestSupplier;
82+
this.bodyExtractorContext = new BodyExtractor.Context() {
83+
@Override
84+
public List<HttpMessageReader<?>> messageReaders() {
85+
return strategies.messageReaders();
86+
}
87+
88+
@Override
89+
public Optional<ServerHttpResponse> serverResponse() {
90+
return Optional.empty();
91+
}
92+
93+
@Override
94+
public Map<String, Object> hints() {
95+
return Hints.from(Hints.LOG_PREFIX_HINT, logPrefix);
96+
}
97+
};
7998
}
8099

81100

@@ -107,22 +126,7 @@ public MultiValueMap<String, ResponseCookie> cookies() {
107126
@SuppressWarnings("unchecked")
108127
@Override
109128
public <T> T body(BodyExtractor<T, ? super ClientHttpResponse> extractor) {
110-
T result = extractor.extract(this.response, new BodyExtractor.Context() {
111-
@Override
112-
public List<HttpMessageReader<?>> messageReaders() {
113-
return strategies.messageReaders();
114-
}
115-
116-
@Override
117-
public Optional<ServerHttpResponse> serverResponse() {
118-
return Optional.empty();
119-
}
120-
121-
@Override
122-
public Map<String, Object> hints() {
123-
return Hints.from(Hints.LOG_PREFIX_HINT, logPrefix);
124-
}
125-
});
129+
T result = extractor.extract(this.response, this.bodyExtractorContext);
126130
String description = "Body from " + this.requestDescription + " [DefaultClientResponse]";
127131
if (result instanceof Mono) {
128132
return (T) ((Mono<?>) result).checkpoint(description);
@@ -146,8 +150,10 @@ public <T> Mono<T> bodyToMono(ParameterizedTypeReference<T> elementTypeRef) {
146150
}
147151

148152
@Override
153+
@SuppressWarnings("unchecked")
149154
public <T> Flux<T> bodyToFlux(Class<? extends T> elementClass) {
150-
return body(BodyExtractors.toFlux(elementClass));
155+
return elementClass.equals(DataBuffer.class) ?
156+
(Flux<T>) body(BodyExtractors.toDataBuffers()) : body(BodyExtractors.toFlux(elementClass));
151157
}
152158

153159
@Override

spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerRequest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.springframework.core.ParameterizedTypeReference;
3737
import org.springframework.core.codec.DecodingException;
3838
import org.springframework.core.codec.Hints;
39+
import org.springframework.core.io.buffer.DataBuffer;
3940
import org.springframework.http.HttpCookie;
4041
import org.springframework.http.HttpHeaders;
4142
import org.springframework.http.HttpRange;
@@ -195,8 +196,10 @@ public <T> Mono<T> bodyToMono(ParameterizedTypeReference<T> typeReference) {
195196
}
196197

197198
@Override
199+
@SuppressWarnings("unchecked")
198200
public <T> Flux<T> bodyToFlux(Class<? extends T> elementClass) {
199-
Flux<T> flux = body(BodyExtractors.toFlux(elementClass));
201+
Flux<T> flux = (elementClass.equals(DataBuffer.class) ?
202+
(Flux<T>) request().getBody() : body(BodyExtractors.toFlux(elementClass)));
200203
return flux.onErrorMap(UnsupportedMediaTypeException.class, ERROR_MAPPER)
201204
.onErrorMap(DecodingException.class, DECODING_MAPPER);
202205
}

0 commit comments

Comments
 (0)