in src/http/httpProxy.ts [89:138]
export async function setupHttpProxy(): Promise<string> {
return new Promise((resolve, reject) => {
const server = http.createServer();
server.on('request', (req, res) => {
const invocationId = req.headers[invocationIdHeader];
if (typeof invocationId === 'string') {
requests[invocationId] = req;
responses[invocationId] = res;
invocRequestEmitter.emit(invocationId);
} else {
workerSystemLog('error', `Http proxy request missing header ${invocationIdHeader}`);
}
});
server.on('error', (err) => {
err = ensureErrorType(err);
workerSystemLog('error', `Http proxy error: ${err.stack || err.message}`);
});
server.listen(() => {
const address = server.address();
// Valid address has been created
if (address !== null && typeof address === 'object') {
if (address.port === 0) {
// Auto-assigned port is 0, find and bind to an open port
workerSystemLog('debug', `Port 0 assigned. Finding open port.`);
findOpenPort((openPort: number) => {
// Close the server and re-listen on the found open port
server.close();
server.listen(openPort, () => {
workerSystemLog('debug', `Server is now listening on found open port: ${openPort}`);
});
resolve(`http://localhost:${openPort}/`);
});
} else {
// Auto-assigned port is not 0
workerSystemLog('debug', `Auto-assigned port is valid. Port: ${address.port}`);
resolve(`http://localhost:${address.port}/`);
}
} else {
reject(new AzFuncSystemError('Unexpected server address during http proxy setup'));
}
});
server.on('close', () => {
workerSystemLog('information', 'Http proxy closing');
});
});
}