socks_client_subprocess.js (2310B)
1 /* global arguments */ 2 3 "use strict"; 4 5 var CC = Components.Constructor; 6 7 const BinaryInputStream = CC( 8 "@mozilla.org/binaryinputstream;1", 9 "nsIBinaryInputStream", 10 "setInputStream" 11 ); 12 const ProtocolProxyService = CC( 13 "@mozilla.org/network/protocol-proxy-service;1", 14 "nsIProtocolProxyService" 15 ); 16 var sts = Cc["@mozilla.org/network/socket-transport-service;1"].getService( 17 Ci.nsISocketTransportService 18 ); 19 20 function waitForStream(stream, streamType) { 21 return new Promise((resolve, reject) => { 22 stream = stream.QueryInterface(streamType); 23 if (!stream) { 24 reject("stream didn't implement given stream type"); 25 } 26 let currentThread = 27 Cc["@mozilla.org/thread-manager;1"].getService().currentThread; 28 stream.asyncWait(resolve, 0, 0, currentThread); 29 }); 30 } 31 32 async function launchConnection( 33 socks_vers, 34 socks_port, 35 dest_host, 36 dest_port, 37 dns 38 ) { 39 let pi_flags = 0; 40 if (dns == "remote") { 41 pi_flags = Ci.nsIProxyInfo.TRANSPARENT_PROXY_RESOLVES_HOST; 42 } 43 44 let pps = new ProtocolProxyService(); 45 let pi = pps.newProxyInfo( 46 socks_vers, 47 "localhost", 48 socks_port, 49 "", 50 "", 51 pi_flags, 52 -1, 53 null 54 ); 55 let trans = sts.createTransport([], dest_host, dest_port, pi, null); 56 let input = trans.openInputStream(0, 0, 0); 57 let output = trans.openOutputStream(0, 0, 0); 58 input = await waitForStream(input, Ci.nsIAsyncInputStream); 59 let bin = new BinaryInputStream(input); 60 let data = bin.readBytes(5); 61 let response; 62 if (data == "PING!") { 63 print("client: got ping, sending pong."); 64 response = "PONG!"; 65 } else { 66 print("client: wrong data from server:", data); 67 response = "Error: wrong data received."; 68 } 69 output = await waitForStream(output, Ci.nsIAsyncOutputStream); 70 output.write(response, response.length); 71 output.close(); 72 input.close(); 73 } 74 75 async function run(args) { 76 for (let arg of args) { 77 print("client: running test", arg); 78 let test = arg.split("|"); 79 await launchConnection( 80 test[0], 81 parseInt(test[1]), 82 test[2], 83 parseInt(test[3]), 84 test[4] 85 ); 86 } 87 } 88 89 var satisfied = false; 90 run(arguments).then(() => (satisfied = true)); 91 var mainThread = Cc["@mozilla.org/thread-manager;1"].getService().mainThread; 92 while (!satisfied) { 93 mainThread.processNextEvent(true); 94 }