123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- try {
- require('tough-cookie')
- } catch (e) {
- console.error('tough-cookie must be installed to run this test.')
- console.error('skipping this test. please install tough-cookie and run again if you need to test this feature.')
- process.exit(0)
- }
- var server = require('./server')
- , assert = require('assert')
- , request = require('../index')
- ;
- var s = server.createServer()
- s.listen(s.port, function () {
- var server = 'http://localhost:' + s.port;
- var hits = {}
- var passed = 0;
- bouncer(301, 'temp')
- bouncer(302, 'perm')
- bouncer(302, 'nope')
- bouncer(307, 'fwd')
- function bouncer(code, label) {
- var landing = label+'_landing';
- s.on('/'+label, function (req, res) {
- hits[label] = true;
- res.writeHead(code, {
- 'location':server + '/'+landing,
- 'set-cookie': 'ham=eggs'
- })
- res.end()
- })
- s.on('/'+landing, function (req, res) {
- // Make sure the cookie doesn't get included twice, see #139:
- // Make sure cookies are set properly after redirect
- assert.equal(req.headers.cookie, 'foo=bar; quux=baz; ham=eggs');
- hits[landing] = true;
- res.writeHead(200)
- res.end(req.method.toUpperCase() + ' ' + landing)
- })
- }
- // Permanent bounce
- var jar = request.jar()
- jar.setCookie('quux=baz', server);
- request({uri: server+'/perm', jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) {
- if (er) throw er
- if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode)
- assert.ok(hits.perm, 'Original request is to /perm')
- assert.ok(hits.perm_landing, 'Forward to permanent landing URL')
- assert.equal(body, 'GET perm_landing', 'Got permanent landing content')
- passed += 1
- done()
- })
-
- // Temporary bounce
- request({uri: server+'/temp', jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) {
- if (er) throw er
- if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode)
- assert.ok(hits.temp, 'Original request is to /temp')
- assert.ok(hits.temp_landing, 'Forward to temporary landing URL')
- assert.equal(body, 'GET temp_landing', 'Got temporary landing content')
- passed += 1
- done()
- })
-
- // Prevent bouncing.
- request({uri:server+'/nope', jar: jar, headers: {cookie: 'foo=bar'}, followRedirect:false}, function (er, res, body) {
- if (er) throw er
- if (res.statusCode !== 302) throw new Error('Status is not 302: '+res.statusCode)
- assert.ok(hits.nope, 'Original request to /nope')
- assert.ok(!hits.nope_landing, 'No chasing the redirect')
- assert.equal(res.statusCode, 302, 'Response is the bounce itself')
- passed += 1
- done()
- })
-
- // Should not follow post redirects by default
- request.post(server+'/temp', { jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) {
- if (er) throw er
- if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode)
- assert.ok(hits.temp, 'Original request is to /temp')
- assert.ok(!hits.temp_landing, 'No chasing the redirect when post')
- assert.equal(res.statusCode, 301, 'Response is the bounce itself')
- passed += 1
- done()
- })
-
- // Should follow post redirects when followAllRedirects true
- request.post({uri:server+'/temp', followAllRedirects:true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) {
- if (er) throw er
- if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode)
- assert.ok(hits.temp, 'Original request is to /temp')
- assert.ok(hits.temp_landing, 'Forward to temporary landing URL')
- assert.equal(body, 'GET temp_landing', 'Got temporary landing content')
- passed += 1
- done()
- })
-
- request.post({uri:server+'/temp', followAllRedirects:false, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) {
- if (er) throw er
- if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode)
- assert.ok(hits.temp, 'Original request is to /temp')
- assert.ok(!hits.temp_landing, 'No chasing the redirect')
- assert.equal(res.statusCode, 301, 'Response is the bounce itself')
- passed += 1
- done()
- })
- // Should not follow delete redirects by default
- request.del(server+'/temp', { jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) {
- if (er) throw er
- if (res.statusCode < 301) throw new Error('Status is not a redirect.')
- assert.ok(hits.temp, 'Original request is to /temp')
- assert.ok(!hits.temp_landing, 'No chasing the redirect when delete')
- assert.equal(res.statusCode, 301, 'Response is the bounce itself')
- passed += 1
- done()
- })
-
- // Should not follow delete redirects even if followRedirect is set to true
- request.del(server+'/temp', { followRedirect: true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) {
- if (er) throw er
- if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode)
- assert.ok(hits.temp, 'Original request is to /temp')
- assert.ok(!hits.temp_landing, 'No chasing the redirect when delete')
- assert.equal(res.statusCode, 301, 'Response is the bounce itself')
- passed += 1
- done()
- })
-
- // Should follow delete redirects when followAllRedirects true
- request.del(server+'/temp', {followAllRedirects:true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) {
- if (er) throw er
- if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode)
- assert.ok(hits.temp, 'Original request is to /temp')
- assert.ok(hits.temp_landing, 'Forward to temporary landing URL')
- assert.equal(body, 'GET temp_landing', 'Got temporary landing content')
- passed += 1
- done()
- })
-
- request.del(server+'/fwd', {followAllRedirects:true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) {
- if (er) throw er
- if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode)
- assert.ok(hits.fwd, 'Original request is to /fwd')
- assert.ok(hits.fwd_landing, 'Forward to temporary landing URL')
- assert.equal(body, 'DELETE fwd_landing', 'Got temporary landing content')
- passed += 1
- done()
- })
- var reqs_done = 0;
- function done() {
- reqs_done += 1;
- if(reqs_done == 10) {
- console.log(passed + ' tests passed.')
- s.close()
- }
- }
- })
|