mirror of https://github.com/lukechilds/node.git
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.
216 lines
5.6 KiB
216 lines
5.6 KiB
var server = require('./server')
|
|
, events = require('events')
|
|
, stream = require('stream')
|
|
, assert = require('assert')
|
|
, fs = require('fs')
|
|
, request = require('../index')
|
|
, path = require('path')
|
|
, util = require('util')
|
|
;
|
|
|
|
var s = server.createServer(3453);
|
|
|
|
function ValidationStream(str) {
|
|
this.str = str
|
|
this.buf = ''
|
|
this.on('data', function (data) {
|
|
this.buf += data
|
|
})
|
|
this.on('end', function () {
|
|
assert.equal(this.str, this.buf)
|
|
})
|
|
this.writable = true
|
|
}
|
|
util.inherits(ValidationStream, stream.Stream)
|
|
ValidationStream.prototype.write = function (chunk) {
|
|
this.emit('data', chunk)
|
|
}
|
|
ValidationStream.prototype.end = function (chunk) {
|
|
if (chunk) emit('data', chunk)
|
|
this.emit('end')
|
|
}
|
|
|
|
s.listen(s.port, function () {
|
|
counter = 0;
|
|
|
|
var check = function () {
|
|
counter = counter - 1
|
|
if (counter === 0) {
|
|
console.log('All tests passed.')
|
|
setTimeout(function () {
|
|
process.exit();
|
|
}, 500)
|
|
}
|
|
}
|
|
|
|
// Test pipeing to a request object
|
|
s.once('/push', server.createPostValidator("mydata"));
|
|
|
|
var mydata = new stream.Stream();
|
|
mydata.readable = true
|
|
|
|
counter++
|
|
var r1 = request.put({url:'http://localhost:3453/push'}, function () {
|
|
check();
|
|
})
|
|
mydata.pipe(r1)
|
|
|
|
mydata.emit('data', 'mydata');
|
|
mydata.emit('end');
|
|
|
|
// Test pipeing to a request object with a json body
|
|
s.once('/push-json', server.createPostValidator("{\"foo\":\"bar\"}", "application/json"));
|
|
|
|
var mybodydata = new stream.Stream();
|
|
mybodydata.readable = true
|
|
|
|
counter++
|
|
var r2 = request.put({url:'http://localhost:3453/push-json',json:true}, function () {
|
|
check();
|
|
})
|
|
mybodydata.pipe(r2)
|
|
|
|
mybodydata.emit('data', JSON.stringify({foo:"bar"}));
|
|
mybodydata.emit('end');
|
|
|
|
// Test pipeing from a request object.
|
|
s.once('/pull', server.createGetResponse("mypulldata"));
|
|
|
|
var mypulldata = new stream.Stream();
|
|
mypulldata.writable = true
|
|
|
|
counter++
|
|
request({url:'http://localhost:3453/pull'}).pipe(mypulldata)
|
|
|
|
var d = '';
|
|
|
|
mypulldata.write = function (chunk) {
|
|
d += chunk;
|
|
}
|
|
mypulldata.end = function () {
|
|
assert.equal(d, 'mypulldata');
|
|
check();
|
|
};
|
|
|
|
|
|
s.on('/cat', function (req, resp) {
|
|
if (req.method === "GET") {
|
|
resp.writeHead(200, {'content-type':'text/plain-test', 'content-length':4});
|
|
resp.end('asdf')
|
|
} else if (req.method === "PUT") {
|
|
assert.equal(req.headers['content-type'], 'text/plain-test');
|
|
assert.equal(req.headers['content-length'], 4)
|
|
var validate = '';
|
|
|
|
req.on('data', function (chunk) {validate += chunk})
|
|
req.on('end', function () {
|
|
resp.writeHead(201);
|
|
resp.end();
|
|
assert.equal(validate, 'asdf');
|
|
check();
|
|
})
|
|
}
|
|
})
|
|
s.on('/pushjs', function (req, resp) {
|
|
if (req.method === "PUT") {
|
|
assert.equal(req.headers['content-type'], 'application/javascript');
|
|
check();
|
|
}
|
|
})
|
|
s.on('/catresp', function (req, resp) {
|
|
request.get('http://localhost:3453/cat').pipe(resp)
|
|
})
|
|
s.on('/doodle', function (req, resp) {
|
|
if (req.headers['x-oneline-proxy']) {
|
|
resp.setHeader('x-oneline-proxy', 'yup')
|
|
}
|
|
resp.writeHead('200', {'content-type':'image/jpeg'})
|
|
fs.createReadStream(path.join(__dirname, 'googledoodle.jpg')).pipe(resp)
|
|
})
|
|
s.on('/onelineproxy', function (req, resp) {
|
|
var x = request('http://localhost:3453/doodle')
|
|
req.pipe(x)
|
|
x.pipe(resp)
|
|
})
|
|
|
|
counter++
|
|
fs.createReadStream(__filename).pipe(request.put('http://localhost:3453/pushjs'))
|
|
|
|
counter++
|
|
request.get('http://localhost:3453/cat').pipe(request.put('http://localhost:3453/cat'))
|
|
|
|
counter++
|
|
request.get('http://localhost:3453/catresp', function (e, resp, body) {
|
|
assert.equal(resp.headers['content-type'], 'text/plain-test');
|
|
assert.equal(resp.headers['content-length'], 4)
|
|
check();
|
|
})
|
|
|
|
var doodleWrite = fs.createWriteStream(path.join(__dirname, 'test.jpg'))
|
|
|
|
counter++
|
|
request.get('http://localhost:3453/doodle').pipe(doodleWrite)
|
|
|
|
doodleWrite.on('close', function () {
|
|
assert.deepEqual(fs.readFileSync(path.join(__dirname, 'googledoodle.jpg')), fs.readFileSync(path.join(__dirname, 'test.jpg')))
|
|
check()
|
|
})
|
|
|
|
process.on('exit', function () {
|
|
fs.unlinkSync(path.join(__dirname, 'test.jpg'))
|
|
})
|
|
|
|
counter++
|
|
request.get({uri:'http://localhost:3453/onelineproxy', headers:{'x-oneline-proxy':'nope'}}, function (err, resp, body) {
|
|
assert.equal(resp.headers['x-oneline-proxy'], 'yup')
|
|
check()
|
|
})
|
|
|
|
s.on('/afterresponse', function (req, resp) {
|
|
resp.write('d')
|
|
resp.end()
|
|
})
|
|
|
|
counter++
|
|
var afterresp = request.post('http://localhost:3453/afterresponse').on('response', function () {
|
|
var v = new ValidationStream('d')
|
|
afterresp.pipe(v)
|
|
v.on('end', check)
|
|
})
|
|
|
|
s.on('/forward1', function (req, resp) {
|
|
resp.writeHead(302, {location:'/forward2'})
|
|
resp.end()
|
|
})
|
|
s.on('/forward2', function (req, resp) {
|
|
resp.writeHead('200', {'content-type':'image/png'})
|
|
resp.write('d')
|
|
resp.end()
|
|
})
|
|
|
|
counter++
|
|
var validateForward = new ValidationStream('d')
|
|
validateForward.on('end', check)
|
|
request.get('http://localhost:3453/forward1').pipe(validateForward)
|
|
|
|
// Test pipe options
|
|
s.once('/opts', server.createGetResponse('opts response'));
|
|
|
|
var optsStream = new stream.Stream();
|
|
optsStream.writable = true
|
|
|
|
var optsData = '';
|
|
optsStream.write = function (buf) {
|
|
optsData += buf;
|
|
if (optsData === 'opts response') {
|
|
setTimeout(check, 10);
|
|
}
|
|
}
|
|
|
|
optsStream.end = function () {
|
|
assert.fail('end called')
|
|
};
|
|
|
|
counter++
|
|
request({url:'http://localhost:3453/opts'}).pipe(optsStream, { end : false })
|
|
})
|
|
|