You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
242 lines
5.9 KiB
242 lines
5.9 KiB
/* 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')) |
|
}) |
|
}) |
|
}) |
|
})
|
|
|