gpt4 book ai didi

apache - 支持分块编码请求的 HTTPS 代理

转载 作者:行者123 更新时间:2023-12-02 07:41:42 29 4
gpt4 key购买 nike

我正在开发一个简单的 HTTPS 代理(用 Python 编写),它接收 POST/GET 请求/响应,应用一些转换,最后将结果转发给接收者。我需要以“流”方式处理分块编码的请求/响应,这意味着一旦收到一个 block ,代理就会对其进行转换并将其转发给接收者。

在决定支持分块编码请求之前,我一直在使用 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

我怎样才能用单个 block 做同样的事情?

编辑:更新

在评估了不同的解决方案后,我决定采用 Squid(代理)+ ICAP(内容适配)。

我已经成功配置了 Squid,并且性能非常好。不幸的是,我找不到合适的 ICAP 服务器(如果可能的话,用 Python)来进行内容适配(修改)。我以为是这个https://github.com/netom/pyicap可以完成这项工作,但看起来它没有读取 myPOST 请求的正文。

你们知道我可以与 Squid 一起使用的 Python ICAP 服务器吗?

谢谢

最佳答案

下面的答案已经过时了。您现在可以通过--stream到 mitmproxy,其行为在 mitmproxy documentation 中进行了解释.

mitmproxy 开发人员在这里。这绝对是我们想要 mitmproxy 提供的功能,但它并不是那么微不足道,而且可能不会很快实现。如果您真的想自己实现,我可以推荐两件事:

  1. 如果您有非常具体的用例,您可以使用 libmproxy.protocol.http.HTTPRequest.from_stream用于解析 header 并自行处理正文。
  2. 如果您不想修改请求/响应正文,您可能会发现修改 mitmproxy 本身就足够了。简而言之,您需要读取不带内容的请求/响应(请参阅 1.),根据您的需要对其进行修改,将其传递给服务器,然后将控制权委托(delegate)给 libmproxy.protocol.tcp(请参阅 https://github.com/mitmproxy/mitmproxy/blob/master/libmproxy/proxy/server.py#L169 )

如果您还有其他问题,请随时在此处或在 mitmproxy 的 IRC channel 上提问。

<小时/>

回复评论#1:

你不能从 mitmproxy 中获取太多东西,但至少你可以委托(delegate) header 解析和处理。

# ...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 中的内容使用正则表达式替换。可能是最简单的方法,但也是最hacky的方法。如果您可以提供一些背景信息,我可能会进一步引导您朝正确的方向前进。

<小时/>

回复评论#2:

在我们进入主要部分之前:只要您不想加密完整的 JSON 对象并将其视为单个字符串,JSON 对于流/分块来说是一个非常糟糕的选择。如果您只想加密部分内容,那么您绝对应该考虑像 tnetstrings 这样的东西。

除此之外, Hook read_chunk 是可行的,但首先您需要达到可以实际通过线路接收 block 的程度。然后,就像读取单个 block 、加密它们并转发它们一样简单。

关于apache - 支持分块编码请求的 HTTPS 代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23366819/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com