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.
226 lines
4.9 KiB
226 lines
4.9 KiB
var assert = require('assert'); |
|
var net = require('net'); |
|
var http = require('http'); |
|
var streamPair = require('stream-pair'); |
|
var thing = require('handle-thing'); |
|
|
|
var httpDeceiver = require('../'); |
|
|
|
describe('HTTP Deceiver', function() { |
|
var handle; |
|
var pair; |
|
var socket; |
|
var deceiver; |
|
|
|
beforeEach(function() { |
|
pair = streamPair.create(); |
|
handle = thing.create(pair.other); |
|
socket = new net.Socket({ handle: handle }); |
|
|
|
// For v0.8 |
|
socket.readable = true; |
|
socket.writable = true; |
|
|
|
deceiver = httpDeceiver.create(socket); |
|
}); |
|
|
|
it('should emit request', function(done) { |
|
var server = http.createServer(); |
|
server.emit('connection', socket); |
|
|
|
server.on('request', function(req, res) { |
|
assert.equal(req.method, 'PUT'); |
|
assert.equal(req.url, '/hello'); |
|
assert.deepEqual(req.headers, { a: 'b' }); |
|
|
|
done(); |
|
}); |
|
|
|
deceiver.emitRequest({ |
|
method: 'PUT', |
|
path: '/hello', |
|
headers: { |
|
a: 'b' |
|
} |
|
}); |
|
}); |
|
|
|
it('should emit response', function(done) { |
|
var agent = new http.Agent(); |
|
agent.createConnection = function createConnection() { |
|
return socket; |
|
}; |
|
var client = http.request({ |
|
method: 'POST', |
|
path: '/ok', |
|
agent: agent |
|
}, function(res) { |
|
assert.equal(res.statusCode, 421); |
|
assert.deepEqual(res.headers, { a: 'b' }); |
|
|
|
done(); |
|
}); |
|
|
|
process.nextTick(function() { |
|
deceiver.emitResponse({ |
|
status: 421, |
|
reason: 'F', |
|
headers: { |
|
a: 'b' |
|
} |
|
}); |
|
}); |
|
}); |
|
|
|
it('should override .execute and .finish', function(done) { |
|
var server = http.createServer(); |
|
server.emit('connection', socket); |
|
|
|
server.on('request', function(req, res) { |
|
assert.equal(req.method, 'PUT'); |
|
assert.equal(req.url, '/hello'); |
|
assert.deepEqual(req.headers, { a: 'b' }); |
|
|
|
var actual = ''; |
|
req.on('data', function(chunk) { |
|
actual += chunk; |
|
}); |
|
req.once('end', function() { |
|
assert.equal(actual, 'hello world'); |
|
done(); |
|
}); |
|
}); |
|
|
|
deceiver.emitRequest({ |
|
method: 'PUT', |
|
path: '/hello', |
|
headers: { |
|
a: 'b' |
|
} |
|
}); |
|
|
|
pair.write('hello'); |
|
pair.end(' world'); |
|
}); |
|
|
|
it('should work with reusing parser', function(done) { |
|
var server = http.createServer(); |
|
server.emit('connection', socket); |
|
|
|
function secondRequest() { |
|
pair = streamPair.create(); |
|
handle = thing.create(pair.other); |
|
socket = new net.Socket({ handle: handle }); |
|
|
|
// For v0.8 |
|
socket.readable = true; |
|
socket.writable = true; |
|
|
|
server.emit('connection', socket); |
|
|
|
pair.end('PUT /second HTTP/1.1\r\nContent-Length:11\r\n\r\nhello world'); |
|
} |
|
|
|
server.on('request', function(req, res) { |
|
var actual = ''; |
|
req.on('data', function(chunk) { |
|
actual += chunk; |
|
}); |
|
req.once('end', function() { |
|
assert.equal(actual, 'hello world'); |
|
|
|
if (req.url === '/first') |
|
secondRequest(); |
|
else |
|
done(); |
|
}); |
|
}); |
|
|
|
deceiver.emitRequest({ |
|
method: 'PUT', |
|
path: '/first', |
|
headers: { |
|
a: 'b' |
|
} |
|
}); |
|
|
|
pair.write('hello'); |
|
pair.end(' world'); |
|
}); |
|
|
|
it('should emit CONNECT request', function(done) { |
|
var server = http.createServer(); |
|
server.emit('connection', socket); |
|
|
|
server.on('connect', function(req, socket, bodyHead) { |
|
assert.equal(req.method, 'CONNECT'); |
|
assert.equal(req.url, '/hello'); |
|
|
|
done(); |
|
}); |
|
|
|
deceiver.emitRequest({ |
|
method: 'CONNECT', |
|
path: '/hello', |
|
headers: { |
|
} |
|
}); |
|
}); |
|
|
|
it('should emit Upgrade request', function(done) { |
|
var server = http.createServer(); |
|
server.emit('connection', socket); |
|
|
|
server.on('upgrade', function(req, socket, bodyHead) { |
|
assert.equal(req.method, 'POST'); |
|
assert.equal(req.url, '/hello'); |
|
|
|
socket.on('data', function(chunk) { |
|
assert.equal(chunk + '', 'hm'); |
|
done(); |
|
}); |
|
}); |
|
|
|
deceiver.emitRequest({ |
|
method: 'POST', |
|
path: '/hello', |
|
headers: { |
|
'upgrade': 'websocket' |
|
} |
|
}); |
|
|
|
pair.write('hm'); |
|
}); |
|
|
|
it('should emit Upgrade response', function(done) { |
|
var agent = new http.Agent(); |
|
agent.createConnection = function createConnection() { |
|
return socket; |
|
}; |
|
var client = http.request({ |
|
method: 'POST', |
|
path: '/ok', |
|
headers: { |
|
connection: 'upgrade', |
|
upgrade: 'websocket' |
|
}, |
|
agent: agent |
|
}, function(res) { |
|
assert(false); |
|
}); |
|
client.on('upgrade', function(res, socket) { |
|
assert.equal(res.statusCode, 421); |
|
done(); |
|
}); |
|
|
|
process.nextTick(function() { |
|
deceiver.emitResponse({ |
|
status: 421, |
|
reason: 'F', |
|
headers: { |
|
upgrade: 'websocket' |
|
} |
|
}); |
|
}); |
|
}); |
|
});
|
|
|