| /* eslint-env mocha */ | 
|   | 
| var assert = require('assert') | 
| var https = require('https') | 
| var http = require('http') | 
| var util = require('util') | 
|   | 
| var fixtures = require('./fixtures') | 
| var spdy = require('../') | 
|   | 
| // Node.js 0.10 and 0.12 support | 
| Object.assign = process.versions.modules >= 46 | 
|   ? Object.assign // eslint-disable-next-line | 
|   : util._extend | 
|   | 
| describe('SPDY Client', function () { | 
|   describe('regular', function () { | 
|     fixtures.everyConfig(function (protocol, alpn, version, plain) { | 
|       var server | 
|       var agent | 
|       var hmodule | 
|   | 
|       beforeEach(function (done) { | 
|         hmodule = plain ? http : https | 
|   | 
|         var options = Object.assign({ | 
|           spdy: { | 
|             plain: plain | 
|           } | 
|         }, fixtures.keys) | 
|         server = spdy.createServer(options, function (req, res) { | 
|           var body = '' | 
|           req.on('data', function (chunk) { | 
|             body += chunk | 
|           }) | 
|           req.on('end', function () { | 
|             res.writeHead(200, req.headers) | 
|             res.addTrailers({ trai: 'ler' }) | 
|   | 
|             var push = res.push('/push', { | 
|               request: { | 
|                 push: 'yes' | 
|               } | 
|             }, function (err) { | 
|               assert(!err) | 
|   | 
|               push.end('push') | 
|               push.on('error', function () { | 
|               }) | 
|   | 
|               res.end(body || 'okay') | 
|             }) | 
|           }) | 
|         }) | 
|   | 
|         server.listen(fixtures.port, function () { | 
|           agent = spdy.createAgent({ | 
|             rejectUnauthorized: false, | 
|             port: fixtures.port, | 
|             spdy: { | 
|               plain: plain, | 
|               protocol: plain ? alpn : null, | 
|               protocols: [alpn] | 
|             } | 
|           }) | 
|   | 
|           done() | 
|         }) | 
|       }) | 
|   | 
|       afterEach(function (done) { | 
|         var waiting = 2 | 
|         agent.close(next) | 
|         server.close(next) | 
|   | 
|         function next () { | 
|           if (--waiting === 0) { | 
|             done() | 
|           } | 
|         } | 
|       }) | 
|   | 
|       it('should send GET request', function (done) { | 
|         var req = hmodule.request({ | 
|           agent: agent, | 
|   | 
|           method: 'GET', | 
|           path: '/get', | 
|           headers: { | 
|             a: 'b' | 
|           } | 
|         }, function (res) { | 
|           assert.strictEqual(res.statusCode, 200) | 
|           assert.strictEqual(res.headers.a, 'b') | 
|   | 
|           fixtures.expectData(res, 'okay', done) | 
|         }) | 
|         req.end() | 
|       }) | 
|   | 
|       it('should send POST request', function (done) { | 
|         var req = hmodule.request({ | 
|           agent: agent, | 
|   | 
|           method: 'POST', | 
|           path: '/post', | 
|   | 
|           headers: { | 
|             post: 'headers' | 
|           } | 
|         }, function (res) { | 
|           assert.strictEqual(res.statusCode, 200) | 
|           assert.strictEqual(res.headers.post, 'headers') | 
|   | 
|           fixtures.expectData(res, 'post body', done) | 
|         }) | 
|   | 
|         agent._spdyState.socket.once(plain ? 'connect' : 'secureConnect', | 
|           function () { | 
|             req.end('post body') | 
|           }) | 
|       }) | 
|   | 
|       it('should receive PUSH_PROMISE', function (done) { | 
|         var req = hmodule.request({ | 
|           agent: agent, | 
|   | 
|           method: 'GET', | 
|           path: '/get' | 
|         }, function (res) { | 
|           assert.strictEqual(res.statusCode, 200) | 
|   | 
|           res.resume() | 
|         }) | 
|         req.on('push', function (push) { | 
|           assert.strictEqual(push.path, '/push') | 
|           assert.strictEqual(push.headers.push, 'yes') | 
|   | 
|           push.resume() | 
|           push.once('end', done) | 
|         }) | 
|         req.end() | 
|       }) | 
|   | 
|       it('should receive trailing headers', function (done) { | 
|         var req = hmodule.request({ | 
|           agent: agent, | 
|   | 
|           method: 'GET', | 
|           path: '/get' | 
|         }, function (res) { | 
|           assert.strictEqual(res.statusCode, 200) | 
|   | 
|           res.on('trailers', function (headers) { | 
|             assert.strictEqual(headers.trai, 'ler') | 
|             fixtures.expectData(res, 'okay', done) | 
|           }) | 
|         }) | 
|         req.end() | 
|       }) | 
|     }) | 
|   }) | 
|   | 
|   describe('x-forwarded-for', function () { | 
|     fixtures.everyConfig(function (protocol, alpn, version, plain) { | 
|       var server | 
|       var agent | 
|       var hmodule | 
|       // The underlying spdy Connection created by the agent. | 
|       var connection | 
|   | 
|       beforeEach(function (done) { | 
|         hmodule = plain ? http : https | 
|   | 
|         var options = Object.assign({ | 
|           spdy: { | 
|             plain: plain, | 
|             'x-forwarded-for': true | 
|           } | 
|         }, fixtures.keys) | 
|         server = spdy.createServer(options, function (req, res) { | 
|           res.writeHead(200, req.headers) | 
|           res.end() | 
|         }) | 
|   | 
|         server.listen(fixtures.port, function () { | 
|           agent = spdy.createAgent({ | 
|             rejectUnauthorized: false, | 
|             port: fixtures.port, | 
|             spdy: { | 
|               'x-forwarded-for': '1.2.3.4', | 
|               plain: plain, | 
|               protocol: plain ? alpn : null, | 
|               protocols: [alpn] | 
|             } | 
|           }) | 
|           // Once aagent has connection, keep a copy for testing. | 
|           agent.once('_connect', function () { | 
|             connection = agent._spdyState.connection | 
|             done() | 
|           }) | 
|         }) | 
|       }) | 
|   | 
|       afterEach(function (done) { | 
|         var waiting = 2 | 
|         agent.close(next) | 
|         server.close(next) | 
|   | 
|         function next () { | 
|           if (--waiting === 0) { | 
|             done() | 
|           } | 
|         } | 
|       }) | 
|   | 
|       it('should send x-forwarded-for', function (done) { | 
|         var req = hmodule.request({ | 
|           agent: agent, | 
|   | 
|           method: 'GET', | 
|           path: '/get' | 
|         }, function (res) { | 
|           assert.strictEqual(res.statusCode, 200) | 
|           assert.strictEqual(res.headers['x-forwarded-for'], '1.2.3.4') | 
|   | 
|           res.resume() | 
|           res.once('end', done) | 
|         }) | 
|         req.end() | 
|       }) | 
|   | 
|       it('agent should emit connection level errors', function (done) { | 
|         agent.once('error', function (err) { | 
|           assert.strictEqual(err.message, 'mock error') | 
|           done() | 
|         }) | 
|         connection.emit('error', new Error('mock error')) | 
|       }) | 
|     }) | 
|   }) | 
| }) |