Skip to content

Commit 9a33319

Browse files
[FLINK-39761][runtime] Set 'Connection: close' header in StaticFileServerHandler when sending '304 Not Modified' responses
1 parent 42bcbe6 commit 9a33319

2 files changed

Lines changed: 68 additions & 0 deletions

File tree

flink-runtime/src/main/java/org/apache/flink/runtime/rest/handler/legacy/files/StaticFileServerHandler.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.apache.flink.shaded.netty4.io.netty.handler.codec.http.DefaultHttpResponse;
4646
import org.apache.flink.shaded.netty4.io.netty.handler.codec.http.FullHttpResponse;
4747
import org.apache.flink.shaded.netty4.io.netty.handler.codec.http.HttpChunkedInput;
48+
import org.apache.flink.shaded.netty4.io.netty.handler.codec.http.HttpHeaderNames;
4849
import org.apache.flink.shaded.netty4.io.netty.handler.codec.http.HttpHeaderValues;
4950
import org.apache.flink.shaded.netty4.io.netty.handler.codec.http.HttpRequest;
5051
import org.apache.flink.shaded.netty4.io.netty.handler.codec.http.HttpResponse;
@@ -308,6 +309,9 @@ public static void sendNotModified(ChannelHandlerContext ctx) {
308309
FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, NOT_MODIFIED);
309310
setDateHeader(response);
310311

312+
// Explicitly notify the client that the connection will be dropped
313+
response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE);
314+
311315
// close the connection as soon as the error message is sent.
312316
ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
313317
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
package org.apache.flink.runtime.rest.handler.legacy.files;
20+
21+
import org.apache.flink.shaded.netty4.io.netty.channel.ChannelHandlerContext;
22+
import org.apache.flink.shaded.netty4.io.netty.channel.ChannelInboundHandlerAdapter;
23+
import org.apache.flink.shaded.netty4.io.netty.channel.embedded.EmbeddedChannel;
24+
import org.apache.flink.shaded.netty4.io.netty.handler.codec.http.FullHttpResponse;
25+
import org.apache.flink.shaded.netty4.io.netty.handler.codec.http.HttpHeaderNames;
26+
import org.apache.flink.shaded.netty4.io.netty.handler.codec.http.HttpHeaderValues;
27+
import org.apache.flink.shaded.netty4.io.netty.handler.codec.http.HttpResponseStatus;
28+
29+
import org.junit.jupiter.api.Test;
30+
31+
import static org.assertj.core.api.Assertions.assertThat;
32+
33+
class StaticFileServerHandlerTest {
34+
35+
@Test
36+
void testSendNotModifiedIncludesConnectionCloseHeader() {
37+
EmbeddedChannel channel =
38+
new EmbeddedChannel(
39+
new ChannelInboundHandlerAdapter() {
40+
@Override
41+
public void channelActive(ChannelHandlerContext ctx) {
42+
StaticFileServerHandler.sendNotModified(ctx);
43+
}
44+
});
45+
46+
FullHttpResponse response = channel.readOutbound();
47+
48+
assertThat(response).as("No response received!").isNotNull();
49+
50+
try {
51+
assertThat(response.status()).isEqualTo(HttpResponseStatus.NOT_MODIFIED);
52+
53+
assertThat(response.headers().contains(HttpHeaderNames.CONNECTION))
54+
.as("The 'Connection' header is missing!")
55+
.isTrue();
56+
57+
assertThat(response.headers().get(HttpHeaderNames.CONNECTION))
58+
.as("The value of 'Connection' header is not 'close'!")
59+
.isEqualTo(HttpHeaderValues.CLOSE.toString());
60+
} finally {
61+
response.release();
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)