diff --git a/packages/grpc-js/src/server-call.ts b/packages/grpc-js/src/server-call.ts index 6bcb9687..284e18fc 100644 --- a/packages/grpc-js/src/server-call.ts +++ b/packages/grpc-js/src/server-call.ts @@ -447,7 +447,11 @@ export class Http2ServerCallStream< try { const requestBytes = Buffer.concat(chunks, totalLength); if (this.maxReceiveMessageSize !== -1 && requestBytes.length > this.maxReceiveMessageSize) { - this.cancelWithStatus(Status.RESOURCE_EXHAUSTED, `Server received message of size ${requestBytes.length} > max size ${this.maxReceiveMessageSize}`); + this.sendError({ + code: Status.RESOURCE_EXHAUSTED, + details: `Server received message of size ${requestBytes.length} > max size ${this.maxReceiveMessageSize}` + }); + resolve(); } resolve(await this.deserializeMessage(requestBytes)); @@ -564,18 +568,17 @@ export class Http2ServerCallStream< this.sendStatus(status); } - cancelWithStatus(code: Status, details: string) { - this.cancelled = true; - this.sendStatus({code, details, metadata: new Metadata()}); - } - write(chunk: Buffer) { if (this.checkCancelled()) { return; } if (this.maxSendMessageSize !== -1 && chunk.length > this.maxSendMessageSize) { - this.cancelWithStatus(Status.RESOURCE_EXHAUSTED, `Server failed to send message of size ${chunk.length} > max size ${this.maxSendMessageSize}`); + this.sendError({ + code: Status.RESOURCE_EXHAUSTED, + details: `Server failed to send message of size ${chunk.length} > max size ${this.maxSendMessageSize}` + }); + return; } this.sendMetadata(); @@ -605,7 +608,11 @@ export class Http2ServerCallStream< for (const message of messages) { if (this.maxReceiveMessageSize !== -1 && message.length > this.maxReceiveMessageSize) { - this.cancelWithStatus(Status.RESOURCE_EXHAUSTED, `Server received message of size ${message.length} > max size ${this.maxReceiveMessageSize}`); + this.sendError({ + code: Status.RESOURCE_EXHAUSTED, + details: `Server received message of size ${message.length} > max size ${this.maxReceiveMessageSize}` + }); + return; } this.pushOrBufferMessage(readable, message); } diff --git a/test/api/interop_extra_test.js b/test/api/interop_extra_test.js index d55471ad..c8c22fea 100644 --- a/test/api/interop_extra_test.js +++ b/test/api/interop_extra_test.js @@ -144,9 +144,9 @@ describe(`${anyGrpc.clientName} client -> ${anyGrpc.serverName} server`, functio done(); }); }); - describe.only('max message size', function() { + describe('max message size', function() { // A size that is larger than the default limit - const largeMessageSize = 6 * 1024 * 1024; + const largeMessageSize = 8 * 1024 * 1024; const largeMessage = Buffer.alloc(largeMessageSize); it('should get an error when sending a large message', function(done) { done = multiDone(done, 2); @@ -257,27 +257,28 @@ describe(`${anyGrpc.clientName} client -> ${anyGrpc.serverName} server`, functio restrictedServer.forceShutdown(); }); it('should get an error when sending a large message', function(done) { - done = multiDone(done, 2); restrictedServerClient.unaryCall({payload: {body: largeMessage}}, (error, result) => { + console.log(error.message); assert(error); assert.strictEqual(error.code, grpc.status.RESOURCE_EXHAUSTED); - done(); - }); - const stream = restrictedServerClient.fullDuplexCall(); - stream.write({payload: {body: largeMessage}}); - stream.end(); - stream.on('data', () => {}); - stream.on('status', (status) => { - assert.strictEqual(status.code, grpc.status.RESOURCE_EXHAUSTED); - done(); - }); - stream.on('error', (error) => { + const stream = restrictedServerClient.fullDuplexCall(); + stream.write({payload: {body: largeMessage}}); + stream.end(); + stream.on('data', () => {}); + stream.on('status', (status) => { + console.log(status.details); + assert.strictEqual(status.code, grpc.status.RESOURCE_EXHAUSTED); + done(); + }); + stream.on('error', (error) => { + }); }); }); it('should get an error when requesting a large message', function(done) { done = multiDone(done, 2); restrictedServerClient.unaryCall({response_size: largeMessageSize}, (error, result) => { assert(error); + console.log(error.message); assert.strictEqual(error.code, grpc.status.RESOURCE_EXHAUSTED); done(); });