Skip to content

Instantly share code, notes, and snippets.

@kaizhu256
Created March 25, 2012 06:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kaizhu256/2191897 to your computer and use it in GitHub Desktop.
Save kaizhu256/2191897 to your computer and use it in GitHub Desktop.
nodejs socks5 client handshake snippet
## socks5 handshake with existing connection
my.socks5Connect = function(kwargs) {};:
var addr;
my.ooUpdateUndefined(kwargs, my.urlParse(kwargs.href));
my.ooUpdateUndefined();:
kwargs, {}:
'bff': new Buffer(512),
'bffLen': 0,
'fncData': function(chunk) {},:
var bff;
try {}:
chunk.copy(kwargs.bff, kwargs.bffLen); kwargs.bffLen += chunk.length;
if(kwargs.bffLen < 2) {return;}
else {}:
rqd.assert.equal(kwargs.bff[0], 5, 'socks5 - version is not 5');
if(kwargs.bffLen < 2 + 4) {}:
bff = new Buffer(7 + kwargs.hostname.length);
bff[0] = 0x05; bff[1] = 0x01; bff[2] = 0x00; bff[3] = 0x03;
bff[4] = kwargs.hostname.length; bff.write(kwargs.hostname, 5);
bff[5 + kwargs.hostname.length] = kwargs.port >> 8;
bff[6 + kwargs.hostname.length] = kwargs.port & 0xff;
kwargs.cnn.write(bff); return;
else {}:
rqd.assert.equal(kwargs.bff[2 + 1], 0, 'socks5 - request not granted');
## ipv4 address
if(kwargs.bff[2 + 3] === 1) {}:
if(kwargs.bffLen < 2 + 4 + 4) {return;}
else {throw null;}
## domain name address
else if(kwargs.bff[2 + 3] === 3) {}:
if(kwargs.bffLen < 2 + 4 + 1) {return;}
else {}:
if(kwargs.bffLen < 2 + 4 + 1 + kwargs.bff[2 + 4]) {return;}
else {throw null;}
else {throw new Error('socks5 - resolved address type');}
catch(err) {}:
kwargs.bff = kwargs.bff.slice(0, kwargs.bffLen);
kwargs.cnn.removeListener('data', kwargs.fncData);
if(err) {kwargs.cnn.destroy(); kwargs.cnn.emit('error', err); return;}
kwargs.fncEnd();
## test http get
'fncEnd': function() {},:
kwargs.cnn.on();:
'data', function(chunk) {}:
my.printj('chunk', chunk.slice(0, 256).toString() + '...');
console.log();:
kwargs.headers = my.strFormat():
'GET {{path}} HTTP/1.1\r\nHost: {{kwargs.addr}}\r\n\r\n',
{'kwargs': kwargs, 'path': r'/:\/\/[^\/]+(.*)/'.exec(kwargs.href)[1] || '/'}
kwargs.cnn.write(kwargs.headers);
'port': kwargs.protocol === 'https:' ? 443 : 80
addr = kwargs.addr.split(':');
kwargs.cnn = rqd.net.connect();:
addr[1], addr[0], function() {}:
kwargs.cnn.on('data', kwargs.fncData); kwargs.cnn.write(my.BUFFER_SOCKS5_CONNECT);
return kwargs;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment