mirror of
https://github.com/Grasscutters/mitmproxy.git
synced 2024-11-22 15:37:45 +00:00
ASGIApp should ignore the HTTP flows loaded from somewhere (#4324)
This commit is contained in:
parent
4f46400184
commit
380ac072aa
@ -11,6 +11,7 @@ Unreleased: mitmproxy next
|
||||
* Addon to suppress unwanted error messages sent by mitmproxy. (@anneborcherding)
|
||||
* Updated imports and styles for web scanner helper addons. (@anneborcherding)
|
||||
* Inform when underscore-formatted options are used in client arg. (@jrblixt)
|
||||
* ASGIApp should ignore the HTTP flows loaded from somewhere. (@linw1995)
|
||||
* Binaries are now built with Python 3.9 (@mhils)
|
||||
* Fixed the web UI showing blank page on clicking details tab when server address is missing (@samhita-sopho)
|
||||
|
||||
|
@ -3,8 +3,8 @@ import urllib.parse
|
||||
|
||||
import asgiref.compatibility
|
||||
import asgiref.wsgi
|
||||
|
||||
from mitmproxy import ctx, http
|
||||
from mitmproxy.controller import DummyReply
|
||||
|
||||
|
||||
class ASGIApp:
|
||||
@ -24,9 +24,17 @@ class ASGIApp:
|
||||
def name(self) -> str:
|
||||
return f"asgiapp:{self.host}:{self.port}"
|
||||
|
||||
def should_serve(self, flow: http.HTTPFlow) -> bool:
|
||||
assert flow.reply
|
||||
return bool(
|
||||
(flow.request.pretty_host, flow.request.port) == (self.host, self.port)
|
||||
and not flow.reply.has_message
|
||||
and not isinstance(flow.reply, DummyReply) # ignore the HTTP flows of this app loaded from somewhere
|
||||
)
|
||||
|
||||
def request(self, flow: http.HTTPFlow) -> None:
|
||||
assert flow.reply
|
||||
if (flow.request.pretty_host, flow.request.port) == (self.host, self.port) and not flow.reply.has_message:
|
||||
if self.should_serve(flow):
|
||||
flow.reply.take() # pause hook completion
|
||||
asyncio.ensure_future(serve(self.asgi_app, flow))
|
||||
|
||||
|
@ -1,10 +1,15 @@
|
||||
import asyncio
|
||||
import json
|
||||
import sys
|
||||
from unittest import mock
|
||||
|
||||
import flask
|
||||
import pytest
|
||||
from flask import request
|
||||
|
||||
from .. import tservers
|
||||
from mitmproxy.addons import asgiapp
|
||||
from mitmproxy.test import tflow
|
||||
|
||||
tapp = flask.Flask(__name__)
|
||||
|
||||
@ -68,3 +73,12 @@ class TestApp(tservers.HTTPProxyTest):
|
||||
ret = p.request("get:'http://noresponseapp/'")
|
||||
assert ret.status_code == 500
|
||||
assert b"ASGI Error" in ret.content
|
||||
|
||||
@pytest.mark.skipif(sys.version_info < (3, 8), reason='requires Python 3.8 or higher')
|
||||
def test_app_not_serve_loading_flows(self):
|
||||
with mock.patch('mitmproxy.addons.asgiapp.serve') as mck:
|
||||
flow = tflow.tflow()
|
||||
flow.request.host = "testapp"
|
||||
flow.request.port = 80
|
||||
asyncio.run_coroutine_threadsafe(self.master.load_flow(flow), self.master.channel.loop).result()
|
||||
mck.assert_not_awaited()
|
||||
|
Loading…
Reference in New Issue
Block a user