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", "name": "@grpc/grpc-js",
"version": "0.7.6", "version": "0.7.7",
"description": "gRPC Library for Node - pure JS implementation", "description": "gRPC Library for Node - pure JS implementation",
"homepage": "https://grpc.io/", "homepage": "https://grpc.io/",
"repository": "https://github.com/grpc/grpc-node/tree/master/packages/grpc-js", "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) { 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; let metadata: Metadata;
try { try {
metadata = Metadata.fromHttp2Headers(headers); metadata = Metadata.fromHttp2Headers(headers);
@ -366,6 +370,7 @@ export class Http2CallStream implements Call {
const receivedStatus = Number(metadataMap['grpc-status']); const receivedStatus = Number(metadataMap['grpc-status']);
if (receivedStatus in Status) { if (receivedStatus in Status) {
code = receivedStatus; code = receivedStatus;
this.trace('received status code ' + receivedStatus + ' from server');
} }
metadata.remove('grpc-status'); metadata.remove('grpc-status');
} }
@ -373,6 +378,7 @@ export class Http2CallStream implements Call {
if (typeof metadataMap['grpc-message'] === 'string') { if (typeof metadataMap['grpc-message'] === 'string') {
details = decodeURI(metadataMap['grpc-message']); details = decodeURI(metadataMap['grpc-message']);
metadata.remove('grpc-message'); metadata.remove('grpc-message');
this.trace('received status details string "' + details + '" from server');
} }
const status: StatusObject = { code, details, metadata }; const status: StatusObject = { code, details, metadata };
let finalStatus; let finalStatus;
@ -407,7 +413,11 @@ export class Http2CallStream implements Call {
subchannel.addDisconnectListener(this.disconnectListener); subchannel.addDisconnectListener(this.disconnectListener);
subchannel.callRef(); subchannel.callRef();
stream.on('response', (headers, flags) => { 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']) { switch (headers[':status']) {
// TODO(murgatroid99): handle 100 and 101 // TODO(murgatroid99): handle 100 and 101
case 400: case 400:
@ -568,6 +578,7 @@ export class Http2CallStream implements Call {
} }
cancelWithStatus(status: Status, details: string): void { cancelWithStatus(status: Status, details: string): void {
this.trace('cancelWithStatus code: ' + status + ' details: "' + details + '"');
this.destroyHttp2Stream(); this.destroyHttp2Stream();
this.endCall({ code: status, details, metadata: new Metadata() }); 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(); private receiveCompression: CompressionHandler = new IdentityHandler();
async sendMetadata(metadata: Promise<Metadata>): Promise<Metadata> { async sendMetadata(metadata: Promise<Metadata>): Promise<Metadata> {
const headers: Metadata = await metadata; const headers: Metadata = await metadata;
headers.set('grpc-encoding', 'identity');
headers.set('grpc-accept-encoding', 'identity,deflate,gzip'); headers.set('grpc-accept-encoding', 'identity,deflate,gzip');
headers.set('accept-encoding', 'identity,gzip');
return headers; return headers;
} }

View File

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

View File

@ -298,8 +298,6 @@ export class Subchannel {
return checkServerIdentity(sslTargetNameOverride, cert); return checkServerIdentity(sslTargetNameOverride, cert);
}; };
connectionOptions.servername = sslTargetNameOverride; connectionOptions.servername = sslTargetNameOverride;
} else {
connectionOptions.servername = getDefaultAuthority(this.channelTarget);
} }
if (socket) { if (socket) {
connectionOptions.socket = socket; connectionOptions.socket = socket;
@ -589,6 +587,11 @@ export class Subchannel {
headers[HTTP2_HEADER_PATH] = callStream.getMethod(); headers[HTTP2_HEADER_PATH] = callStream.getMethod();
headers[HTTP2_HEADER_TE] = 'trailers'; headers[HTTP2_HEADER_TE] = 'trailers';
const http2Stream = this.session!.request(headers); 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); callStream.attachHttp2Stream(http2Stream, this);
} }