В настоящее время я пишу веб-приложение, использующее Express, которое будет порождать индивидуальные Docker-контейнеры для каждого сеанса и прокси-трафик к ним. Все работало нормально, когда я тестировал с express-http-proxy-async
, но мне нужна поддержка websocket для juiceshop. Это подводит меня к использованию http-proxy-middleware
, в котором нет поддержки разрешения асинхронного хоста. Я создал больше промежуточного программного обеспечения, чтобы обойти это, но мой трафик не проходит через прокси, и я не могу понять, почему. Вывод говорит, что прокси создается, но я думаю, что Express не использует его должным образом из-за того, как я его называю.
Маршрут:
app.use(vhost('juiceshop.example.com', async (req, res) => {
let target = await juiceShop_session_handler(req);
return wsproxy({target: target, ws:true});
}));
Сессияобработчик:
async function juiceShop_session_handler(req){
return new Promise((resolve, reject) => {
if(req.sessionID in instances){
resolve('http://127.0.0.1:' + instances[req.sessionID]['port']);
} else {
instances[req.sessionID] = {};
instances[req.sessionID]['port'] = PORTS.next()['value'];
let instance = spawn('docker', ['run', '--rm', '-p', instances[req.sessionID]['port'] + ':3000', 'bkimminich/juice-shop']);
instance.stdout.on('data', (data) => {
if (data.includes('Server listening on port')) resolve('http://127.0.0.1:' + instances[req.sessionID]['port']);
});
instance.stderr.on('data', (data) => {
if (data.includes('port is already allocated')) {
req.session.error = createError(501, 'Failed to bind to port. Complain to the admin about this.');
reject()
}
});
instances[req.sessionID]['instance'] = instance;
}
});
}
Вывод:
[+] Listening on 80!
[HPM] Proxy created: / -> http://127.0.0.1:3000
Я не могу понять, почему трафик не проходит через прокси. Вся помощь приветствуется!