Skip to content

Commit 7a56df7

Browse files
authored
Release requests in cors handler (#32364)
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 df579f8 commit 7a56df7

File tree

2 files changed

+44
-14
lines changed

2 files changed

+44
-14
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
@@ -24,6 +24,7 @@
2424
import io.netty.channel.ChannelHandlerContext;
2525
import io.netty.channel.ChannelPromise;
2626
import io.netty.handler.codec.http.DefaultFullHttpResponse;
27+
import io.netty.handler.codec.http.FullHttpRequest;
2728
import io.netty.handler.codec.http.HttpHeaderNames;
2829
import io.netty.handler.codec.http.HttpHeaders;
2930
import io.netty.handler.codec.http.HttpMethod;
@@ -50,7 +51,7 @@ public class Netty4CorsHandler extends ChannelDuplexHandler {
5051
private static Pattern SCHEME_PATTERN = Pattern.compile("^https?://");
5152

5253
private final Netty4CorsConfig config;
53-
private HttpRequest request;
54+
private FullHttpRequest request;
5455

5556
/**
5657
* Creates a new instance with the specified {@link Netty4CorsConfig}.
@@ -64,15 +65,24 @@ public Netty4CorsHandler(final Netty4CorsConfig config) {
6465

6566
@Override
6667
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
67-
if (config.isCorsSupportEnabled() && msg instanceof HttpRequest) {
68-
request = (HttpRequest) msg;
68+
assert msg instanceof FullHttpRequest : "Invalid message type: " + msg.getClass();
69+
if (config.isCorsSupportEnabled()) {
70+
request = (FullHttpRequest) msg;
6971
if (isPreflightRequest(request)) {
70-
handlePreflight(ctx, request);
71-
return;
72+
try {
73+
handlePreflight(ctx, request);
74+
return;
75+
} finally {
76+
releaseRequest();
77+
}
7278
}
7379
if (config.isShortCircuit() && !validateOrigin()) {
74-
forbidden(ctx, request);
75-
return;
80+
try {
81+
forbidden(ctx, request);
82+
return;
83+
} finally {
84+
releaseRequest();
85+
}
7686
}
7787
}
7888
ctx.fireChannelRead(msg);
@@ -123,6 +133,11 @@ private void handlePreflight(final ChannelHandlerContext ctx, final HttpRequest
123133
}
124134
}
125135

136+
private void releaseRequest() {
137+
request.release();
138+
request = null;
139+
}
140+
126141
private static void forbidden(final ChannelHandlerContext ctx, final HttpRequest request) {
127142
ctx.writeAndFlush(new DefaultFullHttpResponse(request.protocolVersion(), HttpResponseStatus.FORBIDDEN))
128143
.addListener(ChannelFutureListener.CLOSE);

plugins/transport-nio/src/main/java/org/elasticsearch/http/nio/cors/NioCorsHandler.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.netty.channel.ChannelHandlerContext;
2525
import io.netty.channel.ChannelPromise;
2626
import io.netty.handler.codec.http.DefaultFullHttpResponse;
27+
import io.netty.handler.codec.http.FullHttpRequest;
2728
import io.netty.handler.codec.http.HttpHeaderNames;
2829
import io.netty.handler.codec.http.HttpHeaders;
2930
import io.netty.handler.codec.http.HttpMethod;
@@ -50,7 +51,7 @@ public class NioCorsHandler extends ChannelDuplexHandler {
5051
private static Pattern SCHEME_PATTERN = Pattern.compile("^https?://");
5152

5253
private final NioCorsConfig config;
53-
private HttpRequest request;
54+
private FullHttpRequest request;
5455

5556
/**
5657
* Creates a new instance with the specified {@link NioCorsConfig}.
@@ -64,15 +65,24 @@ public NioCorsHandler(final NioCorsConfig config) {
6465

6566
@Override
6667
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
67-
if (config.isCorsSupportEnabled() && msg instanceof HttpRequest) {
68-
request = (HttpRequest) msg;
68+
assert msg instanceof FullHttpRequest : "Invalid message type: " + msg.getClass();
69+
if (config.isCorsSupportEnabled()) {
70+
request = (FullHttpRequest) msg;
6971
if (isPreflightRequest(request)) {
70-
handlePreflight(ctx, request);
71-
return;
72+
try {
73+
handlePreflight(ctx, request);
74+
return;
75+
} finally {
76+
releaseRequest();
77+
}
7278
}
7379
if (config.isShortCircuit() && !validateOrigin()) {
74-
forbidden(ctx, request);
75-
return;
80+
try {
81+
forbidden(ctx, request);
82+
return;
83+
} finally {
84+
releaseRequest();
85+
}
7686
}
7787
}
7888
ctx.fireChannelRead(msg);
@@ -109,6 +119,11 @@ public static void setCorsResponseHeaders(HttpRequest request, HttpResponse resp
109119
}
110120
}
111121

122+
private void releaseRequest() {
123+
request.release();
124+
request = null;
125+
}
126+
112127
private void handlePreflight(final ChannelHandlerContext ctx, final HttpRequest request) {
113128
final HttpResponse response = new DefaultFullHttpResponse(request.protocolVersion(), HttpResponseStatus.OK, true, true);
114129
if (setOrigin(response)) {

0 commit comments

Comments
 (0)