243 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			243 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* 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'))
 | |
|       })
 | |
|     })
 | |
|   })
 | |
| })
 |