From patchwork Wed May 23 21:58:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joseph Kogut X-Patchwork-Id: 919410 Return-Path: X-Original-To: incoming-buildroot@patchwork.ozlabs.org Delivered-To: patchwork-incoming-buildroot@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=busybox.net (client-ip=140.211.166.133; helo=hemlock.osuosl.org; envelope-from=buildroot-bounces@busybox.net; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="ENjsWLNO"; dkim-atps=neutral Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 40rmcL6wp4z9s0W for ; Thu, 24 May 2018 07:58:42 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id EA60A8987A; Wed, 23 May 2018 21:58:38 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from hemlock.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id stgdafffIb2O; Wed, 23 May 2018 21:58:36 +0000 (UTC) Received: from ash.osuosl.org (ash.osuosl.org [140.211.166.34]) by hemlock.osuosl.org (Postfix) with ESMTP id AB6F489869; Wed, 23 May 2018 21:58:36 +0000 (UTC) X-Original-To: buildroot@lists.busybox.net Delivered-To: buildroot@osuosl.org Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by ash.osuosl.org (Postfix) with ESMTP id 913611CEBE8 for ; Wed, 23 May 2018 21:58:35 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 8DD1887AB6 for ; Wed, 23 May 2018 21:58:35 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id fNhaRxdBih-m for ; Wed, 23 May 2018 21:58:34 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail-pf0-f174.google.com (mail-pf0-f174.google.com [209.85.192.174]) by fraxinus.osuosl.org (Postfix) with ESMTPS id 6988A86F3C for ; Wed, 23 May 2018 21:58:34 +0000 (UTC) Received: by mail-pf0-f174.google.com with SMTP id q22-v6so11147319pff.11 for ; Wed, 23 May 2018 14:58:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=hqzmJDrNZR58ZJLDHAMGicm9j5Ju40t1etUUjhSt43A=; b=ENjsWLNO+dCDkP1+m2E2P1reNz93wMoPsjjAlYCnOxL5PQi99BD/YbvN6+vqrhHrW7 JdRYdU1VxLQxsWB4Vt+gHsJdpbYU3IE6VcystMe2zmQcK00mwe3obTfbsYBVdCVePrAs VuE8HyqTv47njqxxyXPZbj92LXVC4mt+TKuFwj6UIlRW9Pmmm1aIfLKZ30Y5AhZR0EvV jiN89HOw9vYVAE1pErGhx+tJxXI/rDp4i3xhpgqYyWEAShmbfvZcEVyFFUB56zmL1EL/ 668nes91zOhmApMf1or6XXGcKbPUpwbVJBRvhAdpquN2/8Xo+4TJcJLjLG3feUIzIIMG r7wA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=hqzmJDrNZR58ZJLDHAMGicm9j5Ju40t1etUUjhSt43A=; b=WSAd31fknpAzHIj1OVRg0xZFCP1tnKZw3VY7NwgBI69/3VpbNLRvDHEmZaXHD/e8Wo V4SIuENkwOD0T7blq7YrSxdX26iDcZrVSTmJIBZpc6VGtNpb94xu9fr3SP9xPlVaQj6c DkIifJ6oTSWOwgpz2RmiyeTdHAEBIq7X+ZbSuHIPh95j9x9RYO30O/Rf1Q5v24ifPRSW 9AT2SlWr6obYFv2kb4wbceeMZXSesL1bb9zrlZfYSlmBAHbzW0aYXYbxjqUxYNvafz1O Eny5T7j0nhF8FGEBtlPccEfPFhTdXRQzbBln9A9DBqYT4TruugDKrU25vSOqARy7jutO fkdw== X-Gm-Message-State: ALKqPweyWHLipxJa4SV/UQgxLXD3wIfpRbJ6tC5D26CURQeVn8gywXZA v4oAQA4OYbHmrnYia4JI8oHnv6j4 X-Google-Smtp-Source: AB8JxZoK1pANQAWZXDrsbPiG+EPaQWnfw3NWL3LzoE29VSMNrHDFC/NeYgEXebsZGsesDcUucrLzOQ== X-Received: by 2002:a63:ad09:: with SMTP id g9-v6mr3561310pgf.74.1527112713419; Wed, 23 May 2018 14:58:33 -0700 (PDT) Received: from JAKWS.YakimaSteel.local ([162.251.69.147]) by smtp.gmail.com with ESMTPSA id r90-v6sm48576965pfg.122.2018.05.23.14.58.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 23 May 2018 14:58:32 -0700 (PDT) From: Joseph Kogut To: buildroot@buildroot.org Date: Wed, 23 May 2018 14:58:29 -0700 Message-Id: <20180523215829.8300-1-joseph.kogut@gmail.com> X-Mailer: git-send-email 2.17.0 Subject: [Buildroot] [PATCH 1/1] python-websockets: bump to version 5.0 X-BeenThere: buildroot@busybox.net X-Mailman-Version: 2.1.24 Precedence: list List-Id: Discussion and development of buildroot List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Joseph Kogut MIME-Version: 1.0 Errors-To: buildroot-bounces@busybox.net Sender: "buildroot" Signed-off-by: Joseph Kogut --- ...ehavior-of-recv-in-the-CLOSING-state.patch | 261 ------------------ package/python-websockets/Config.in | 3 +- .../python-websockets/python-websockets.hash | 7 +- .../python-websockets/python-websockets.mk | 6 +- 4 files changed, 9 insertions(+), 268 deletions(-) delete mode 100644 package/python-websockets/0001-Fix-behavior-of-recv-in-the-CLOSING-state.patch diff --git a/package/python-websockets/0001-Fix-behavior-of-recv-in-the-CLOSING-state.patch b/package/python-websockets/0001-Fix-behavior-of-recv-in-the-CLOSING-state.patch deleted file mode 100644 index cb97b36bde..0000000000 --- a/package/python-websockets/0001-Fix-behavior-of-recv-in-the-CLOSING-state.patch +++ /dev/null @@ -1,261 +0,0 @@ -From 402059e4a46a764632eba8a669f5b012f173ee7b Mon Sep 17 00:00:00 2001 -From: Aymeric Augustin -Date: Tue, 1 May 2018 17:05:05 +0200 -Subject: [PATCH] Fix behavior of recv() in the CLOSING state. - -The behavior wasn't tested correctly: in some test cases, the connection -had already moved to the CLOSED state, where the close code and reason -are already known. - -Refactor half_close_connection_{local,remote} to allow multiple runs of -the event loop while remaining in the CLOSING state. Refactor affected -tests accordingly. - -I verified that all tests in the CLOSING state were behaving is intended -by inserting debug statements in recv/send/ping/pong and running: - -$ PYTHONASYNCIODEBUG=1 python -m unittest -v websockets.test_protocol.{Client,Server}Tests.test_{recv,send,ping,pong}_on_closing_connection_{local,remote} - -Fix #317, #327, #350, #357. - -Signed-off-by: Joseph Kogut ---- - websockets/protocol.py | 10 ++--- - websockets/test_protocol.py | 78 +++++++++++++++++++++++++++++-------- - 2 files changed, 66 insertions(+), 22 deletions(-) - -diff --git a/websockets/protocol.py b/websockets/protocol.py -index f8121a1..7583fe9 100644 ---- a/websockets/protocol.py -+++ b/websockets/protocol.py -@@ -303,7 +303,7 @@ class WebSocketCommonProtocol(asyncio.StreamReaderProtocol): - # Don't yield from self.ensure_open() here because messages could be - # received before the closing frame even if the connection is closing. - -- # Wait for a message until the connection is closed -+ # Wait for a message until the connection is closed. - next_message = asyncio_ensure_future( - self.messages.get(), loop=self.loop) - try: -@@ -315,15 +315,15 @@ class WebSocketCommonProtocol(asyncio.StreamReaderProtocol): - next_message.cancel() - raise - -- # Now there's no need to yield from self.ensure_open(). Either a -- # message was received or the connection was closed. -- - if next_message in done: - return next_message.result() - else: - next_message.cancel() - if not self.legacy_recv: -- raise ConnectionClosed(self.close_code, self.close_reason) -+ assert self.state in [State.CLOSING, State.CLOSED] -+ # Wait until the connection is closed to raise -+ # ConnectionClosed with the correct code and reason. -+ yield from self.ensure_open() - - @asyncio.coroutine - def send(self, data): -diff --git a/websockets/test_protocol.py b/websockets/test_protocol.py -index 70348fb..bfd4e3b 100644 ---- a/websockets/test_protocol.py -+++ b/websockets/test_protocol.py -@@ -105,7 +105,7 @@ class CommonTests: - self.loop.call_soon(self.loop.stop) - self.loop.run_forever() - -- def make_drain_slow(self, delay=3 * MS): -+ def make_drain_slow(self, delay=MS): - # Process connection_made in order to initialize self.protocol.writer. - self.run_loop_once() - -@@ -174,6 +174,8 @@ class CommonTests: - # Empty the outgoing data stream so we can make assertions later on. - self.assertOneFrameSent(True, OP_CLOSE, close_frame_data) - -+ assert self.protocol.state is State.CLOSED -+ - def half_close_connection_local(self, code=1000, reason='close'): - """ - Start a closing handshake but do not complete it. -@@ -181,31 +183,56 @@ class CommonTests: - The main difference with `close_connection` is that the connection is - left in the CLOSING state until the event loop runs again. - -+ The current implementation returns a task that must be awaited or -+ cancelled, else asyncio complains about destroying a pending task. -+ - """ - close_frame_data = serialize_close(code, reason) -- # Trigger the closing handshake from the local side. -- self.ensure_future(self.protocol.close(code, reason)) -+ # Trigger the closing handshake from the local endpoint. -+ close_task = self.ensure_future(self.protocol.close(code, reason)) - self.run_loop_once() # wait_for executes - self.run_loop_once() # write_frame executes - # Empty the outgoing data stream so we can make assertions later on. - self.assertOneFrameSent(True, OP_CLOSE, close_frame_data) -- # Prepare the response to the closing handshake from the remote side. -- self.loop.call_soon( -- self.receive_frame, Frame(True, OP_CLOSE, close_frame_data)) -- self.loop.call_soon(self.receive_eof_if_client) -+ -+ assert self.protocol.state is State.CLOSING -+ -+ # Complete the closing sequence at 1ms intervals so the test can run -+ # at each point even it goes back to the event loop several times. -+ self.loop.call_later( -+ MS, self.receive_frame, Frame(True, OP_CLOSE, close_frame_data)) -+ self.loop.call_later(2 * MS, self.receive_eof_if_client) -+ -+ # This task must be awaited or cancelled by the caller. -+ return close_task - - def half_close_connection_remote(self, code=1000, reason='close'): - """ -- Receive a closing handshake. -+ Receive a closing handshake but do not complete it. - - The main difference with `close_connection` is that the connection is - left in the CLOSING state until the event loop runs again. - - """ -+ # On the server side, websockets completes the closing handshake and -+ # closes the TCP connection immediately. Yield to the event loop after -+ # sending the close frame to run the test while the connection is in -+ # the CLOSING state. -+ if not self.protocol.is_client: -+ self.make_drain_slow() -+ - close_frame_data = serialize_close(code, reason) -- # Trigger the closing handshake from the remote side. -+ # Trigger the closing handshake from the remote endpoint. - self.receive_frame(Frame(True, OP_CLOSE, close_frame_data)) -- self.receive_eof_if_client() -+ self.run_loop_once() # read_frame executes -+ # Empty the outgoing data stream so we can make assertions later on. -+ self.assertOneFrameSent(True, OP_CLOSE, close_frame_data) -+ -+ assert self.protocol.state is State.CLOSING -+ -+ # Complete the closing sequence at 1ms intervals so the test can run -+ # at each point even it goes back to the event loop several times. -+ self.loop.call_later(2 * MS, self.receive_eof_if_client) - - def process_invalid_frames(self): - """ -@@ -335,11 +362,13 @@ class CommonTests: - self.assertEqual(data, b'tea') - - def test_recv_on_closing_connection_local(self): -- self.half_close_connection_local() -+ close_task = self.half_close_connection_local() - - with self.assertRaises(ConnectionClosed): - self.loop.run_until_complete(self.protocol.recv()) - -+ self.loop.run_until_complete(close_task) # cleanup -+ - def test_recv_on_closing_connection_remote(self): - self.half_close_connection_remote() - -@@ -421,24 +450,29 @@ class CommonTests: - self.assertNoFrameSent() - - def test_send_on_closing_connection_local(self): -- self.half_close_connection_local() -+ close_task = self.half_close_connection_local() - - with self.assertRaises(ConnectionClosed): - self.loop.run_until_complete(self.protocol.send('foobar')) -+ - self.assertNoFrameSent() - -+ self.loop.run_until_complete(close_task) # cleanup -+ - def test_send_on_closing_connection_remote(self): - self.half_close_connection_remote() - - with self.assertRaises(ConnectionClosed): - self.loop.run_until_complete(self.protocol.send('foobar')) -- self.assertOneFrameSent(True, OP_CLOSE, serialize_close(1000, 'close')) -+ -+ self.assertNoFrameSent() - - def test_send_on_closed_connection(self): - self.close_connection() - - with self.assertRaises(ConnectionClosed): - self.loop.run_until_complete(self.protocol.send('foobar')) -+ - self.assertNoFrameSent() - - # Test the ping coroutine. -@@ -466,24 +500,29 @@ class CommonTests: - self.assertNoFrameSent() - - def test_ping_on_closing_connection_local(self): -- self.half_close_connection_local() -+ close_task = self.half_close_connection_local() - - with self.assertRaises(ConnectionClosed): - self.loop.run_until_complete(self.protocol.ping()) -+ - self.assertNoFrameSent() - -+ self.loop.run_until_complete(close_task) # cleanup -+ - def test_ping_on_closing_connection_remote(self): - self.half_close_connection_remote() - - with self.assertRaises(ConnectionClosed): - self.loop.run_until_complete(self.protocol.ping()) -- self.assertOneFrameSent(True, OP_CLOSE, serialize_close(1000, 'close')) -+ -+ self.assertNoFrameSent() - - def test_ping_on_closed_connection(self): - self.close_connection() - - with self.assertRaises(ConnectionClosed): - self.loop.run_until_complete(self.protocol.ping()) -+ - self.assertNoFrameSent() - - # Test the pong coroutine. -@@ -506,24 +545,29 @@ class CommonTests: - self.assertNoFrameSent() - - def test_pong_on_closing_connection_local(self): -- self.half_close_connection_local() -+ close_task = self.half_close_connection_local() - - with self.assertRaises(ConnectionClosed): - self.loop.run_until_complete(self.protocol.pong()) -+ - self.assertNoFrameSent() - -+ self.loop.run_until_complete(close_task) # cleanup -+ - def test_pong_on_closing_connection_remote(self): - self.half_close_connection_remote() - - with self.assertRaises(ConnectionClosed): - self.loop.run_until_complete(self.protocol.pong()) -- self.assertOneFrameSent(True, OP_CLOSE, serialize_close(1000, 'close')) -+ -+ self.assertNoFrameSent() - - def test_pong_on_closed_connection(self): - self.close_connection() - - with self.assertRaises(ConnectionClosed): - self.loop.run_until_complete(self.protocol.pong()) -+ - self.assertNoFrameSent() - - # Test the protocol's logic for acknowledging pings with pongs. --- -2.17.0 - diff --git a/package/python-websockets/Config.in b/package/python-websockets/Config.in index 7d80161a1a..888bec616f 100644 --- a/package/python-websockets/Config.in +++ b/package/python-websockets/Config.in @@ -4,6 +4,7 @@ config BR2_PACKAGE_PYTHON_WEBSOCKETS select BR2_PACKAGE_PYTHON3_ZLIB select BR2_PACKAGE_PYTHON3_SSL help - An implementation of the WebSocket Protocol (RFC 6455) + An implementation of the WebSocket Protocol (RFC 6455 & + 7692). https://github.com/aaugustin/websockets diff --git a/package/python-websockets/python-websockets.hash b/package/python-websockets/python-websockets.hash index 18947cc60a..2805e8a534 100644 --- a/package/python-websockets/python-websockets.hash +++ b/package/python-websockets/python-websockets.hash @@ -1,4 +1,5 @@ -# md5 from https://pypi.python.org/pypi/websockets/json, sha256 locally computed -md5 9e8c6b3c70def4146d75fbb0f52bdfc7 websockets-4.0.1.tar.gz -sha256 da4d4fbe059b0453e726d6d993760065d69b823a27efc3040402a6fcfe6a1ed9 websockets-4.0.1.tar.gz +# md5, sha256 from https://pypi.org/pypi/websockets/json +md5 fde30398f43401731ba38340a7031ab0 websockets-5.0.tar.gz +sha256 4ea90a598b546233a4c61bef98db4171ac30f1302826729af30001ac1f471098 websockets-5.0.tar.gz +# Locally computed sha256 checksums sha256 2cd4d416e432ca7fda2c103b38b852f8d3cb327d70c3db44410b9fe97e6c4d73 LICENSE diff --git a/package/python-websockets/python-websockets.mk b/package/python-websockets/python-websockets.mk index 7c5cf8c4e7..f7f2caaf0b 100644 --- a/package/python-websockets/python-websockets.mk +++ b/package/python-websockets/python-websockets.mk @@ -4,9 +4,9 @@ # ################################################################################ -PYTHON_WEBSOCKETS_VERSION = 4.0.1 -PYTHON_WEBSOCKETS_SOURCE = websockets-${PYTHON_WEBSOCKETS_VERSION}.tar.gz -PYTHON_WEBSOCKETS_SITE = https://pypi.python.org/packages/b6/12/6194aac840c65253e45a38912e318f9ac548f9ba86d75bdb8fe66841b335 +PYTHON_WEBSOCKETS_VERSION = 5.0 +PYTHON_WEBSOCKETS_SOURCE = websockets-$(PYTHON_WEBSOCKETS_VERSION).tar.gz +PYTHON_WEBSOCKETS_SITE = https://files.pythonhosted.org/packages/0d/ea/0cc41f9ab63b4af08840a667b047d6fab6406aebb076932ef877a4511f78 PYTHON_WEBSOCKETS_SETUP_TYPE = setuptools PYTHON_WEBSOCKETS_LICENSE = BSD-3-Clause PYTHON_WEBSOCKETS_LICENSE_FILES = LICENSE