aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYouhei Sakurai <sakurai.youhei@gmail.com>2015-02-27 02:44:47 +0900
committerYouhei Sakurai <sakurai.youhei@gmail.com>2015-02-27 02:44:47 +0900
commit77bb0b74ed9cf156490f52a162a4d1856694db4f (patch)
treeebaf0bd2e67052e5c3e1c56783abf0265225f02c
parentbd6c3f64c1f3102a4e91d4a964757821773781e0 (diff)
downloadmitmproxy-77bb0b74ed9cf156490f52a162a4d1856694db4f.tar.gz
mitmproxy-77bb0b74ed9cf156490f52a162a4d1856694db4f.tar.bz2
mitmproxy-77bb0b74ed9cf156490f52a162a4d1856694db4f.zip
Maybe it should work; https://github.com/mitmproxy/mitmproxy/issues/319
-rw-r--r--doc-src/features/responsestreaming.html3
-rw-r--r--examples/stream_modify.py11
-rw-r--r--libmproxy/protocol/http.py7
3 files changed, 20 insertions, 1 deletions
diff --git a/doc-src/features/responsestreaming.html b/doc-src/features/responsestreaming.html
index 47fafef7..59847c8f 100644
--- a/doc-src/features/responsestreaming.html
+++ b/doc-src/features/responsestreaming.html
@@ -40,6 +40,9 @@ Responses that should be tagged for streaming by setting their respective .strea
$!example("examples/stream.py")!$
+In addition, if the .stream attribute is set to callable(), .stream will work as a hook in chunk data processing.
+
+$!example("examples/stream_modify.py")!$
<h2>Implementation Details</h2>
diff --git a/examples/stream_modify.py b/examples/stream_modify.py
new file mode 100644
index 00000000..517f730a
--- /dev/null
+++ b/examples/stream_modify.py
@@ -0,0 +1,11 @@
+def modify(chunks):
+ """
+ chunks is a generator that can be used to iterate over all chunks.
+ Each chunk is a (prefix, content, suffix) tuple.
+ For example, in the case of chunked transfer encoding: ("3\r\n","foo","\r\n")
+ """
+ for prefix, content, suffix in chunks:
+ yield prefix, content.replace("foo","bar"), suffix
+
+def responseheaders(ctx, flow):
+ flow.response.stream = modify
diff --git a/libmproxy/protocol/http.py b/libmproxy/protocol/http.py
index 046d0b42..fff2b84f 100644
--- a/libmproxy/protocol/http.py
+++ b/libmproxy/protocol/http.py
@@ -1332,7 +1332,12 @@ class HTTPHandler(ProtocolHandler):
# incrementally:
h = flow.response._assemble_head(preserve_transfer_encoding=True)
self.c.client_conn.send(h)
- for chunk in http.read_http_body_chunked(self.c.server_conn.rfile,
+ for chunk in hasattr(flow.response.stream, "__call__") and \
+ flow.response.stream(http.read_http_body_chunked(self.c.server_conn.rfile,
+ flow.response.headers,
+ self.c.config.body_size_limit, flow.request.method,
+ flow.response.code, False, 4096)) or \
+ http.read_http_body_chunked(self.c.server_conn.rfile,
flow.response.headers,
self.c.config.body_size_limit, flow.request.method,
flow.response.code, False, 4096):