From b5796b86d5935156e92b368c1633ac342f0c9b42 Mon Sep 17 00:00:00 2001 From: Philipp Kunz Date: Mon, 1 Aug 2022 18:40:44 +0200 Subject: [PATCH] fix(core): update --- ts/00_commitinfo_data.ts | 2 +- ts/smartproxy.classes.networkproxy.ts | 100 ++++++++++++++------------ 2 files changed, 54 insertions(+), 48 deletions(-) diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index 3a09240..67bf8e2 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@pushrocks/smartproxy', - version: '3.0.34', + version: '3.0.35', description: 'a proxy for handling high workloads of proxying' } diff --git a/ts/smartproxy.classes.networkproxy.ts b/ts/smartproxy.classes.networkproxy.ts index 5568f01..74012d5 100644 --- a/ts/smartproxy.classes.networkproxy.ts +++ b/ts/smartproxy.classes.networkproxy.ts @@ -116,27 +116,30 @@ JNj2Dr5H0XoLFFnvuvzcRbhlJ9J67JzR+7g= -----END CERTIFICATE----- `, }, - async (req, res) => { + async (originRequest, originResponse) => { /** * endRequest function * can be used to prematurely end a request */ - const endRequest = ( + const endOriginReqRes = ( statusArg: number = 404, messageArg: string = 'This route is not available on this server.', headers: plugins.http.OutgoingHttpHeaders = {} ) => { - res.writeHead(statusArg, messageArg); - res.end(messageArg); - res.destroy(); + originResponse.writeHead(statusArg, messageArg); + originResponse.end(messageArg); + if (originRequest.socket !== originResponse.socket) { + console.log('hey, something is strange.') + } + originResponse.destroy(); }; - console.log(`got request: ${req.headers.host}${plugins.url.parse(req.url).path}`); - const destinationConfig = this.router.routeReq(req); + console.log(`got request: ${originRequest.headers.host}${plugins.url.parse(originRequest.url).path}`); + const destinationConfig = this.router.routeReq(originRequest); if (!destinationConfig) { - console.log(`${req.headers.host} can't be routed properly. Terminating request.`); - endRequest(); + console.log(`${originRequest.headers.host} can't be routed properly. Terminating request.`); + endOriginReqRes(); return; } @@ -145,14 +148,14 @@ JNj2Dr5H0XoLFFnvuvzcRbhlJ9J67JzR+7g= const authInfo = destinationConfig.authentication; switch (authInfo.type) { case 'Basic': - const authHeader = req.headers.authorization; + const authHeader = originRequest.headers.authorization; if (authHeader) { if (!authHeader.includes('Basic ')) { - return endRequest(401, 'Authentication required', { + return endOriginReqRes(401, 'Authentication required', { 'WWW-Authenticate': 'Basic realm="Access to the staging site", charset="UTF-8"', }); } - const authStringBase64 = req.headers.authorization.replace('Basic ', ''); + const authStringBase64 = originRequest.headers.authorization.replace('Basic ', ''); const authString: string = plugins.smartstring.base64.decode(authStringBase64); const userPassArray = authString.split(':'); const user = userPassArray[0]; @@ -160,12 +163,12 @@ JNj2Dr5H0XoLFFnvuvzcRbhlJ9J67JzR+7g= if (user === authInfo.user && pass === authInfo.pass) { console.log('request successfully authenticated'); } else { - return endRequest(403, 'Forbidden: Wrong credentials'); + return endOriginReqRes(403, 'Forbidden: Wrong credentials'); } } break; default: - return endRequest( + return endOriginReqRes( 403, 'Forbidden: unsupported authentication method configured. Please report to the admin.' ); @@ -174,61 +177,64 @@ JNj2Dr5H0XoLFFnvuvzcRbhlJ9J67JzR+7g= let destinationUrl: string; if (destinationConfig) { - destinationUrl = `http://${destinationConfig.destinationIp}:${destinationConfig.destinationPort}${req.url}`; + destinationUrl = `http://${destinationConfig.destinationIp}:${destinationConfig.destinationPort}${originRequest.url}`; } else { - return endRequest(); + return endOriginReqRes(); } console.log(destinationUrl); - const response = await plugins.smartrequest.request( + const proxyResponse = await plugins.smartrequest.request( destinationUrl, { - method: req.method, - headers: req.headers, + method: originRequest.method, + headers: originRequest.headers, keepAlive: true, }, true, // lets make this streaming - (request) => { - req.on('data', (data) => { - request.write(data); + (proxyRequest) => { + originRequest.on('data', (data) => { + proxyRequest.write(data); }); - req.on('end', (data) => { - request.end(); + originRequest.on('end', (data) => { + proxyRequest.end(); }); - req.on('error', () => { - request.end(); + originRequest.on('error', () => { + proxyRequest.end(); }); - req.on('close', () => { - request.end(); + originRequest.on('close', () => { + proxyRequest.end(); }); - req.on('timeout', () => { - req.destroy(); - request.end(); + originRequest.on('timeout', () => { + proxyRequest.end(); + originRequest.destroy(); + }); + proxyRequest.on('error', () => { + endOriginReqRes(); }) } ); - res.statusCode = response.statusCode; - console.log(response.statusCode); + originResponse.statusCode = proxyResponse.statusCode; + console.log(proxyResponse.statusCode); for (const defaultHeader of Object.keys(this.defaultHeaders)) { - res.setHeader(defaultHeader, this.defaultHeaders[defaultHeader]); + originResponse.setHeader(defaultHeader, this.defaultHeaders[defaultHeader]); } - for (const header of Object.keys(response.headers)) { - res.setHeader(header, response.headers[header]); + for (const header of Object.keys(proxyResponse.headers)) { + originResponse.setHeader(header, proxyResponse.headers[header]); } - response.on('data', (data) => { - res.write(data); + proxyResponse.on('data', (data) => { + originResponse.write(data); }); - response.on('end', () => { - res.end(); + proxyResponse.on('end', () => { + originResponse.end(); }); - response.on('error', () => { - res.end(); + proxyResponse.on('error', () => { + originResponse.destroy(); }); - response.on('close', () => { - res.end(); + proxyResponse.on('close', () => { + originResponse.end(); }); - response.on('timeout', () => { - res.end(); - res.destroy() + proxyResponse.on('timeout', () => { + originResponse.end(); + originResponse.destroy() }); }