我正在使用TypeScript在Node上开发一个MITM代理。我尝试解码使用gzip编码的响应。我不想像在SO上某些答案中看到的那样仅删除
注意:
accept-encoding
头。我想使用zlib
解码响应正文,但是当我尝试加载使用gzip(例如github.com)的页面时,页面无法加载(图像,颜色,文本等)。我的解压缩不起作用,我不知道为什么。我用于解压缩响应正文的代码如下:注意:
serverResponse
是我(作为代理)连接到的服务器(例如github.com)的响应,而proxyResponse
是我(代理)向发起请求的客户端返回的响应。 protected async receiveResponse(serverResponse: http.IncomingMessage, proxyResponse: http.ServerResponse) {
const contentEncoding = serverResponse.headers["content-encoding"]
let responseContent: http.IncomingMessage | zlib.Gunzip = serverResponse
if (contentEncoding && contentEncoding.toLowerCase().includes("gzip")) {
responseContent = zlib.createGunzip()
serverResponse.pipe(responseContent)
delete serverResponse.headers["content-encoding"]
}
let responseBody: Buffer
try {
responseBody = await this.collectMessageBody(responseContent)
} catch (error) {
console.log(error)
return
}
proxyResponse.writeHead(serverResponse.statusCode!, serverResponse.headers)
proxyResponse.write(responseBody)
proxyResponse.end()
}
private collectMessageBody(stream: http.IncomingMessage | zlib.Gunzip): Promise<Buffer> {
return new Promise<Buffer>((resolve, reject) => {
let bodyBuffers: Buffer[] = []
stream.on('data', chunk => bodyBuffers.push(chunk))
stream.on('end', () => resolve(Buffer.concat(bodyBuffers)))
stream.on('error', error => reject(error))
})
}
这里的策略与大多数在 SO 上的回答相同,但我不知道我的为什么不起作用。
注意:这是一个开源项目,因此整个文件可以在此处找到:https://github.com/olmps/web-sniffer/blob/master/src/server.ts
我已经简化了逻辑,删除了不必要的内容,以便在此发布。
例如,当加载使用 gzip
压缩其内容的 github.com 时,当代理打开时,我得到以下结果:
Gunzip
用于解码来自Github服务器的响应,而不是对其进行编码。 - GGirotto