Skip to content

Instantly share code, notes, and snippets.

@yssk22
Created September 15, 2011 14:25
Show Gist options
  • Save yssk22/1219368 to your computer and use it in GitHub Desktop.
Save yssk22/1219368 to your computer and use it in GitHub Desktop.
Node.js: access https URI via http proxy
var http = require('http');
var tls = require('tls');
var crypto = require('crypto');
var opts = {
host: 'proxy.com',
port: 8080,
method: 'CONNECT',
path: 'securehost.com:443',
headers: {
'Connection': 'keep-alive'
}
};
var req = http.request(opts, function(res){
if( res.statusCode == 200 ){
var socket = res.connection;
var sslcontext = crypto.createCredentials({});
var pair = new tls.createSecurePair(sslcontext, false);
var cleartext = pipe(pair, socket);
var parser = http.parsers.alloc();
parser.reinitialize('response');
parser.socket = cleartext;
parser.incoming = null;
cleartext.ondata = function(d, start, end){
var ret = parser.execute(d, start, end - start);
var res = parser.incoming;
};
parser.onIncoming = function(res, shouldKeepAlive){
res.on('data', function(chunk){
// ...
}
res.on('end', function(chunk){
cleartext.close();
}
};
cleartext.write('GET / HTTP/1.1\r\n');
cleartext.write('Host: github.com:443\r\n');
cleartext.write('\r\n');
}
});
req.end();
function pipe(pair, socket){
pair.encrypted.pipe(socket);
socket.pipe(pair.encrypted);
pair.fd = socket.fd;
var cleartext = pair.cleartext;
cleartext.socket = socket;
cleartext.encrypted = pair.encrypted;
cleartext.authorized = false;
function onerror(e) {
if (cleartext._controlReleased) {
cleartext.emit('error', e);
}
}
function onclose() {
socket.removeListener('error', onerror);
socket.removeListener('close', onclose);
socket.removeListener('timeout', ontimeout);
}
function ontimeout() {
cleartext.emit('timeout');
}
socket.on('error', onerror);
socket.on('close', onclose);
socket.on('timeout', ontimeout);
return cleartext;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment