<pre style='margin:0'>
Chih-Hsuan Yen (yan12125) pushed a commit to branch master
in repository macports-ports.
</pre>
<p><a href="https://github.com/macports/macports-ports/commit/426e8338e55667f22479fa66dc7e1fafdd3e8f49">https://github.com/macports/macports-ports/commit/426e8338e55667f22479fa66dc7e1fafdd3e8f49</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 426e8338e55667f22479fa66dc7e1fafdd3e8f49
</span>Author: Chih-Hsuan Yen <yan12125@macports.org>
AuthorDate: Fri Feb 1 15:20:32 2019 +0800
<span style='display:block; white-space:pre;color:#404040;'> py-mitmproxy: add a patch for wsproto 0.13 compatibility
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> And several others to fix most test failures. The only remaining failure
</span><span style='display:block; white-space:pre;color:#404040;'> is `TestXSSScanner.test_find_unclaimed_URLs`. The fix appears to be too
</span><span style='display:block; white-space:pre;color:#404040;'> big to be backported and it's for an example script only, anyway.
</span>---
python/py-mitmproxy/Portfile | 11 +-
python/py-mitmproxy/files/mojave.patch | 32 +++
python/py-mitmproxy/files/pytest4.patch | 15 ++
python/py-mitmproxy/files/wsproto0.13.patch | 294 ++++++++++++++++++++++++++++
4 files changed, 350 insertions(+), 2 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-mitmproxy/Portfile b/python/py-mitmproxy/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index de59c32..5ed8e45 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/python/py-mitmproxy/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-mitmproxy/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -6,6 +6,7 @@ PortGroup github 1.0
</span>
github.setup mitmproxy mitmproxy 4.0.4 v
<span style='display:block; white-space:pre;background:#e0ffe0;'>+revision 1
</span>
name py-${github.project}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -29,8 +30,14 @@ checksums md5 d9f58513ab46777b60c15bff52a2239b \
</span> sha256 313c6aa2e801b3743a1fad57fdf6f1e8b001ea3a7a7744394fc48cc3f9512553 \
size 27132072
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# https://github.com/mitmproxy/mitmproxy/issues/3316
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-patchfiles update-certs.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# update_certs: https://github.com/mitmproxy/mitmproxy/issues/3316
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# wsproto0.13: https://github.com/mitmproxy/mitmproxy/pull/3459
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# pytest4: https://github.com/mitmproxy/mitmproxy/pull/3403
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# mojave: https://github.com/mitmproxy/mitmproxy/pull/3437
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+patchfiles update-certs.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ wsproto0.13.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ pytest4.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ mojave.patch
</span>
python.versions 36 37
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-mitmproxy/files/mojave.patch b/python/py-mitmproxy/files/mojave.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..0e4559f
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-mitmproxy/files/mojave.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,32 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From cc33f40f29dcd250e2dc3df77412fdec91f2d4eb Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Chih-Hsuan Yen <yen@chyen.cc>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Sat, 29 Dec 2018 21:24:46 +0800
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Fix a failing test on macOS Mojave
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ test/mitmproxy/test_proxy.py | 6 +++++-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 5 insertions(+), 1 deletion(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git test/mitmproxy/test_proxy.py test/mitmproxy/test_proxy.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 00086c4b5..c8cf6c334 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- test/mitmproxy/test_proxy.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ test/mitmproxy/test_proxy.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,4 +1,5 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import argparse
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import platform
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from unittest import mock
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import pytest
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -52,8 +53,11 @@ def test_certs(self, tdata):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class TestProxyServer:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @skip_windows
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ @pytest.mark.skipif(platform.mac_ver()[0].split('.')[:2] == ['10', '14'],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ reason='Skipping due to macOS Mojave')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def test_err(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- # binding to 0.0.0.0:1 works without special permissions on Windows
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ # binding to 0.0.0.0:1 works without special permissions on Windows and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ # macOS Mojave
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ conf = ProxyConfig(options.Options(listen_port=1))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ with pytest.raises(Exception, match="Error starting proxy server"):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ProxyServer(conf)
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-mitmproxy/files/pytest4.patch b/python/py-mitmproxy/files/pytest4.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..82e15b2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-mitmproxy/files/pytest4.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,15 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git test/mitmproxy/addons/test_readfile.py test/mitmproxy/addons/test_readfile.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 3d28d8b7d..94e18cdb3 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- test/mitmproxy/addons/test_readfile.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ test/mitmproxy/addons/test_readfile.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -30,8 +30,8 @@ def data():
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @pytest.fixture
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-def corrupt_data():
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- f = data()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++def corrupt_data(data):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ f = io.BytesIO(data.getvalue())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ f.seek(0, io.SEEK_END)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ f.write(b"qibble")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ f.seek(0)
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-mitmproxy/files/wsproto0.13.patch b/python/py-mitmproxy/files/wsproto0.13.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..5f21785
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-mitmproxy/files/wsproto0.13.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,294 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 106948d996d74bf5ff7e3511f35eefea0a90561f Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: rpigott <rpigott@berkeley.edu>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Sun, 27 Jan 2019 00:59:26 -0800
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH 1/4] update to wsproto 0.13
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ mitmproxy/proxy/protocol/websocket.py | 87 +++++++++++++--------------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ setup.py | 2 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 2 files changed, 44 insertions(+), 45 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git mitmproxy/proxy/protocol/websocket.py mitmproxy/proxy/protocol/websocket.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 0d1964a60..591bae7e0 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- mitmproxy/proxy/protocol/websocket.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ mitmproxy/proxy/protocol/websocket.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4,8 +4,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import wsproto
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from wsproto import events
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-from wsproto.connection import ConnectionType, WSConnection
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from wsproto import events, WSConnection
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from wsproto.connection import ConnectionType
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++from wsproto.events import AcceptConnection, CloseConnection, Message, Ping, Request
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from wsproto.extensions import PerMessageDeflate
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from mitmproxy import exceptions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -56,47 +57,44 @@ def __init__(self, ctx, handshake_flow):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if 'Sec-WebSocket-Extensions' in handshake_flow.response.headers:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if PerMessageDeflate.name in handshake_flow.response.headers['Sec-WebSocket-Extensions']:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extensions = [PerMessageDeflate()]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- self.connections[self.client_conn] = WSConnection(ConnectionType.SERVER,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- extensions=extensions)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- self.connections[self.server_conn] = WSConnection(ConnectionType.CLIENT,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- host=handshake_flow.request.host,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- resource=handshake_flow.request.path,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- extensions=extensions)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ self.connections[self.client_conn] = WSConnection(ConnectionType.SERVER)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ self.connections[self.server_conn] = WSConnection(ConnectionType.CLIENT)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if extensions:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- for conn in self.connections.values():
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- conn.extensions[0].finalize(conn, handshake_flow.response.headers['Sec-WebSocket-Extensions'])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ extensions[0].finalize(handshake_flow.response.headers['Sec-WebSocket-Extensions'])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- data = self.connections[self.server_conn].bytes_to_send()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- self.connections[self.client_conn].receive_bytes(data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ request = Request(extensions = extensions, host = handshake_flow.request.host, target = handshake_flow.request.path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ data = self.connections[self.server_conn].send(request)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ self.connections[self.client_conn].receive_data(data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ event = next(self.connections[self.client_conn].events())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- assert isinstance(event, events.ConnectionRequested)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert isinstance(event, events.Request)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- self.connections[self.client_conn].accept(event)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- self.connections[self.server_conn].receive_bytes(self.connections[self.client_conn].bytes_to_send())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- assert isinstance(next(self.connections[self.server_conn].events()), events.ConnectionEstablished)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ data = self.connections[self.client_conn].send(AcceptConnection(extensions=extensions))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ self.connections[self.server_conn].receive_data(data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ assert isinstance(next(self.connections[self.server_conn].events()), events.AcceptConnection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def _handle_event(self, event, source_conn, other_conn, is_server):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if isinstance(event, events.DataReceived):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return self._handle_data_received(event, source_conn, other_conn, is_server)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- elif isinstance(event, events.PingReceived):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return self._handle_ping_received(event, source_conn, other_conn, is_server)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- elif isinstance(event, events.PongReceived):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return self._handle_pong_received(event, source_conn, other_conn, is_server)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- elif isinstance(event, events.ConnectionClosed):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return self._handle_connection_closed(event, source_conn, other_conn, is_server)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if isinstance(event, events.Message):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return self._handle_message(event, source_conn, other_conn, is_server)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ elif isinstance(event, events.Ping):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return self._handle_ping(event, source_conn, other_conn, is_server)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ elif isinstance(event, events.Pong):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return self._handle_pong(event, source_conn, other_conn, is_server)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ elif isinstance(event, events.CloseConnection):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return self._handle_close_connection(event, source_conn, other_conn, is_server)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # fail-safe for unhandled events
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return True # pragma: no cover
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- def _handle_data_received(self, event, source_conn, other_conn, is_server):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ def _handle_message(self, event, source_conn, other_conn, is_server):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fb = self.server_frame_buffer if is_server else self.client_frame_buffer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fb.append(event.data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if event.message_finished:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ original_chunk_sizes = [len(f) for f in fb]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if isinstance(event, events.TextReceived):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if isinstance(event, events.TextMessage):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ message_type = wsproto.frame_protocol.Opcode.TEXT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ payload = ''.join(fb)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ else:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -127,19 +125,20 @@ def get_chunk(payload):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ yield (payload[i:i + chunk_size], True if i + chunk_size >= len(payload) else False)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for chunk, final in get_chunk(websocket_message.content):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- self.connections[other_conn].send_data(chunk, final)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- other_conn.send(self.connections[other_conn].bytes_to_send())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ data = self.connections[other_conn].send(Message(data = chunk, message_finished = final))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ other_conn.send(data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if self.flow.stream:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- self.connections[other_conn].send_data(event.data, event.message_finished)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- other_conn.send(self.connections[other_conn].bytes_to_send())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ data = self.connections[other_conn].send(Message(data = event.data, message_finished = event.message_finished))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ other_conn.send(data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return True
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- def _handle_ping_received(self, event, source_conn, other_conn, is_server):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- # PING is automatically answered with a PONG by wsproto
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- self.connections[other_conn].ping()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- other_conn.send(self.connections[other_conn].bytes_to_send())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- source_conn.send(self.connections[source_conn].bytes_to_send())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ def _handle_ping(self, event, source_conn, other_conn, is_server):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ # Use event.response to create the approprate Pong response
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ data = self.connections[other_conn].send(Ping())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ other_conn.send(data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ data = self.connections[source_conn].send(event.response())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ source_conn.send(data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ self.log(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "Ping Received from {}".format("server" if is_server else "client"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "info",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -147,7 +146,7 @@ def _handle_ping_received(self, event, source_conn, other_conn, is_server):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return True
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- def _handle_pong_received(self, event, source_conn, other_conn, is_server):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ def _handle_pong(self, event, source_conn, other_conn, is_server):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ self.log(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "Pong Received from {}".format("server" if is_server else "client"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "info",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -155,14 +154,15 @@ def _handle_pong_received(self, event, source_conn, other_conn, is_server):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return True
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- def _handle_connection_closed(self, event, source_conn, other_conn, is_server):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ def _handle_close_connection(self, event, source_conn, other_conn, is_server):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ self.flow.close_sender = "server" if is_server else "client"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ self.flow.close_code = event.code
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ self.flow.close_reason = event.reason
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- self.connections[other_conn].close(event.code, event.reason)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- other_conn.send(self.connections[other_conn].bytes_to_send())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- source_conn.send(self.connections[source_conn].bytes_to_send())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ data = self.connections[other_conn].send(CloseConnection(code=event.code, reason=event.reason))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ other_conn.send(data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ data = self.connections[source_conn].send(event.response())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ source_conn.send(data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return False
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -170,8 +170,7 @@ def _inject_messages(self, endpoint, message_queue):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while True:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ try:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ payload = message_queue.get_nowait()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- self.connections[endpoint].send_data(payload, final=True)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- data = self.connections[endpoint].bytes_to_send()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ data = self.connections[endpoint].send(Message(data = payload, message_finished = True))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ endpoint.send(data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ except queue.Empty:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -197,8 +196,8 @@ def __call__(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ is_server = (source_conn == self.server_conn)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ frame = websockets.Frame.from_file(source_conn.rfile)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- self.connections[source_conn].receive_bytes(bytes(frame))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- source_conn.send(self.connections[source_conn].bytes_to_send())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ data = self.connections[source_conn].receive_data(bytes(frame))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ source_conn.send(data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if close_received:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 2af71a4486494b64431558da2e068dc1babe65fa Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: rpigott <rpigott@berkeley.edu>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Wed, 30 Jan 2019 18:12:05 -0800
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH 2/4] Separate client and server PerMessageDefalte extension
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ per #3460
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ mitmproxy/proxy/protocol/websocket.py | 16 ++++++++++------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 10 insertions(+), 6 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git mitmproxy/proxy/protocol/websocket.py mitmproxy/proxy/protocol/websocket.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 591bae7e0..fd2aed157 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- mitmproxy/proxy/protocol/websocket.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ mitmproxy/proxy/protocol/websocket.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -53,24 +53,28 @@ def __init__(self, ctx, handshake_flow):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ self.connections: dict[object, WSConnection] = {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- extensions = []
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ client_extensions = []
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ server_extensions = []
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if 'Sec-WebSocket-Extensions' in handshake_flow.response.headers:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if PerMessageDeflate.name in handshake_flow.response.headers['Sec-WebSocket-Extensions']:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- extensions = [PerMessageDeflate()]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ client_extensions = [PerMessageDeflate()]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ server_extensions = [PerMessageDeflate()]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ self.connections[self.client_conn] = WSConnection(ConnectionType.SERVER)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ self.connections[self.server_conn] = WSConnection(ConnectionType.CLIENT)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if extensions:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- extensions[0].finalize(handshake_flow.response.headers['Sec-WebSocket-Extensions'])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if client_extensions:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ client_extensions[0].finalize(handshake_flow.response.headers['Sec-WebSocket-Extensions'])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if server_extensions:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ server_extensions[0].finalize(handshake_flow.response.headers['Sec-WebSocket-Extensions'])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- request = Request(extensions = extensions, host = handshake_flow.request.host, target = handshake_flow.request.path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ request = Request(extensions = client_extensions, host = handshake_flow.request.host, target = handshake_flow.request.path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data = self.connections[self.server_conn].send(request)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ self.connections[self.client_conn].receive_data(data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ event = next(self.connections[self.client_conn].events())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert isinstance(event, events.Request)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- data = self.connections[self.client_conn].send(AcceptConnection(extensions=extensions))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ data = self.connections[self.client_conn].send(AcceptConnection(extensions=server_extensions))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ self.connections[self.server_conn].receive_data(data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert isinstance(next(self.connections[self.server_conn].events()), events.AcceptConnection)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 92fc87bc4c3922758fe9862fd309886f06fcb16b Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: rpigott <rpigott@berkeley.edu>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Wed, 30 Jan 2019 23:44:35 -0800
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH 3/4] whitespace error
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ mitmproxy/proxy/protocol/websocket.py | 2 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 1 insertion(+), 1 deletion(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git mitmproxy/proxy/protocol/websocket.py mitmproxy/proxy/protocol/websocket.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index fd2aed157..191da7a28 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- mitmproxy/proxy/protocol/websocket.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ mitmproxy/proxy/protocol/websocket.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -64,7 +64,7 @@ def __init__(self, ctx, handshake_flow):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if client_extensions:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ client_extensions[0].finalize(handshake_flow.response.headers['Sec-WebSocket-Extensions'])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if server_extensions:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if server_extensions:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ server_extensions[0].finalize(handshake_flow.response.headers['Sec-WebSocket-Extensions'])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ request = Request(extensions = client_extensions, host = handshake_flow.request.host, target = handshake_flow.request.path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 7fa209790e0df869d0d3c96ba75cb1a85943fc7c Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: rpigott <rpigott@berkeley.edu>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Thu, 31 Jan 2019 12:34:00 -0800
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH 4/4] removed whitespace in kwargs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ mitmproxy/proxy/protocol/websocket.py | 8 ++++----
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 4 insertions(+), 4 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git mitmproxy/proxy/protocol/websocket.py mitmproxy/proxy/protocol/websocket.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 191da7a28..f5ac6a29d 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- mitmproxy/proxy/protocol/websocket.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ mitmproxy/proxy/protocol/websocket.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -67,7 +67,7 @@ def __init__(self, ctx, handshake_flow):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if server_extensions:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ server_extensions[0].finalize(handshake_flow.response.headers['Sec-WebSocket-Extensions'])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- request = Request(extensions = client_extensions, host = handshake_flow.request.host, target = handshake_flow.request.path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ request = Request(extensions=client_extensions, host=handshake_flow.request.host, target=handshake_flow.request.path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ data = self.connections[self.server_conn].send(request)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ self.connections[self.client_conn].receive_data(data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -129,11 +129,11 @@ def get_chunk(payload):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ yield (payload[i:i + chunk_size], True if i + chunk_size >= len(payload) else False)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ for chunk, final in get_chunk(websocket_message.content):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- data = self.connections[other_conn].send(Message(data = chunk, message_finished = final))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ data = self.connections[other_conn].send(Message(data=chunk, message_finished=final))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ other_conn.send(data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if self.flow.stream:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- data = self.connections[other_conn].send(Message(data = event.data, message_finished = event.message_finished))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ data = self.connections[other_conn].send(Message(data=event.data, message_finished=event.message_finished))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ other_conn.send(data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return True
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -174,7 +174,7 @@ def _inject_messages(self, endpoint, message_queue):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while True:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ try:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ payload = message_queue.get_nowait()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- data = self.connections[endpoint].send(Message(data = payload, message_finished = True))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ data = self.connections[endpoint].send(Message(data=payload, message_finished=True))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ endpoint.send(data)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ except queue.Empty:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break
</span></pre><pre style='margin:0'>
</pre>