aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaximilian Hils <git@maximilianhils.com>2015-09-11 01:18:17 +0200
committerMaximilian Hils <git@maximilianhils.com>2015-09-11 01:18:17 +0200
commitc159c8ca13afa6a909f456e41c1a3f57b98baf8a (patch)
treee502fbd569dd417034c4446341f0f750c371afa8
parent30f0ee40c51fc6bc911169f044677e235087161e (diff)
downloadmitmproxy-c159c8ca13afa6a909f456e41c1a3f57b98baf8a.tar.gz
mitmproxy-c159c8ca13afa6a909f456e41c1a3f57b98baf8a.tar.bz2
mitmproxy-c159c8ca13afa6a909f456e41c1a3f57b98baf8a.zip
fix chunked encoding
-rw-r--r--libmproxy/protocol/http.py22
-rw-r--r--test/test_server.py4
2 files changed, 16 insertions, 10 deletions
diff --git a/libmproxy/protocol/http.py b/libmproxy/protocol/http.py
index 308fa0a0..636b72f4 100644
--- a/libmproxy/protocol/http.py
+++ b/libmproxy/protocol/http.py
@@ -1,7 +1,9 @@
from __future__ import (absolute_import, print_function, division)
-import six
+import itertools
import sys
+import six
+
from netlib import tcp
from netlib.http import http1, HttpErrorConnClosed, HttpError, Headers
from netlib.http.semantics import CONTENT_MISSING
@@ -9,14 +11,13 @@ from netlib.tcp import NetLibError, Address
from netlib.http.http1 import HTTP1Protocol
from netlib.http.http2 import HTTP2Protocol
from netlib.http.http2.frame import GoAwayFrame, PriorityFrame, WindowUpdateFrame
-
from .. import utils
from ..exceptions import InvalidCredentials, HttpException, ProtocolException
from ..models import (
HTTPFlow, HTTPRequest, HTTPResponse, make_error_response, make_connect_response, Error
)
from .base import Layer, Kill
-from .rawtcp import RawTCPLayer
+
class _HttpLayer(Layer):
supports_streaming = False
@@ -108,16 +109,21 @@ class Http1Layer(_StreamingHttpLayer):
response,
preserve_transfer_encoding=True
)
- self.client_conn.send(h + "\r\n")
+ self.client_conn.wfile.write(h + "\r\n")
+ self.client_conn.wfile.flush()
def send_response_body(self, response, chunks):
if self.client_protocol.has_chunked_encoding(response.headers):
- chunks = (
- "%d\r\n%s\r\n" % (len(chunk), chunk)
- for chunk in chunks
+ chunks = itertools.chain(
+ (
+ "{:x}\r\n{}\r\n".format(len(chunk), chunk)
+ for chunk in chunks if chunk
+ ),
+ ("0\r\n\r\n",)
)
for chunk in chunks:
- self.client_conn.send(chunk)
+ self.client_conn.wfile.write(chunk)
+ self.client_conn.wfile.flush()
def check_close_connection(self, flow):
close_connection = (
diff --git a/test/test_server.py b/test/test_server.py
index 829b5f0a..49258791 100644
--- a/test/test_server.py
+++ b/test/test_server.py
@@ -711,7 +711,7 @@ class TestStreamRequest(tservers.HTTPProxTest):
connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connection.connect(("127.0.0.1", self.proxy.port))
fconn = connection.makefile()
- spec = '200:h"Transfer-Encoding"="chunked":r:b"4\\r\\nthis\\r\\n7\\r\\nisatest\\r\\n0\\r\\n\\r\\n"'
+ spec = '200:h"Transfer-Encoding"="chunked":r:b"4\\r\\nthis\\r\\n11\\r\\nisatest__reachhex\\r\\n0\\r\\n\\r\\n"'
connection.send(
"GET %s/p/%s HTTP/1.1\r\n" %
(self.server.urlbase, spec))
@@ -726,7 +726,7 @@ class TestStreamRequest(tservers.HTTPProxTest):
chunks = list(protocol.read_http_body_chunked(
resp.headers, None, "GET", 200, False
))
- assert chunks == ["this", "isatest", ""]
+ assert chunks == ["this", "isatest__reachhex"]
connection.close()