remora/web/tests/system/proxy.mjs

46 lines
1.3 KiB
JavaScript

import http from 'node:http'
import net from 'node:net'
const upstreamHost = 'qualification-ingress'
const upstreamPort = 80
const server = http.createServer((request, response) => {
const upstream = http.request(
{
host: upstreamHost,
port: upstreamPort,
method: request.method,
path: request.url,
headers: { ...request.headers, host: upstreamHost },
},
(upstreamResponse) => {
response.writeHead(
upstreamResponse.statusCode ?? 502,
upstreamResponse.headers,
)
upstreamResponse.pipe(response)
},
)
upstream.on('error', () => {
response.writeHead(502)
response.end()
})
request.pipe(upstream)
})
server.on('upgrade', (request, socket, head) => {
const upstream = net.connect(upstreamPort, upstreamHost, () => {
const headers = Object.entries(request.headers)
.filter(([name]) => name.toLowerCase() !== 'host')
.map(([name, value]) => `${name}: ${String(value)}`)
.join('\r\n')
upstream.write(
`${request.method} ${request.url} HTTP/${request.httpVersion}\r\nHost: ${upstreamHost}\r\n${headers}\r\n\r\n`,
)
if (head.length > 0) upstream.write(head)
socket.pipe(upstream).pipe(socket)
})
upstream.on('error', () => socket.destroy())
})
server.listen(4174, '127.0.0.1')