@luminati-io/luminati-proxy
Version:
A configurable local proxy for brightdata.com
84 lines (81 loc) • 3.13 kB
JavaScript
// LICENSE_CODE ZON ISC
; /*jslint node:true, esnext:true, evil: true*/
const {SESSION_TERMINATED_BODY} = require('./consts.js');
const {res_util, write_http_reply} = require('./util.js');
class Router {
constructor(opt){
this.opt = opt;
}
is_bypass_proxy(req){
return req.ctx.is_bypass_proxy;
}
is_fake_request(req){
return !!req.headers['x-lpm-fake'];
}
send_null_response(req, res){
const status = req.method=='CONNECT' ? 501 : 200;
write_http_reply(res, {statusCode: status, statusMessage: 'NULL'}, {},
this.opt);
res.end();
req.ctx.response.status_code = status;
req.ctx.response.status_message = 'NULL';
return req.ctx.response;
}
send_malware_detected_response(req, res, malware={}){
const status_code = 451, status_message = `Malware detected`;
const headers = {
'x-threat-type': malware.threat_type||'unknown',
'x-threat-name': malware.threat_name||'unknown',
};
write_http_reply(res, {statusCode: status_code,
statusMessage: status_message}, headers, this.opt);
res.end();
req.ctx.response.headers = headers;
req.ctx.response.status_code = status_code;
req.ctx.response.status_message = status_message;
return req.ctx.response;
}
send_cached(req, res, cached){
const {res_data, headers} = cached;
write_http_reply(res, {statusCode: 200, statusMessage: 'OK'}, headers,
this.opt);
for (let i=0; i<res_data.length; i++)
res.write(res_data[i]);
res.end();
const har_limit = res_util.is_one_of_types({headers},
['image', 'javascript', 'css']) ? -1 : this.opt.har_limit;
req.ctx.response.status_code = 200;
req.ctx.response.status_message = 'OK';
req.ctx.response.headers = headers;
req.ctx.response.body_size = 0;
for (let i=0; i<res_data.length; i++)
{
if (req.ctx.response.body_size>=har_limit)
break;
const l = har_limit-req.ctx.response.body_size;
req.ctx.response.body.push(res_data[i].slice(0, l));
req.ctx.response.body_size += l;
}
return req.ctx.response;
}
send_internal_redirection(req, res){
const _url = encodeURIComponent(req.ctx.response.request.url_full);
const headers = {
'content-type': 'text/html',
'content-length': SESSION_TERMINATED_BODY.length,
'x-lpm-redirect': _url,
};
if (this.opt.debug=='full')
headers['x-lpm-port'] = this.opt.port;
write_http_reply(res, {
statusCode: 400,
statusMessage: 'Session terminated',
}, headers, this.opt);
res.write(SESSION_TERMINATED_BODY, ()=>{ res.end(); });
req.ctx.response.status_code = 400;
req.ctx.response.status_message = 'Session terminated';
req.ctx.response.headers = headers;
return req.ctx.response;
}
}
module.exports = Router;