mirror of
https://gitee.com/java110/MicroCommunityWeb.git
synced 2026-02-24 21:59:12 +08:00
122 lines
3.6 KiB
JavaScript
122 lines
3.6 KiB
JavaScript
'use strict';
|
|
|
|
var assert = require('assert');
|
|
var express = require('express');
|
|
var http = require('http');
|
|
var startProxyTarget = require('./support/proxyTarget');
|
|
var proxy = require('../');
|
|
|
|
function chunkingProxyServer() {
|
|
var proxyRouteFn = [{
|
|
method: 'get',
|
|
path: '/stream',
|
|
fn: function (req, res) {
|
|
res.write('0');
|
|
setTimeout(function () { res.write('1'); }, 100);
|
|
setTimeout(function () { res.write('2'); }, 200);
|
|
setTimeout(function () { res.write('3'); }, 300);
|
|
setTimeout(function () { res.end(); }, 500);
|
|
}
|
|
}];
|
|
|
|
return startProxyTarget(8309, 1000, proxyRouteFn);
|
|
}
|
|
|
|
function simulateUserRequest() {
|
|
return new Promise(function (resolve, reject) {
|
|
var req = http.request({ hostname: 'localhost', port: 8308, path: '/stream' }, function (res) {
|
|
var chunks = [];
|
|
res.on('data', function (chunk) { chunks.push(chunk.toString()); });
|
|
res.on('end', function () { resolve(chunks); });
|
|
});
|
|
|
|
req.on('error', function (e) {
|
|
reject('problem with request:', e.message);
|
|
});
|
|
|
|
req.end();
|
|
});
|
|
}
|
|
|
|
function startLocalServer(proxyOptions) {
|
|
var app = express();
|
|
app.get('/stream', proxy('http://localhost:8309', proxyOptions));
|
|
return app.listen(8308);
|
|
}
|
|
|
|
describe('streams / piped requests', function () {
|
|
this.timeout(3000);
|
|
|
|
var server;
|
|
var targetServer;
|
|
|
|
beforeEach(function () {
|
|
targetServer = chunkingProxyServer();
|
|
});
|
|
|
|
afterEach(function () {
|
|
server.close();
|
|
targetServer.close();
|
|
});
|
|
|
|
describe('when streaming options are truthy', function () {
|
|
var TEST_CASES = [{
|
|
name: 'vanilla, no options defined',
|
|
options: {}
|
|
}, {
|
|
name: 'proxyReqOptDecorator is defined',
|
|
options: { proxyReqOptDecorator: function (reqBuilder) { return reqBuilder; } }
|
|
}, {
|
|
//// Keep around this case for manually testing that this for sure fails for a few cycles. 2018 NMK
|
|
//name: 'proxyReqOptDecorator never returns',
|
|
//options: { proxyReqOptDecorator: function () { return new Promise(function () {}); } }
|
|
//}, {
|
|
|
|
name: 'proxyReqOptDecorator is a Promise',
|
|
options: { proxyReqOptDecorator: function (reqBuilder) { return Promise.resolve(reqBuilder); } }
|
|
}];
|
|
|
|
TEST_CASES.forEach(function (testCase) {
|
|
describe(testCase.name, function () {
|
|
it('chunks are received without any buffering, e.g. before request end', function (done) {
|
|
server = startLocalServer(testCase.options);
|
|
simulateUserRequest()
|
|
.then(function (res) {
|
|
// Assume that if I'm getting a chunked response, it will be an array of length > 1;
|
|
|
|
assert(res instanceof Array, 'res is an Array');
|
|
assert.equal(res.length, 4);
|
|
done();
|
|
})
|
|
.catch(done);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('when streaming options are falsey', function () {
|
|
var TEST_CASES = [{
|
|
name: 'skipToNextHandler is defined',
|
|
options: { skipToNextHandlerFilter: function () { return false; } }
|
|
}];
|
|
|
|
TEST_CASES.forEach(function (testCase) {
|
|
describe(testCase.name, function () {
|
|
it('response arrives in one large chunk', function (done) {
|
|
server = startLocalServer(testCase.options);
|
|
|
|
simulateUserRequest()
|
|
.then(function (res) {
|
|
// Assume that if I'm getting a un-chunked response, it will be an array of length = 1;
|
|
|
|
assert(res instanceof Array);
|
|
assert.equal(res.length, 1);
|
|
done();
|
|
})
|
|
.catch(done);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|