mirror of
https://github.com/Grasscutters/mitmproxy.git
synced 2024-11-27 02:24:18 +00:00
fix #553
This commit is contained in:
parent
f37efecd0a
commit
6852eb9d0a
@ -328,9 +328,22 @@ class HTTPRequest(HTTPMessage):
|
|||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_stream(cls, rfile, include_body=True, body_size_limit=None):
|
def from_stream(cls, rfile, include_body=True, body_size_limit=None, wfile=None):
|
||||||
"""
|
"""
|
||||||
Parse an HTTP request from a file stream
|
Parse an HTTP request from a file stream
|
||||||
|
|
||||||
|
Args:
|
||||||
|
rfile (file): Input file to read from
|
||||||
|
include_body (bool): Read response body as well
|
||||||
|
body_size_limit (bool): Maximum body size
|
||||||
|
wfile (file): If specified, HTTP Expect headers are handled automatically.
|
||||||
|
by writing a HTTP 100 CONTINUE response to the stream.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
HTTPRequest: The HTTP request
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
HttpError: If the input is invalid.
|
||||||
"""
|
"""
|
||||||
httpversion, host, port, scheme, method, path, headers, content, timestamp_start, timestamp_end = (
|
httpversion, host, port, scheme, method, path, headers, content, timestamp_start, timestamp_end = (
|
||||||
None, None, None, None, None, None, None, None, None, None)
|
None, None, None, None, None, None, None, None, None, None)
|
||||||
@ -385,6 +398,15 @@ class HTTPRequest(HTTPMessage):
|
|||||||
if headers is None:
|
if headers is None:
|
||||||
raise http.HttpError(400, "Invalid headers")
|
raise http.HttpError(400, "Invalid headers")
|
||||||
|
|
||||||
|
expect_header = headers.get_first("expect")
|
||||||
|
if expect_header and expect_header.lower() == "100-continue" and httpversion >= (1, 1):
|
||||||
|
wfile.write(
|
||||||
|
'HTTP/1.1 100 Continue\r\n'
|
||||||
|
'\r\n'
|
||||||
|
)
|
||||||
|
wfile.flush()
|
||||||
|
del headers['expect']
|
||||||
|
|
||||||
if include_body:
|
if include_body:
|
||||||
content = http.read_http_body(rfile, headers, body_size_limit,
|
content = http.read_http_body(rfile, headers, body_size_limit,
|
||||||
method, None, True)
|
method, None, True)
|
||||||
@ -1062,7 +1084,8 @@ class HTTPHandler(ProtocolHandler):
|
|||||||
try:
|
try:
|
||||||
req = HTTPRequest.from_stream(
|
req = HTTPRequest.from_stream(
|
||||||
self.c.client_conn.rfile,
|
self.c.client_conn.rfile,
|
||||||
body_size_limit=self.c.config.body_size_limit
|
body_size_limit=self.c.config.body_size_limit,
|
||||||
|
wfile=self.c.client_conn.wfile
|
||||||
)
|
)
|
||||||
except tcp.NetLibError:
|
except tcp.NetLibError:
|
||||||
# don't throw an error for disconnects that happen
|
# don't throw an error for disconnects that happen
|
||||||
|
@ -55,6 +55,14 @@ class TestHTTPRequest:
|
|||||||
r.update_host_header()
|
r.update_host_header()
|
||||||
assert "Host" in r.headers
|
assert "Host" in r.headers
|
||||||
|
|
||||||
|
def test_expect_header(self):
|
||||||
|
s = StringIO("GET / HTTP/1.1\r\nContent-Length: 3\r\nExpect: 100-continue\r\n\r\nfoobar")
|
||||||
|
w = StringIO()
|
||||||
|
r = HTTPRequest.from_stream(s, wfile=w)
|
||||||
|
assert w.getvalue() == "HTTP/1.1 100 Continue\r\n\r\n"
|
||||||
|
assert r.content == "foo"
|
||||||
|
assert s.read(3) == "bar"
|
||||||
|
|
||||||
def test_authority_form_in(self):
|
def test_authority_form_in(self):
|
||||||
s = StringIO("CONNECT oops-no-port.com HTTP/1.1")
|
s = StringIO("CONNECT oops-no-port.com HTTP/1.1")
|
||||||
tutils.raises("Bad HTTP request line", HTTPRequest.from_stream, s)
|
tutils.raises("Bad HTTP request line", HTTPRequest.from_stream, s)
|
||||||
|
Loading…
Reference in New Issue
Block a user