HTTPS代理,支持分块编码请求

时间:2014-04-29 13:58:36

标签: apache proxy squid

我正在开发一个简单的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服务器吗?

由于

1 个答案:

答案 0 :(得分:1)

以下答案已过时。您现在可以将--stream传递给mitmproxy,其行为在mitmproxy documentation中有解释。

mitmproxy开发人员在这里。这绝对是我们想要用于mitmproxy的一个功能,但它不是那么微不足道,可能不会很快到来。如果你真的想自己实现,我可以推荐两件事:

  1. 如果您有一个非常具体的用例,可以使用libmproxy.protocol.http.HTTPRequest.from_stream来解析标题并自己进行正文处理。
  2. 如果您不想修改请求/响应正文,您可能会发现修改mitmproxy本身就足够了。简而言之,您需要在没有内容的情况下阅读请求/响应(请参阅1.),根据需要对其进行修改,将其传递给服务器,然后将控制权委托给libmproxy.protocol.tcp(请参阅https://github.com/mitmproxy/mitmproxy/blob/master/libmproxy/proxy/server.py#L169
  3. 如果您还有其他问题,请不要在此处或在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工作,但首先你需要到达你可以实际接收线路的块。然后,它就像读取单个块,加密它们并转发它们一样简单。