Merge pull request #900 from murgatroid99/pure-js_0.4.1_fixes

Fix custom metadata handling bug
This commit is contained in:
Michael Lumish 2019-06-04 10:50:05 -07:00 committed by GitHub
commit 70d75a5ab4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 102 additions and 1 deletions

View File

@ -330,7 +330,7 @@ export class Http2Channel extends EventEmitter implements Channel {
metadata: Metadata
) {
const connectMetadata: Promise<Metadata> = this.connect().then(
() => metadata
() => metadata.clone()
);
const finalMetadata: Promise<Metadata> = stream.filterStack.sendMetadata(
connectMetadata

101
test/api/metadata_test.js Normal file
View File

@ -0,0 +1,101 @@
/*
* Copyright 2019 gRPC authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
const options = {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true
};
const path = require('path');
const fs = require('fs');
const assert = require('assert');
const _ = require('lodash');
const anyGrpc = require('../any_grpc');
const clientGrpc = anyGrpc.client;
const serverGrpc = anyGrpc.server;
const protoLoader = require('../../packages/proto-loader', options);
const testServiceDef = protoLoader.loadSync(__dirname + '/../proto/test_service.proto');
const TestService = serverGrpc.loadPackageDefinition(testServiceDef).TestService.service;
const TestServiceClient = clientGrpc.loadPackageDefinition(testServiceDef).TestService;
const keyPath = path.join(__dirname, '../data/server1.key');
const pemPath = path.join(__dirname, '../data/server1.pem');
const caPath = path.join(__dirname, '../data/ca.pem');
const keyData = fs.readFileSync(keyPath);
const pemData = fs.readFileSync(pemPath);
const caData = fs.readFileSync(caPath);
const clientCreds = clientGrpc.credentials.createSsl(caData);
const dummyCallCreds = clientGrpc.credentials.createFromMetadataGenerator((options, callback) => {
const metadata = new clientGrpc.Metadata();
metadata.add('authorization', 'test');
callback(null, metadata);
});
const combinedClientCreds = clientGrpc.credentials.combineChannelCredentials(clientCreds, dummyCallCreds);
const serverCreds = serverGrpc.ServerCredentials.createSsl(null, [{private_key: keyData, cert_chain: pemData}]);
const hostOverride = 'foo.test.google.fr';
const clientOptions = {
'grpc.ssl_target_name_override': hostOverride,
'grpc.default_authority': hostOverride
}
describe('Sending metadata', function() {
let server;
let port;
before(function() {
server = new serverGrpc.Server();
server.addService(TestService, {
unary: function(call, cb) {
cb(null, {});
},
clientStream: function(stream, cb){
stream.on('data', function(data) {});
stream.on('end', function() {
cb(null, {});
});
},
serverStream: function(stream) {
stream.end();
},
bidiStream: function(stream) {
stream.on('data', function(data) {});
stream.on('end', function() {
stream.end();
});
}
});
port = server.bind('localhost:0', serverCreds);
server.start();
client = new TestServiceClient(`localhost:${port}`, combinedClientCreds, clientOptions);
});
after(function() {
server.forceShutdown();
});
it('Should be able to send the same metadata on two calls with call creds', function(done) {
const metadata = new clientGrpc.Metadata();
client.unary({}, metadata, (err, data) => {
assert.ifError(err);
client.unary({}, metadata, (err, data) => {
assert.ifError(err);
done();
});
});
});
});