luminati-proxy-stripped
Version:
A configurable local proxy for luminati.io
56 lines (53 loc) • 1.74 kB
JavaScript
// LICENSE_CODE ZON ISC
; /*jslint node:true*/
require('./config.js');
const HTTPParser = process.binding('http_parser').HTTPParser;
const E = exports;
// original_raw should be the untransformed value of rawHeaders from the
// Node.js HTTP request or response
E.restore_case = function(headers, original_raw){
if (!original_raw)
return headers;
const names = {};
for (let i = 0; i<original_raw.length; i += 2)
{
const name = original_raw[i];
names[name.toLowerCase()] = [name];
}
for (let orig_name in headers)
{
const name = orig_name.toLowerCase();
if (names[name])
names[name].push(orig_name);
else
names[name] = [orig_name];
}
const res = {};
for (let name in names)
{
const value = names[name].map(n=>headers[n]).filter(v=>v)[0];
if (value!==undefined)
res[names[name][0]] = value;
}
return res;
};
let parser = new HTTPParser(HTTPParser.REQUEST);
E.parse_request = buffer=>{
let ret;
parser[HTTPParser.kOnHeadersComplete] =
(version_major, version_minor, raw_headers, method, url, status_code,
status_message, upgrade, should_keep_alive)=>
ret = {version_major, version_minor, raw_headers, method, url,
upgrade, should_keep_alive};
parser.reinitialize(HTTPParser.REQUEST);
let exec_res = parser.execute(buffer);
if (exec_res instanceof Error)
throw exec_res;
if (!ret)
return;
// ugly, not 100% accurate, but fast!
ret.headers = {};
for (let i=0; i<ret.raw_headers.length; i+=2)
ret.headers[ret.raw_headers[i].toLowerCase()] = ret.raw_headers[i+1];
return ret;
};