aboutsummaryrefslogtreecommitdiffstats
path: root/libmproxy
diff options
context:
space:
mode:
authorMaximilian Hils <git@maximilianhils.com>2015-04-10 14:59:38 +0200
committerMaximilian Hils <git@maximilianhils.com>2015-04-10 14:59:38 +0200
commit6852eb9d0af5cf7196da5cad2ccf3b036e348226 (patch)
tree7c892af020a728ee86c791954362ba1aa55ab2b7 /libmproxy
parentf37efecd0a22313eacad33251512ef371557fde7 (diff)
downloadmitmproxy-6852eb9d0af5cf7196da5cad2ccf3b036e348226.tar.gz
mitmproxy-6852eb9d0af5cf7196da5cad2ccf3b036e348226.tar.bz2
mitmproxy-6852eb9d0af5cf7196da5cad2ccf3b036e348226.zip
fix #553
Diffstat (limited to 'libmproxy')
-rw-r--r--libmproxy/protocol/http.py27
1 files changed, 25 insertions, 2 deletions
diff --git a/libmproxy/protocol/http.py b/libmproxy/protocol/http.py
index c763db4c..05657ea6 100644
--- a/libmproxy/protocol/http.py
+++ b/libmproxy/protocol/http.py
@@ -328,9 +328,22 @@ class HTTPRequest(HTTPMessage):
)
@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
+
+ 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 = (
None, None, None, None, None, None, None, None, None, None)
@@ -385,6 +398,15 @@ class HTTPRequest(HTTPMessage):
if headers is None:
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:
content = http.read_http_body(rfile, headers, body_size_limit,
method, None, True)
@@ -1062,7 +1084,8 @@ class HTTPHandler(ProtocolHandler):
try:
req = HTTPRequest.from_stream(
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:
# don't throw an error for disconnects that happen