Skip to content

Commit 9150bdf

Browse files
committed
default to identity header everywhere instead of leaving it undefined
1 parent 47bb8b6 commit 9150bdf

File tree

3 files changed

+37
-24
lines changed

3 files changed

+37
-24
lines changed

packages/grpc-js/src/compression-filter.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ function getCompressionHandler(compressionName: string): CompressionHandler {
183183
export class CompressionFilter extends BaseFilter implements Filter {
184184
private sendCompression: CompressionHandler = new IdentityHandler();
185185
private receiveCompression: CompressionHandler = new IdentityHandler();
186-
private defaultCompressionAlgorithm: CompressionAlgorithm | undefined;
186+
private currentCompressionAlgorithm: CompressionAlgorithm = 'identity';
187187

188188
constructor(channelOptions: ChannelOptions, private sharedFilterConfig: SharedCompressionFilterConfig) {
189189
super();
@@ -201,8 +201,8 @@ export class CompressionFilter extends BaseFilter implements Filter {
201201
* In that case we only want to use the encoding chosen by the client if the server supports it
202202
*/
203203
if (!serverSupportedEncodings || serverSupportedEncodings.includes(clientSelectedEncoding)) {
204-
this.defaultCompressionAlgorithm = clientSelectedEncoding;
205-
this.sendCompression = getCompressionHandler(this.defaultCompressionAlgorithm);
204+
this.currentCompressionAlgorithm = clientSelectedEncoding;
205+
this.sendCompression = getCompressionHandler(this.currentCompressionAlgorithm);
206206
}
207207
} else {
208208
logging.log(LogVerbosity.ERROR, `Invalid value provided for grpc.default_compression_algorithm option: ${compressionAlgorithmKey}`);
@@ -215,10 +215,11 @@ export class CompressionFilter extends BaseFilter implements Filter {
215215
headers.set('grpc-accept-encoding', 'identity,deflate,gzip');
216216
headers.set('accept-encoding', 'identity');
217217

218-
if (this.defaultCompressionAlgorithm && ['deflate', 'gzip'].includes(this.defaultCompressionAlgorithm)) {
219-
headers.set('grpc-encoding', this.defaultCompressionAlgorithm);
220-
} else {
218+
// No need to send the header if it's "identity" - behavior is identical; save the bandwidth
219+
if (this.currentCompressionAlgorithm === 'identity') {
221220
headers.remove('grpc-encoding');
221+
} else {
222+
headers.set('grpc-encoding', this.currentCompressionAlgorithm);
222223
}
223224

224225
return headers;
@@ -255,10 +256,13 @@ export class CompressionFilter extends BaseFilter implements Filter {
255256
* and the output is a framed and possibly compressed message. For this
256257
* reason, this filter should be at the bottom of the filter stack */
257258
const resolvedMessage: WriteObject = await message;
258-
const compress =
259-
resolvedMessage.flags === undefined
260-
? !(this.sendCompression instanceof IdentityHandler)
261-
: (resolvedMessage.flags & WriteFlags.NoCompress) === 0;
259+
let compress: boolean;
260+
if (this.sendCompression instanceof IdentityHandler) {
261+
compress = false;
262+
} else {
263+
compress = ((resolvedMessage.flags ?? 0) & WriteFlags.NoCompress) === 0;
264+
}
265+
262266
return {
263267
message: await this.sendCompression.writeMessage(
264268
resolvedMessage.message,

packages/grpc-js/src/server-call.ts

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ export class ServerReadableStreamImpl<RequestType, ResponseType>
138138
private call: Http2ServerCallStream<RequestType, ResponseType>,
139139
public metadata: Metadata,
140140
public deserialize: Deserialize<RequestType>,
141-
encoding?: string
141+
encoding: string
142142
) {
143143
super({ objectMode: true });
144144
this.cancelled = false;
@@ -253,7 +253,7 @@ export class ServerDuplexStreamImpl<RequestType, ResponseType>
253253
public metadata: Metadata,
254254
public serialize: Serialize<ResponseType>,
255255
public deserialize: Deserialize<RequestType>,
256-
encoding?: string
256+
encoding: string
257257
) {
258258
super({ objectMode: true });
259259
this.cancelled = false;
@@ -442,7 +442,7 @@ export class Http2ServerCallStream<
442442
return this.cancelled;
443443
}
444444

445-
private getDecompressedMessage(message: Buffer, encoding?: string) {
445+
private getDecompressedMessage(message: Buffer, encoding: string) {
446446
switch (encoding) {
447447
case 'deflate': {
448448
return new Promise<Buffer | undefined>((resolve, reject) => {
@@ -477,9 +477,18 @@ export class Http2ServerCallStream<
477477
});
478478
});
479479
}
480-
481-
default:
480+
481+
case 'identity': {
482482
return Promise.resolve(message);
483+
}
484+
485+
default: {
486+
this.sendError({
487+
code: Status.UNIMPLEMENTED,
488+
details: `Received "grpc-encoding" header "${encoding}", which is not supported`,
489+
});
490+
return Promise.resolve();
491+
}
483492
}
484493
}
485494

@@ -533,7 +542,7 @@ export class Http2ServerCallStream<
533542
return metadata;
534543
}
535544

536-
receiveUnaryMessage(encoding?: string): Promise<RequestType> {
545+
receiveUnaryMessage(encoding: string): Promise<RequestType> {
537546
return new Promise((resolve, reject) => {
538547
const stream = this.stream;
539548
const chunks: Buffer[] = [];
@@ -561,7 +570,7 @@ export class Http2ServerCallStream<
561570
this.emit('receiveMessage');
562571

563572
const compressed = requestBytes.readUInt8(0) === 1;
564-
const compressedMessageEncoding = compressed ? encoding : undefined;
573+
const compressedMessageEncoding = compressed ? encoding : 'identity';
565574
const decompressedMessage = await this.getDecompressedMessage(requestBytes, compressedMessageEncoding);
566575

567576
// Encountered an error with decompression; it'll already have been propogated back
@@ -729,7 +738,7 @@ export class Http2ServerCallStream<
729738
readable:
730739
| ServerReadableStream<RequestType, ResponseType>
731740
| ServerDuplexStream<RequestType, ResponseType>,
732-
encoding?: string
741+
encoding: string
733742
) {
734743
const decoder = new StreamDecoder();
735744

@@ -750,7 +759,7 @@ export class Http2ServerCallStream<
750759
this.emit('receiveMessage');
751760

752761
const compressed = message.readUInt8(0) === 1;
753-
const compressedMessageEncoding = compressed ? encoding : undefined;
762+
const compressedMessageEncoding = compressed ? encoding : 'identity';
754763
const decompressedMessage = await this.getDecompressedMessage(message, compressedMessageEncoding);
755764

756765
// Encountered an error with decompression; it'll already have been propogated back

packages/grpc-js/src/server.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,7 @@ export class Server {
778778
});
779779
}
780780
const metadata = call.receiveMetadata(headers);
781-
const encoding = metadata.get('grpc-encoding')[0] as string | undefined;
781+
const encoding = (metadata.get('grpc-encoding')[0] as string | undefined) ?? 'identity';
782782
metadata.remove('grpc-encoding');
783783

784784
switch (handler.type) {
@@ -863,7 +863,7 @@ async function handleUnary<RequestType, ResponseType>(
863863
call: Http2ServerCallStream<RequestType, ResponseType>,
864864
handler: UnaryHandler<RequestType, ResponseType>,
865865
metadata: Metadata,
866-
encoding?: string
866+
encoding: string
867867
): Promise<void> {
868868
const request = await call.receiveUnaryMessage(encoding);
869869

@@ -894,7 +894,7 @@ function handleClientStreaming<RequestType, ResponseType>(
894894
call: Http2ServerCallStream<RequestType, ResponseType>,
895895
handler: ClientStreamingHandler<RequestType, ResponseType>,
896896
metadata: Metadata,
897-
encoding?: string
897+
encoding: string
898898
): void {
899899
const stream = new ServerReadableStreamImpl<RequestType, ResponseType>(
900900
call,
@@ -925,7 +925,7 @@ async function handleServerStreaming<RequestType, ResponseType>(
925925
call: Http2ServerCallStream<RequestType, ResponseType>,
926926
handler: ServerStreamingHandler<RequestType, ResponseType>,
927927
metadata: Metadata,
928-
encoding?: string
928+
encoding: string
929929
): Promise<void> {
930930
const request = await call.receiveUnaryMessage(encoding);
931931

@@ -947,7 +947,7 @@ function handleBidiStreaming<RequestType, ResponseType>(
947947
call: Http2ServerCallStream<RequestType, ResponseType>,
948948
handler: BidiStreamingHandler<RequestType, ResponseType>,
949949
metadata: Metadata,
950-
encoding?: string
950+
encoding: string
951951
): void {
952952
const stream = new ServerDuplexStreamImpl<RequestType, ResponseType>(
953953
call,

0 commit comments

Comments
 (0)