我正在开发一个简单的HTTPS代理(用Python编写),它接收POST / GET请求/响应,应用一些转换,最后将结果转发给收件人。 我需要在"流媒体"中处理分块编码的请求/响应。时尚,这意味着只要收到一个块,代理就会将其转换并转发给收件人。
在决定支持分块编码请求之前,我一直在使用mitmproxy http://mitmproxy.org/并且它运行良好。不幸的是,我注意到在让我处理响应/请求之前它会一直等到收到整个正文。
如何实现支持分块编码请求/响应的代理?你有没有人做过这样的事情?
由于
编辑:更多信息我的使用案例
我需要处理POST请求和GET响应。
在 POST请求中,我收到一个JSON对象,我必须加密它的一些值。
在 GET响应中,我收到一个JSON对象,我必须解密它的一些值。
到目前为止,以下代码已经完美运行:
def handle_request(self, r):
if(r.method=='POST'):
// encryption of r.get_form_urlencoded()
def handle_response(self, r):
if(r.request.method=='GET'):
// decryption of r.content
如何用单个块做同样的事情?
编辑:更新
在评估了不同的解决方案之后,我决定选择Squid(代理)+ ICAP(内容改编)。
我已经成功配置了Squid,性能非常好。不幸的是,我找不到合适的ICAP服务器(如果可能的话,用Python)来进行内容改编(修改)。我认为这个https://github.com/netom/pyicap可以完成这项工作,但看起来它没有读取myPOST请求的正文。
你们知道我可以和Squid一起使用的Python ICAP服务器吗?
由于
答案 0 :(得分:1)
以下答案已过时。您现在可以将--stream
传递给mitmproxy,其行为在mitmproxy documentation中有解释。
mitmproxy开发人员在这里。这绝对是我们想要用于mitmproxy的一个功能,但它不是那么微不足道,可能不会很快到来。如果你真的想自己实现,我可以推荐两件事:
如果您还有其他问题,请不要在此处或在mitmproxy的IRC频道上提问。
评论#1:
你不能从mitmproxy中获取太多,但至少你可以获得头部解析和代理。处理
# ...accept request, socket.makefile() etc...
req = HTTPRequest.from_stream(client_conn.rfile, include_content=False)
# manually forward to the server (req._assemble_head())
# manually receive response body chunk by chunk and forward it to the server, see
# https://github.com/mitmproxy/netlib/blob/master/netlib/http.py#L98
resp = HTTPResponse.from_stream(server_conn.rfile, include_content=False)
# manually forward headers
# manually process body and forward
话虽如此,这是一个相当复杂的话题。最后,您最好直接将其黑客攻击到libmproxy.protocol.http.HTTPHandler。
另一个选项,取决于您的用例:使用mitmproxy,将conntype设置为tcp并按原样转发流量,并对libmproxy.protocol.tcp中的内容使用regex替换。可能是最简单的方法,但最笨拙的方式。 如果你能提供一些背景信息,我可以指导你进一步朝着正确的方向发展。
重新评论#2:
在我们进入主要部分之前:只要您不想加密完整的JSON对象并将其视为单个字符串,JSON就是流媒体/分块的一个非常糟糕的选择。如果你只想加密部件,你一定要考虑像tnetstrings这样的东西。
除此之外,挂钩到read_chunk工作,但首先你需要到达你可以实际接收线路的块。然后,它就像读取单个块,加密它们并转发它们一样简单。