Skip to content

Commit 9ceced3

Browse files
committed
decompressedMessageTooLong
1 parent 559e3ba commit 9ceced3

File tree

3 files changed

+40
-3
lines changed

3 files changed

+40
-3
lines changed

core/src/main/java/io/grpc/internal/ServerCallImpl.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,8 +330,17 @@ private void messagesAvailableInternal(final MessageProducer producer) {
330330
InputStream message;
331331
try {
332332
while ((message = producer.next()) != null) {
333+
ReqT parsedMessage;
333334
try {
334-
listener.onMessage(call.method.parseRequest(message));
335+
parsedMessage = call.method.parseRequest(message);
336+
} catch (StatusRuntimeException e) {
337+
GrpcUtil.closeQuietly(message);
338+
call.cancelled = true;
339+
call.close(e.getStatus(), new Metadata());
340+
return;
341+
}
342+
try {
343+
listener.onMessage(parsedMessage);
335344
} catch (Throwable t) {
336345
GrpcUtil.closeQuietly(message);
337346
throw t;

interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2030,7 +2030,7 @@ private void assertPayload(Payload expected, Payload actual) {
20302030
}
20312031
}
20322032

2033-
private static void assertCodeEquals(Status.Code expected, Status actual) {
2033+
protected static void assertCodeEquals(Status.Code expected, Status actual) {
20342034
assertWithMessage("Unexpected status: %s", actual).that(actual.getCode()).isEqualTo(expected);
20352035
}
20362036

interop-testing/src/test/java/io/grpc/testing/integration/TransportCompressionTest.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package io.grpc.testing.integration;
1818

1919
import static org.junit.Assert.assertEquals;
20+
import static org.junit.Assert.assertThrows;
2021
import static org.junit.Assert.assertTrue;
2122

2223
import com.google.protobuf.ByteString;
@@ -37,6 +38,8 @@
3738
import io.grpc.ServerCall.Listener;
3839
import io.grpc.ServerCallHandler;
3940
import io.grpc.ServerInterceptor;
41+
import io.grpc.Status.Code;
42+
import io.grpc.StatusRuntimeException;
4043
import io.grpc.internal.GrpcUtil;
4144
import io.grpc.netty.InternalNettyChannelBuilder;
4245
import io.grpc.netty.InternalNettyServerBuilder;
@@ -53,7 +56,10 @@
5356
import java.io.OutputStream;
5457
import org.junit.Before;
5558
import org.junit.BeforeClass;
59+
import org.junit.Ignore;
60+
import org.junit.Rule;
5661
import org.junit.Test;
62+
import org.junit.rules.TestName;
5763
import org.junit.runner.RunWith;
5864
import org.junit.runners.JUnit4;
5965

@@ -84,10 +90,16 @@ public static void registerCompressors() {
8490
compressors.register(Codec.Identity.NONE);
8591
}
8692

93+
@Rule
94+
public final TestName currentTest = new TestName();
95+
8796
@Override
8897
protected ServerBuilder<?> getServerBuilder() {
8998
NettyServerBuilder builder = NettyServerBuilder.forPort(0, InsecureServerCredentials.create())
90-
.maxInboundMessageSize(AbstractInteropTest.MAX_MESSAGE_SIZE)
99+
.maxInboundMessageSize(
100+
DECOMPRESSED_MESSAGE_TOO_LONG_METHOD_NAME.equals(currentTest.getMethodName())
101+
? 1000
102+
: AbstractInteropTest.MAX_MESSAGE_SIZE)
91103
.compressorRegistry(compressors)
92104
.decompressorRegistry(decompressors)
93105
.intercept(new ServerInterceptor() {
@@ -126,6 +138,22 @@ public void compresses() {
126138
assertTrue(FZIPPER.anyWritten);
127139
}
128140

141+
private static final String DECOMPRESSED_MESSAGE_TOO_LONG_METHOD_NAME = "decompressedMessageTooLong";
142+
143+
@Test
144+
// @Ignore("WIP")
145+
public void decompressedMessageTooLong() {
146+
assertEquals(DECOMPRESSED_MESSAGE_TOO_LONG_METHOD_NAME, currentTest.getMethodName());
147+
final SimpleRequest bigRequest = SimpleRequest.newBuilder()
148+
.setPayload(Payload.newBuilder().setBody(ByteString.copyFrom(new byte[271828])))
149+
.build();
150+
StatusRuntimeException e = assertThrows(StatusRuntimeException.class,
151+
() -> blockingStub.withCompression("gzip").unaryCall(bigRequest));
152+
assertCodeEquals(Code.RESOURCE_EXHAUSTED, e.getStatus());
153+
assertEquals("Decompressed gRPC message exceeds maximum size 1000",
154+
e.getStatus().getDescription());
155+
}
156+
129157
@Override
130158
protected NettyChannelBuilder createChannelBuilder() {
131159
NettyChannelBuilder builder = NettyChannelBuilder.forAddress(getListenAddress())

0 commit comments

Comments
 (0)