diff options
author | leot <leot@pkgsrc.org> | 2019-07-21 12:16:28 +0000 |
---|---|---|
committer | leot <leot@pkgsrc.org> | 2019-07-21 12:16:28 +0000 |
commit | 609db05fabd6652af5795efc7cfa7e89178a3d28 (patch) | |
tree | 9ffa5d31e05f25aa06c3286e6a46a1bdbd1c0a4f /net/mitmproxy | |
parent | be5e4c333fe15c2b51183144e70879d2c2d6971d (diff) | |
download | pkgsrc-609db05fabd6652af5795efc7cfa7e89178a3d28.tar.gz |
mitmproxy: Fix support with newer py-wsproto
Backport upstream commit 106948d996d74bf5ff7e3511f35eefea0a90561f
(except setup.py change) to fix support with py-wsproto 0.13.0 and newer.
PKGREVISION++
Diffstat (limited to 'net/mitmproxy')
-rw-r--r-- | net/mitmproxy/Makefile | 4 | ||||
-rw-r--r-- | net/mitmproxy/distinfo | 4 | ||||
-rw-r--r-- | net/mitmproxy/patches/patch-mitmproxy_proxy_protocol_websocket.py | 157 |
3 files changed, 158 insertions, 7 deletions
diff --git a/net/mitmproxy/Makefile b/net/mitmproxy/Makefile index 560c1c1ce95..11fcdef4fc1 100644 --- a/net/mitmproxy/Makefile +++ b/net/mitmproxy/Makefile @@ -1,7 +1,7 @@ -# $NetBSD: Makefile,v 1.25 2019/04/26 13:14:08 maya Exp $ +# $NetBSD: Makefile,v 1.26 2019/07/21 12:16:28 leot Exp $ DISTNAME= mitmproxy-4.0.4 -PKGREVISION= 2 +PKGREVISION= 3 CATEGORIES= net MASTER_SITES= ${MASTER_SITE_GITHUB:=mitmproxy/} GITHUB_TAG= v${PKGVERSION_NOREV} diff --git a/net/mitmproxy/distinfo b/net/mitmproxy/distinfo index b479f29a8ab..41df7ee8574 100644 --- a/net/mitmproxy/distinfo +++ b/net/mitmproxy/distinfo @@ -1,7 +1,7 @@ -$NetBSD: distinfo,v 1.16 2019/04/15 10:19:04 leot Exp $ +$NetBSD: distinfo,v 1.17 2019/07/21 12:16:28 leot Exp $ SHA1 (mitmproxy-4.0.4.tar.gz) = 67871cbf7751d34d254ccc733f5e2cd23fbe8faf RMD160 (mitmproxy-4.0.4.tar.gz) = d4935a325081544ef0cc9b5551d5eb976ce21777 SHA512 (mitmproxy-4.0.4.tar.gz) = e08ea8b1c75a95b822c463625509037bbc8a979161cacaa1f0185f98df8d6d7e5400925365dbbe70d18751251b1005824f739a8cd035c0389f7b4aea562adfb3 Size (mitmproxy-4.0.4.tar.gz) = 27131713 bytes -SHA1 (patch-mitmproxy_proxy_protocol_websocket.py) = 83337b732b156707308506fe9378571e0d2711bc +SHA1 (patch-mitmproxy_proxy_protocol_websocket.py) = 3a3a67daa4190a150070cf44b007f8b97bee9278 diff --git a/net/mitmproxy/patches/patch-mitmproxy_proxy_protocol_websocket.py b/net/mitmproxy/patches/patch-mitmproxy_proxy_protocol_websocket.py index 4a696daf62c..695308417ba 100644 --- a/net/mitmproxy/patches/patch-mitmproxy_proxy_protocol_websocket.py +++ b/net/mitmproxy/patches/patch-mitmproxy_proxy_protocol_websocket.py @@ -1,10 +1,11 @@ -$NetBSD: patch-mitmproxy_proxy_protocol_websocket.py,v 1.1 2019/04/15 10:19:55 leot Exp $ +$NetBSD: patch-mitmproxy_proxy_protocol_websocket.py,v 1.2 2019/07/21 12:16:28 leot Exp $ -Adjust for py-wsproto 0.13.0. +Backport upstream commit 106948d996d74bf5ff7e3511f35eefea0a90561f +(minus setup.py change) to fix support with py-wsproto 0.13.0. --- mitmproxy/proxy/protocol/websocket.py.orig 2018-07-31 12:01:45.000000000 +0000 +++ mitmproxy/proxy/protocol/websocket.py -@@ -4,8 +4,8 @@ from OpenSSL import SSL +@@ -4,8 +4,9 @@ from OpenSSL import SSL import wsproto @@ -12,6 +13,156 @@ Adjust for py-wsproto 0.13.0. -from wsproto.connection import ConnectionType, WSConnection +from wsproto import events, WSConnection +from wsproto.connection import ConnectionType ++from wsproto.events import AcceptConnection, CloseConnection, Message, Ping, Request from wsproto.extensions import PerMessageDeflate from mitmproxy import exceptions +@@ -56,47 +57,44 @@ class WebSocketLayer(base.Layer): + if 'Sec-WebSocket-Extensions' in handshake_flow.response.headers: + if PerMessageDeflate.name in handshake_flow.response.headers['Sec-WebSocket-Extensions']: + extensions = [PerMessageDeflate()] +- self.connections[self.client_conn] = WSConnection(ConnectionType.SERVER, +- extensions=extensions) +- self.connections[self.server_conn] = WSConnection(ConnectionType.CLIENT, +- host=handshake_flow.request.host, +- resource=handshake_flow.request.path, +- extensions=extensions) ++ self.connections[self.client_conn] = WSConnection(ConnectionType.SERVER) ++ self.connections[self.server_conn] = WSConnection(ConnectionType.CLIENT) ++ + if extensions: +- for conn in self.connections.values(): +- conn.extensions[0].finalize(conn, handshake_flow.response.headers['Sec-WebSocket-Extensions']) ++ extensions[0].finalize(handshake_flow.response.headers['Sec-WebSocket-Extensions']) + +- data = self.connections[self.server_conn].bytes_to_send() +- self.connections[self.client_conn].receive_bytes(data) ++ request = Request(extensions = extensions, host = handshake_flow.request.host, target = handshake_flow.request.path) ++ data = self.connections[self.server_conn].send(request) ++ self.connections[self.client_conn].receive_data(data) + + event = next(self.connections[self.client_conn].events()) +- assert isinstance(event, events.ConnectionRequested) ++ assert isinstance(event, events.Request) + +- self.connections[self.client_conn].accept(event) +- self.connections[self.server_conn].receive_bytes(self.connections[self.client_conn].bytes_to_send()) +- assert isinstance(next(self.connections[self.server_conn].events()), events.ConnectionEstablished) ++ data = self.connections[self.client_conn].send(AcceptConnection(extensions=extensions)) ++ self.connections[self.server_conn].receive_data(data) ++ assert isinstance(next(self.connections[self.server_conn].events()), events.AcceptConnection) + + def _handle_event(self, event, source_conn, other_conn, is_server): +- if isinstance(event, events.DataReceived): +- return self._handle_data_received(event, source_conn, other_conn, is_server) +- elif isinstance(event, events.PingReceived): +- return self._handle_ping_received(event, source_conn, other_conn, is_server) +- elif isinstance(event, events.PongReceived): +- return self._handle_pong_received(event, source_conn, other_conn, is_server) +- elif isinstance(event, events.ConnectionClosed): +- return self._handle_connection_closed(event, source_conn, other_conn, is_server) ++ if isinstance(event, events.Message): ++ return self._handle_message(event, source_conn, other_conn, is_server) ++ elif isinstance(event, events.Ping): ++ return self._handle_ping(event, source_conn, other_conn, is_server) ++ elif isinstance(event, events.Pong): ++ return self._handle_pong(event, source_conn, other_conn, is_server) ++ elif isinstance(event, events.CloseConnection): ++ return self._handle_close_connection(event, source_conn, other_conn, is_server) + + # fail-safe for unhandled events + return True # pragma: no cover + +- def _handle_data_received(self, event, source_conn, other_conn, is_server): ++ def _handle_message(self, event, source_conn, other_conn, is_server): + fb = self.server_frame_buffer if is_server else self.client_frame_buffer + fb.append(event.data) + + if event.message_finished: + original_chunk_sizes = [len(f) for f in fb] + +- if isinstance(event, events.TextReceived): ++ if isinstance(event, events.TextMessage): + message_type = wsproto.frame_protocol.Opcode.TEXT + payload = ''.join(fb) + else: +@@ -127,19 +125,20 @@ class WebSocketLayer(base.Layer): + yield (payload[i:i + chunk_size], True if i + chunk_size >= len(payload) else False) + + for chunk, final in get_chunk(websocket_message.content): +- self.connections[other_conn].send_data(chunk, final) +- other_conn.send(self.connections[other_conn].bytes_to_send()) ++ data = self.connections[other_conn].send(Message(data = chunk, message_finished = final)) ++ other_conn.send(data) + + if self.flow.stream: +- self.connections[other_conn].send_data(event.data, event.message_finished) +- other_conn.send(self.connections[other_conn].bytes_to_send()) ++ data = self.connections[other_conn].send(Message(data = event.data, message_finished = event.message_finished)) ++ other_conn.send(data) + return True + +- def _handle_ping_received(self, event, source_conn, other_conn, is_server): +- # PING is automatically answered with a PONG by wsproto +- self.connections[other_conn].ping() +- other_conn.send(self.connections[other_conn].bytes_to_send()) +- source_conn.send(self.connections[source_conn].bytes_to_send()) ++ def _handle_ping(self, event, source_conn, other_conn, is_server): ++ # Use event.response to create the approprate Pong response ++ data = self.connections[other_conn].send(Ping()) ++ other_conn.send(data) ++ data = self.connections[source_conn].send(event.response()) ++ source_conn.send(data) + self.log( + "Ping Received from {}".format("server" if is_server else "client"), + "info", +@@ -147,7 +146,7 @@ class WebSocketLayer(base.Layer): + ) + return True + +- def _handle_pong_received(self, event, source_conn, other_conn, is_server): ++ def _handle_pong(self, event, source_conn, other_conn, is_server): + self.log( + "Pong Received from {}".format("server" if is_server else "client"), + "info", +@@ -155,14 +154,15 @@ class WebSocketLayer(base.Layer): + ) + return True + +- def _handle_connection_closed(self, event, source_conn, other_conn, is_server): ++ def _handle_close_connection(self, event, source_conn, other_conn, is_server): + self.flow.close_sender = "server" if is_server else "client" + self.flow.close_code = event.code + self.flow.close_reason = event.reason + +- self.connections[other_conn].close(event.code, event.reason) +- other_conn.send(self.connections[other_conn].bytes_to_send()) +- source_conn.send(self.connections[source_conn].bytes_to_send()) ++ data = self.connections[other_conn].send(CloseConnection(code=event.code, reason=event.reason)) ++ other_conn.send(data) ++ data = self.connections[source_conn].send(event.response()) ++ source_conn.send(data) + + return False + +@@ -170,8 +170,7 @@ class WebSocketLayer(base.Layer): + while True: + try: + payload = message_queue.get_nowait() +- self.connections[endpoint].send_data(payload, final=True) +- data = self.connections[endpoint].bytes_to_send() ++ data = self.connections[endpoint].send(Message(data = payload, message_finished = True)) + endpoint.send(data) + except queue.Empty: + break +@@ -197,8 +196,8 @@ class WebSocketLayer(base.Layer): + is_server = (source_conn == self.server_conn) + + frame = websockets.Frame.from_file(source_conn.rfile) +- self.connections[source_conn].receive_bytes(bytes(frame)) +- source_conn.send(self.connections[source_conn].bytes_to_send()) ++ data = self.connections[source_conn].receive_data(bytes(frame)) ++ source_conn.send(data) + + if close_received: + return |