grpc-js: Make some headers conform to what the other library does

This commit is contained in:
Michael Lumish 2020-04-07 13:49:54 -07:00
parent 44e927edc3
commit ae18f3ce92
5 changed files with 26 additions and 6 deletions

View File

@ -1,6 +1,6 @@
{
"name": "@grpc/grpc-js",
"version": "0.7.6",
"version": "0.7.7",
"description": "gRPC Library for Node - pure JS implementation",
"homepage": "https://grpc.io/",
"repository": "https://github.com/grpc/grpc-node/tree/master/packages/grpc-js",

View File

@ -353,7 +353,11 @@ export class Http2CallStream implements Call {
}
private handleTrailers(headers: http2.IncomingHttpHeaders) {
this.trace('received HTTP/2 trailing headers frame');
let headersString = '';
for (const header of Object.keys(headers)) {
headersString += '\t\t' + header + ': ' + headers[header] + '\n'
}
this.trace('Received server trailers:\n' + headersString);
let metadata: Metadata;
try {
metadata = Metadata.fromHttp2Headers(headers);
@ -366,6 +370,7 @@ export class Http2CallStream implements Call {
const receivedStatus = Number(metadataMap['grpc-status']);
if (receivedStatus in Status) {
code = receivedStatus;
this.trace('received status code ' + receivedStatus + ' from server');
}
metadata.remove('grpc-status');
}
@ -373,6 +378,7 @@ export class Http2CallStream implements Call {
if (typeof metadataMap['grpc-message'] === 'string') {
details = decodeURI(metadataMap['grpc-message']);
metadata.remove('grpc-message');
this.trace('received status details string "' + details + '" from server');
}
const status: StatusObject = { code, details, metadata };
let finalStatus;
@ -407,7 +413,11 @@ export class Http2CallStream implements Call {
subchannel.addDisconnectListener(this.disconnectListener);
subchannel.callRef();
stream.on('response', (headers, flags) => {
this.trace('received HTTP/2 headers frame');
let headersString = '';
for (const header of Object.keys(headers)) {
headersString += '\t\t' + header + ': ' + headers[header] + '\n'
}
this.trace('Received server headers:\n' + headersString);
switch (headers[':status']) {
// TODO(murgatroid99): handle 100 and 101
case 400:
@ -568,6 +578,7 @@ export class Http2CallStream implements Call {
}
cancelWithStatus(status: Status, details: string): void {
this.trace('cancelWithStatus code: ' + status + ' details: "' + details + '"');
this.destroyHttp2Stream();
this.endCall({ code: status, details, metadata: new Metadata() });
}

View File

@ -169,8 +169,8 @@ export class CompressionFilter extends BaseFilter implements Filter {
private receiveCompression: CompressionHandler = new IdentityHandler();
async sendMetadata(metadata: Promise<Metadata>): Promise<Metadata> {
const headers: Metadata = await metadata;
headers.set('grpc-encoding', 'identity');
headers.set('grpc-accept-encoding', 'identity,deflate,gzip');
headers.set('accept-encoding', 'identity,gzip');
return headers;
}

View File

@ -298,10 +298,16 @@ class DnsResolver implements Resolver {
IPV6_REGEX.exec(target) ||
IPV6_BRACKET_REGEX.exec(target);
if (ipMatch) {
if (ipMatch[2]) {
return ipMatch[1] + ':' + ipMatch[2];
}
return ipMatch[1];
}
const dnsMatch = DNS_REGEX.exec(target);
if (dnsMatch) {
if (dnsMatch[2]) {
return dnsMatch[1] + ':' + dnsMatch[2];
}
return dnsMatch[1];
}
throw new Error(`Failed to parse target ${target}`);

View File

@ -298,8 +298,6 @@ export class Subchannel {
return checkServerIdentity(sslTargetNameOverride, cert);
};
connectionOptions.servername = sslTargetNameOverride;
} else {
connectionOptions.servername = getDefaultAuthority(this.channelTarget);
}
if (socket) {
connectionOptions.socket = socket;
@ -589,6 +587,11 @@ export class Subchannel {
headers[HTTP2_HEADER_PATH] = callStream.getMethod();
headers[HTTP2_HEADER_TE] = 'trailers';
const http2Stream = this.session!.request(headers);
let headersString = '';
for (const header of Object.keys(headers)) {
headersString += '\t\t' + header + ': ' + headers[header] + '\n'
}
trace('Starting stream with headers\n' + headersString);
callStream.attachHttp2Stream(http2Stream, this);
}