socksinthemiddle
Advanced tools
Comparing version 2.0.5 to 2.0.6
104
index.js
@@ -14,3 +14,2 @@ const net = require('net'), | ||
} = require('socks5server/src/socks.js'); | ||
const { pipeline } = require('stream'); | ||
/** | ||
@@ -28,3 +27,6 @@ * for getting a full buffer from a stream and modifying it | ||
constructor(processer){ | ||
super({highWaterMark:1638400}); | ||
super({ | ||
highWaterMark:1638400, | ||
allowHalfOpen:false, | ||
}); | ||
this.processer=processer; | ||
@@ -35,3 +37,3 @@ this.buf=[]; | ||
this.buf.push(chunk); | ||
setImmediate(cb,null) | ||
setImmediate(cb,null); | ||
} | ||
@@ -191,3 +193,4 @@ async _flush(cb){ | ||
} | ||
const rawURL=`${reqFromClient.protocol}://${headers.host}${reqFromClient.url}`; | ||
const rawHost=headers.host.split(':'); | ||
const rawURL=`${reqFromClient.protocol}://${headers.host}:${rawHost[1]||(reqFromClient.protocol==='https'?443:80)}${reqFromClient.url}`; | ||
if(this.requestModder){ | ||
@@ -227,3 +230,3 @@ let streamModder=await this.requestModder(headers,reqFromClient,resToClient,overrideRequestOptions); | ||
reqFromClient.relayURL=relayURL; | ||
this.httpLog&&console.log('(relay out)[%s] -> [%s]',rawURL,relayURL); | ||
this.httpLog&&console.log(`(relay out)[%s]`,rawURL,rawURL!==relayURL?` -> [${relayURL}]`:''); | ||
let reqToServer; | ||
@@ -248,9 +251,7 @@ if(reqFromClient.isWebScoket){ | ||
streamChain.push(reqToServer); | ||
pipeline(streamChain,(err)=>{ | ||
if(err){ | ||
if(this.httpLog){ | ||
if(err.rawPacket)err.rawText=err.rawPacket.toString(); | ||
console.error('(relay request error)[%s] -> [%s]',rawURL,relayURL); | ||
console.error(err); | ||
} | ||
chainPipe(streamChain,(err)=>{ | ||
if(this.httpLog){ | ||
if(err.rawPacket)err.rawText=err.rawPacket.toString(); | ||
console.error(`(relay request error)[%s]`,rawURL,rawURL!==relayURL?` -> [${relayURL}]`:''); | ||
console.error(err); | ||
} | ||
@@ -273,20 +274,20 @@ }); | ||
delete headers['content-length']; | ||
headers['transfer-encoding']='chunked'; | ||
const enc=headers['content-encoding']; | ||
if(streamModder instanceof Transform){//if the modder stream is an instance of Transform, the raw data will be piped in | ||
const contentDecoder=contentDecoderSelector(enc); | ||
if(contentDecoder){ | ||
streamChain.push(contentDecoder); | ||
if(enc){ | ||
const contentDecoder=contentDecoderSelector(enc)/* , | ||
contentEncoder=contentEncoderSelector(enc) */; | ||
streamChain.push(contentDecoder,streamModder/* ,contentEncoder */); | ||
delete headers['content-encoding']; | ||
}else{ | ||
streamChain.push(streamModder); | ||
} | ||
streamChain.push(streamModder); | ||
delete headers['content-encoding']; | ||
//todo fix here | ||
/* const contentEncoder=contentEncoderSelector(enc); | ||
if(contentEncoder){ | ||
streamChain.push(contentEncoder); | ||
} */ | ||
}else if(streamModder instanceof Readable){//if the modder stream is just a readable stream, the stream will replace the raw data | ||
streamChain=[streamModder]; | ||
delete headers['content-encoding']; | ||
//todo fix here | ||
/* const contentEncoder=contentEncoderSelector(enc); | ||
if(contentEncoder){ | ||
/* if(enc){ | ||
const contentEncoder=contentEncoderSelector(enc); | ||
streamChain.push(contentEncoder); | ||
@@ -300,3 +301,2 @@ } */ | ||
if(!resFromServer.destroyed)resFromServer.destroy(); | ||
// for(let s of streamChain)if(!s.destroyed)s.destroy(); | ||
return; | ||
@@ -327,8 +327,6 @@ } | ||
streamChain.push(resToClient); | ||
pipeline(streamChain,(err)=>{ | ||
if(err){ | ||
if(this.httpLog){ | ||
console.error(`(relay response error) [${reqFromClient.relayURL}]`); | ||
console.error(err); | ||
} | ||
chainPipe(streamChain,(err)=>{ | ||
if(this.httpLog){ | ||
console.error(`(relay response error) [${reqFromClient.relayURL}]`); | ||
console.error(err); | ||
} | ||
@@ -433,22 +431,40 @@ }); | ||
function contentDecoderSelector(enc){ | ||
if(enc){ | ||
switch(enc){ | ||
case 'gzip':return zlib.createUnzip(); | ||
case 'deflate':return zlib.createUnzip(); | ||
case 'br':return zlib.createBrotliDecompress(); | ||
default:throw(new Error('unknown encoding:'+enc)); | ||
} | ||
switch(enc){ | ||
case 'gzip':return zlib.createUnzip(); | ||
case 'deflate':return zlib.createInflate(); | ||
case 'br':return zlib.createBrotliDecompress(); | ||
default:throw(new Error('unknown encoding:'+enc)); | ||
} | ||
} | ||
function contentEncoderSelector(enc){ | ||
if(enc){ | ||
switch(enc){ | ||
case 'gzip':return zlib.createGzip(); | ||
case 'deflate':return zlib.createDeflate(); | ||
case 'br':return zlib.createBrotliCompress(); | ||
default:throw(new Error('unknown encoding:'+enc)); | ||
} | ||
switch(enc){ | ||
case 'gzip':return zlib.createGzip(); | ||
case 'deflate':return zlib.createDeflate(); | ||
case 'br':return zlib.createBrotliCompress(); | ||
default:throw(new Error('unknown encoding:'+enc)); | ||
} | ||
} | ||
function chainPipe(chain,cb){ | ||
let lastStream,calledCb=false,i=0; | ||
for(let s of chain){ | ||
if(lastStream)lastStream.pipe(s); | ||
lastStream=s; | ||
const ind=i++; | ||
s.once('error',err=>{ | ||
err.streamIndex=ind; | ||
err.chainLength=chain.length; | ||
err.streamType=s.constructor?.name||'unknown'; | ||
if(!calledCb){ | ||
cb(err); | ||
calledCb=true; | ||
} | ||
for(let stream of chain){ | ||
if(s===stream || stream.errored || stream.closed || stream.destroyed || stream.writableFinished)continue; | ||
stream.destroy(err); | ||
} | ||
}); | ||
} | ||
} | ||
function isHTTPHeader(buf){ | ||
@@ -455,0 +471,0 @@ let str=buf.toString(); |
{ | ||
"name": "socksinthemiddle", | ||
"description": "use a socks server for web request modification", | ||
"version": "2.0.5", | ||
"version": "2.0.6", | ||
"main": "index.js", | ||
@@ -23,2 +23,3 @@ "scripts": { | ||
"dependencies": { | ||
"pump": "^3.0.0", | ||
"socks5server": "^4.5.1", | ||
@@ -25,0 +26,0 @@ "ws": "^8.11.0" |
26537
538
3
+ Addedpump@^3.0.0
+ Addedend-of-stream@1.4.4(transitive)
+ Addedonce@1.4.0(transitive)
+ Addedpump@3.0.2(transitive)
+ Addedwrappy@1.0.2(transitive)