UNPKG

rail

Version:

An enhanced HTTP/RESTful API Client

210 lines (172 loc) 4.95 kB
'use strict'; /* global suite: false, setup: false, test: false, teardown: false, suiteSetup: false, suiteTeardown: false */ var assert = require('assert'); var common = require('./common'); var http = require('http'); var RAIL = require('../'); suite('http:redirect', function() { var rail, server; var onrequest; var listener = function(request, response) { if (typeof onrequest === 'function') { onrequest(request, response); } }; suiteSetup(function(done) { rail = new RAIL({ proto: 'http', request: { port: common.port, host: '127.0.0.1' } }); rail.use('redirect', { allowUpgrade: false }); rail.use('buffer', {default: true}); server = http.createServer(listener); server.listen(common.port, '127.0.0.1', done); }); test('configure', function() { var options = { redirect: {} }; rail.plugins.redirect._configure(options); assert.deepEqual(options, {redirect: {limit: 1, sameHost: false, allowDowngrade: false, allowUpgrade: false}}); options = { redirect: false }; rail.plugins.redirect._configure(options); assert.deepEqual(options, {redirect: {limit: 0}}); }); test('relative', function(done) { var c = 0; var r = [ {path: '/home/test', status: 302, location: '../other'}, {path: '/home/other', status: 200} ]; onrequest = function(request, response) { assert.strictEqual(request.url, r[c].path); if (r[c].location) { response.writeHead(r[c].status, { Location: r[c].location }); response.end(); } else { response.writeHead(r[c].status); response.end('works!'); } ++c; }; rail.call({ path: r[c].path }, function(response) { assert.strictEqual(response.statusCode, 200); assert(response.buffer); assert.strictEqual(response.buffer.length, 6); assert.strictEqual(response.buffer.toString(), 'works!'); done(); }).end(); }); test('absolute', function(done) { var c = 0; var r = [ {path: '/', status: 302, location: 'http://localhost:' + common.port + '/home/test'}, {path: '/home/test', status: 200} ]; onrequest = function(request, response) { assert.strictEqual(request.url, r[c].path); if (r[c].location) { response.writeHead(r[c].status, { Location: r[c].location }); response.end(); } else { response.writeHead(r[c].status); response.end('works!'); } ++c; }; rail.call({ path: '/' }, function(response) { assert.strictEqual(response.statusCode, 200); assert(response.buffer); assert.strictEqual(response.buffer.length, 6); assert.strictEqual(response.buffer.toString(), 'works!'); done(); }).on('redirect', function(options, response) { assert.strictEqual(response.statusCode, 302); }).end(); }); test('limit=0', function(done) { onrequest = function(request, response) { assert.strictEqual(request.url, '/'); response.writeHead(302, { Location: '/home' }); response.end(); }; rail.call({ path: '/', redirect: { limit: 0 } }, function(response) { assert.strictEqual(response.statusCode, 302); assert.strictEqual(response.buffer, null); done(); }).end(); }); test('sameHost', function(done) { var warn; onrequest = function(request, response) { assert.strictEqual(request.url, '/'); response.writeHead(302, { Location: 'http://localhost:' + common.port + '/home' }); response.end(); }; rail.call({ path: '/', redirect: { sameHost: true } }, function(response) { assert.strictEqual(response.statusCode, 302); assert.strictEqual(response.buffer, null); assert.deepEqual(['redirect', 'blocked', 'different host'], warn); done(); }).on('warn', function(plugin, status, message) { warn = [plugin, status, message]; }).end(); }); test('allowUpgrade=false', function(done) { var warn; onrequest = function(request, response) { assert.strictEqual(request.url, '/'); response.writeHead(302, { Location: 'https://localhost:' + common.port + '/home' }); response.end(); }; rail.call({ path: '/', redirect: { allowUpgrade: false } }, function(response) { assert.strictEqual(response.statusCode, 302); assert.strictEqual(response.buffer, null); assert.deepEqual(['redirect', 'blocked', 'protocol upgrade'], warn); done(); }).on('warn', function(plugin, status, message) { warn = [plugin, status, message]; }).end(); }); suiteTeardown(function(done) { server.close(done); }); });