mirror of
https://github.com/Grasscutters/mitmproxy.git
synced 2024-11-26 18:18:25 +00:00
Bug: ask requestheaders before request body is read
Also add the beginnings of a test suite to exercise issues like this.
This commit is contained in:
parent
53b77fc475
commit
82ac7d05a6
@ -161,10 +161,11 @@ class HttpLayer(base.Layer):
|
|||||||
def _process_flow(self, f):
|
def _process_flow(self, f):
|
||||||
try:
|
try:
|
||||||
request = self.read_request_headers(f)
|
request = self.read_request_headers(f)
|
||||||
request.data.content = b"".join(self.read_request_body(request))
|
|
||||||
request.timestamp_end = time.time()
|
|
||||||
f.request = request
|
f.request = request
|
||||||
self.channel.ask("requestheaders", f)
|
self.channel.ask("requestheaders", f)
|
||||||
|
|
||||||
|
request.data.content = b"".join(self.read_request_body(request))
|
||||||
|
request.timestamp_end = time.time()
|
||||||
if request.headers.get("expect", "").lower() == "100-continue":
|
if request.headers.get("expect", "").lower() == "100-continue":
|
||||||
# TODO: We may have to use send_response_headers for HTTP2 here.
|
# TODO: We may have to use send_response_headers for HTTP2 here.
|
||||||
self.send_response(http.expect_continue_response)
|
self.send_response(http.expect_continue_response)
|
||||||
|
48
test/mitmproxy/test_eventsequence.py
Normal file
48
test/mitmproxy/test_eventsequence.py
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
from mitmproxy import events
|
||||||
|
import contextlib
|
||||||
|
from . import tservers
|
||||||
|
|
||||||
|
|
||||||
|
class EAddon:
|
||||||
|
def __init__(self, handlers):
|
||||||
|
self.failure = None
|
||||||
|
self.handlers = handlers
|
||||||
|
for i in events.Events:
|
||||||
|
def mkprox():
|
||||||
|
evt = i
|
||||||
|
|
||||||
|
def prox(*args, **kwargs):
|
||||||
|
if evt in self.handlers:
|
||||||
|
try:
|
||||||
|
handlers[evt](*args, **kwargs)
|
||||||
|
except AssertionError as e:
|
||||||
|
self.failure = e
|
||||||
|
return prox
|
||||||
|
setattr(self, i, mkprox())
|
||||||
|
|
||||||
|
def fail(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class SequenceTester:
|
||||||
|
@contextlib.contextmanager
|
||||||
|
def events(self, **kwargs):
|
||||||
|
m = EAddon(kwargs)
|
||||||
|
self.master.addons.add(m)
|
||||||
|
yield
|
||||||
|
self.master.addons.remove(m)
|
||||||
|
if m.failure:
|
||||||
|
raise m.failure
|
||||||
|
|
||||||
|
|
||||||
|
class TestBasic(tservers.HTTPProxyTest, SequenceTester):
|
||||||
|
def test_requestheaders(self):
|
||||||
|
|
||||||
|
def req(f):
|
||||||
|
assert f.request.headers
|
||||||
|
assert not f.request.content
|
||||||
|
|
||||||
|
with self.events(requestheaders=req):
|
||||||
|
p = self.pathoc()
|
||||||
|
with p.connect():
|
||||||
|
assert p.request("get:'%s/p/200':b@10" % self.server.urlbase).status_code == 200
|
Loading…
Reference in New Issue
Block a user