在 proxpy 中写为 non-human 可读的响应主体
Response bodies written as non-human readable in proxpy
我正在为 proxpy 写一个插件。这基本上是一个用 python 编写的 HTTP/HTTPS 代理。您可以通过实现两个函数来扩展它,参数分别是 HTTP 请求和响应。像这样:
方法 1(请求):
#你的实现
方法 2(响应):
#你的实现
我只想将请求和响应写入文件。
响应 object 有一个 serialize()
函数,我调用该函数以将整个响应作为字符串获取,然后将其写入文件。这是我的代码:
def proxy_mangle_response(res):
temp = res.serialize()
file_temp = open('test.txt', 'a')
file_temp.write(temp + '\n\n')
file_temp.close()
然而,问题是,响应 body 被写成非 human-readable 乱码,即使它在通过 Live HTTP headers 之类的东西检查时显示为 HTML (chrome 分机)。
serialize()方法由proxpy提供,实现是这样的:
def serialize(self):
# Response line
s = "%s %s %s" % (self.proto, self.code, self.msg)
s += HTTPMessage.EOL
# Headers
for n,v in self.headers.iteritems():
for i in v:
s += "%s: %s" % (n, i)
s += HTTPMessage.EOL
s += HTTPMessage.EOL
# Body
if not self.isChunked():
s += self.body
else:
# FIXME: Make a single-chunk body
s += "%x" % len(self.body) + HTTPMessage.EOL
s += self.body + HTTPMessage.EOL
s += HTTPMessage.EOL
s += "0" + HTTPMessage.EOL + HTTPMessage.EOL
return s
要重现此问题,请在 运行 proxpy 之后点击 'dawn.com'。转到 dawn.com 的第一个请求将重现该问题。
以下是回复headers:
CF-RAY 1b2c4934487f073d-AMS
Connection keep-alive
Content-Encoding gzip
Content-Type text/html
Date Tue, 03 Feb 2015 05:39:05 GMT
Server cloudflare-nginx
Transfer-Encoding chunked
Vary Accept-Encoding
X-Backend www2
X-Developer Enjoy webdev? We like you, reach out at topcoder(at)compunode.com
我认为这是某种编码问题,headers 中有一些信息可以使浏览器正确解释响应 body。
事实证明,响应 body 是使用 gzip
压缩的,从响应 header Content-Encoding
可以明显看出。浏览器在显示之前将其解压缩。如果 Content-Encoding
header 值设置为 gzip
.
则只需要使用 zlib
解压
我正在为 proxpy 写一个插件。这基本上是一个用 python 编写的 HTTP/HTTPS 代理。您可以通过实现两个函数来扩展它,参数分别是 HTTP 请求和响应。像这样:
方法 1(请求):
#你的实现
方法 2(响应):
#你的实现
我只想将请求和响应写入文件。
响应 object 有一个 serialize()
函数,我调用该函数以将整个响应作为字符串获取,然后将其写入文件。这是我的代码:
def proxy_mangle_response(res):
temp = res.serialize()
file_temp = open('test.txt', 'a')
file_temp.write(temp + '\n\n')
file_temp.close()
然而,问题是,响应 body 被写成非 human-readable 乱码,即使它在通过 Live HTTP headers 之类的东西检查时显示为 HTML (chrome 分机)。
serialize()方法由proxpy提供,实现是这样的:
def serialize(self):
# Response line
s = "%s %s %s" % (self.proto, self.code, self.msg)
s += HTTPMessage.EOL
# Headers
for n,v in self.headers.iteritems():
for i in v:
s += "%s: %s" % (n, i)
s += HTTPMessage.EOL
s += HTTPMessage.EOL
# Body
if not self.isChunked():
s += self.body
else:
# FIXME: Make a single-chunk body
s += "%x" % len(self.body) + HTTPMessage.EOL
s += self.body + HTTPMessage.EOL
s += HTTPMessage.EOL
s += "0" + HTTPMessage.EOL + HTTPMessage.EOL
return s
要重现此问题,请在 运行 proxpy 之后点击 'dawn.com'。转到 dawn.com 的第一个请求将重现该问题。
以下是回复headers:
CF-RAY 1b2c4934487f073d-AMS
Connection keep-alive
Content-Encoding gzip
Content-Type text/html
Date Tue, 03 Feb 2015 05:39:05 GMT
Server cloudflare-nginx
Transfer-Encoding chunked
Vary Accept-Encoding
X-Backend www2
X-Developer Enjoy webdev? We like you, reach out at topcoder(at)compunode.com
我认为这是某种编码问题,headers 中有一些信息可以使浏览器正确解释响应 body。
事实证明,响应 body 是使用 gzip
压缩的,从响应 header Content-Encoding
可以明显看出。浏览器在显示之前将其解压缩。如果 Content-Encoding
header 值设置为 gzip
.
zlib
解压