Skip to content

Commit 18da718

Browse files
committed
Enforce use of unpooled data buffers in 5.0.x
Issue: SPR-17501
1 parent 2405161 commit 18da718

File tree

5 files changed

+26
-15
lines changed

5 files changed

+26
-15
lines changed

spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpConnector.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@
2020
import java.util.function.Consumer;
2121
import java.util.function.Function;
2222

23+
import io.netty.buffer.UnpooledByteBufAllocator;
2324
import reactor.core.publisher.Mono;
2425
import reactor.ipc.netty.http.client.HttpClient;
2526
import reactor.ipc.netty.http.client.HttpClientOptions;
2627
import reactor.ipc.netty.http.client.HttpClientRequest;
2728
import reactor.ipc.netty.http.client.HttpClientResponse;
2829
import reactor.ipc.netty.options.ClientOptions;
2930

31+
import org.springframework.core.io.buffer.NettyDataBufferFactory;
3032
import org.springframework.http.HttpMethod;
3133

3234
/**
@@ -38,6 +40,11 @@
3840
*/
3941
public class ReactorClientHttpConnector implements ClientHttpConnector {
4042

43+
// 5.0.x only: no buffer pooling
44+
static final NettyDataBufferFactory BUFFER_FACTORY =
45+
new NettyDataBufferFactory(new UnpooledByteBufAllocator(false));
46+
47+
4148
private final HttpClient httpClient;
4249

4350

spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpRequest.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,21 +48,18 @@ class ReactorClientHttpRequest extends AbstractClientHttpRequest implements Zero
4848

4949
private final HttpClientRequest httpRequest;
5050

51-
private final NettyDataBufferFactory bufferFactory;
52-
5351

5452
public ReactorClientHttpRequest(HttpMethod httpMethod, URI uri,
5553
HttpClientRequest httpRequest) {
5654
this.httpMethod = httpMethod;
5755
this.uri = uri;
5856
this.httpRequest = httpRequest.failOnClientError(false).failOnServerError(false);
59-
this.bufferFactory = new NettyDataBufferFactory(httpRequest.alloc());
6057
}
6158

6259

6360
@Override
6461
public DataBufferFactory bufferFactory() {
65-
return this.bufferFactory;
62+
return ReactorClientHttpConnector.BUFFER_FACTORY;
6663
}
6764

6865
@Override

spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpResponse.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import reactor.ipc.netty.http.client.HttpClientResponse;
2424

2525
import org.springframework.core.io.buffer.DataBuffer;
26-
import org.springframework.core.io.buffer.NettyDataBufferFactory;
2726
import org.springframework.http.HttpHeaders;
2827
import org.springframework.http.HttpStatus;
2928
import org.springframework.http.ResponseCookie;
@@ -41,16 +40,13 @@
4140
*/
4241
class ReactorClientHttpResponse implements ClientHttpResponse {
4342

44-
private final NettyDataBufferFactory dataBufferFactory;
45-
4643
private final HttpClientResponse response;
4744

4845
private final AtomicBoolean bodyConsumed = new AtomicBoolean();
4946

5047

5148
public ReactorClientHttpResponse(HttpClientResponse response) {
5249
this.response = response;
53-
this.dataBufferFactory = new NettyDataBufferFactory(response.channel().alloc());
5450
}
5551

5652

@@ -64,9 +60,11 @@ public Flux<DataBuffer> getBody() {
6460
// isn't consistent in doing so and may hang without completion.
6561
Assert.state(this.bodyConsumed.compareAndSet(false, true),
6662
"The client response body can only be consumed once."))
67-
.map(buf -> {
68-
buf.retain();
69-
return dataBufferFactory.wrap(buf);
63+
.map(byteBuf -> {
64+
// 5.0.x only: do not retain, make a copy..
65+
byte[] data = new byte[byteBuf.readableBytes()];
66+
byteBuf.readBytes(data);
67+
return ReactorClientHttpConnector.BUFFER_FACTORY.wrap(data);
7068
});
7169
}
7270

spring-web/src/main/java/org/springframework/http/server/reactive/ReactorHttpHandlerAdapter.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.net.URISyntaxException;
2020
import java.util.function.BiFunction;
2121

22+
import io.netty.buffer.UnpooledByteBufAllocator;
2223
import io.netty.handler.codec.http.HttpResponseStatus;
2324
import org.apache.commons.logging.Log;
2425
import org.apache.commons.logging.LogFactory;
@@ -39,6 +40,10 @@
3940
*/
4041
public class ReactorHttpHandlerAdapter implements BiFunction<HttpServerRequest, HttpServerResponse, Mono<Void>> {
4142

43+
// 5.0.x only: no buffer pooling
44+
private static final NettyDataBufferFactory BUFFER_FACTORY =
45+
new NettyDataBufferFactory(new UnpooledByteBufAllocator(false));
46+
4247
private static final Log logger = LogFactory.getLog(ReactorHttpHandlerAdapter.class);
4348

4449

@@ -53,12 +58,11 @@ public ReactorHttpHandlerAdapter(HttpHandler httpHandler) {
5358

5459
@Override
5560
public Mono<Void> apply(HttpServerRequest request, HttpServerResponse response) {
56-
NettyDataBufferFactory bufferFactory = new NettyDataBufferFactory(response.alloc());
5761
ServerHttpRequest adaptedRequest;
5862
ServerHttpResponse adaptedResponse;
5963
try {
60-
adaptedRequest = new ReactorServerHttpRequest(request, bufferFactory);
61-
adaptedResponse = new ReactorServerHttpResponse(response, bufferFactory);
64+
adaptedRequest = new ReactorServerHttpRequest(request, BUFFER_FACTORY);
65+
adaptedResponse = new ReactorServerHttpResponse(response, BUFFER_FACTORY);
6266
}
6367
catch (URISyntaxException ex) {
6468
if (logger.isWarnEnabled()) {

spring-web/src/main/java/org/springframework/http/server/reactive/ReactorServerHttpRequest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,12 @@ protected SslInfo initSslInfo() {
167167

168168
@Override
169169
public Flux<DataBuffer> getBody() {
170-
return this.request.receive().retain().map(this.bufferFactory::wrap);
170+
// 5.0.x only: do not retain, make a copy..
171+
return this.request.receive().map(byteBuf -> {
172+
byte[] data = new byte[byteBuf.readableBytes()];
173+
byteBuf.readBytes(data);
174+
return bufferFactory.wrap(data);
175+
});
171176
}
172177

173178
@SuppressWarnings("unchecked")

0 commit comments

Comments
 (0)