Skip to content

Commit 22de216

Browse files
authored
Handle header with errors and endStream = true (#10384) (#10414)
* Eliminate NPE by skipping further processing when stream is defined, but doesn't have a property for streamKey (header processing identified an error) Fixes #10364 * Add unit test for missing content type
1 parent c96b7d5 commit 22de216

File tree

4 files changed

+43
-7
lines changed

4 files changed

+43
-7
lines changed

core/src/testFixtures/java/io/grpc/internal/AbstractTransportTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2106,6 +2106,9 @@ private static void assertStatusEquals(Status expected, Status actual) {
21062106
* be present, and the cause should be stripped away.
21072107
*/
21082108
private static void checkClientStatus(Status expectedStatus, Status clientStreamStatus) {
2109+
if (!clientStreamStatus.isOk() && clientStreamStatus.getCode() != expectedStatus.getCode()) {
2110+
System.out.println("Full Status: " + clientStreamStatus);
2111+
}
21092112
assertEquals(expectedStatus.getCode(), clientStreamStatus.getCode());
21102113
assertEquals(expectedStatus.getDescription(), clientStreamStatus.getDescription());
21112114
assertNull(clientStreamStatus.getCause());

netty/src/main/java/io/grpc/netty/NettyServerHandler.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,9 @@ private void onDataRead(int streamId, ByteBuf data, int padding, boolean endOfSt
512512
flowControlPing().onDataRead(data.readableBytes(), padding);
513513
try {
514514
NettyServerStream.TransportState stream = serverStream(requireHttp2Stream(streamId));
515+
if (stream == null) {
516+
return;
517+
}
515518
try (TaskCloseable ignore = PerfMark.traceTask("NettyServerHandler.onDataRead")) {
516519
PerfMark.attachTag(stream.tag());
517520
stream.inboundDataReceived(data, endOfStream);
@@ -679,12 +682,14 @@ void returnProcessedBytes(Http2Stream http2Stream, int bytes) {
679682

680683
private void closeStreamWhenDone(ChannelPromise promise, int streamId) throws Http2Exception {
681684
final NettyServerStream.TransportState stream = serverStream(requireHttp2Stream(streamId));
682-
promise.addListener(new ChannelFutureListener() {
683-
@Override
684-
public void operationComplete(ChannelFuture future) {
685-
stream.complete();
686-
}
687-
});
685+
if (stream != null) {
686+
promise.addListener(new ChannelFutureListener() {
687+
@Override
688+
public void operationComplete(ChannelFuture future) {
689+
stream.complete();
690+
}
691+
});
692+
}
688693
}
689694

690695
/**

netty/src/test/java/io/grpc/netty/NettyServerHandlerTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,34 @@ public void headersWithMultipleHostsShouldFail() throws Exception {
634634
any(ChannelPromise.class));
635635
}
636636

637+
@Test
638+
public void headersWithErrAndEndStreamReturnErrorButNotThrowNpe() throws Exception {
639+
manualSetUp();
640+
Http2Headers headers = new DefaultHttp2Headers()
641+
.method(HTTP_METHOD)
642+
.add(AsciiString.of("host"), AsciiString.of("example.com"))
643+
.path(new AsciiString("/foo/bar"));
644+
ByteBuf headersFrame = headersFrame(STREAM_ID, headers);
645+
channelRead(headersFrame);
646+
channelRead(emptyGrpcFrame(STREAM_ID, true));
647+
648+
Http2Headers responseHeaders = new DefaultHttp2Headers()
649+
.set(InternalStatus.CODE_KEY.name(), String.valueOf(Code.INTERNAL.value()))
650+
.set(InternalStatus.MESSAGE_KEY.name(), "Content-Type is missing from the request")
651+
.status("" + 415)
652+
.set(CONTENT_TYPE_HEADER, "text/plain; charset=utf-8");
653+
654+
verifyWrite()
655+
.writeHeaders(
656+
eq(ctx()),
657+
eq(STREAM_ID),
658+
eq(responseHeaders),
659+
eq(0),
660+
eq(false),
661+
any(ChannelPromise.class));
662+
663+
}
664+
637665
@Test
638666
public void headersWithAuthorityAndHostUsesAuthority() throws Exception {
639667
manualSetUp();

xds/src/test/java/io/grpc/xds/WeightedRoundRobinLoadBalancerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -943,7 +943,7 @@ public void testStaticStrideSchedulerNonIntegers1() {
943943
Map<Integer, Integer> pickCount = new HashMap<>();
944944
for (int i = 0; i < 1000; i++) {
945945
int result = sss.pick();
946-
pickCount.put(result, pickCount.getOrDefault(result, 0) + 1);
946+
pickCount.merge(result, 1, (o, v) -> o + v);
947947
}
948948
for (int i = 0; i < 3; i++) {
949949
assertThat(Math.abs(pickCount.getOrDefault(i, 0) / 1000.0 - weights[i] / totalWeight))

0 commit comments

Comments
 (0)