diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..fb4dbc2 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,31 @@ +{ + "name": "proxy-login-automator", + "version": "1.2.4", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "version": "1.2.4", + "license": "MIT", + "dependencies": { + "http-parser-js": "^0.5.3" + }, + "bin": { + "proxy-login-automator": "proxy-login-automator.js", + "proxy-login-automator.js": "proxy-login-automator.js" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + } + }, + "dependencies": { + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + } + } +} diff --git a/package.json b/package.json index 311bae6..12ccfe1 100644 --- a/package.json +++ b/package.json @@ -18,5 +18,8 @@ "bugs": { "url": "https://github.com/sjitech/proxy-login-automator/issues" }, - "homepage": "https://github.com/sjitech/proxy-login-automator#readme" + "homepage": "https://github.com/sjitech/proxy-login-automator#readme", + "dependencies": { + "http-parser-js": "^0.5.3" + } } diff --git a/proxy-login-automator.js b/proxy-login-automator.js index dcac576..08aa5b4 100755 --- a/proxy-login-automator.js +++ b/proxy-login-automator.js @@ -1,10 +1,16 @@ #!/usr/bin/env node 'use strict'; var net = require('net'), tls = require('tls'); -var HTTPParser = process.binding('http_parser').HTTPParser; +var HTTPParser = require('http-parser-js').HTTPParser; var http = require('http'), https = require('https'); var url = require('url'); +const kOnHeaders = HTTPParser.kOnHeaders | 0; +const kOnHeadersComplete = HTTPParser.kOnHeadersComplete | 0; +const kOnBody = HTTPParser.kOnBody | 0; +const kOnMessageComplete = HTTPParser.kOnMessageComplete | 0; +const kOnExecute = HTTPParser.kOnExecute | 0; + function main() { //convert `-key value` to cfg[key]=value var cfg = process.argv.slice(2/*skip ["node", "xxx.js"]*/).reduce(function (cfg, arg, i, argv) { @@ -36,7 +42,7 @@ function main() { return console.error('when use as a PAC server, the local_host parameter must be a definite address'); } console.log('Using parameters: ' + JSON.stringify(cfg, null, ' ')); - cfg.buf_proxy_basic_auth = new Buffer('Proxy-Authorization: Basic ' + new Buffer(cfg.usr + ':' + cfg.pwd).toString('base64')); + cfg.buf_proxy_basic_auth = Buffer.from('Proxy-Authorization: Basic ' + Buffer.from(cfg.usr + ':' + cfg.pwd).toString('base64')); if (cfg.as_pac_server) { createPacServer(cfg.local_host, cfg.local_port, cfg.remote_host, cfg.remote_port, cfg.buf_proxy_basic_auth, cfg.is_remote_https, cfg.ignore_https_cert, cfg.are_remotes_in_pac_https); @@ -45,9 +51,9 @@ function main() { } } -var CR = 0xd, LF = 0xa, BUF_CR = new Buffer([0xd]), BUF_CR_LF_CR_LF = new Buffer([0xd, 0xa, 0xd, 0xa]), - BUF_LF_LF = new Buffer([0xa, 0xa]), BUF_PROXY_CONNECTION_CLOSE = new Buffer('Proxy-Connection: close'); -var STATE_NONE = 0, STATE_FOUND_LF = 1, STATE_FOUND_LF_CR = 2; +var CR = 0xd, LF = 0xa, BUF_CR = Buffer.from([0xd]), BUF_CR_LF_CR_LF = Buffer.from([0xd, 0xa, 0xd, 0xa]), + BUF_LF_LF = Buffer.from([0xa, 0xa]), BUF_PROXY_CONNECTION_CLOSE = Buffer.from('Proxy-Connection: close'); +var STATE_NONE = 0, STATE_FOUND_LF = 1, STATE_FOUND_LF_CR = 2, STATE_CONNECTED = 3; function createPortForwarder(local_host, local_port, remote_host, remote_port, buf_proxy_basic_auth, is_remote_https, ignore_https_cert) { net.createServer({allowHalfOpen: true}, function (socket) { @@ -117,10 +123,16 @@ function createPortForwarder(local_host, local_port, remote_host, remote_port, b //find second CR LF or LF if (buf[i] === LF) { - parser.__is_headers_complete = false; - parser.execute(buf.slice(unsavedStart, i + 1)); + var headersComplete = false; + parser[kOnHeadersComplete] = + function(versionMajor, versionMinor, headers, method, + url, statusCode, statusMessage, upgrade, shouldKeepAlive) { + headersComplete = true; + //console.log('kOnHeadersComplete'); + } - if (parser.__is_headers_complete) { + parser.execute(buf.slice(unsavedStart, i + 1)); + if (headersComplete) { buf_ary.push(buf.slice(unsavedStart, buf[i - 1] === CR ? i - 1 : i)); //console.log('insert auth header'); buf_ary.push(buf_proxy_basic_auth);