File size: 3,894 Bytes
befd7da | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | 'use strict';
var assert = require('assert');
var express = require('express');
var request = require('supertest');
var proxy = require('../');
var proxyTarget = require('../test/support/proxyTarget');
var proxyRouteFn = [{
method: 'get',
path: '/:errorCode',
fn: function (req, res) {
var errorCode = req.params.errorCode;
if (errorCode === 'timeout') {
return res.status(504).send('mock timeout');
}
return res.status(parseInt(errorCode)).send('test case error');
}
}];
describe('error handling can be over-ridden by user', function () {
var app = express();
var proxyServer;
beforeEach(function () {
proxyServer = proxyTarget(12346, 100, proxyRouteFn);
app = express();
});
afterEach(function () {
proxyServer.close();
});
describe('when user provides a null function', function () {
describe('when author sets a timeout that fires', function () {
it('passes 504 directly to client', function (done) {
app.use(proxy('localhost:12346', {
timeout: 1,
}));
request(app)
.get('/200')
.expect(504)
.expect('X-Timeout-Reason', 'express-http-proxy reset the request.')
.end(done);
});
});
it('passes status code (e.g. 504) directly to the client', function (done) {
app.use(proxy('localhost:12346'));
request(app)
.get('/504')
.expect(504)
.expect(function (res) {
assert(res.text === 'test case error');
return res;
})
.end(done);
});
it('passes status code (e.g. 500) back to the client', function (done) {
app.use(proxy('localhost:12346'));
request(app)
.get('/500')
.expect(500)
.end(function (err, res) {
assert(res.text === 'test case error');
done();
});
});
});
describe('when user provides a handler function', function () {
var intentionallyWeirdStatusCode = 399;
var intentionallyQuirkyStatusMessage = 'monkey skunky';
describe('when author sets a timeout that fires', function () {
it('allows author to skip handling and handle in application step', function (done) {
app.use(proxy('localhost:12346', {
timeout: 1,
proxyErrorHandler: function (err, res, next) {
next(err);
}
}));
app.use(function (err, req, res, next) { // eslint-disable-line no-unused-vars
if (err.code === 'ECONNRESET') {
res.status(intentionallyWeirdStatusCode).send(intentionallyQuirkyStatusMessage);
}
});
request(app)
.get('/200')
.expect(function (res) {
assert(res.text === intentionallyQuirkyStatusMessage);
return res;
})
.expect(intentionallyWeirdStatusCode)
.end(done);
});
});
it('allows authors to sub in their own handling', function (done) {
app.use(proxy('localhost:12346', {
timeout: 1,
proxyErrorHandler: function (err, res, next) {
switch (err && err.code) {
case 'ECONNRESET': { return res.status(405).send('504 became 405'); }
case 'ECONNREFUSED': { return res.status(200).send('gotcher back'); }
default: { next(err); }
}
} }));
request(app)
.get('/timeout')
.expect(405)
.expect(function (res) {
assert(res.text === '504 became 405');
return res;
})
.end(done);
});
it('passes status code (e.g. 500) back to the client', function (done) {
app.use(proxy('localhost:12346'));
request(app)
.get('/500')
.expect(500)
.end(function (err, res) {
assert(res.text === 'test case error');
done();
});
});
});
});
|