2323import io .netty .channel .ChannelFutureListener ;
2424import io .netty .channel .ChannelHandlerContext ;
2525import io .netty .handler .codec .http .DefaultFullHttpResponse ;
26+ import io .netty .handler .codec .http .FullHttpRequest ;
2627import io .netty .handler .codec .http .HttpHeaderNames ;
2728import io .netty .handler .codec .http .HttpHeaders ;
2829import 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