diff --git a/packages/grpc-js-core/src/call-stream.ts b/packages/grpc-js-core/src/call-stream.ts index 20eca023..840d7f2b 100644 --- a/packages/grpc-js-core/src/call-stream.ts +++ b/packages/grpc-js-core/src/call-stream.ts @@ -233,8 +233,7 @@ export class Http2CallStream extends Duplex implements Call { default: this.mappedStatusCode = Status.UNKNOWN; } - delete headers[HTTP2_HEADER_STATUS]; - delete headers[HTTP2_HEADER_CONTENT_TYPE]; + if (flags & http2.constants.NGHTTP2_FLAG_END_STREAM) { this.handleTrailers(headers); } else { diff --git a/packages/grpc-js-core/src/metadata.ts b/packages/grpc-js-core/src/metadata.ts index 48cfb6f3..574b549f 100644 --- a/packages/grpc-js-core/src/metadata.ts +++ b/packages/grpc-js-core/src/metadata.ts @@ -197,6 +197,11 @@ export class Metadata { static fromHttp2Headers(headers: http2.IncomingHttpHeaders): Metadata { const result = new Metadata(); forOwn(headers, (values, key) => { + // Reserved headers (beginning with `:`) are not valid keys. + if (key.charAt(0) === ':') { + return; + } + if (isBinaryKey(key)) { if (Array.isArray(values)) { values.forEach((value) => {