Skip to content

Commit 17361dc

Browse files
authored
Release requests in cors handle (#32410)
There are two scenarios where a http request could terminate in the cors handler. If that occurs, the requests need to be released. This commit releases those requests.
1 parent e8d56fd commit 17361dc

File tree

1 file changed

+22
-7
lines changed

1 file changed

+22
-7
lines changed

modules/transport-netty4/src/main/java/org/elasticsearch/http/netty4/cors/Netty4CorsHandler.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import io.netty.channel.ChannelFutureListener;
2424
import io.netty.channel.ChannelHandlerContext;
2525
import io.netty.handler.codec.http.DefaultFullHttpResponse;
26+
import io.netty.handler.codec.http.FullHttpRequest;
2627
import io.netty.handler.codec.http.HttpHeaderNames;
2728
import io.netty.handler.codec.http.HttpHeaders;
2829
import io.netty.handler.codec.http.HttpMethod;
@@ -48,7 +49,7 @@ public class Netty4CorsHandler extends ChannelDuplexHandler {
4849
private static Pattern SCHEME_PATTERN = Pattern.compile("^https?://");
4950

5051
private final Netty4CorsConfig config;
51-
private HttpRequest request;
52+
private FullHttpRequest request;
5253

5354
/**
5455
* Creates a new instance with the specified {@link Netty4CorsConfig}.
@@ -62,15 +63,24 @@ public Netty4CorsHandler(final Netty4CorsConfig config) {
6263

6364
@Override
6465
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
65-
if (config.isCorsSupportEnabled() && msg instanceof HttpRequest) {
66-
request = (HttpRequest) msg;
66+
assert msg instanceof FullHttpRequest : "Invalid message type: " + msg.getClass();
67+
if (config.isCorsSupportEnabled()) {
68+
request = (FullHttpRequest) msg;
6769
if (isPreflightRequest(request)) {
68-
handlePreflight(ctx, request);
69-
return;
70+
try {
71+
handlePreflight(ctx, request);
72+
return;
73+
} finally {
74+
releaseRequest();
75+
}
7076
}
7177
if (config.isShortCircuit() && !validateOrigin()) {
72-
forbidden(ctx, request);
73-
return;
78+
try {
79+
forbidden(ctx, request);
80+
return;
81+
} finally {
82+
releaseRequest();
83+
}
7484
}
7585
}
7686
ctx.fireChannelRead(msg);
@@ -113,6 +123,11 @@ private void handlePreflight(final ChannelHandlerContext ctx, final HttpRequest
113123
}
114124
}
115125

126+
private void releaseRequest() {
127+
request.release();
128+
request = null;
129+
}
130+
116131
private static void forbidden(final ChannelHandlerContext ctx, final HttpRequest request) {
117132
ctx.writeAndFlush(new DefaultFullHttpResponse(request.protocolVersion(), HttpResponseStatus.FORBIDDEN))
118133
.addListener(ChannelFutureListener.CLOSE);

0 commit comments

Comments
 (0)