Use doOnDiscard to free internally queued data buffers

Issue: SPR-17246
This commit is contained in:
Arjen Poutsma
2018-09-11 13:24:03 +02:00
parent 1756f83701
commit 8a4835368d
5 changed files with 45 additions and 15 deletions

View File

@@ -29,7 +29,9 @@ import reactor.netty.Connection;
import reactor.netty.http.server.HttpServerRequest;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.core.io.buffer.NettyDataBufferFactory;
import org.springframework.core.io.buffer.PooledDataBuffer;
import org.springframework.http.HttpCookie;
import org.springframework.http.HttpHeaders;
import org.springframework.lang.Nullable;
@@ -153,6 +155,7 @@ class ReactorServerHttpRequest extends AbstractServerHttpRequest {
return this.request.remoteAddress();
}
@Override
@Nullable
protected SslInfo initSslInfo() {
SslHandler sslHandler = ((Connection) this.request).channel().pipeline().get(SslHandler.class);
@@ -165,7 +168,8 @@ class ReactorServerHttpRequest extends AbstractServerHttpRequest {
@Override
public Flux<DataBuffer> getBody() {
return this.request.receive().retain().map(this.bufferFactory::wrap);
Flux<DataBuffer> body = this.request.receive().retain().map(this.bufferFactory::wrap);
return body.doOnDiscard(PooledDataBuffer.class, DataBufferUtils::release);
}
@SuppressWarnings("unchecked")

View File

@@ -119,7 +119,8 @@ class UndertowServerHttpRequest extends AbstractServerHttpRequest {
@Override
public Flux<DataBuffer> getBody() {
return Flux.from(this.body);
return Flux.from(this.body)
.doOnDiscard(PooledDataBuffer.class, DataBufferUtils::release);
}
@SuppressWarnings("unchecked")
@@ -216,6 +217,11 @@ class UndertowServerHttpRequest extends AbstractServerHttpRequest {
this.pooledByteBuffer = pooledByteBuffer;
}
@Override
public boolean isAllocated() {
return this.pooledByteBuffer.isOpen();
}
@Override
public PooledDataBuffer retain() {
return this;