首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在mitmproxy中流式传输响应

如何在mitmproxy中流式传输响应
EN

Stack Overflow用户
提问于 2021-04-11 15:56:03
回答 1查看 271关注 0票数 0

由于我使用的互联网连接很糟糕,我不得不使用下载管理器下载大的包,然后将它们流式传输到chocolatey (它仍然缺乏恢复功能)。为了完成MITM工作,我使用了mitmproxy和一个简单的脚本。

脚本

代码语言:javascript
运行
复制
from mitmproxy import http

dlFileLoc = "C:\\Users\\Pouya\\Downloads\\flutter_windows_2.0.4-stable.zip"

def responseheaders(flow: http.HTTPFlow):
    flow.response.stream = True

def request(flow: http.HTTPFlow):
    if flow.request.pretty_host.find("storage.googleapis.com") >= 0:
        # flow.intercept()
        with open(dlFileLoc, mode="rb") as fb:
            flow.response = http.HTTPResponse.make(content=fb.read())
            # flow.resume()

将脚本加载到mitmdump

代码语言:javascript
运行
复制
mitmdump.exe -s D:\Code\cli\rend\main.py

chocolatey设置代理

代码语言:javascript
运行
复制
choco upgrade flutter -y --proxy http://127.0.0.1:8080

和mitmproxy崩溃

代码语言:javascript
运行
复制
127.0.0.1:50395: Traceback (most recent call last):
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\server.py", line 121, in handle
    root_layer()
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\modes\http_proxy.py", line 9, in __call__
    layer()
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\tls.py", line 285, in __call__
    layer()
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\http1.py", line 100, in __call__
    layer()
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\http.py", line 204, in __call__
    if not self._process_flow(flow):
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\http.py", line 277, in _process_flow
    return self.handle_regular_connect(f)
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\http.py", line 222, in handle_regular_connect
    layer()
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\tls.py", line 285, in __call__
    layer()
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\http1.py", line 100, in __call__
    layer()
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\http.py", line 204, in __call__
    if not self._process_flow(flow):
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\http.py", line 457, in _process_flow
    self.send_response_body(f.response, chunks)
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\http1.py", line 71, in send_response_body
    for chunk in http1.assemble_body(response.headers, chunks, response.trailers):
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\net\http\http1\assemble.py", line 44, in assemble_body
    for chunk in body_chunks:
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\net\http\http1\read.py", line 137, in read_body
    content = rfile.read(chunk_size)
AttributeError: 'NoneType' object has no attribute 'read'
Traceback (most recent call last):
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\server.py", line 121, in handle
    root_layer()
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\modes\http_proxy.py", line 9, in __call__
    layer()
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\tls.py", line 285, in __call__
    layer()
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\http1.py", line 100, in __call__
    layer()
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\http.py", line 204, in __call__
    if not self._process_flow(flow):
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\http.py", line 277, in _process_flow
    return self.handle_regular_connect(f)
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\http.py", line 222, in handle_regular_connect
    layer()
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\tls.py", line 285, in __call__
    layer()
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\http1.py", line 100, in __call__
    layer()
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\http.py", line 204, in __call__
    if not self._process_flow(flow):
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\http.py", line 457, in _process_flow
    self.send_response_body(f.response, chunks)
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\proxy\protocol\http1.py", line 71, in send_response_body
    for chunk in http1.assemble_body(response.headers, chunks, response.trailers):
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\net\http\http1\assemble.py", line 44, in assemble_body
    for chunk in body_chunks:
  File "C:\Users\Pouya\AppData\Roaming\Python\Python39\site-packages\mitmproxy\net\http\http1\read.py", line 137, in read_body
    content = rfile.read(chunk_size)
AttributeError: 'NoneType' object has no attribute 'read'

环境

代码语言:javascript
运行
复制
> mitmdump.exe --version
Mitmproxy: 6.0.2
Python:    3.9.4
OpenSSL:   OpenSSL 1.1.1i  8 Dec 2020
Platform:  Windows-10-10.0.19041-SP0
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-11 23:16:56

虽然我之前的脚本应该可以工作,但不知何故,我最终通过更改脚本使其工作,如下所示:

代码语言:javascript
运行
复制
from mitmproxy import http

dlFileLoc = "C:\\Users\\Pouya\\Downloads\\flutter_windows_2.0.4-stable.zip"


def request(flow: http.HTTPFlow):
    if flow.request.pretty_host.find("storage.googleapis.com") >= 0:
        with open(dlFileLoc, mode="rb") as fb:
            body = fb.read()
            size = str(len(body))
            flow.response = http.HTTPResponse.make(
                status_code=200,
                content=body,
                headers={
                    "Content-Type": "application/octet-stream",
                    "Content-Length": size,
                },
            )

然后将--set stream_large_bodies传递给一个合理的值,例如10Mb

代码语言:javascript
运行
复制
mitmdump.exe -s D:\Code\cli\rend\main.py --set stream_large_bodies=10m

巧克力必须通过mitmproxy请求

代码语言:javascript
运行
复制
choco upgrade flutter -y --proxy http://127.0.0.1:8080
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67042659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档