<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>