diff --git a/lib/http-proxy/common.js b/lib/http-proxy/common.js index d682047c8..d4186f06f 100644 --- a/lib/http-proxy/common.js +++ b/lib/http-proxy/common.js @@ -47,12 +47,14 @@ common.setupOutgoing = function(outgoing, options, req, forward) { outgoing.localAddress = options.localAddress; // - // Remark: If we are false set the connection: close. This is the right thing to do + // Remark: If we are false and not upgrading, set the connection: close. This is the right thing to do // as node core doesn't handle this COMPLETELY properly yet. // if(!outgoing.agent) { outgoing.headers = outgoing.headers || {}; - outgoing.headers.connection = 'close'; + if(typeof outgoing.headers.connection !== 'string' || outgoing.headers.connection.toLowerCase() !== 'upgrade') { + outgoing.headers.connection = 'close'; + } } // diff --git a/test/lib-http-proxy-common-test.js b/test/lib-http-proxy-common-test.js index 8cb9391dc..dab2d26ac 100644 --- a/test/lib-http-proxy-common-test.js +++ b/test/lib-http-proxy-common-test.js @@ -38,6 +38,48 @@ describe('lib/http-proxy/common.js', function () { expect(outgoing.localAddress).to.eql('local.address'); }); + it('should not override agentless upgrade header', function () { + var outgoing = {}; + common.setupOutgoing(outgoing, + { + agent: undefined, + target: { + host : 'hey', + hostname : 'how', + socketPath: 'are', + port : 'you', + }, + headers: {'connection': 'upgrade'}, + }, + { + method : 'i', + url : 'am', + headers : {'pro':'xy','overwritten':false} + }); + expect(outgoing.headers.connection).to.eql('upgrade'); + }); + + it('should override agentless non-upgrade header to close', function () { + var outgoing = {}; + common.setupOutgoing(outgoing, + { + agent: undefined, + target: { + host : 'hey', + hostname : 'how', + socketPath: 'are', + port : 'you', + }, + headers: {'connection': 'xyz'}, + }, + { + method : 'i', + url : 'am', + headers : {'pro':'xy','overwritten':false} + }); + expect(outgoing.headers.connection).to.eql('close'); + }); + it('should set the agent to false if none is given', function () { var outgoing = {}; common.setupOutgoing(outgoing, {target: