summaryrefslogtreecommitdiffstats
path: root/contrib/python/websocket-client
diff options
context:
space:
mode:
authorrobot-piglet <[email protected]>2024-12-09 18:25:21 +0300
committerrobot-piglet <[email protected]>2024-12-09 19:18:57 +0300
commit13374e0884578812cda7697d0c5680122db59a37 (patch)
tree30a022eb841035299deb2b8c393b2902f0c21735 /contrib/python/websocket-client
parentc7ade6d3bf7cd492235a61b77153351e422a28f3 (diff)
Intermediate changes
commit_hash:034150f557268506d7bc0cbd8b5becf65f765593
Diffstat (limited to 'contrib/python/websocket-client')
-rw-r--r--contrib/python/websocket-client/.dist-info/METADATA (renamed from contrib/python/websocket-client/py3/.dist-info/METADATA)0
-rw-r--r--contrib/python/websocket-client/.dist-info/entry_points.txt (renamed from contrib/python/websocket-client/py3/.dist-info/entry_points.txt)0
-rw-r--r--contrib/python/websocket-client/.dist-info/top_level.txt (renamed from contrib/python/websocket-client/py2/.dist-info/top_level.txt)0
-rw-r--r--contrib/python/websocket-client/LICENSE (renamed from contrib/python/websocket-client/py3/LICENSE)0
-rw-r--r--contrib/python/websocket-client/README.md (renamed from contrib/python/websocket-client/py3/README.md)0
-rw-r--r--contrib/python/websocket-client/patches/01-fix-tests.patch (renamed from contrib/python/websocket-client/py3/patches/01-fix-tests.patch)8
-rw-r--r--contrib/python/websocket-client/py2/.dist-info/METADATA174
-rw-r--r--contrib/python/websocket-client/py2/COPYING.LESSER503
-rw-r--r--contrib/python/websocket-client/py2/LICENSE503
-rw-r--r--contrib/python/websocket-client/py2/README.md136
-rw-r--r--contrib/python/websocket-client/py2/patches/01-fix-tests.patch33
-rw-r--r--contrib/python/websocket-client/py2/tests/ya.make28
-rw-r--r--contrib/python/websocket-client/py2/websocket/__init__.py28
-rw-r--r--contrib/python/websocket-client/py2/websocket/_abnf.py458
-rw-r--r--contrib/python/websocket-client/py2/websocket/_app.py399
-rw-r--r--contrib/python/websocket-client/py2/websocket/_cookiejar.py78
-rw-r--r--contrib/python/websocket-client/py2/websocket/_core.py595
-rw-r--r--contrib/python/websocket-client/py2/websocket/_exceptions.py86
-rw-r--r--contrib/python/websocket-client/py2/websocket/_handshake.py212
-rw-r--r--contrib/python/websocket-client/py2/websocket/_http.py335
-rw-r--r--contrib/python/websocket-client/py2/websocket/_logging.py92
-rw-r--r--contrib/python/websocket-client/py2/websocket/_socket.py176
-rw-r--r--contrib/python/websocket-client/py2/websocket/_ssl_compat.py53
-rw-r--r--contrib/python/websocket-client/py2/websocket/_url.py178
-rw-r--r--contrib/python/websocket-client/py2/websocket/_utils.py110
-rw-r--r--contrib/python/websocket-client/py2/websocket/tests/data/header03.txt6
-rw-r--r--contrib/python/websocket-client/py2/websocket/tests/test_abnf.py77
-rw-r--r--contrib/python/websocket-client/py2/websocket/tests/test_app.py137
-rw-r--r--contrib/python/websocket-client/py2/websocket/tests/test_cookiejar.py117
-rw-r--r--contrib/python/websocket-client/py2/websocket/tests/test_http.py110
-rw-r--r--contrib/python/websocket-client/py2/websocket/tests/test_url.py309
-rw-r--r--contrib/python/websocket-client/py2/websocket/tests/test_websocket.py434
-rw-r--r--contrib/python/websocket-client/py2/ya.make42
-rw-r--r--contrib/python/websocket-client/py3/.dist-info/top_level.txt1
-rw-r--r--contrib/python/websocket-client/py3/websocket/tests/__init__.py0
-rw-r--r--contrib/python/websocket-client/py3/websocket/tests/data/header01.txt6
-rw-r--r--contrib/python/websocket-client/py3/websocket/tests/data/header02.txt6
-rw-r--r--contrib/python/websocket-client/py3/ya.make41
-rw-r--r--contrib/python/websocket-client/tests/ya.make (renamed from contrib/python/websocket-client/py3/tests/ya.make)4
-rw-r--r--contrib/python/websocket-client/websocket/__init__.py (renamed from contrib/python/websocket-client/py3/websocket/__init__.py)0
-rw-r--r--contrib/python/websocket-client/websocket/_abnf.py (renamed from contrib/python/websocket-client/py3/websocket/_abnf.py)0
-rw-r--r--contrib/python/websocket-client/websocket/_app.py (renamed from contrib/python/websocket-client/py3/websocket/_app.py)0
-rw-r--r--contrib/python/websocket-client/websocket/_cookiejar.py (renamed from contrib/python/websocket-client/py3/websocket/_cookiejar.py)0
-rw-r--r--contrib/python/websocket-client/websocket/_core.py (renamed from contrib/python/websocket-client/py3/websocket/_core.py)0
-rw-r--r--contrib/python/websocket-client/websocket/_exceptions.py (renamed from contrib/python/websocket-client/py3/websocket/_exceptions.py)0
-rw-r--r--contrib/python/websocket-client/websocket/_handshake.py (renamed from contrib/python/websocket-client/py3/websocket/_handshake.py)0
-rw-r--r--contrib/python/websocket-client/websocket/_http.py (renamed from contrib/python/websocket-client/py3/websocket/_http.py)0
-rw-r--r--contrib/python/websocket-client/websocket/_logging.py (renamed from contrib/python/websocket-client/py3/websocket/_logging.py)0
-rw-r--r--contrib/python/websocket-client/websocket/_socket.py (renamed from contrib/python/websocket-client/py3/websocket/_socket.py)0
-rw-r--r--contrib/python/websocket-client/websocket/_ssl_compat.py (renamed from contrib/python/websocket-client/py3/websocket/_ssl_compat.py)0
-rw-r--r--contrib/python/websocket-client/websocket/_url.py (renamed from contrib/python/websocket-client/py3/websocket/_url.py)0
-rw-r--r--contrib/python/websocket-client/websocket/_utils.py (renamed from contrib/python/websocket-client/py3/websocket/_utils.py)0
-rw-r--r--contrib/python/websocket-client/websocket/_wsdump.py (renamed from contrib/python/websocket-client/py3/websocket/_wsdump.py)0
-rw-r--r--contrib/python/websocket-client/websocket/py.typed (renamed from contrib/python/websocket-client/py3/websocket/py.typed)0
-rw-r--r--contrib/python/websocket-client/websocket/tests/__init__.py (renamed from contrib/python/websocket-client/py2/websocket/tests/__init__.py)0
-rw-r--r--contrib/python/websocket-client/websocket/tests/data/header01.txt (renamed from contrib/python/websocket-client/py2/websocket/tests/data/header01.txt)0
-rw-r--r--contrib/python/websocket-client/websocket/tests/data/header02.txt (renamed from contrib/python/websocket-client/py2/websocket/tests/data/header02.txt)0
-rw-r--r--contrib/python/websocket-client/websocket/tests/data/header03.txt (renamed from contrib/python/websocket-client/py3/websocket/tests/data/header03.txt)0
-rw-r--r--contrib/python/websocket-client/websocket/tests/echo-server.py (renamed from contrib/python/websocket-client/py3/websocket/tests/echo-server.py)0
-rw-r--r--contrib/python/websocket-client/websocket/tests/test_abnf.py (renamed from contrib/python/websocket-client/py3/websocket/tests/test_abnf.py)0
-rw-r--r--contrib/python/websocket-client/websocket/tests/test_app.py (renamed from contrib/python/websocket-client/py3/websocket/tests/test_app.py)0
-rw-r--r--contrib/python/websocket-client/websocket/tests/test_cookiejar.py (renamed from contrib/python/websocket-client/py3/websocket/tests/test_cookiejar.py)0
-rw-r--r--contrib/python/websocket-client/websocket/tests/test_http.py (renamed from contrib/python/websocket-client/py3/websocket/tests/test_http.py)0
-rw-r--r--contrib/python/websocket-client/websocket/tests/test_url.py (renamed from contrib/python/websocket-client/py3/websocket/tests/test_url.py)0
-rw-r--r--contrib/python/websocket-client/websocket/tests/test_websocket.py (renamed from contrib/python/websocket-client/py3/websocket/tests/test_websocket.py)0
-rw-r--r--contrib/python/websocket-client/ya.make43
66 files changed, 38 insertions, 5480 deletions
diff --git a/contrib/python/websocket-client/py3/.dist-info/METADATA b/contrib/python/websocket-client/.dist-info/METADATA
index 563e5c05268..563e5c05268 100644
--- a/contrib/python/websocket-client/py3/.dist-info/METADATA
+++ b/contrib/python/websocket-client/.dist-info/METADATA
diff --git a/contrib/python/websocket-client/py3/.dist-info/entry_points.txt b/contrib/python/websocket-client/.dist-info/entry_points.txt
index 45c854eb72e..45c854eb72e 100644
--- a/contrib/python/websocket-client/py3/.dist-info/entry_points.txt
+++ b/contrib/python/websocket-client/.dist-info/entry_points.txt
diff --git a/contrib/python/websocket-client/py2/.dist-info/top_level.txt b/contrib/python/websocket-client/.dist-info/top_level.txt
index ca4cb0cf822..ca4cb0cf822 100644
--- a/contrib/python/websocket-client/py2/.dist-info/top_level.txt
+++ b/contrib/python/websocket-client/.dist-info/top_level.txt
diff --git a/contrib/python/websocket-client/py3/LICENSE b/contrib/python/websocket-client/LICENSE
index 62a54ca4991..62a54ca4991 100644
--- a/contrib/python/websocket-client/py3/LICENSE
+++ b/contrib/python/websocket-client/LICENSE
diff --git a/contrib/python/websocket-client/py3/README.md b/contrib/python/websocket-client/README.md
index 14b6b506cea..14b6b506cea 100644
--- a/contrib/python/websocket-client/py3/README.md
+++ b/contrib/python/websocket-client/README.md
diff --git a/contrib/python/websocket-client/py3/patches/01-fix-tests.patch b/contrib/python/websocket-client/patches/01-fix-tests.patch
index 28d7c74be30..dc6354510eb 100644
--- a/contrib/python/websocket-client/py3/patches/01-fix-tests.patch
+++ b/contrib/python/websocket-client/patches/01-fix-tests.patch
@@ -1,5 +1,5 @@
---- contrib/python/websocket-client/py3/websocket/tests/test_http.py (index)
-+++ contrib/python/websocket-client/py3/websocket/tests/test_http.py (working tree)
+--- contrib/python/websocket-client/websocket/tests/test_http.py (index)
++++ contrib/python/websocket-client/websocket/tests/test_http.py (working tree)
@@ -74,7 +74,8 @@ class HeaderSockMock(SockMock):
def __init__(self, fname):
@@ -10,8 +10,8 @@
with open(path, "rb") as f:
self.add_packet(f.read())
---- contrib/python/websocket-client/py3/websocket/tests/test_websocket.py (index)
-+++ contrib/python/websocket-client/py3/websocket/tests/test_websocket.py (working tree)
+--- contrib/python/websocket-client/websocket/tests/test_websocket.py (index)
++++ contrib/python/websocket-client/websocket/tests/test_websocket.py (working tree)
@@ -86,7 +86,8 @@ class HeaderSockMock(SockMock):
def __init__(self, fname):
diff --git a/contrib/python/websocket-client/py2/.dist-info/METADATA b/contrib/python/websocket-client/py2/.dist-info/METADATA
deleted file mode 100644
index f71e30a3069..00000000000
--- a/contrib/python/websocket-client/py2/.dist-info/METADATA
+++ /dev/null
@@ -1,174 +0,0 @@
-Metadata-Version: 2.1
-Name: websocket-client
-Version: 0.59.0
-Summary: WebSocket client for Python with low level API options
-Home-page: https://github.com/websocket-client/websocket-client.git
-Author: liris
-Author-email: [email protected]
-License: LGPL version 2.1
-Download-URL: https://github.com/websocket-client/websocket-client/releases
-Project-URL: Documentation, https://websocket-client.readthedocs.io/
-Project-URL: Source, https://github.com/websocket-client/websocket-client/
-Keywords: websockets client
-Platform: UNKNOWN
-Classifier: Development Status :: 4 - Beta
-Classifier: License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.6
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Topic :: Internet
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Intended Audience :: Developers
-Requires-Python: >=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
-Description-Content-Type: text/markdown
-Requires-Dist: six
-
-[![docs](https://readthedocs.org/projects/websocket-client/badge/?style=flat)](https://websocket-client.readthedocs.io/)
-[![Build Status](https://github.com/websocket-client/websocket-client/actions/workflows/build.yml/badge.svg)](https://github.com/websocket-client/websocket-client/actions/workflows/build.yml)
-[![codecov](https://codecov.io/gh/websocket-client/websocket-client/branch/master/graph/badge.svg?token=pcXhUQwiL3)](https://codecov.io/gh/websocket-client/websocket-client)
-[![PyPI Downloads](https://pepy.tech/badge/websocket-client)](https://pepy.tech/project/websocket-client)
-[![PyPI version](https://img.shields.io/pypi/v/websocket_client)](https://pypi.org/project/websocket_client/)
-
-# websocket-client
-
-websocket-client is a WebSocket client for Python. It provides access
-to low level APIs for WebSockets. websocket-client implements version
-[hybi-13](https://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-13)
-of the WebSocket procotol. This client does not currently support the
-permessage-deflate extension from
-[RFC 7692](https://tools.ietf.org/html/rfc7692).
-
-## Documentation
-
-This project's documentation can be found at
-[https://websocket-client.readthedocs.io/](https://websocket-client.readthedocs.io/)
-
-## Contributing
-
-Please see the [contribution guidelines](https://github.com/websocket-client/websocket-client/blob/master/CONTRIBUTING.md)
-
-## Installation
-
-First, install the following dependencies:
-- six
-- backports.ssl\_match\_hostname for Python 2.x
-
-You can install the dependencies with the command `pip install six` and
-`pip install backports.ssl_match_hostname`
-
-You can use either `python setup.py install` or `pip install websocket-client`
-to install. This module is tested on Python 2.7 and Python 3.4+. Python 3
-support was first introduced in version 0.14.0, but is a work in progress.
-
-## Usage Tips
-
-Check out the documentation's FAQ for additional guidelines:
-[https://websocket-client.readthedocs.io/en/latest/faq.html](https://websocket-client.readthedocs.io/en/latest/faq.html)
-
-Known issues with this library include lack of WebSocket Compression
-support (RFC 7692) and [minimal threading documentation/support](https://websocket-client.readthedocs.io/en/latest/threading.html).
-
-## License
-
-- LGPL version 2.1
-
-### Performance
-
-The `send` and `validate_utf8` methods are very slow in pure Python. You can
-disable UTF8 validation in this library (and receive a performance enhancement)
-with the `skip_utf8_validation` parameter. If you want to get better
-performance, please install both numpy and wsaccel, and import them into your
-project files - these other libraries will automatically be used when available.
-Note that wsaccel can sometimes cause other issues.
-
-### Long-lived Connection
-
-Most real-world WebSockets situations involve longer-lived connections.
-The WebSocketApp `run_forever` loop automatically tries to reconnect when a
-connection is lost, and provides a variety of event-based connection controls.
-The project documentation has
-[additional examples](https://websocket-client.readthedocs.io/en/latest/examples.html)
-
-```python
-import websocket
-try:
- import thread
-except ImportError:
- import _thread as thread
-import time
-
-def on_message(ws, message):
- print(message)
-
-def on_error(ws, error):
- print(error)
-
-def on_close(ws):
- print("### closed ###")
-
-def on_open(ws):
- def run(*args):
- for i in range(3):
- time.sleep(1)
- ws.send("Hello %d" % i)
- time.sleep(1)
- ws.close()
- print("thread terminating...")
- thread.start_new_thread(run, ())
-
-if __name__ == "__main__":
- websocket.enableTrace(True)
- ws = websocket.WebSocketApp("ws://echo.websocket.org/",
- on_open = on_open,
- on_message = on_message,
- on_error = on_error,
- on_close = on_close)
-
- ws.run_forever()
-```
-
-### Short-lived Connection
-
-This is if you want to communicate a short message and disconnect
-immediately when done. For example, if you want to confirm that a WebSocket
-server is running and responds properly to a specific request.
-The project documentation has
-[additional examples](https://websocket-client.readthedocs.io/en/latest/examples.html)
-
-```python
-from websocket import create_connection
-ws = create_connection("ws://echo.websocket.org/")
-print("Sending 'Hello, World'...")
-ws.send("Hello, World")
-print("Sent")
-print("Receiving...")
-result = ws.recv()
-print("Received '%s'" % result)
-ws.close()
-```
-
-If you want to customize socket options, set sockopt, as seen below:
-
-```python
-from websocket import create_connection
-ws = create_connection("ws://echo.websocket.org/",
- sockopt=((socket.IPPROTO_TCP, socket.TCP_NODELAY),))
-```
-
-### Acknowledgements
-
-Thanks to @battlemidget and @ralphbean for helping migrate this project to
-Python 3.
-
-
diff --git a/contrib/python/websocket-client/py2/COPYING.LESSER b/contrib/python/websocket-client/py2/COPYING.LESSER
deleted file mode 100644
index 67cd97bbc24..00000000000
--- a/contrib/python/websocket-client/py2/COPYING.LESSER
+++ /dev/null
@@ -1,503 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
diff --git a/contrib/python/websocket-client/py2/LICENSE b/contrib/python/websocket-client/py2/LICENSE
deleted file mode 100644
index 67cd97bbc24..00000000000
--- a/contrib/python/websocket-client/py2/LICENSE
+++ /dev/null
@@ -1,503 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
diff --git a/contrib/python/websocket-client/py2/README.md b/contrib/python/websocket-client/py2/README.md
deleted file mode 100644
index d61578f1165..00000000000
--- a/contrib/python/websocket-client/py2/README.md
+++ /dev/null
@@ -1,136 +0,0 @@
-[![docs](https://readthedocs.org/projects/websocket-client/badge/?style=flat)](https://websocket-client.readthedocs.io/)
-[![Build Status](https://github.com/websocket-client/websocket-client/actions/workflows/build.yml/badge.svg)](https://github.com/websocket-client/websocket-client/actions/workflows/build.yml)
-[![codecov](https://codecov.io/gh/websocket-client/websocket-client/branch/master/graph/badge.svg?token=pcXhUQwiL3)](https://codecov.io/gh/websocket-client/websocket-client)
-[![PyPI Downloads](https://pepy.tech/badge/websocket-client)](https://pepy.tech/project/websocket-client)
-[![PyPI version](https://img.shields.io/pypi/v/websocket_client)](https://pypi.org/project/websocket_client/)
-
-# websocket-client
-
-websocket-client is a WebSocket client for Python. It provides access
-to low level APIs for WebSockets. websocket-client implements version
-[hybi-13](https://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-13)
-of the WebSocket procotol. This client does not currently support the
-permessage-deflate extension from
-[RFC 7692](https://tools.ietf.org/html/rfc7692).
-
-## Documentation
-
-This project's documentation can be found at
-[https://websocket-client.readthedocs.io/](https://websocket-client.readthedocs.io/)
-
-## Contributing
-
-Please see the [contribution guidelines](https://github.com/websocket-client/websocket-client/blob/master/CONTRIBUTING.md)
-
-## Installation
-
-First, install the following dependencies:
-- six
-- backports.ssl\_match\_hostname for Python 2.x
-
-You can install the dependencies with the command `pip install six` and
-`pip install backports.ssl_match_hostname`
-
-You can use either `python setup.py install` or `pip install websocket-client`
-to install. This module is tested on Python 2.7 and Python 3.4+. Python 3
-support was first introduced in version 0.14.0, but is a work in progress.
-
-## Usage Tips
-
-Check out the documentation's FAQ for additional guidelines:
-[https://websocket-client.readthedocs.io/en/latest/faq.html](https://websocket-client.readthedocs.io/en/latest/faq.html)
-
-Known issues with this library include lack of WebSocket Compression
-support (RFC 7692) and [minimal threading documentation/support](https://websocket-client.readthedocs.io/en/latest/threading.html).
-
-## License
-
-- LGPL version 2.1
-
-### Performance
-
-The `send` and `validate_utf8` methods are very slow in pure Python. You can
-disable UTF8 validation in this library (and receive a performance enhancement)
-with the `skip_utf8_validation` parameter. If you want to get better
-performance, please install both numpy and wsaccel, and import them into your
-project files - these other libraries will automatically be used when available.
-Note that wsaccel can sometimes cause other issues.
-
-### Long-lived Connection
-
-Most real-world WebSockets situations involve longer-lived connections.
-The WebSocketApp `run_forever` loop automatically tries to reconnect when a
-connection is lost, and provides a variety of event-based connection controls.
-The project documentation has
-[additional examples](https://websocket-client.readthedocs.io/en/latest/examples.html)
-
-```python
-import websocket
-try:
- import thread
-except ImportError:
- import _thread as thread
-import time
-
-def on_message(ws, message):
- print(message)
-
-def on_error(ws, error):
- print(error)
-
-def on_close(ws):
- print("### closed ###")
-
-def on_open(ws):
- def run(*args):
- for i in range(3):
- time.sleep(1)
- ws.send("Hello %d" % i)
- time.sleep(1)
- ws.close()
- print("thread terminating...")
- thread.start_new_thread(run, ())
-
-if __name__ == "__main__":
- websocket.enableTrace(True)
- ws = websocket.WebSocketApp("ws://echo.websocket.org/",
- on_open = on_open,
- on_message = on_message,
- on_error = on_error,
- on_close = on_close)
-
- ws.run_forever()
-```
-
-### Short-lived Connection
-
-This is if you want to communicate a short message and disconnect
-immediately when done. For example, if you want to confirm that a WebSocket
-server is running and responds properly to a specific request.
-The project documentation has
-[additional examples](https://websocket-client.readthedocs.io/en/latest/examples.html)
-
-```python
-from websocket import create_connection
-ws = create_connection("ws://echo.websocket.org/")
-print("Sending 'Hello, World'...")
-ws.send("Hello, World")
-print("Sent")
-print("Receiving...")
-result = ws.recv()
-print("Received '%s'" % result)
-ws.close()
-```
-
-If you want to customize socket options, set sockopt, as seen below:
-
-```python
-from websocket import create_connection
-ws = create_connection("ws://echo.websocket.org/",
- sockopt=((socket.IPPROTO_TCP, socket.TCP_NODELAY),))
-```
-
-### Acknowledgements
-
-Thanks to @battlemidget and @ralphbean for helping migrate this project to
-Python 3.
diff --git a/contrib/python/websocket-client/py2/patches/01-fix-tests.patch b/contrib/python/websocket-client/py2/patches/01-fix-tests.patch
deleted file mode 100644
index ba276c9cee0..00000000000
--- a/contrib/python/websocket-client/py2/patches/01-fix-tests.patch
+++ /dev/null
@@ -1,33 +0,0 @@
---- contrib/python/websocket-client/py2/websocket/tests/test_http.py (index)
-+++ contrib/python/websocket-client/py2/websocket/tests/test_http.py (working tree)
-@@ -66,7 +66,8 @@ class HeaderSockMock(SockMock):
-
- def __init__(self, fname):
- SockMock.__init__(self)
-- path = os.path.join(os.path.dirname(__file__), fname)
-+ import yatest.common as yc
-+ path = os.path.join(os.path.dirname(yc.source_path(__file__)), fname)
- with open(path, "rb") as f:
- self.add_packet(f.read())
-
-@@ -91,7 +92,7 @@ class HttpTest(unittest.TestCase):
- self.assertRaises(ws.WebSocketProxyException, _tunnel, HeaderSockMock("data/header01.txt"), "example.com", 80, ("username", "password"))
- self.assertRaises(ws.WebSocketProxyException, _tunnel, HeaderSockMock("data/header02.txt"), "example.com", 80, ("username", "password"))
-
-- def testConnect(self):
-+ def _testConnect(self):
- # Not currently testing an actual proxy connection, so just check whether TypeError is raised
- self.assertRaises(TypeError, _open_proxied_socket, "wss://example.com", OptsList(), proxy_info(http_proxy_host="example.com", http_proxy_port="8080", proxy_type="http"))
- self.assertRaises(TypeError, _open_proxied_socket, "wss://example.com", OptsList(), proxy_info(http_proxy_host="example.com", http_proxy_port="8080", proxy_type="socks4"))
---- contrib/python/websocket-client/py2/websocket/tests/test_websocket.py (index)
-+++ contrib/python/websocket-client/py2/websocket/tests/test_websocket.py (working tree)
-@@ -99,7 +99,8 @@ class HeaderSockMock(SockMock):
-
- def __init__(self, fname):
- SockMock.__init__(self)
-- path = os.path.join(os.path.dirname(__file__), fname)
-+ import yatest.common as yc
-+ path = os.path.join(os.path.dirname(yc.source_path(__file__)), fname)
- with open(path, "rb") as f:
- self.add_packet(f.read())
-
diff --git a/contrib/python/websocket-client/py2/tests/ya.make b/contrib/python/websocket-client/py2/tests/ya.make
deleted file mode 100644
index 7084ee13b07..00000000000
--- a/contrib/python/websocket-client/py2/tests/ya.make
+++ /dev/null
@@ -1,28 +0,0 @@
-PY2TEST()
-
-PEERDIR(
- contrib/python/PySocks
- contrib/python/websocket-client
-)
-
-DATA(
- arcadia/contrib/python/websocket-client/py2/websocket/tests/data
-)
-
-SRCDIR(
- contrib/python/websocket-client/py2/websocket/tests
-)
-
-TEST_SRCS(
- __init__.py
- test_abnf.py
- test_app.py
- test_cookiejar.py
- test_http.py
- test_url.py
- test_websocket.py
-)
-
-NO_LINT()
-
-END()
diff --git a/contrib/python/websocket-client/py2/websocket/__init__.py b/contrib/python/websocket-client/py2/websocket/__init__.py
deleted file mode 100644
index f2c7b44c17a..00000000000
--- a/contrib/python/websocket-client/py2/websocket/__init__.py
+++ /dev/null
@@ -1,28 +0,0 @@
-"""
-websocket - WebSocket client library for Python
-
-Copyright (C) 2010 Hiroki Ohtani(liris)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-from ._abnf import *
-from ._app import WebSocketApp
-from ._core import *
-from ._exceptions import *
-from ._logging import *
-from ._socket import *
-
-__version__ = "0.59.0"
diff --git a/contrib/python/websocket-client/py2/websocket/_abnf.py b/contrib/python/websocket-client/py2/websocket/_abnf.py
deleted file mode 100644
index 80fbe1f9b93..00000000000
--- a/contrib/python/websocket-client/py2/websocket/_abnf.py
+++ /dev/null
@@ -1,458 +0,0 @@
-"""
-
-"""
-
-"""
-websocket - WebSocket client library for Python
-
-Copyright (C) 2010 Hiroki Ohtani(liris)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-import array
-import os
-import struct
-
-import six
-
-from ._exceptions import *
-from ._utils import validate_utf8
-from threading import Lock
-
-try:
- if six.PY3:
- import numpy
- else:
- numpy = None
-except ImportError:
- numpy = None
-
-try:
- # If wsaccel is available we use compiled routines to mask data.
- if not numpy:
- from wsaccel.xormask import XorMaskerSimple
-
- def _mask(_m, _d):
- return XorMaskerSimple(_m).process(_d)
-except ImportError:
- # wsaccel is not available, we rely on python implementations.
- def _mask(_m, _d):
- for i in range(len(_d)):
- _d[i] ^= _m[i % 4]
-
- if six.PY3:
- return _d.tobytes()
- else:
- return _d.tostring()
-
-
-__all__ = [
- 'ABNF', 'continuous_frame', 'frame_buffer',
- 'STATUS_NORMAL',
- 'STATUS_GOING_AWAY',
- 'STATUS_PROTOCOL_ERROR',
- 'STATUS_UNSUPPORTED_DATA_TYPE',
- 'STATUS_STATUS_NOT_AVAILABLE',
- 'STATUS_ABNORMAL_CLOSED',
- 'STATUS_INVALID_PAYLOAD',
- 'STATUS_POLICY_VIOLATION',
- 'STATUS_MESSAGE_TOO_BIG',
- 'STATUS_INVALID_EXTENSION',
- 'STATUS_UNEXPECTED_CONDITION',
- 'STATUS_BAD_GATEWAY',
- 'STATUS_TLS_HANDSHAKE_ERROR',
-]
-
-# closing frame status codes.
-STATUS_NORMAL = 1000
-STATUS_GOING_AWAY = 1001
-STATUS_PROTOCOL_ERROR = 1002
-STATUS_UNSUPPORTED_DATA_TYPE = 1003
-STATUS_STATUS_NOT_AVAILABLE = 1005
-STATUS_ABNORMAL_CLOSED = 1006
-STATUS_INVALID_PAYLOAD = 1007
-STATUS_POLICY_VIOLATION = 1008
-STATUS_MESSAGE_TOO_BIG = 1009
-STATUS_INVALID_EXTENSION = 1010
-STATUS_UNEXPECTED_CONDITION = 1011
-STATUS_BAD_GATEWAY = 1014
-STATUS_TLS_HANDSHAKE_ERROR = 1015
-
-VALID_CLOSE_STATUS = (
- STATUS_NORMAL,
- STATUS_GOING_AWAY,
- STATUS_PROTOCOL_ERROR,
- STATUS_UNSUPPORTED_DATA_TYPE,
- STATUS_INVALID_PAYLOAD,
- STATUS_POLICY_VIOLATION,
- STATUS_MESSAGE_TOO_BIG,
- STATUS_INVALID_EXTENSION,
- STATUS_UNEXPECTED_CONDITION,
- STATUS_BAD_GATEWAY,
-)
-
-
-class ABNF(object):
- """
- ABNF frame class.
- See http://tools.ietf.org/html/rfc5234
- and http://tools.ietf.org/html/rfc6455#section-5.2
- """
-
- # operation code values.
- OPCODE_CONT = 0x0
- OPCODE_TEXT = 0x1
- OPCODE_BINARY = 0x2
- OPCODE_CLOSE = 0x8
- OPCODE_PING = 0x9
- OPCODE_PONG = 0xa
-
- # available operation code value tuple
- OPCODES = (OPCODE_CONT, OPCODE_TEXT, OPCODE_BINARY, OPCODE_CLOSE,
- OPCODE_PING, OPCODE_PONG)
-
- # opcode human readable string
- OPCODE_MAP = {
- OPCODE_CONT: "cont",
- OPCODE_TEXT: "text",
- OPCODE_BINARY: "binary",
- OPCODE_CLOSE: "close",
- OPCODE_PING: "ping",
- OPCODE_PONG: "pong"
- }
-
- # data length threshold.
- LENGTH_7 = 0x7e
- LENGTH_16 = 1 << 16
- LENGTH_63 = 1 << 63
-
- def __init__(self, fin=0, rsv1=0, rsv2=0, rsv3=0,
- opcode=OPCODE_TEXT, mask=1, data=""):
- """
- Constructor for ABNF. Please check RFC for arguments.
- """
- self.fin = fin
- self.rsv1 = rsv1
- self.rsv2 = rsv2
- self.rsv3 = rsv3
- self.opcode = opcode
- self.mask = mask
- if data is None:
- data = ""
- self.data = data
- self.get_mask_key = os.urandom
-
- def validate(self, skip_utf8_validation=False):
- """
- Validate the ABNF frame.
-
- Parameters
- ----------
- skip_utf8_validation: skip utf8 validation.
- """
- if self.rsv1 or self.rsv2 or self.rsv3:
- raise WebSocketProtocolException("rsv is not implemented, yet")
-
- if self.opcode not in ABNF.OPCODES:
- raise WebSocketProtocolException("Invalid opcode %r", self.opcode)
-
- if self.opcode == ABNF.OPCODE_PING and not self.fin:
- raise WebSocketProtocolException("Invalid ping frame.")
-
- if self.opcode == ABNF.OPCODE_CLOSE:
- l = len(self.data)
- if not l:
- return
- if l == 1 or l >= 126:
- raise WebSocketProtocolException("Invalid close frame.")
- if l > 2 and not skip_utf8_validation and not validate_utf8(self.data[2:]):
- raise WebSocketProtocolException("Invalid close frame.")
-
- code = 256 * \
- six.byte2int(self.data[0:1]) + six.byte2int(self.data[1:2])
- if not self._is_valid_close_status(code):
- raise WebSocketProtocolException("Invalid close opcode.")
-
- @staticmethod
- def _is_valid_close_status(code):
- return code in VALID_CLOSE_STATUS or (3000 <= code < 5000)
-
- def __str__(self):
- return "fin=" + str(self.fin) \
- + " opcode=" + str(self.opcode) \
- + " data=" + str(self.data)
-
- @staticmethod
- def create_frame(data, opcode, fin=1):
- """
- Create frame to send text, binary and other data.
-
- Parameters
- ----------
- data: <type>
- data to send. This is string value(byte array).
- If opcode is OPCODE_TEXT and this value is unicode,
- data value is converted into unicode string, automatically.
- opcode: <type>
- operation code. please see OPCODE_XXX.
- fin: <type>
- fin flag. if set to 0, create continue fragmentation.
- """
- if opcode == ABNF.OPCODE_TEXT and isinstance(data, six.text_type):
- data = data.encode("utf-8")
- # mask must be set if send data from client
- return ABNF(fin, 0, 0, 0, opcode, 1, data)
-
- def format(self):
- """
- Format this object to string(byte array) to send data to server.
- """
- if any(x not in (0, 1) for x in [self.fin, self.rsv1, self.rsv2, self.rsv3]):
- raise ValueError("not 0 or 1")
- if self.opcode not in ABNF.OPCODES:
- raise ValueError("Invalid OPCODE")
- length = len(self.data)
- if length >= ABNF.LENGTH_63:
- raise ValueError("data is too long")
-
- frame_header = chr(self.fin << 7 |
- self.rsv1 << 6 | self.rsv2 << 5 | self.rsv3 << 4 |
- self.opcode)
- if length < ABNF.LENGTH_7:
- frame_header += chr(self.mask << 7 | length)
- frame_header = six.b(frame_header)
- elif length < ABNF.LENGTH_16:
- frame_header += chr(self.mask << 7 | 0x7e)
- frame_header = six.b(frame_header)
- frame_header += struct.pack("!H", length)
- else:
- frame_header += chr(self.mask << 7 | 0x7f)
- frame_header = six.b(frame_header)
- frame_header += struct.pack("!Q", length)
-
- if not self.mask:
- return frame_header + self.data
- else:
- mask_key = self.get_mask_key(4)
- return frame_header + self._get_masked(mask_key)
-
- def _get_masked(self, mask_key):
- s = ABNF.mask(mask_key, self.data)
-
- if isinstance(mask_key, six.text_type):
- mask_key = mask_key.encode('utf-8')
-
- return mask_key + s
-
- @staticmethod
- def mask(mask_key, data):
- """
- Mask or unmask data. Just do xor for each byte
-
- Parameters
- ----------
- mask_key: <type>
- 4 byte string(byte).
- data: <type>
- data to mask/unmask.
- """
- if data is None:
- data = ""
-
- if isinstance(mask_key, six.text_type):
- mask_key = six.b(mask_key)
-
- if isinstance(data, six.text_type):
- data = six.b(data)
-
- if numpy:
- origlen = len(data)
- _mask_key = mask_key[3] << 24 | mask_key[2] << 16 | mask_key[1] << 8 | mask_key[0]
-
- # We need data to be a multiple of four...
- data += bytes(" " * (4 - (len(data) % 4)), "us-ascii")
- a = numpy.frombuffer(data, dtype="uint32")
- masked = numpy.bitwise_xor(a, [_mask_key]).astype("uint32")
- if len(data) > origlen:
- return masked.tobytes()[:origlen]
- return masked.tobytes()
- else:
- _m = array.array("B", mask_key)
- _d = array.array("B", data)
- return _mask(_m, _d)
-
-
-class frame_buffer(object):
- _HEADER_MASK_INDEX = 5
- _HEADER_LENGTH_INDEX = 6
-
- def __init__(self, recv_fn, skip_utf8_validation):
- self.recv = recv_fn
- self.skip_utf8_validation = skip_utf8_validation
- # Buffers over the packets from the layer beneath until desired amount
- # bytes of bytes are received.
- self.recv_buffer = []
- self.clear()
- self.lock = Lock()
-
- def clear(self):
- self.header = None
- self.length = None
- self.mask = None
-
- def has_received_header(self):
- return self.header is None
-
- def recv_header(self):
- header = self.recv_strict(2)
- b1 = header[0]
-
- if six.PY2:
- b1 = ord(b1)
-
- fin = b1 >> 7 & 1
- rsv1 = b1 >> 6 & 1
- rsv2 = b1 >> 5 & 1
- rsv3 = b1 >> 4 & 1
- opcode = b1 & 0xf
- b2 = header[1]
-
- if six.PY2:
- b2 = ord(b2)
-
- has_mask = b2 >> 7 & 1
- length_bits = b2 & 0x7f
-
- self.header = (fin, rsv1, rsv2, rsv3, opcode, has_mask, length_bits)
-
- def has_mask(self):
- if not self.header:
- return False
- return self.header[frame_buffer._HEADER_MASK_INDEX]
-
- def has_received_length(self):
- return self.length is None
-
- def recv_length(self):
- bits = self.header[frame_buffer._HEADER_LENGTH_INDEX]
- length_bits = bits & 0x7f
- if length_bits == 0x7e:
- v = self.recv_strict(2)
- self.length = struct.unpack("!H", v)[0]
- elif length_bits == 0x7f:
- v = self.recv_strict(8)
- self.length = struct.unpack("!Q", v)[0]
- else:
- self.length = length_bits
-
- def has_received_mask(self):
- return self.mask is None
-
- def recv_mask(self):
- self.mask = self.recv_strict(4) if self.has_mask() else ""
-
- def recv_frame(self):
-
- with self.lock:
- # Header
- if self.has_received_header():
- self.recv_header()
- (fin, rsv1, rsv2, rsv3, opcode, has_mask, _) = self.header
-
- # Frame length
- if self.has_received_length():
- self.recv_length()
- length = self.length
-
- # Mask
- if self.has_received_mask():
- self.recv_mask()
- mask = self.mask
-
- # Payload
- payload = self.recv_strict(length)
- if has_mask:
- payload = ABNF.mask(mask, payload)
-
- # Reset for next frame
- self.clear()
-
- frame = ABNF(fin, rsv1, rsv2, rsv3, opcode, has_mask, payload)
- frame.validate(self.skip_utf8_validation)
-
- return frame
-
- def recv_strict(self, bufsize):
- shortage = bufsize - sum(len(x) for x in self.recv_buffer)
- while shortage > 0:
- # Limit buffer size that we pass to socket.recv() to avoid
- # fragmenting the heap -- the number of bytes recv() actually
- # reads is limited by socket buffer and is relatively small,
- # yet passing large numbers repeatedly causes lots of large
- # buffers allocated and then shrunk, which results in
- # fragmentation.
- bytes_ = self.recv(min(16384, shortage))
- self.recv_buffer.append(bytes_)
- shortage -= len(bytes_)
-
- unified = six.b("").join(self.recv_buffer)
-
- if shortage == 0:
- self.recv_buffer = []
- return unified
- else:
- self.recv_buffer = [unified[bufsize:]]
- return unified[:bufsize]
-
-
-class continuous_frame(object):
-
- def __init__(self, fire_cont_frame, skip_utf8_validation):
- self.fire_cont_frame = fire_cont_frame
- self.skip_utf8_validation = skip_utf8_validation
- self.cont_data = None
- self.recving_frames = None
-
- def validate(self, frame):
- if not self.recving_frames and frame.opcode == ABNF.OPCODE_CONT:
- raise WebSocketProtocolException("Illegal frame")
- if self.recving_frames and \
- frame.opcode in (ABNF.OPCODE_TEXT, ABNF.OPCODE_BINARY):
- raise WebSocketProtocolException("Illegal frame")
-
- def add(self, frame):
- if self.cont_data:
- self.cont_data[1] += frame.data
- else:
- if frame.opcode in (ABNF.OPCODE_TEXT, ABNF.OPCODE_BINARY):
- self.recving_frames = frame.opcode
- self.cont_data = [frame.opcode, frame.data]
-
- if frame.fin:
- self.recving_frames = None
-
- def is_fire(self, frame):
- return frame.fin or self.fire_cont_frame
-
- def extract(self, frame):
- data = self.cont_data
- self.cont_data = None
- frame.data = data[1]
- if not self.fire_cont_frame and data[0] == ABNF.OPCODE_TEXT and not self.skip_utf8_validation and not validate_utf8(frame.data):
- raise WebSocketPayloadException(
- "cannot decode: " + repr(frame.data))
-
- return [data[0], frame]
diff --git a/contrib/python/websocket-client/py2/websocket/_app.py b/contrib/python/websocket-client/py2/websocket/_app.py
deleted file mode 100644
index a3f91a38a3f..00000000000
--- a/contrib/python/websocket-client/py2/websocket/_app.py
+++ /dev/null
@@ -1,399 +0,0 @@
-"""
-
-"""
-
-"""
-websocket - WebSocket client library for Python
-
-Copyright (C) 2010 Hiroki Ohtani(liris)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-import inspect
-import select
-import sys
-import threading
-import time
-import traceback
-
-import six
-
-from ._abnf import ABNF
-from ._core import WebSocket, getdefaulttimeout
-from ._exceptions import *
-from . import _logging
-
-
-__all__ = ["WebSocketApp"]
-
-
-class Dispatcher:
- """
- Dispatcher
- """
- def __init__(self, app, ping_timeout):
- self.app = app
- self.ping_timeout = ping_timeout
-
- def read(self, sock, read_callback, check_callback):
- while self.app.keep_running:
- r, w, e = select.select(
- (self.app.sock.sock, ), (), (), self.ping_timeout)
- if r:
- if not read_callback():
- break
- check_callback()
-
-
-class SSLDispatcher:
- """
- SSLDispatcher
- """
- def __init__(self, app, ping_timeout):
- self.app = app
- self.ping_timeout = ping_timeout
-
- def read(self, sock, read_callback, check_callback):
- while self.app.keep_running:
- r = self.select()
- if r:
- if not read_callback():
- break
- check_callback()
-
- def select(self):
- sock = self.app.sock.sock
- if sock.pending():
- return [sock,]
-
- r, w, e = select.select((sock, ), (), (), self.ping_timeout)
- return r
-
-
-class WebSocketApp(object):
- """
- Higher level of APIs are provided. The interface is like JavaScript WebSocket object.
- """
-
- def __init__(self, url, header=None,
- on_open=None, on_message=None, on_error=None,
- on_close=None, on_ping=None, on_pong=None,
- on_cont_message=None,
- keep_running=True, get_mask_key=None, cookie=None,
- subprotocols=None,
- on_data=None):
- """
- WebSocketApp initialization
-
- Parameters
- ----------
- url: <type>
- websocket url.
- header: list or dict
- custom header for websocket handshake.
- on_open: <type>
- callable object which is called at opening websocket.
- this function has one argument. The argument is this class object.
- on_message: <type>
- callable object which is called when received data.
- on_message has 2 arguments.
- The 1st argument is this class object.
- The 2nd argument is utf-8 string which we get from the server.
- on_error: <type>
- callable object which is called when we get error.
- on_error has 2 arguments.
- The 1st argument is this class object.
- The 2nd argument is exception object.
- on_close: <type>
- callable object which is called when closed the connection.
- this function has one argument. The argument is this class object.
- on_cont_message: <type>
- callback object which is called when receive continued
- frame data.
- on_cont_message has 3 arguments.
- The 1st argument is this class object.
- The 2nd argument is utf-8 string which we get from the server.
- The 3rd argument is continue flag. if 0, the data continue
- to next frame data
- on_data: <type>
- callback object which is called when a message received.
- This is called before on_message or on_cont_message,
- and then on_message or on_cont_message is called.
- on_data has 4 argument.
- The 1st argument is this class object.
- The 2nd argument is utf-8 string which we get from the server.
- The 3rd argument is data type. ABNF.OPCODE_TEXT or ABNF.OPCODE_BINARY will be came.
- The 4th argument is continue flag. if 0, the data continue
- keep_running: <type>
- this parameter is obsolete and ignored.
- get_mask_key: func
- a callable to produce new mask keys,
- see the WebSocket.set_mask_key's docstring for more information
- cookie: str
- cookie value.
- subprotocols: <type>
- array of available sub protocols. default is None.
- """
- self.url = url
- self.header = header if header is not None else []
- self.cookie = cookie
-
- self.on_open = on_open
- self.on_message = on_message
- self.on_data = on_data
- self.on_error = on_error
- self.on_close = on_close
- self.on_ping = on_ping
- self.on_pong = on_pong
- self.on_cont_message = on_cont_message
- self.keep_running = False
- self.get_mask_key = get_mask_key
- self.sock = None
- self.last_ping_tm = 0
- self.last_pong_tm = 0
- self.subprotocols = subprotocols
-
- def send(self, data, opcode=ABNF.OPCODE_TEXT):
- """
- send message
-
- Parameters
- ----------
- data: <type>
- Message to send. If you set opcode to OPCODE_TEXT,
- data must be utf-8 string or unicode.
- opcode: <type>
- Operation code of data. default is OPCODE_TEXT.
- """
-
- if not self.sock or self.sock.send(data, opcode) == 0:
- raise WebSocketConnectionClosedException(
- "Connection is already closed.")
-
- def close(self, **kwargs):
- """
- Close websocket connection.
- """
- self.keep_running = False
- if self.sock:
- self.sock.close(**kwargs)
- self.sock = None
-
- def _send_ping(self, interval, event, payload):
- while not event.wait(interval):
- self.last_ping_tm = time.time()
- if self.sock:
- try:
- self.sock.ping(payload)
- except Exception as ex:
- _logging.warning("send_ping routine terminated: {}".format(ex))
- break
-
- def run_forever(self, sockopt=None, sslopt=None,
- ping_interval=0, ping_timeout=None,
- ping_payload="",
- http_proxy_host=None, http_proxy_port=None,
- http_no_proxy=None, http_proxy_auth=None,
- skip_utf8_validation=False,
- host=None, origin=None, dispatcher=None,
- suppress_origin=False, proxy_type=None):
- """
- Run event loop for WebSocket framework.
-
- This loop is an infinite loop and is alive while websocket is available.
-
- Parameters
- ----------
- sockopt: tuple
- values for socket.setsockopt.
- sockopt must be tuple
- and each element is argument of sock.setsockopt.
- sslopt: dict
- optional dict object for ssl socket option.
- ping_interval: int or float
- automatically send "ping" command
- every specified period (in seconds)
- if set to 0, not send automatically.
- ping_timeout: int or float
- timeout (in seconds) if the pong message is not received.
- ping_payload: str
- payload message to send with each ping.
- http_proxy_host: <type>
- http proxy host name.
- http_proxy_port: <type>
- http proxy port. If not set, set to 80.
- http_no_proxy: <type>
- host names, which doesn't use proxy.
- skip_utf8_validation: bool
- skip utf8 validation.
- host: str
- update host header.
- origin: str
- update origin header.
- dispatcher: <type>
- customize reading data from socket.
- suppress_origin: bool
- suppress outputting origin header.
-
- Returns
- -------
- teardown: bool
- False if caught KeyboardInterrupt, True if other exception was raised during a loop
- """
-
- if ping_timeout is not None and ping_timeout <= 0:
- ping_timeout = None
- if ping_timeout and ping_interval and ping_interval <= ping_timeout:
- raise WebSocketException("Ensure ping_interval > ping_timeout")
- if not sockopt:
- sockopt = []
- if not sslopt:
- sslopt = {}
- if self.sock:
- raise WebSocketException("socket is already opened")
- thread = None
- self.keep_running = True
- self.last_ping_tm = 0
- self.last_pong_tm = 0
-
- def teardown(close_frame=None):
- """
- Tears down the connection.
-
- If close_frame is set, we will invoke the on_close handler with the
- statusCode and reason from there.
- """
- if thread and thread.is_alive():
- event.set()
- thread.join()
- self.keep_running = False
- if self.sock:
- self.sock.close()
- close_args = self._get_close_args(
- close_frame.data if close_frame else None)
- self._callback(self.on_close, *close_args)
- self.sock = None
-
- try:
- self.sock = WebSocket(
- self.get_mask_key, sockopt=sockopt, sslopt=sslopt,
- fire_cont_frame=self.on_cont_message is not None,
- skip_utf8_validation=skip_utf8_validation,
- enable_multithread=True if ping_interval else False)
- self.sock.settimeout(getdefaulttimeout())
- self.sock.connect(
- self.url, header=self.header, cookie=self.cookie,
- http_proxy_host=http_proxy_host,
- http_proxy_port=http_proxy_port, http_no_proxy=http_no_proxy,
- http_proxy_auth=http_proxy_auth, subprotocols=self.subprotocols,
- host=host, origin=origin, suppress_origin=suppress_origin,
- proxy_type=proxy_type)
- if not dispatcher:
- dispatcher = self.create_dispatcher(ping_timeout)
-
- self._callback(self.on_open)
-
- if ping_interval:
- event = threading.Event()
- thread = threading.Thread(
- target=self._send_ping, args=(ping_interval, event, ping_payload))
- thread.daemon = True
- thread.start()
-
- def read():
- if not self.keep_running:
- return teardown()
-
- op_code, frame = self.sock.recv_data_frame(True)
- if op_code == ABNF.OPCODE_CLOSE:
- return teardown(frame)
- elif op_code == ABNF.OPCODE_PING:
- self._callback(self.on_ping, frame.data)
- elif op_code == ABNF.OPCODE_PONG:
- self.last_pong_tm = time.time()
- self._callback(self.on_pong, frame.data)
- elif op_code == ABNF.OPCODE_CONT and self.on_cont_message:
- self._callback(self.on_data, frame.data,
- frame.opcode, frame.fin)
- self._callback(self.on_cont_message,
- frame.data, frame.fin)
- else:
- data = frame.data
- if six.PY3 and op_code == ABNF.OPCODE_TEXT:
- data = data.decode("utf-8")
- self._callback(self.on_data, data, frame.opcode, True)
- self._callback(self.on_message, data)
-
- return True
-
- def check():
- if (ping_timeout):
- has_timeout_expired = time.time() - self.last_ping_tm > ping_timeout
- has_pong_not_arrived_after_last_ping = self.last_pong_tm - self.last_ping_tm < 0
- has_pong_arrived_too_late = self.last_pong_tm - self.last_ping_tm > ping_timeout
-
- if (self.last_ping_tm and
- has_timeout_expired and
- (has_pong_not_arrived_after_last_ping or has_pong_arrived_too_late)):
- raise WebSocketTimeoutException("ping/pong timed out")
- return True
-
- dispatcher.read(self.sock.sock, read, check)
- except (Exception, KeyboardInterrupt, SystemExit) as e:
- self._callback(self.on_error, e)
- if isinstance(e, SystemExit):
- # propagate SystemExit further
- raise
- teardown()
- return not isinstance(e, KeyboardInterrupt)
-
- def create_dispatcher(self, ping_timeout):
- timeout = ping_timeout or 10
- if self.sock.is_ssl():
- return SSLDispatcher(self, timeout)
-
- return Dispatcher(self, timeout)
-
- def _get_close_args(self, data):
- """
- _get_close_args extracts the code, reason from the close body
- if they exists, and if the self.on_close except three arguments
- """
- # if the on_close callback is "old", just return empty list
- if sys.version_info < (3, 0):
- if not self.on_close or len(inspect.getargspec(self.on_close).args) != 3:
- return []
- else:
- if not self.on_close or len(inspect.getfullargspec(self.on_close).args) != 3:
- return []
-
- if data and len(data) >= 2:
- code = 256 * six.byte2int(data[0:1]) + six.byte2int(data[1:2])
- reason = data[2:].decode('utf-8')
- return [code, reason]
-
- return [None, None]
-
- def _callback(self, callback, *args):
- if callback:
- try:
- callback(self, *args)
-
- except Exception as e:
- _logging.error("error from callback {}: {}".format(callback, e))
- if _logging.isEnabledForDebug():
- _, _, tb = sys.exc_info()
- traceback.print_tb(tb)
diff --git a/contrib/python/websocket-client/py2/websocket/_cookiejar.py b/contrib/python/websocket-client/py2/websocket/_cookiejar.py
deleted file mode 100644
index bc2891a6508..00000000000
--- a/contrib/python/websocket-client/py2/websocket/_cookiejar.py
+++ /dev/null
@@ -1,78 +0,0 @@
-"""
-
-"""
-
-"""
-websocket - WebSocket client library for Python
-
-Copyright (C) 2010 Hiroki Ohtani(liris)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-try:
- import Cookie
-except:
- import http.cookies as Cookie
-
-
-class SimpleCookieJar(object):
- def __init__(self):
- self.jar = dict()
-
- def add(self, set_cookie):
- if set_cookie:
- try:
- simpleCookie = Cookie.SimpleCookie(set_cookie)
- except:
- simpleCookie = Cookie.SimpleCookie(set_cookie.encode('ascii', 'ignore'))
-
- for k, v in simpleCookie.items():
- domain = v.get("domain")
- if domain:
- if not domain.startswith("."):
- domain = "." + domain
- cookie = self.jar.get(domain) if self.jar.get(domain) else Cookie.SimpleCookie()
- cookie.update(simpleCookie)
- self.jar[domain.lower()] = cookie
-
- def set(self, set_cookie):
- if set_cookie:
- try:
- simpleCookie = Cookie.SimpleCookie(set_cookie)
- except:
- simpleCookie = Cookie.SimpleCookie(set_cookie.encode('ascii', 'ignore'))
-
- for k, v in simpleCookie.items():
- domain = v.get("domain")
- if domain:
- if not domain.startswith("."):
- domain = "." + domain
- self.jar[domain.lower()] = simpleCookie
-
- def get(self, host):
- if not host:
- return ""
-
- cookies = []
- for domain, simpleCookie in self.jar.items():
- host = host.lower()
- if host.endswith(domain) or host == domain[1:]:
- cookies.append(self.jar.get(domain))
-
- return "; ".join(filter(
- None, sorted(
- ["%s=%s" % (k, v.value) for cookie in filter(None, cookies) for k, v in cookie.items()]
- )))
diff --git a/contrib/python/websocket-client/py2/websocket/_core.py b/contrib/python/websocket-client/py2/websocket/_core.py
deleted file mode 100644
index 1ff80f05d73..00000000000
--- a/contrib/python/websocket-client/py2/websocket/_core.py
+++ /dev/null
@@ -1,595 +0,0 @@
-from __future__ import print_function
-"""
-_core.py
-====================================
-WebSocket Python client
-"""
-
-"""
-websocket - WebSocket client library for Python
-
-Copyright (C) 2010 Hiroki Ohtani(liris)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-import socket
-import struct
-import threading
-import time
-
-import six
-
-# websocket modules
-from ._abnf import *
-from ._exceptions import *
-from ._handshake import *
-from ._http import *
-from ._logging import *
-from ._socket import *
-from ._ssl_compat import *
-from ._utils import *
-
-__all__ = ['WebSocket', 'create_connection']
-
-
-class WebSocket(object):
- """
- Low level WebSocket interface.
-
- This class is based on the WebSocket protocol `draft-hixie-thewebsocketprotocol-76 <http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76>`_
-
- We can connect to the websocket server and send/receive data.
- The following example is an echo client.
-
- >>> import websocket
- >>> ws = websocket.WebSocket()
- >>> ws.connect("ws://echo.websocket.org")
- >>> ws.send("Hello, Server")
- >>> ws.recv()
- 'Hello, Server'
- >>> ws.close()
-
- Parameters
- ----------
- get_mask_key: func
- a callable to produce new mask keys, see the set_mask_key
- function's docstring for more details
- sockopt: tuple
- values for socket.setsockopt.
- sockopt must be tuple and each element is argument of sock.setsockopt.
- sslopt: dict
- optional dict object for ssl socket option.
- fire_cont_frame: bool
- fire recv event for each cont frame. default is False
- enable_multithread: bool
- if set to True, lock send method.
- skip_utf8_validation: bool
- skip utf8 validation.
- """
-
- def __init__(self, get_mask_key=None, sockopt=None, sslopt=None,
- fire_cont_frame=False, enable_multithread=False,
- skip_utf8_validation=False, **_):
- """
- Initialize WebSocket object.
-
- Parameters
- ----------
- sslopt: specify ssl certification verification options
- """
- self.sock_opt = sock_opt(sockopt, sslopt)
- self.handshake_response = None
- self.sock = None
-
- self.connected = False
- self.get_mask_key = get_mask_key
- # These buffer over the build-up of a single frame.
- self.frame_buffer = frame_buffer(self._recv, skip_utf8_validation)
- self.cont_frame = continuous_frame(
- fire_cont_frame, skip_utf8_validation)
-
- if enable_multithread:
- self.lock = threading.Lock()
- self.readlock = threading.Lock()
- else:
- self.lock = NoLock()
- self.readlock = NoLock()
-
- def __iter__(self):
- """
- Allow iteration over websocket, implying sequential `recv` executions.
- """
- while True:
- yield self.recv()
-
- def __next__(self):
- return self.recv()
-
- def next(self):
- return self.__next__()
-
- def fileno(self):
- return self.sock.fileno()
-
- def set_mask_key(self, func):
- """
- Set function to create mask key. You can customize mask key generator.
- Mainly, this is for testing purpose.
-
- Parameters
- ----------
- func: func
- callable object. the func takes 1 argument as integer.
- The argument means length of mask key.
- This func must return string(byte array),
- which length is argument specified.
- """
- self.get_mask_key = func
-
- def gettimeout(self):
- """
- Get the websocket timeout (in seconds) as an int or float
-
- Returns
- ----------
- timeout: int or float
- returns timeout value (in seconds). This value could be either float/integer.
- """
- return self.sock_opt.timeout
-
- def settimeout(self, timeout):
- """
- Set the timeout to the websocket.
-
- Parameters
- ----------
- timeout: int or float
- timeout time (in seconds). This value could be either float/integer.
- """
- self.sock_opt.timeout = timeout
- if self.sock:
- self.sock.settimeout(timeout)
-
- timeout = property(gettimeout, settimeout)
-
- def getsubprotocol(self):
- """
- Get subprotocol
- """
- if self.handshake_response:
- return self.handshake_response.subprotocol
- else:
- return None
-
- subprotocol = property(getsubprotocol)
-
- def getstatus(self):
- """
- Get handshake status
- """
- if self.handshake_response:
- return self.handshake_response.status
- else:
- return None
-
- status = property(getstatus)
-
- def getheaders(self):
- """
- Get handshake response header
- """
- if self.handshake_response:
- return self.handshake_response.headers
- else:
- return None
-
- def is_ssl(self):
- return isinstance(self.sock, ssl.SSLSocket)
-
- headers = property(getheaders)
-
- def connect(self, url, **options):
- """
- Connect to url. url is websocket url scheme.
- ie. ws://host:port/resource
- You can customize using 'options'.
- If you set "header" list object, you can set your own custom header.
-
- >>> ws = WebSocket()
- >>> ws.connect("ws://echo.websocket.org/",
- ... header=["User-Agent: MyProgram",
- ... "x-custom: header"])
-
- timeout: <type>
- socket timeout time. This value is an integer or float.
- if you set None for this value, it means "use default_timeout value"
-
- Parameters
- ----------
- options:
- - header: list or dict
- custom http header list or dict.
- - cookie: str
- cookie value.
- - origin: str
- custom origin url.
- - suppress_origin: bool
- suppress outputting origin header.
- - host: str
- custom host header string.
- - http_proxy_host: <type>
- http proxy host name.
- - http_proxy_port: <type>
- http proxy port. If not set, set to 80.
- - http_no_proxy: <type>
- host names, which doesn't use proxy.
- - http_proxy_auth: <type>
- http proxy auth information. tuple of username and password. default is None
- - redirect_limit: <type>
- number of redirects to follow.
- - subprotocols: <type>
- array of available sub protocols. default is None.
- - socket: <type>
- pre-initialized stream socket.
- """
- self.sock_opt.timeout = options.get('timeout', self.sock_opt.timeout)
- self.sock, addrs = connect(url, self.sock_opt, proxy_info(**options),
- options.pop('socket', None))
-
- try:
- self.handshake_response = handshake(self.sock, *addrs, **options)
- for attempt in range(options.pop('redirect_limit', 3)):
- if self.handshake_response.status in SUPPORTED_REDIRECT_STATUSES:
- url = self.handshake_response.headers['location']
- self.sock.close()
- self.sock, addrs = connect(url, self.sock_opt, proxy_info(**options),
- options.pop('socket', None))
- self.handshake_response = handshake(self.sock, *addrs, **options)
- self.connected = True
- except:
- if self.sock:
- self.sock.close()
- self.sock = None
- raise
-
- def send(self, payload, opcode=ABNF.OPCODE_TEXT):
- """
- Send the data as string.
-
- Parameters
- ----------
- payload: <type>
- Payload must be utf-8 string or unicode,
- if the opcode is OPCODE_TEXT.
- Otherwise, it must be string(byte array)
- opcode: <type>
- operation code to send. Please see OPCODE_XXX.
- """
-
- frame = ABNF.create_frame(payload, opcode)
- return self.send_frame(frame)
-
- def send_frame(self, frame):
- """
- Send the data frame.
-
- >>> ws = create_connection("ws://echo.websocket.org/")
- >>> frame = ABNF.create_frame("Hello", ABNF.OPCODE_TEXT)
- >>> ws.send_frame(frame)
- >>> cont_frame = ABNF.create_frame("My name is ", ABNF.OPCODE_CONT, 0)
- >>> ws.send_frame(frame)
- >>> cont_frame = ABNF.create_frame("Foo Bar", ABNF.OPCODE_CONT, 1)
- >>> ws.send_frame(frame)
-
- Parameters
- ----------
- frame: <type>
- frame data created by ABNF.create_frame
- """
- if self.get_mask_key:
- frame.get_mask_key = self.get_mask_key
- data = frame.format()
- length = len(data)
- if (isEnabledForTrace()):
- trace("send: " + repr(data))
-
- with self.lock:
- while data:
- l = self._send(data)
- data = data[l:]
-
- return length
-
- def send_binary(self, payload):
- return self.send(payload, ABNF.OPCODE_BINARY)
-
- def ping(self, payload=""):
- """
- Send ping data.
-
- Parameters
- ----------
- payload: <type>
- data payload to send server.
- """
- if isinstance(payload, six.text_type):
- payload = payload.encode("utf-8")
- self.send(payload, ABNF.OPCODE_PING)
-
- def pong(self, payload=""):
- """
- Send pong data.
-
- Parameters
- ----------
- payload: <type>
- data payload to send server.
- """
- if isinstance(payload, six.text_type):
- payload = payload.encode("utf-8")
- self.send(payload, ABNF.OPCODE_PONG)
-
- def recv(self):
- """
- Receive string data(byte array) from the server.
-
- Returns
- ----------
- data: string (byte array) value.
- """
- with self.readlock:
- opcode, data = self.recv_data()
- if six.PY3 and opcode == ABNF.OPCODE_TEXT:
- return data.decode("utf-8")
- elif opcode == ABNF.OPCODE_TEXT or opcode == ABNF.OPCODE_BINARY:
- return data
- else:
- return ''
-
- def recv_data(self, control_frame=False):
- """
- Receive data with operation code.
-
- Parameters
- ----------
- control_frame: bool
- a boolean flag indicating whether to return control frame
- data, defaults to False
-
- Returns
- -------
- opcode, frame.data: tuple
- tuple of operation code and string(byte array) value.
- """
- opcode, frame = self.recv_data_frame(control_frame)
- return opcode, frame.data
-
- def recv_data_frame(self, control_frame=False):
- """
- Receive data with operation code.
-
- Parameters
- ----------
- control_frame: bool
- a boolean flag indicating whether to return control frame
- data, defaults to False
-
- Returns
- -------
- frame.opcode, frame: tuple
- tuple of operation code and string(byte array) value.
- """
- while True:
- frame = self.recv_frame()
- if not frame:
- # handle error:
- # 'NoneType' object has no attribute 'opcode'
- raise WebSocketProtocolException(
- "Not a valid frame %s" % frame)
- elif frame.opcode in (ABNF.OPCODE_TEXT, ABNF.OPCODE_BINARY, ABNF.OPCODE_CONT):
- self.cont_frame.validate(frame)
- self.cont_frame.add(frame)
-
- if self.cont_frame.is_fire(frame):
- return self.cont_frame.extract(frame)
-
- elif frame.opcode == ABNF.OPCODE_CLOSE:
- self.send_close()
- return frame.opcode, frame
- elif frame.opcode == ABNF.OPCODE_PING:
- if len(frame.data) < 126:
- self.pong(frame.data)
- else:
- raise WebSocketProtocolException(
- "Ping message is too long")
- if control_frame:
- return frame.opcode, frame
- elif frame.opcode == ABNF.OPCODE_PONG:
- if control_frame:
- return frame.opcode, frame
-
- def recv_frame(self):
- """
- Receive data as frame from server.
-
- Returns
- -------
- self.frame_buffer.recv_frame(): ABNF frame object
- """
- return self.frame_buffer.recv_frame()
-
- def send_close(self, status=STATUS_NORMAL, reason=six.b("")):
- """
- Send close data to the server.
-
- Parameters
- ----------
- status: <type>
- status code to send. see STATUS_XXX.
- reason: str or bytes
- the reason to close. This must be string or bytes.
- """
- if status < 0 or status >= ABNF.LENGTH_16:
- raise ValueError("code is invalid range")
- self.connected = False
- self.send(struct.pack('!H', status) + reason, ABNF.OPCODE_CLOSE)
-
- def close(self, status=STATUS_NORMAL, reason=six.b(""), timeout=3):
- """
- Close Websocket object
-
- Parameters
- ----------
- status: <type>
- status code to send. see STATUS_XXX.
- reason: <type>
- the reason to close. This must be string.
- timeout: int or float
- timeout until receive a close frame.
- If None, it will wait forever until receive a close frame.
- """
- if self.connected:
- if status < 0 or status >= ABNF.LENGTH_16:
- raise ValueError("code is invalid range")
-
- try:
- self.connected = False
- self.send(struct.pack('!H', status) + reason, ABNF.OPCODE_CLOSE)
- sock_timeout = self.sock.gettimeout()
- self.sock.settimeout(timeout)
- start_time = time.time()
- while timeout is None or time.time() - start_time < timeout:
- try:
- frame = self.recv_frame()
- if frame.opcode != ABNF.OPCODE_CLOSE:
- continue
- if isEnabledForError():
- recv_status = struct.unpack("!H", frame.data[0:2])[0]
- if recv_status >= 3000 and recv_status <= 4999:
- debug("close status: " + repr(recv_status))
- elif recv_status != STATUS_NORMAL:
- error("close status: " + repr(recv_status))
- break
- except:
- break
- self.sock.settimeout(sock_timeout)
- self.sock.shutdown(socket.SHUT_RDWR)
- except:
- pass
-
- self.shutdown()
-
- def abort(self):
- """
- Low-level asynchronous abort, wakes up other threads that are waiting in recv_*
- """
- if self.connected:
- self.sock.shutdown(socket.SHUT_RDWR)
-
- def shutdown(self):
- """
- close socket, immediately.
- """
- if self.sock:
- self.sock.close()
- self.sock = None
- self.connected = False
-
- def _send(self, data):
- return send(self.sock, data)
-
- def _recv(self, bufsize):
- try:
- return recv(self.sock, bufsize)
- except WebSocketConnectionClosedException:
- if self.sock:
- self.sock.close()
- self.sock = None
- self.connected = False
- raise
-
-
-def create_connection(url, timeout=None, class_=WebSocket, **options):
- """
- Connect to url and return websocket object.
-
- Connect to url and return the WebSocket object.
- Passing optional timeout parameter will set the timeout on the socket.
- If no timeout is supplied,
- the global default timeout setting returned by getdefaulttimeout() is used.
- You can customize using 'options'.
- If you set "header" list object, you can set your own custom header.
-
- >>> conn = create_connection("ws://echo.websocket.org/",
- ... header=["User-Agent: MyProgram",
- ... "x-custom: header"])
-
- Parameters
- ----------
- timeout: int or float
- socket timeout time. This value could be either float/integer.
- if you set None for this value,
- it means "use default_timeout value"
- class_: <type>
- class to instantiate when creating the connection. It has to implement
- settimeout and connect. It's __init__ should be compatible with
- WebSocket.__init__, i.e. accept all of it's kwargs.
- options: <type>
- - header: list or dict
- custom http header list or dict.
- - cookie: str
- cookie value.
- - origin: str
- custom origin url.
- - suppress_origin: bool
- suppress outputting origin header.
- - host: <type>
- custom host header string.
- - http_proxy_host: <type>
- http proxy host name.
- - http_proxy_port: <type>
- http proxy port. If not set, set to 80.
- - http_no_proxy: <type>
- host names, which doesn't use proxy.
- - http_proxy_auth: <type>
- http proxy auth information. tuple of username and password. default is None
- - enable_multithread: bool
- enable lock for multithread.
- - redirect_limit: <type>
- number of redirects to follow.
- - sockopt: <type>
- socket options
- - sslopt: <type>
- ssl option
- - subprotocols: <type>
- array of available sub protocols. default is None.
- - skip_utf8_validation: bool
- skip utf8 validation.
- - socket: <type>
- pre-initialized stream socket.
- """
- sockopt = options.pop("sockopt", [])
- sslopt = options.pop("sslopt", {})
- fire_cont_frame = options.pop("fire_cont_frame", False)
- enable_multithread = options.pop("enable_multithread", False)
- skip_utf8_validation = options.pop("skip_utf8_validation", False)
- websock = class_(sockopt=sockopt, sslopt=sslopt,
- fire_cont_frame=fire_cont_frame,
- enable_multithread=enable_multithread,
- skip_utf8_validation=skip_utf8_validation, **options)
- websock.settimeout(timeout if timeout is not None else getdefaulttimeout())
- websock.connect(url, **options)
- return websock
diff --git a/contrib/python/websocket-client/py2/websocket/_exceptions.py b/contrib/python/websocket-client/py2/websocket/_exceptions.py
deleted file mode 100644
index 83c6e42b7df..00000000000
--- a/contrib/python/websocket-client/py2/websocket/_exceptions.py
+++ /dev/null
@@ -1,86 +0,0 @@
-"""
-Define WebSocket exceptions
-"""
-
-"""
-websocket - WebSocket client library for Python
-
-Copyright (C) 2010 Hiroki Ohtani(liris)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-
-
-class WebSocketException(Exception):
- """
- WebSocket exception class.
- """
- pass
-
-
-class WebSocketProtocolException(WebSocketException):
- """
- If the WebSocket protocol is invalid, this exception will be raised.
- """
- pass
-
-
-class WebSocketPayloadException(WebSocketException):
- """
- If the WebSocket payload is invalid, this exception will be raised.
- """
- pass
-
-
-class WebSocketConnectionClosedException(WebSocketException):
- """
- If remote host closed the connection or some network error happened,
- this exception will be raised.
- """
- pass
-
-
-class WebSocketTimeoutException(WebSocketException):
- """
- WebSocketTimeoutException will be raised at socket timeout during read/write data.
- """
- pass
-
-
-class WebSocketProxyException(WebSocketException):
- """
- WebSocketProxyException will be raised when proxy error occurred.
- """
- pass
-
-
-class WebSocketBadStatusException(WebSocketException):
- """
- WebSocketBadStatusException will be raised when we get bad handshake status code.
- """
-
- def __init__(self, message, status_code, status_message=None, resp_headers=None):
- msg = message % (status_code, status_message)
- super(WebSocketBadStatusException, self).__init__(msg)
- self.status_code = status_code
- self.resp_headers = resp_headers
-
-
-class WebSocketAddressException(WebSocketException):
- """
- If the websocket address info cannot be found, this exception will be raised.
- """
- pass
diff --git a/contrib/python/websocket-client/py2/websocket/_handshake.py b/contrib/python/websocket-client/py2/websocket/_handshake.py
deleted file mode 100644
index c4d9d169dab..00000000000
--- a/contrib/python/websocket-client/py2/websocket/_handshake.py
+++ /dev/null
@@ -1,212 +0,0 @@
-"""
-websocket - WebSocket client library for Python
-
-Copyright (C) 2010 Hiroki Ohtani(liris)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-import hashlib
-import hmac
-import os
-
-import six
-
-from ._cookiejar import SimpleCookieJar
-from ._exceptions import *
-from ._http import *
-from ._logging import *
-from ._socket import *
-
-if hasattr(six, 'PY3') and six.PY3:
- from base64 import encodebytes as base64encode
-else:
- from base64 import encodestring as base64encode
-
-if hasattr(six, 'PY3') and six.PY3:
- if hasattr(six, 'PY34') and six.PY34:
- from http import client as HTTPStatus
- else:
- from http import HTTPStatus
-else:
- import httplib as HTTPStatus
-
-__all__ = ["handshake_response", "handshake", "SUPPORTED_REDIRECT_STATUSES"]
-
-if hasattr(hmac, "compare_digest"):
- compare_digest = hmac.compare_digest
-else:
- def compare_digest(s1, s2):
- return s1 == s2
-
-# websocket supported version.
-VERSION = 13
-
-SUPPORTED_REDIRECT_STATUSES = (HTTPStatus.MOVED_PERMANENTLY, HTTPStatus.FOUND, HTTPStatus.SEE_OTHER,)
-SUCCESS_STATUSES = SUPPORTED_REDIRECT_STATUSES + (HTTPStatus.SWITCHING_PROTOCOLS,)
-
-CookieJar = SimpleCookieJar()
-
-
-class handshake_response(object):
-
- def __init__(self, status, headers, subprotocol):
- self.status = status
- self.headers = headers
- self.subprotocol = subprotocol
- CookieJar.add(headers.get("set-cookie"))
-
-
-def handshake(sock, hostname, port, resource, **options):
- headers, key = _get_handshake_headers(resource, hostname, port, options)
-
- header_str = "\r\n".join(headers)
- send(sock, header_str)
- dump("request header", header_str)
-
- status, resp = _get_resp_headers(sock)
- if status in SUPPORTED_REDIRECT_STATUSES:
- return handshake_response(status, resp, None)
- success, subproto = _validate(resp, key, options.get("subprotocols"))
- if not success:
- raise WebSocketException("Invalid WebSocket Header")
-
- return handshake_response(status, resp, subproto)
-
-
-def _pack_hostname(hostname):
- # IPv6 address
- if ':' in hostname:
- return '[' + hostname + ']'
-
- return hostname
-
-
-def _get_handshake_headers(resource, host, port, options):
- headers = [
- "GET %s HTTP/1.1" % resource,
- "Upgrade: websocket"
- ]
- if port == 80 or port == 443:
- hostport = _pack_hostname(host)
- else:
- hostport = "%s:%d" % (_pack_hostname(host), port)
- if "host" in options and options["host"] is not None:
- headers.append("Host: %s" % options["host"])
- else:
- headers.append("Host: %s" % hostport)
-
- if "suppress_origin" not in options or not options["suppress_origin"]:
- if "origin" in options and options["origin"] is not None:
- headers.append("Origin: %s" % options["origin"])
- else:
- headers.append("Origin: http://%s" % hostport)
-
- key = _create_sec_websocket_key()
-
- # Append Sec-WebSocket-Key & Sec-WebSocket-Version if not manually specified
- if 'header' not in options or 'Sec-WebSocket-Key' not in options['header']:
- key = _create_sec_websocket_key()
- headers.append("Sec-WebSocket-Key: %s" % key)
- else:
- key = options['header']['Sec-WebSocket-Key']
-
- if 'header' not in options or 'Sec-WebSocket-Version' not in options['header']:
- headers.append("Sec-WebSocket-Version: %s" % VERSION)
-
- if 'connection' not in options or options['connection'] is None:
- headers.append('Connection: Upgrade')
- else:
- headers.append(options['connection'])
-
- subprotocols = options.get("subprotocols")
- if subprotocols:
- headers.append("Sec-WebSocket-Protocol: %s" % ",".join(subprotocols))
-
- if "header" in options:
- header = options["header"]
- if isinstance(header, dict):
- header = [
- ": ".join([k, v])
- for k, v in header.items()
- if v is not None
- ]
- headers.extend(header)
-
- server_cookie = CookieJar.get(host)
- client_cookie = options.get("cookie", None)
-
- cookie = "; ".join(filter(None, [server_cookie, client_cookie]))
-
- if cookie:
- headers.append("Cookie: %s" % cookie)
-
- headers.append("")
- headers.append("")
-
- return headers, key
-
-
-def _get_resp_headers(sock, success_statuses=SUCCESS_STATUSES):
- status, resp_headers, status_message = read_headers(sock)
- if status not in success_statuses:
- raise WebSocketBadStatusException("Handshake status %d %s", status, status_message, resp_headers)
- return status, resp_headers
-
-
-_HEADERS_TO_CHECK = {
- "upgrade": "websocket",
- "connection": "upgrade",
-}
-
-
-def _validate(headers, key, subprotocols):
- subproto = None
- for k, v in _HEADERS_TO_CHECK.items():
- r = headers.get(k, None)
- if not r:
- return False, None
- r = [x.strip().lower() for x in r.split(',')]
- if v not in r:
- return False, None
-
- if subprotocols:
- subproto = headers.get("sec-websocket-protocol", None)
- if not subproto or subproto.lower() not in [s.lower() for s in subprotocols]:
- error("Invalid subprotocol: " + str(subprotocols))
- return False, None
- subproto = subproto.lower()
-
- result = headers.get("sec-websocket-accept", None)
- if not result:
- return False, None
- result = result.lower()
-
- if isinstance(result, six.text_type):
- result = result.encode('utf-8')
-
- value = (key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").encode('utf-8')
- hashed = base64encode(hashlib.sha1(value).digest()).strip().lower()
- success = compare_digest(hashed, result)
-
- if success:
- return True, subproto
- else:
- return False, None
-
-
-def _create_sec_websocket_key():
- randomness = os.urandom(16)
- return base64encode(randomness).decode('utf-8').strip()
diff --git a/contrib/python/websocket-client/py2/websocket/_http.py b/contrib/python/websocket-client/py2/websocket/_http.py
deleted file mode 100644
index b0dad48ce0c..00000000000
--- a/contrib/python/websocket-client/py2/websocket/_http.py
+++ /dev/null
@@ -1,335 +0,0 @@
-"""
-websocket - WebSocket client library for Python
-
-Copyright (C) 2010 Hiroki Ohtani(liris)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-import errno
-import os
-import socket
-import sys
-
-import six
-
-from ._exceptions import *
-from ._logging import *
-from ._socket import*
-from ._ssl_compat import *
-from ._url import *
-
-if six.PY3:
- from base64 import encodebytes as base64encode
-else:
- from base64 import encodestring as base64encode
-
-__all__ = ["proxy_info", "connect", "read_headers"]
-
-try:
- import socks
- ProxyConnectionError = socks.ProxyConnectionError
- HAS_PYSOCKS = True
-except:
- class ProxyConnectionError(BaseException):
- pass
- HAS_PYSOCKS = False
-
-
-class proxy_info(object):
-
- def __init__(self, **options):
- self.type = options.get("proxy_type") or "http"
- if not(self.type in ['http', 'socks4', 'socks5', 'socks5h']):
- raise ValueError("proxy_type must be 'http', 'socks4', 'socks5' or 'socks5h'")
- self.host = options.get("http_proxy_host", None)
- if self.host:
- self.port = options.get("http_proxy_port", 0)
- self.auth = options.get("http_proxy_auth", None)
- self.no_proxy = options.get("http_no_proxy", None)
- else:
- self.port = 0
- self.auth = None
- self.no_proxy = None
-
-
-def _open_proxied_socket(url, options, proxy):
- hostname, port, resource, is_secure = parse_url(url)
-
- if not HAS_PYSOCKS:
- raise WebSocketException("PySocks module not found.")
-
- ptype = socks.SOCKS5
- rdns = False
- if proxy.type == "socks4":
- ptype = socks.SOCKS4
- if proxy.type == "http":
- ptype = socks.HTTP
- if proxy.type[-1] == "h":
- rdns = True
-
- sock = socks.create_connection(
- (hostname, port),
- proxy_type=ptype,
- proxy_addr=proxy.host,
- proxy_port=proxy.port,
- proxy_rdns=rdns,
- proxy_username=proxy.auth[0] if proxy.auth else None,
- proxy_password=proxy.auth[1] if proxy.auth else None,
- timeout=options.timeout,
- socket_options=DEFAULT_SOCKET_OPTION + options.sockopt
- )
-
- if is_secure:
- if HAVE_SSL:
- sock = _ssl_socket(sock, options.sslopt, hostname)
- else:
- raise WebSocketException("SSL not available.")
-
- return sock, (hostname, port, resource)
-
-
-def connect(url, options, proxy, socket):
- if proxy.host and not socket and not (proxy.type == 'http'):
- return _open_proxied_socket(url, options, proxy)
-
- hostname, port, resource, is_secure = parse_url(url)
-
- if socket:
- return socket, (hostname, port, resource)
-
- addrinfo_list, need_tunnel, auth = _get_addrinfo_list(
- hostname, port, is_secure, proxy)
- if not addrinfo_list:
- raise WebSocketException(
- "Host not found.: " + hostname + ":" + str(port))
-
- sock = None
- try:
- sock = _open_socket(addrinfo_list, options.sockopt, options.timeout)
- if need_tunnel:
- sock = _tunnel(sock, hostname, port, auth)
-
- if is_secure:
- if HAVE_SSL:
- sock = _ssl_socket(sock, options.sslopt, hostname)
- else:
- raise WebSocketException("SSL not available.")
-
- return sock, (hostname, port, resource)
- except:
- if sock:
- sock.close()
- raise
-
-
-def _get_addrinfo_list(hostname, port, is_secure, proxy):
- phost, pport, pauth = get_proxy_info(
- hostname, is_secure, proxy.host, proxy.port, proxy.auth, proxy.no_proxy)
- try:
- # when running on windows 10, getaddrinfo without socktype returns a socktype 0.
- # This generates an error exception: `_on_error: exception Socket type must be stream or datagram, not 0`
- # or `OSError: [Errno 22] Invalid argument` when creating socket. Force the socket type to SOCK_STREAM.
- if not phost:
- addrinfo_list = socket.getaddrinfo(
- hostname, port, 0, socket.SOCK_STREAM, socket.SOL_TCP)
- return addrinfo_list, False, None
- else:
- pport = pport and pport or 80
- # when running on windows 10, the getaddrinfo used above
- # returns a socktype 0. This generates an error exception:
- # _on_error: exception Socket type must be stream or datagram, not 0
- # Force the socket type to SOCK_STREAM
- addrinfo_list = socket.getaddrinfo(phost, pport, 0, socket.SOCK_STREAM, socket.SOL_TCP)
- return addrinfo_list, True, pauth
- except socket.gaierror as e:
- raise WebSocketAddressException(e)
-
-
-def _open_socket(addrinfo_list, sockopt, timeout):
- err = None
- for addrinfo in addrinfo_list:
- family, socktype, proto = addrinfo[:3]
- sock = socket.socket(family, socktype, proto)
- sock.settimeout(timeout)
- for opts in DEFAULT_SOCKET_OPTION:
- sock.setsockopt(*opts)
- for opts in sockopt:
- sock.setsockopt(*opts)
-
- address = addrinfo[4]
- err = None
- while not err:
- try:
- sock.connect(address)
- except ProxyConnectionError as error:
- err = WebSocketProxyException(str(error))
- err.remote_ip = str(address[0])
- continue
- except socket.error as error:
- error.remote_ip = str(address[0])
- try:
- eConnRefused = (errno.ECONNREFUSED, errno.WSAECONNREFUSED)
- except:
- eConnRefused = (errno.ECONNREFUSED, )
- if error.errno == errno.EINTR:
- continue
- elif error.errno in eConnRefused:
- err = error
- continue
- else:
- raise error
- else:
- break
- else:
- continue
- break
- else:
- if err:
- raise err
-
- return sock
-
-
-def _can_use_sni():
- return six.PY2 and sys.version_info >= (2, 7, 9) or sys.version_info >= (3, 2)
-
-
-def _wrap_sni_socket(sock, sslopt, hostname, check_hostname):
- context = ssl.SSLContext(sslopt.get('ssl_version', ssl.PROTOCOL_SSLv23))
-
- if sslopt.get('cert_reqs', ssl.CERT_NONE) != ssl.CERT_NONE:
- cafile = sslopt.get('ca_certs', None)
- capath = sslopt.get('ca_cert_path', None)
- if cafile or capath:
- context.load_verify_locations(cafile=cafile, capath=capath)
- elif hasattr(context, 'load_default_certs'):
- context.load_default_certs(ssl.Purpose.SERVER_AUTH)
- if sslopt.get('certfile', None):
- context.load_cert_chain(
- sslopt['certfile'],
- sslopt.get('keyfile', None),
- sslopt.get('password', None),
- )
- # see
- # https://github.com/liris/websocket-client/commit/b96a2e8fa765753e82eea531adb19716b52ca3ca#commitcomment-10803153
- context.verify_mode = sslopt['cert_reqs']
- if HAVE_CONTEXT_CHECK_HOSTNAME:
- context.check_hostname = check_hostname
- if 'ciphers' in sslopt:
- context.set_ciphers(sslopt['ciphers'])
- if 'cert_chain' in sslopt:
- certfile, keyfile, password = sslopt['cert_chain']
- context.load_cert_chain(certfile, keyfile, password)
- if 'ecdh_curve' in sslopt:
- context.set_ecdh_curve(sslopt['ecdh_curve'])
-
- return context.wrap_socket(
- sock,
- do_handshake_on_connect=sslopt.get('do_handshake_on_connect', True),
- suppress_ragged_eofs=sslopt.get('suppress_ragged_eofs', True),
- server_hostname=hostname,
- )
-
-
-def _ssl_socket(sock, user_sslopt, hostname):
- sslopt = dict(cert_reqs=ssl.CERT_REQUIRED)
- sslopt.update(user_sslopt)
-
- certPath = os.environ.get('WEBSOCKET_CLIENT_CA_BUNDLE')
- if certPath and os.path.isfile(certPath) \
- and user_sslopt.get('ca_certs', None) is None \
- and user_sslopt.get('ca_cert', None) is None:
- sslopt['ca_certs'] = certPath
- elif certPath and os.path.isdir(certPath) \
- and user_sslopt.get('ca_cert_path', None) is None:
- sslopt['ca_cert_path'] = certPath
-
- check_hostname = sslopt["cert_reqs"] != ssl.CERT_NONE and sslopt.pop(
- 'check_hostname', True)
-
- if _can_use_sni():
- sock = _wrap_sni_socket(sock, sslopt, hostname, check_hostname)
- else:
- sslopt.pop('check_hostname', True)
- sock = ssl.wrap_socket(sock, **sslopt)
-
- if not HAVE_CONTEXT_CHECK_HOSTNAME and check_hostname:
- match_hostname(sock.getpeercert(), hostname)
-
- return sock
-
-
-def _tunnel(sock, host, port, auth):
- debug("Connecting proxy...")
- connect_header = "CONNECT %s:%d HTTP/1.1\r\n" % (host, port)
- connect_header += "Host: %s:%d\r\n" % (host, port)
-
- # TODO: support digest auth.
- if auth and auth[0]:
- auth_str = auth[0]
- if auth[1]:
- auth_str += ":" + auth[1]
- encoded_str = base64encode(auth_str.encode()).strip().decode().replace('\n', '')
- connect_header += "Proxy-Authorization: Basic %s\r\n" % encoded_str
- connect_header += "\r\n"
- dump("request header", connect_header)
-
- send(sock, connect_header)
-
- try:
- status, resp_headers, status_message = read_headers(sock)
- except Exception as e:
- raise WebSocketProxyException(str(e))
-
- if status != 200:
- raise WebSocketProxyException(
- "failed CONNECT via proxy status: %r" % status)
-
- return sock
-
-
-def read_headers(sock):
- status = None
- status_message = None
- headers = {}
- trace("--- response header ---")
-
- while True:
- line = recv_line(sock)
- line = line.decode('utf-8').strip()
- if not line:
- break
- trace(line)
- if not status:
-
- status_info = line.split(" ", 2)
- status = int(status_info[1])
- if len(status_info) > 2:
- status_message = status_info[2]
- else:
- kv = line.split(":", 1)
- if len(kv) == 2:
- key, value = kv
- if key.lower() == "set-cookie" and headers.get("set-cookie"):
- headers["set-cookie"] = headers.get("set-cookie") + "; " + value.strip()
- else:
- headers[key.lower()] = value.strip()
- else:
- raise WebSocketException("Invalid header")
-
- trace("-----------------------")
-
- return status, headers, status_message
diff --git a/contrib/python/websocket-client/py2/websocket/_logging.py b/contrib/python/websocket-client/py2/websocket/_logging.py
deleted file mode 100644
index 07d9009031d..00000000000
--- a/contrib/python/websocket-client/py2/websocket/_logging.py
+++ /dev/null
@@ -1,92 +0,0 @@
-"""
-
-"""
-
-"""
-websocket - WebSocket client library for Python
-
-Copyright (C) 2010 Hiroki Ohtani(liris)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-import logging
-
-_logger = logging.getLogger('websocket')
-try:
- from logging import NullHandler
-except ImportError:
- class NullHandler(logging.Handler):
- def emit(self, record):
- pass
-
-_logger.addHandler(NullHandler())
-
-_traceEnabled = False
-
-__all__ = ["enableTrace", "dump", "error", "warning", "debug", "trace",
- "isEnabledForError", "isEnabledForDebug", "isEnabledForTrace"]
-
-
-def enableTrace(traceable, handler=logging.StreamHandler()):
- """
- Turn on/off the traceability.
-
- Parameters
- ----------
- traceable: bool
- If set to True, traceability is enabled.
- """
- global _traceEnabled
- _traceEnabled = traceable
- if traceable:
- _logger.addHandler(handler)
- _logger.setLevel(logging.DEBUG)
-
-
-def dump(title, message):
- if _traceEnabled:
- _logger.debug("--- " + title + " ---")
- _logger.debug(message)
- _logger.debug("-----------------------")
-
-
-def error(msg):
- _logger.error(msg)
-
-
-def warning(msg):
- _logger.warning(msg)
-
-
-def debug(msg):
- _logger.debug(msg)
-
-
-def trace(msg):
- if _traceEnabled:
- _logger.debug(msg)
-
-
-def isEnabledForError():
- return _logger.isEnabledFor(logging.ERROR)
-
-
-def isEnabledForDebug():
- return _logger.isEnabledFor(logging.DEBUG)
-
-
-def isEnabledForTrace():
- return _traceEnabled
diff --git a/contrib/python/websocket-client/py2/websocket/_socket.py b/contrib/python/websocket-client/py2/websocket/_socket.py
deleted file mode 100644
index 2c383ed4d34..00000000000
--- a/contrib/python/websocket-client/py2/websocket/_socket.py
+++ /dev/null
@@ -1,176 +0,0 @@
-"""
-
-"""
-
-"""
-websocket - WebSocket client library for Python
-
-Copyright (C) 2010 Hiroki Ohtani(liris)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-import errno
-import select
-import socket
-
-import six
-
-from ._exceptions import *
-from ._ssl_compat import *
-from ._utils import *
-
-DEFAULT_SOCKET_OPTION = [(socket.SOL_TCP, socket.TCP_NODELAY, 1)]
-if hasattr(socket, "SO_KEEPALIVE"):
- DEFAULT_SOCKET_OPTION.append((socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1))
-if hasattr(socket, "TCP_KEEPIDLE"):
- DEFAULT_SOCKET_OPTION.append((socket.SOL_TCP, socket.TCP_KEEPIDLE, 30))
-if hasattr(socket, "TCP_KEEPINTVL"):
- DEFAULT_SOCKET_OPTION.append((socket.SOL_TCP, socket.TCP_KEEPINTVL, 10))
-if hasattr(socket, "TCP_KEEPCNT"):
- DEFAULT_SOCKET_OPTION.append((socket.SOL_TCP, socket.TCP_KEEPCNT, 3))
-
-_default_timeout = None
-
-__all__ = ["DEFAULT_SOCKET_OPTION", "sock_opt", "setdefaulttimeout", "getdefaulttimeout",
- "recv", "recv_line", "send"]
-
-
-class sock_opt(object):
-
- def __init__(self, sockopt, sslopt):
- if sockopt is None:
- sockopt = []
- if sslopt is None:
- sslopt = {}
- self.sockopt = sockopt
- self.sslopt = sslopt
- self.timeout = None
-
-
-def setdefaulttimeout(timeout):
- """
- Set the global timeout setting to connect.
-
- Parameters
- ----------
- timeout: int or float
- default socket timeout time (in seconds)
- """
- global _default_timeout
- _default_timeout = timeout
-
-
-def getdefaulttimeout():
- """
- Get default timeout
-
- Returns
- ----------
- _default_timeout: int or float
- Return the global timeout setting (in seconds) to connect.
- """
- return _default_timeout
-
-
-def recv(sock, bufsize):
- if not sock:
- raise WebSocketConnectionClosedException("socket is already closed.")
-
- def _recv():
- try:
- return sock.recv(bufsize)
- except SSLWantReadError:
- pass
- except socket.error as exc:
- error_code = extract_error_code(exc)
- if error_code is None:
- raise
- if error_code != errno.EAGAIN or error_code != errno.EWOULDBLOCK:
- raise
-
- r, w, e = select.select((sock, ), (), (), sock.gettimeout())
- if r:
- return sock.recv(bufsize)
-
- try:
- if sock.gettimeout() == 0:
- bytes_ = sock.recv(bufsize)
- else:
- bytes_ = _recv()
- except socket.timeout as e:
- message = extract_err_message(e)
- raise WebSocketTimeoutException(message)
- except SSLError as e:
- message = extract_err_message(e)
- if isinstance(message, str) and 'timed out' in message:
- raise WebSocketTimeoutException(message)
- else:
- raise
-
- if not bytes_:
- raise WebSocketConnectionClosedException(
- "Connection is already closed.")
-
- return bytes_
-
-
-def recv_line(sock):
- line = []
- while True:
- c = recv(sock, 1)
- line.append(c)
- if c == six.b("\n"):
- break
- return six.b("").join(line)
-
-
-def send(sock, data):
- if isinstance(data, six.text_type):
- data = data.encode('utf-8')
-
- if not sock:
- raise WebSocketConnectionClosedException("socket is already closed.")
-
- def _send():
- try:
- return sock.send(data)
- except SSLWantWriteError:
- pass
- except socket.error as exc:
- error_code = extract_error_code(exc)
- if error_code is None:
- raise
- if error_code != errno.EAGAIN or error_code != errno.EWOULDBLOCK:
- raise
-
- r, w, e = select.select((), (sock, ), (), sock.gettimeout())
- if w:
- return sock.send(data)
-
- try:
- if sock.gettimeout() == 0:
- return sock.send(data)
- else:
- return _send()
- except socket.timeout as e:
- message = extract_err_message(e)
- raise WebSocketTimeoutException(message)
- except Exception as e:
- message = extract_err_message(e)
- if isinstance(message, str) and "timed out" in message:
- raise WebSocketTimeoutException(message)
- else:
- raise
diff --git a/contrib/python/websocket-client/py2/websocket/_ssl_compat.py b/contrib/python/websocket-client/py2/websocket/_ssl_compat.py
deleted file mode 100644
index 9e201ddf003..00000000000
--- a/contrib/python/websocket-client/py2/websocket/_ssl_compat.py
+++ /dev/null
@@ -1,53 +0,0 @@
-"""
-websocket - WebSocket client library for Python
-
-Copyright (C) 2010 Hiroki Ohtani(liris)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-__all__ = ["HAVE_SSL", "ssl", "SSLError", "SSLWantReadError", "SSLWantWriteError"]
-
-try:
- import ssl
- from ssl import SSLError
- from ssl import SSLWantReadError
- from ssl import SSLWantWriteError
- if hasattr(ssl, 'SSLContext') and hasattr(ssl.SSLContext, 'check_hostname'):
- HAVE_CONTEXT_CHECK_HOSTNAME = True
- else:
- HAVE_CONTEXT_CHECK_HOSTNAME = False
- if hasattr(ssl, "match_hostname"):
- from ssl import match_hostname
- else:
- from backports.ssl_match_hostname import match_hostname
- __all__.append("match_hostname")
- __all__.append("HAVE_CONTEXT_CHECK_HOSTNAME")
-
- HAVE_SSL = True
-except ImportError:
- # dummy class of SSLError for ssl none-support environment.
- class SSLError(Exception):
- pass
-
- class SSLWantReadError(Exception):
- pass
-
- class SSLWantWriteError(Exception):
- pass
-
- ssl = None
-
- HAVE_SSL = False
diff --git a/contrib/python/websocket-client/py2/websocket/_url.py b/contrib/python/websocket-client/py2/websocket/_url.py
deleted file mode 100644
index 92ff939e391..00000000000
--- a/contrib/python/websocket-client/py2/websocket/_url.py
+++ /dev/null
@@ -1,178 +0,0 @@
-"""
-
-"""
-"""
-websocket - WebSocket client library for Python
-
-Copyright (C) 2010 Hiroki Ohtani(liris)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-
-import os
-import socket
-import struct
-
-from six.moves.urllib.parse import urlparse
-
-
-__all__ = ["parse_url", "get_proxy_info"]
-
-
-def parse_url(url):
- """
- parse url and the result is tuple of
- (hostname, port, resource path and the flag of secure mode)
-
- Parameters
- ----------
- url: str
- url string.
- """
- if ":" not in url:
- raise ValueError("url is invalid")
-
- scheme, url = url.split(":", 1)
-
- parsed = urlparse(url, scheme="http")
- if parsed.hostname:
- hostname = parsed.hostname
- else:
- raise ValueError("hostname is invalid")
- port = 0
- if parsed.port:
- port = parsed.port
-
- is_secure = False
- if scheme == "ws":
- if not port:
- port = 80
- elif scheme == "wss":
- is_secure = True
- if not port:
- port = 443
- else:
- raise ValueError("scheme %s is invalid" % scheme)
-
- if parsed.path:
- resource = parsed.path
- else:
- resource = "/"
-
- if parsed.query:
- resource += "?" + parsed.query
-
- return hostname, port, resource, is_secure
-
-
-DEFAULT_NO_PROXY_HOST = ["localhost", "127.0.0.1"]
-
-
-def _is_ip_address(addr):
- try:
- socket.inet_aton(addr)
- except socket.error:
- return False
- else:
- return True
-
-
-def _is_subnet_address(hostname):
- try:
- addr, netmask = hostname.split("/")
- return _is_ip_address(addr) and 0 <= int(netmask) < 32
- except ValueError:
- return False
-
-
-def _is_address_in_network(ip, net):
- ipaddr = struct.unpack('!I', socket.inet_aton(ip))[0]
- netaddr, netmask = net.split('/')
- netaddr = struct.unpack('!I', socket.inet_aton(netaddr))[0]
-
- netmask = (0xFFFFFFFF << (32 - int(netmask))) & 0xFFFFFFFF
- return ipaddr & netmask == netaddr
-
-
-def _is_no_proxy_host(hostname, no_proxy):
- if not no_proxy:
- v = os.environ.get("no_proxy", "").replace(" ", "")
- if v:
- no_proxy = v.split(",")
- if not no_proxy:
- no_proxy = DEFAULT_NO_PROXY_HOST
-
- if '*' in no_proxy:
- return True
- if hostname in no_proxy:
- return True
- if _is_ip_address(hostname):
- return any([_is_address_in_network(hostname, subnet) for subnet in no_proxy if _is_subnet_address(subnet)])
- for domain in [domain for domain in no_proxy if domain.startswith('.')]:
- if hostname.endswith(domain):
- return True
- return False
-
-
-def get_proxy_info(
- hostname, is_secure, proxy_host=None, proxy_port=0, proxy_auth=None,
- no_proxy=None, proxy_type='http'):
- """
- Try to retrieve proxy host and port from environment
- if not provided in options.
- Result is (proxy_host, proxy_port, proxy_auth).
- proxy_auth is tuple of username and password
- of proxy authentication information.
-
- Parameters
- ----------
- hostname: <type>
- websocket server name.
- is_secure: <type>
- is the connection secure? (wss) looks for "https_proxy" in env
- before falling back to "http_proxy"
- options: <type>
- - http_proxy_host: <type>
- http proxy host name.
- - http_proxy_port: <type>
- http proxy port.
- - http_no_proxy: <type>
- host names, which doesn't use proxy.
- - http_proxy_auth: <type>
- http proxy auth information. tuple of username and password. default is None
- - proxy_type: <type>
- if set to "socks5" PySocks wrapper will be used in place of a http proxy. default is "http"
- """
- if _is_no_proxy_host(hostname, no_proxy):
- return None, 0, None
-
- if proxy_host:
- port = proxy_port
- auth = proxy_auth
- return proxy_host, port, auth
-
- env_keys = ["http_proxy"]
- if is_secure:
- env_keys.insert(0, "https_proxy")
-
- for key in env_keys:
- value = os.environ.get(key, None)
- if value:
- proxy = urlparse(value)
- auth = (proxy.username, proxy.password) if proxy.username else None
- return proxy.hostname, proxy.port, auth
-
- return None, 0, None
diff --git a/contrib/python/websocket-client/py2/websocket/_utils.py b/contrib/python/websocket-client/py2/websocket/_utils.py
deleted file mode 100644
index 0072bce8ac9..00000000000
--- a/contrib/python/websocket-client/py2/websocket/_utils.py
+++ /dev/null
@@ -1,110 +0,0 @@
-"""
-websocket - WebSocket client library for Python
-
-Copyright (C) 2010 Hiroki Ohtani(liris)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-import six
-
-__all__ = ["NoLock", "validate_utf8", "extract_err_message", "extract_error_code"]
-
-
-class NoLock(object):
-
- def __enter__(self):
- pass
-
- def __exit__(self, exc_type, exc_value, traceback):
- pass
-
-
-try:
- # If wsaccel is available we use compiled routines to validate UTF-8
- # strings.
- from wsaccel.utf8validator import Utf8Validator
-
- def _validate_utf8(utfbytes):
- return Utf8Validator().validate(utfbytes)[0]
-
-except ImportError:
- # UTF-8 validator
- # python implementation of http://bjoern.hoehrmann.de/utf-8/decoder/dfa/
-
- _UTF8_ACCEPT = 0
- _UTF8_REJECT = 12
-
- _UTF8D = [
- # The first part of the table maps bytes to character classes that
- # to reduce the size of the transition table and create bitmasks.
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
- 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
- 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8,
-
- # The second part is a transition table that maps a combination
- # of a state of the automaton and a character class to a state.
- 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12,
- 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12,
- 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12,
- 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12,
- 12,36,12,12,12,12,12,12,12,12,12,12, ]
-
- def _decode(state, codep, ch):
- tp = _UTF8D[ch]
-
- codep = (ch & 0x3f) | (codep << 6) if (
- state != _UTF8_ACCEPT) else (0xff >> tp) & ch
- state = _UTF8D[256 + state + tp]
-
- return state, codep
-
- def _validate_utf8(utfbytes):
- state = _UTF8_ACCEPT
- codep = 0
- for i in utfbytes:
- if six.PY2:
- i = ord(i)
- state, codep = _decode(state, codep, i)
- if state == _UTF8_REJECT:
- return False
-
- return True
-
-
-def validate_utf8(utfbytes):
- """
- validate utf8 byte string.
- utfbytes: utf byte string to check.
- return value: if valid utf8 string, return true. Otherwise, return false.
- """
- return _validate_utf8(utfbytes)
-
-
-def extract_err_message(exception):
- if exception.args:
- return exception.args[0]
- else:
- return None
-
-
-def extract_error_code(exception):
- if exception.args and len(exception.args) > 1:
- return exception.args[0] if isinstance(exception.args[0], int) else None
diff --git a/contrib/python/websocket-client/py2/websocket/tests/data/header03.txt b/contrib/python/websocket-client/py2/websocket/tests/data/header03.txt
deleted file mode 100644
index 012b7d18dd3..00000000000
--- a/contrib/python/websocket-client/py2/websocket/tests/data/header03.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-HTTP/1.1 101 WebSocket Protocol Handshake
-Connection: Upgrade, Keep-Alive
-Upgrade: WebSocket
-Sec-WebSocket-Accept: Kxep+hNu9n51529fGidYu7a3wO0=
-some_header: something
-
diff --git a/contrib/python/websocket-client/py2/websocket/tests/test_abnf.py b/contrib/python/websocket-client/py2/websocket/tests/test_abnf.py
deleted file mode 100644
index acce0206825..00000000000
--- a/contrib/python/websocket-client/py2/websocket/tests/test_abnf.py
+++ /dev/null
@@ -1,77 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-"""
-websocket - WebSocket client library for Python
-
-Copyright (C) 2010 Hiroki Ohtani(liris)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-
-import os
-import websocket as ws
-from websocket._abnf import *
-import sys
-sys.path[0:0] = [""]
-
-if sys.version_info[0] == 2 and sys.version_info[1] < 7:
- import unittest2 as unittest
-else:
- import unittest
-
-
-class ABNFTest(unittest.TestCase):
-
- def testInit(self):
- a = ABNF(0,0,0,0, opcode=ABNF.OPCODE_PING)
- self.assertEqual(a.fin, 0)
- self.assertEqual(a.rsv1, 0)
- self.assertEqual(a.rsv2, 0)
- self.assertEqual(a.rsv3, 0)
- self.assertEqual(a.opcode, 9)
- self.assertEqual(a.data, '')
- a_bad = ABNF(0,1,0,0, opcode=77)
- self.assertEqual(a_bad.rsv1, 1)
- self.assertEqual(a_bad.opcode, 77)
-
- def testValidate(self):
- a = ABNF(0,0,0,0, opcode=ABNF.OPCODE_PING)
- self.assertRaises(ws.WebSocketProtocolException, a.validate)
- a_bad = ABNF(0,1,0,0, opcode=77)
- self.assertRaises(ws.WebSocketProtocolException, a_bad.validate)
- a_close = ABNF(0,1,0,0, opcode=ABNF.OPCODE_CLOSE, data="abcdefgh1234567890abcdefgh1234567890abcdefgh1234567890abcdefgh1234567890")
- self.assertRaises(ws.WebSocketProtocolException, a_close.validate)
-
-# This caused an error in the Python 2.7 Github Actions build
-# Uncomment test case when Python 2 support no longer wanted
-# def testMask(self):
-# ab = ABNF(0,0,0,0, opcode=ABNF.OPCODE_PING)
-# bytes_val = bytes("aaaa", 'utf-8')
-# self.assertEqual(ab._get_masked(bytes_val), bytes_val)
-
- def testFrameBuffer(self):
- fb = frame_buffer(0, True)
- self.assertEqual(fb.recv, 0)
- self.assertEqual(fb.skip_utf8_validation, True)
- fb.clear
- self.assertEqual(fb.header, None)
- self.assertEqual(fb.length, None)
- self.assertEqual(fb.mask, None)
- self.assertEqual(fb.has_mask(), False)
-
-
-if __name__ == "__main__":
- unittest.main()
diff --git a/contrib/python/websocket-client/py2/websocket/tests/test_app.py b/contrib/python/websocket-client/py2/websocket/tests/test_app.py
deleted file mode 100644
index e5a739008e4..00000000000
--- a/contrib/python/websocket-client/py2/websocket/tests/test_app.py
+++ /dev/null
@@ -1,137 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-"""
-websocket - WebSocket client library for Python
-
-Copyright (C) 2010 Hiroki Ohtani(liris)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-
-import os
-import os.path
-import websocket as ws
-import sys
-sys.path[0:0] = [""]
-
-try:
- import ssl
-except ImportError:
- HAVE_SSL = False
-
-if sys.version_info[0] == 2 and sys.version_info[1] < 7:
- import unittest2 as unittest
-else:
- import unittest
-
-# Skip test to access the internet.
-TEST_WITH_INTERNET = os.environ.get('TEST_WITH_INTERNET', '0') == '1'
-TRACEABLE = True
-
-
-class WebSocketAppTest(unittest.TestCase):
-
- class NotSetYet(object):
- """ A marker class for signalling that a value hasn't been set yet.
- """
-
- def setUp(self):
- ws.enableTrace(TRACEABLE)
-
- WebSocketAppTest.keep_running_open = WebSocketAppTest.NotSetYet()
- WebSocketAppTest.keep_running_close = WebSocketAppTest.NotSetYet()
- WebSocketAppTest.get_mask_key_id = WebSocketAppTest.NotSetYet()
-
- def tearDown(self):
- WebSocketAppTest.keep_running_open = WebSocketAppTest.NotSetYet()
- WebSocketAppTest.keep_running_close = WebSocketAppTest.NotSetYet()
- WebSocketAppTest.get_mask_key_id = WebSocketAppTest.NotSetYet()
-
- @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
- def testKeepRunning(self):
- """ A WebSocketApp should keep running as long as its self.keep_running
- is not False (in the boolean context).
- """
-
- def on_open(self, *args, **kwargs):
- """ Set the keep_running flag for later inspection and immediately
- close the connection.
- """
- WebSocketAppTest.keep_running_open = self.keep_running
-
- self.close()
-
- def on_close(self, *args, **kwargs):
- """ Set the keep_running flag for the test to use.
- """
- WebSocketAppTest.keep_running_close = self.keep_running
-
- app = ws.WebSocketApp('ws://echo.websocket.org/', on_open=on_open, on_close=on_close)
- app.run_forever()
-
- # if numpy is installed, this assertion fail
- # self.assertFalse(isinstance(WebSocketAppTest.keep_running_open,
- # WebSocketAppTest.NotSetYet))
-
- # self.assertFalse(isinstance(WebSocketAppTest.keep_running_close,
- # WebSocketAppTest.NotSetYet))
-
- # self.assertEqual(True, WebSocketAppTest.keep_running_open)
- # self.assertEqual(False, WebSocketAppTest.keep_running_close)
-
- @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
- def testSockMaskKey(self):
- """ A WebSocketApp should forward the received mask_key function down
- to the actual socket.
- """
-
- def my_mask_key_func():
- pass
-
- def on_open(self, *args, **kwargs):
- """ Set the value so the test can use it later on and immediately
- close the connection.
- """
- WebSocketAppTest.get_mask_key_id = id(self.get_mask_key)
- self.close()
-
- app = ws.WebSocketApp('ws://echo.websocket.org/', on_open=on_open, get_mask_key=my_mask_key_func)
- app.run_forever()
-
- # if numpy is installed, this assertion fail
- # Note: We can't use 'is' for comparing the functions directly, need to use 'id'.
- # self.assertEqual(WebSocketAppTest.get_mask_key_id, id(my_mask_key_func))
-
- @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
- def testPingInterval(self):
- """ A WebSocketApp should ping regularly
- """
-
- def on_ping(app, msg):
- print("Got a ping!")
- app.close()
-
- def on_pong(app, msg):
- print("Got a pong! No need to respond")
- app.close()
-
- app = ws.WebSocketApp('wss://api-pub.bitfinex.com/ws/1', on_ping=on_ping, on_pong=on_pong)
- app.run_forever(ping_interval=2, ping_timeout=1) # , sslopt={"cert_reqs": ssl.CERT_NONE}
- self.assertRaises(ws.WebSocketException, app.run_forever, ping_interval=2, ping_timeout=3, sslopt={"cert_reqs": ssl.CERT_NONE})
-
-
-if __name__ == "__main__":
- unittest.main()
diff --git a/contrib/python/websocket-client/py2/websocket/tests/test_cookiejar.py b/contrib/python/websocket-client/py2/websocket/tests/test_cookiejar.py
deleted file mode 100644
index fc66e58b0ee..00000000000
--- a/contrib/python/websocket-client/py2/websocket/tests/test_cookiejar.py
+++ /dev/null
@@ -1,117 +0,0 @@
-"""
-
-"""
-
-"""
-websocket - WebSocket client library for Python
-
-Copyright (C) 2010 Hiroki Ohtani(liris)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-import unittest
-
-from websocket._cookiejar import SimpleCookieJar
-
-
-class CookieJarTest(unittest.TestCase):
- def testAdd(self):
- cookie_jar = SimpleCookieJar()
- cookie_jar.add("")
- self.assertFalse(cookie_jar.jar, "Cookie with no domain should not be added to the jar")
-
- cookie_jar = SimpleCookieJar()
- cookie_jar.add("a=b")
- self.assertFalse(cookie_jar.jar, "Cookie with no domain should not be added to the jar")
-
- cookie_jar = SimpleCookieJar()
- cookie_jar.add("a=b; domain=.abc")
- self.assertTrue(".abc" in cookie_jar.jar)
-
- cookie_jar = SimpleCookieJar()
- cookie_jar.add("a=b; domain=abc")
- self.assertTrue(".abc" in cookie_jar.jar)
- self.assertTrue("abc" not in cookie_jar.jar)
-
- cookie_jar = SimpleCookieJar()
- cookie_jar.add("a=b; c=d; domain=abc")
- self.assertEqual(cookie_jar.get("abc"), "a=b; c=d")
-
- cookie_jar = SimpleCookieJar()
- cookie_jar.add("a=b; c=d; domain=abc")
- cookie_jar.add("e=f; domain=abc")
- self.assertEqual(cookie_jar.get("abc"), "a=b; c=d; e=f")
-
- cookie_jar = SimpleCookieJar()
- cookie_jar.add("a=b; c=d; domain=abc")
- cookie_jar.add("e=f; domain=.abc")
- self.assertEqual(cookie_jar.get("abc"), "a=b; c=d; e=f")
-
- cookie_jar = SimpleCookieJar()
- cookie_jar.add("a=b; c=d; domain=abc")
- cookie_jar.add("e=f; domain=xyz")
- self.assertEqual(cookie_jar.get("abc"), "a=b; c=d")
- self.assertEqual(cookie_jar.get("xyz"), "e=f")
- self.assertEqual(cookie_jar.get("something"), "")
-
- def testSet(self):
- cookie_jar = SimpleCookieJar()
- cookie_jar.set("a=b")
- self.assertFalse(cookie_jar.jar, "Cookie with no domain should not be added to the jar")
-
- cookie_jar = SimpleCookieJar()
- cookie_jar.set("a=b; domain=.abc")
- self.assertTrue(".abc" in cookie_jar.jar)
-
- cookie_jar = SimpleCookieJar()
- cookie_jar.set("a=b; domain=abc")
- self.assertTrue(".abc" in cookie_jar.jar)
- self.assertTrue("abc" not in cookie_jar.jar)
-
- cookie_jar = SimpleCookieJar()
- cookie_jar.set("a=b; c=d; domain=abc")
- self.assertEqual(cookie_jar.get("abc"), "a=b; c=d")
-
- cookie_jar = SimpleCookieJar()
- cookie_jar.set("a=b; c=d; domain=abc")
- cookie_jar.set("e=f; domain=abc")
- self.assertEqual(cookie_jar.get("abc"), "e=f")
-
- cookie_jar = SimpleCookieJar()
- cookie_jar.set("a=b; c=d; domain=abc")
- cookie_jar.set("e=f; domain=.abc")
- self.assertEqual(cookie_jar.get("abc"), "e=f")
-
- cookie_jar = SimpleCookieJar()
- cookie_jar.set("a=b; c=d; domain=abc")
- cookie_jar.set("e=f; domain=xyz")
- self.assertEqual(cookie_jar.get("abc"), "a=b; c=d")
- self.assertEqual(cookie_jar.get("xyz"), "e=f")
- self.assertEqual(cookie_jar.get("something"), "")
-
- def testGet(self):
- cookie_jar = SimpleCookieJar()
- cookie_jar.set("a=b; c=d; domain=abc.com")
- self.assertEqual(cookie_jar.get("abc.com"), "a=b; c=d")
- self.assertEqual(cookie_jar.get("x.abc.com"), "a=b; c=d")
- self.assertEqual(cookie_jar.get("abc.com.es"), "")
- self.assertEqual(cookie_jar.get("xabc.com"), "")
-
- cookie_jar.set("a=b; c=d; domain=.abc.com")
- self.assertEqual(cookie_jar.get("abc.com"), "a=b; c=d")
- self.assertEqual(cookie_jar.get("x.abc.com"), "a=b; c=d")
- self.assertEqual(cookie_jar.get("abc.com.es"), "")
- self.assertEqual(cookie_jar.get("xabc.com"), "")
diff --git a/contrib/python/websocket-client/py2/websocket/tests/test_http.py b/contrib/python/websocket-client/py2/websocket/tests/test_http.py
deleted file mode 100644
index 8271e7717d9..00000000000
--- a/contrib/python/websocket-client/py2/websocket/tests/test_http.py
+++ /dev/null
@@ -1,110 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-"""
-websocket - WebSocket client library for Python
-
-Copyright (C) 2010 Hiroki Ohtani(liris)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-
-import os
-import os.path
-import websocket as ws
-from websocket._http import proxy_info, read_headers, _open_proxied_socket, _tunnel
-import sys
-sys.path[0:0] = [""]
-
-if sys.version_info[0] == 2 and sys.version_info[1] < 7:
- import unittest2 as unittest
-else:
- import unittest
-
-
-class SockMock(object):
- def __init__(self):
- self.data = []
- self.sent = []
-
- def add_packet(self, data):
- self.data.append(data)
-
- def gettimeout(self):
- return None
-
- def recv(self, bufsize):
- if self.data:
- e = self.data.pop(0)
- if isinstance(e, Exception):
- raise e
- if len(e) > bufsize:
- self.data.insert(0, e[bufsize:])
- return e[:bufsize]
-
- def send(self, data):
- self.sent.append(data)
- return len(data)
-
- def close(self):
- pass
-
-
-class HeaderSockMock(SockMock):
-
- def __init__(self, fname):
- SockMock.__init__(self)
- import yatest.common as yc
- path = os.path.join(os.path.dirname(yc.source_path(__file__)), fname)
- with open(path, "rb") as f:
- self.add_packet(f.read())
-
-
-class OptsList():
-
- def __init__(self):
- self.timeout = 0
- self.sockopt = []
-
-
-class HttpTest(unittest.TestCase):
-
- def testReadHeader(self):
- status, header, status_message = read_headers(HeaderSockMock("data/header01.txt"))
- self.assertEqual(status, 101)
- self.assertEqual(header["connection"], "Upgrade")
- # header02.txt is intentionally malformed
- self.assertRaises(ws.WebSocketException, read_headers, HeaderSockMock("data/header02.txt"))
-
- def testTunnel(self):
- self.assertRaises(ws.WebSocketProxyException, _tunnel, HeaderSockMock("data/header01.txt"), "example.com", 80, ("username", "password"))
- self.assertRaises(ws.WebSocketProxyException, _tunnel, HeaderSockMock("data/header02.txt"), "example.com", 80, ("username", "password"))
-
- def _testConnect(self):
- # Not currently testing an actual proxy connection, so just check whether TypeError is raised
- self.assertRaises(TypeError, _open_proxied_socket, "wss://example.com", OptsList(), proxy_info(http_proxy_host="example.com", http_proxy_port="8080", proxy_type="http"))
- self.assertRaises(TypeError, _open_proxied_socket, "wss://example.com", OptsList(), proxy_info(http_proxy_host="example.com", http_proxy_port="8080", proxy_type="socks4"))
- self.assertRaises(TypeError, _open_proxied_socket, "wss://example.com", OptsList(), proxy_info(http_proxy_host="example.com", http_proxy_port="8080", proxy_type="socks5h"))
-
- def testProxyInfo(self):
- self.assertEqual(proxy_info(http_proxy_host="127.0.0.1", http_proxy_port="8080", proxy_type="http").type, "http")
- self.assertRaises(ValueError, proxy_info, http_proxy_host="127.0.0.1", http_proxy_port="8080", proxy_type="badval")
- self.assertEqual(proxy_info(http_proxy_host="example.com", http_proxy_port="8080", proxy_type="http").host, "example.com")
- self.assertEqual(proxy_info(http_proxy_host="127.0.0.1", http_proxy_port="8080", proxy_type="http").port, "8080")
- self.assertEqual(proxy_info(http_proxy_host="127.0.0.1", http_proxy_port="8080", proxy_type="http").auth, None)
-
-
-if __name__ == "__main__":
- unittest.main()
diff --git a/contrib/python/websocket-client/py2/websocket/tests/test_url.py b/contrib/python/websocket-client/py2/websocket/tests/test_url.py
deleted file mode 100644
index b1d8e06f23f..00000000000
--- a/contrib/python/websocket-client/py2/websocket/tests/test_url.py
+++ /dev/null
@@ -1,309 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-"""
-websocket - WebSocket client library for Python
-
-Copyright (C) 2010 Hiroki Ohtani(liris)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-
-import sys
-import os
-
-from websocket._url import get_proxy_info, parse_url, _is_address_in_network, _is_no_proxy_host
-
-if sys.version_info[0] == 2 and sys.version_info[1] < 7:
- import unittest2 as unittest
-else:
- import unittest
-sys.path[0:0] = [""]
-
-
-class UrlTest(unittest.TestCase):
-
- def test_address_in_network(self):
- self.assertTrue(_is_address_in_network('127.0.0.1', '127.0.0.0/8'))
- self.assertTrue(_is_address_in_network('127.1.0.1', '127.0.0.0/8'))
- self.assertFalse(_is_address_in_network('127.1.0.1', '127.0.0.0/24'))
-
- def testParseUrl(self):
- p = parse_url("ws://www.example.com/r")
- self.assertEqual(p[0], "www.example.com")
- self.assertEqual(p[1], 80)
- self.assertEqual(p[2], "/r")
- self.assertEqual(p[3], False)
-
- p = parse_url("ws://www.example.com/r/")
- self.assertEqual(p[0], "www.example.com")
- self.assertEqual(p[1], 80)
- self.assertEqual(p[2], "/r/")
- self.assertEqual(p[3], False)
-
- p = parse_url("ws://www.example.com/")
- self.assertEqual(p[0], "www.example.com")
- self.assertEqual(p[1], 80)
- self.assertEqual(p[2], "/")
- self.assertEqual(p[3], False)
-
- p = parse_url("ws://www.example.com")
- self.assertEqual(p[0], "www.example.com")
- self.assertEqual(p[1], 80)
- self.assertEqual(p[2], "/")
- self.assertEqual(p[3], False)
-
- p = parse_url("ws://www.example.com:8080/r")
- self.assertEqual(p[0], "www.example.com")
- self.assertEqual(p[1], 8080)
- self.assertEqual(p[2], "/r")
- self.assertEqual(p[3], False)
-
- p = parse_url("ws://www.example.com:8080/")
- self.assertEqual(p[0], "www.example.com")
- self.assertEqual(p[1], 8080)
- self.assertEqual(p[2], "/")
- self.assertEqual(p[3], False)
-
- p = parse_url("ws://www.example.com:8080")
- self.assertEqual(p[0], "www.example.com")
- self.assertEqual(p[1], 8080)
- self.assertEqual(p[2], "/")
- self.assertEqual(p[3], False)
-
- p = parse_url("wss://www.example.com:8080/r")
- self.assertEqual(p[0], "www.example.com")
- self.assertEqual(p[1], 8080)
- self.assertEqual(p[2], "/r")
- self.assertEqual(p[3], True)
-
- p = parse_url("wss://www.example.com:8080/r?key=value")
- self.assertEqual(p[0], "www.example.com")
- self.assertEqual(p[1], 8080)
- self.assertEqual(p[2], "/r?key=value")
- self.assertEqual(p[3], True)
-
- self.assertRaises(ValueError, parse_url, "http://www.example.com/r")
-
- if sys.version_info[0] == 2 and sys.version_info[1] < 7:
- return
-
- p = parse_url("ws://[2a03:4000:123:83::3]/r")
- self.assertEqual(p[0], "2a03:4000:123:83::3")
- self.assertEqual(p[1], 80)
- self.assertEqual(p[2], "/r")
- self.assertEqual(p[3], False)
-
- p = parse_url("ws://[2a03:4000:123:83::3]:8080/r")
- self.assertEqual(p[0], "2a03:4000:123:83::3")
- self.assertEqual(p[1], 8080)
- self.assertEqual(p[2], "/r")
- self.assertEqual(p[3], False)
-
- p = parse_url("wss://[2a03:4000:123:83::3]/r")
- self.assertEqual(p[0], "2a03:4000:123:83::3")
- self.assertEqual(p[1], 443)
- self.assertEqual(p[2], "/r")
- self.assertEqual(p[3], True)
-
- p = parse_url("wss://[2a03:4000:123:83::3]:8080/r")
- self.assertEqual(p[0], "2a03:4000:123:83::3")
- self.assertEqual(p[1], 8080)
- self.assertEqual(p[2], "/r")
- self.assertEqual(p[3], True)
-
-
-class IsNoProxyHostTest(unittest.TestCase):
- def setUp(self):
- self.no_proxy = os.environ.get("no_proxy", None)
- if "no_proxy" in os.environ:
- del os.environ["no_proxy"]
-
- def tearDown(self):
- if self.no_proxy:
- os.environ["no_proxy"] = self.no_proxy
- elif "no_proxy" in os.environ:
- del os.environ["no_proxy"]
-
- def testMatchAll(self):
- self.assertTrue(_is_no_proxy_host("any.websocket.org", ['*']))
- self.assertTrue(_is_no_proxy_host("192.168.0.1", ['*']))
- self.assertTrue(_is_no_proxy_host("any.websocket.org", ['other.websocket.org', '*']))
- os.environ['no_proxy'] = '*'
- self.assertTrue(_is_no_proxy_host("any.websocket.org", None))
- self.assertTrue(_is_no_proxy_host("192.168.0.1", None))
- os.environ['no_proxy'] = 'other.websocket.org, *'
- self.assertTrue(_is_no_proxy_host("any.websocket.org", None))
-
- def testIpAddress(self):
- self.assertTrue(_is_no_proxy_host("127.0.0.1", ['127.0.0.1']))
- self.assertFalse(_is_no_proxy_host("127.0.0.2", ['127.0.0.1']))
- self.assertTrue(_is_no_proxy_host("127.0.0.1", ['other.websocket.org', '127.0.0.1']))
- self.assertFalse(_is_no_proxy_host("127.0.0.2", ['other.websocket.org', '127.0.0.1']))
- os.environ['no_proxy'] = '127.0.0.1'
- self.assertTrue(_is_no_proxy_host("127.0.0.1", None))
- self.assertFalse(_is_no_proxy_host("127.0.0.2", None))
- os.environ['no_proxy'] = 'other.websocket.org, 127.0.0.1'
- self.assertTrue(_is_no_proxy_host("127.0.0.1", None))
- self.assertFalse(_is_no_proxy_host("127.0.0.2", None))
-
- def testIpAddressInRange(self):
- self.assertTrue(_is_no_proxy_host("127.0.0.1", ['127.0.0.0/8']))
- self.assertTrue(_is_no_proxy_host("127.0.0.2", ['127.0.0.0/8']))
- self.assertFalse(_is_no_proxy_host("127.1.0.1", ['127.0.0.0/24']))
- os.environ['no_proxy'] = '127.0.0.0/8'
- self.assertTrue(_is_no_proxy_host("127.0.0.1", None))
- self.assertTrue(_is_no_proxy_host("127.0.0.2", None))
- os.environ['no_proxy'] = '127.0.0.0/24'
- self.assertFalse(_is_no_proxy_host("127.1.0.1", None))
-
- def testHostnameMatch(self):
- self.assertTrue(_is_no_proxy_host("my.websocket.org", ['my.websocket.org']))
- self.assertTrue(_is_no_proxy_host("my.websocket.org", ['other.websocket.org', 'my.websocket.org']))
- self.assertFalse(_is_no_proxy_host("my.websocket.org", ['other.websocket.org']))
- os.environ['no_proxy'] = 'my.websocket.org'
- self.assertTrue(_is_no_proxy_host("my.websocket.org", None))
- self.assertFalse(_is_no_proxy_host("other.websocket.org", None))
- os.environ['no_proxy'] = 'other.websocket.org, my.websocket.org'
- self.assertTrue(_is_no_proxy_host("my.websocket.org", None))
-
- def testHostnameMatchDomain(self):
- self.assertTrue(_is_no_proxy_host("any.websocket.org", ['.websocket.org']))
- self.assertTrue(_is_no_proxy_host("my.other.websocket.org", ['.websocket.org']))
- self.assertTrue(_is_no_proxy_host("any.websocket.org", ['my.websocket.org', '.websocket.org']))
- self.assertFalse(_is_no_proxy_host("any.websocket.com", ['.websocket.org']))
- os.environ['no_proxy'] = '.websocket.org'
- self.assertTrue(_is_no_proxy_host("any.websocket.org", None))
- self.assertTrue(_is_no_proxy_host("my.other.websocket.org", None))
- self.assertFalse(_is_no_proxy_host("any.websocket.com", None))
- os.environ['no_proxy'] = 'my.websocket.org, .websocket.org'
- self.assertTrue(_is_no_proxy_host("any.websocket.org", None))
-
-
-class ProxyInfoTest(unittest.TestCase):
- def setUp(self):
- self.http_proxy = os.environ.get("http_proxy", None)
- self.https_proxy = os.environ.get("https_proxy", None)
- self.no_proxy = os.environ.get("no_proxy", None)
- if "http_proxy" in os.environ:
- del os.environ["http_proxy"]
- if "https_proxy" in os.environ:
- del os.environ["https_proxy"]
- if "no_proxy" in os.environ:
- del os.environ["no_proxy"]
-
- def tearDown(self):
- if self.http_proxy:
- os.environ["http_proxy"] = self.http_proxy
- elif "http_proxy" in os.environ:
- del os.environ["http_proxy"]
-
- if self.https_proxy:
- os.environ["https_proxy"] = self.https_proxy
- elif "https_proxy" in os.environ:
- del os.environ["https_proxy"]
-
- if self.no_proxy:
- os.environ["no_proxy"] = self.no_proxy
- elif "no_proxy" in os.environ:
- del os.environ["no_proxy"]
-
- def testProxyFromArgs(self):
- self.assertEqual(get_proxy_info("echo.websocket.org", False, proxy_host="localhost"), ("localhost", 0, None))
- self.assertEqual(get_proxy_info("echo.websocket.org", False, proxy_host="localhost", proxy_port=3128),
- ("localhost", 3128, None))
- self.assertEqual(get_proxy_info("echo.websocket.org", True, proxy_host="localhost"), ("localhost", 0, None))
- self.assertEqual(get_proxy_info("echo.websocket.org", True, proxy_host="localhost", proxy_port=3128),
- ("localhost", 3128, None))
-
- self.assertEqual(get_proxy_info("echo.websocket.org", False, proxy_host="localhost", proxy_auth=("a", "b")),
- ("localhost", 0, ("a", "b")))
- self.assertEqual(
- get_proxy_info("echo.websocket.org", False, proxy_host="localhost", proxy_port=3128, proxy_auth=("a", "b")),
- ("localhost", 3128, ("a", "b")))
- self.assertEqual(get_proxy_info("echo.websocket.org", True, proxy_host="localhost", proxy_auth=("a", "b")),
- ("localhost", 0, ("a", "b")))
- self.assertEqual(
- get_proxy_info("echo.websocket.org", True, proxy_host="localhost", proxy_port=3128, proxy_auth=("a", "b")),
- ("localhost", 3128, ("a", "b")))
-
- self.assertEqual(get_proxy_info("echo.websocket.org", True, proxy_host="localhost", proxy_port=3128,
- no_proxy=["example.com"], proxy_auth=("a", "b")),
- ("localhost", 3128, ("a", "b")))
- self.assertEqual(get_proxy_info("echo.websocket.org", True, proxy_host="localhost", proxy_port=3128,
- no_proxy=["echo.websocket.org"], proxy_auth=("a", "b")),
- (None, 0, None))
-
- def testProxyFromEnv(self):
- os.environ["http_proxy"] = "http://localhost/"
- self.assertEqual(get_proxy_info("echo.websocket.org", False), ("localhost", None, None))
- os.environ["http_proxy"] = "http://localhost:3128/"
- self.assertEqual(get_proxy_info("echo.websocket.org", False), ("localhost", 3128, None))
-
- os.environ["http_proxy"] = "http://localhost/"
- os.environ["https_proxy"] = "http://localhost2/"
- self.assertEqual(get_proxy_info("echo.websocket.org", False), ("localhost", None, None))
- os.environ["http_proxy"] = "http://localhost:3128/"
- os.environ["https_proxy"] = "http://localhost2:3128/"
- self.assertEqual(get_proxy_info("echo.websocket.org", False), ("localhost", 3128, None))
-
- os.environ["http_proxy"] = "http://localhost/"
- os.environ["https_proxy"] = "http://localhost2/"
- self.assertEqual(get_proxy_info("echo.websocket.org", True), ("localhost2", None, None))
- os.environ["http_proxy"] = "http://localhost:3128/"
- os.environ["https_proxy"] = "http://localhost2:3128/"
- self.assertEqual(get_proxy_info("echo.websocket.org", True), ("localhost2", 3128, None))
-
- os.environ["http_proxy"] = "http://a:b@localhost/"
- self.assertEqual(get_proxy_info("echo.websocket.org", False), ("localhost", None, ("a", "b")))
- os.environ["http_proxy"] = "http://a:b@localhost:3128/"
- self.assertEqual(get_proxy_info("echo.websocket.org", False), ("localhost", 3128, ("a", "b")))
-
- os.environ["http_proxy"] = "http://a:b@localhost/"
- os.environ["https_proxy"] = "http://a:b@localhost2/"
- self.assertEqual(get_proxy_info("echo.websocket.org", False), ("localhost", None, ("a", "b")))
- os.environ["http_proxy"] = "http://a:b@localhost:3128/"
- os.environ["https_proxy"] = "http://a:b@localhost2:3128/"
- self.assertEqual(get_proxy_info("echo.websocket.org", False), ("localhost", 3128, ("a", "b")))
-
- os.environ["http_proxy"] = "http://a:b@localhost/"
- os.environ["https_proxy"] = "http://a:b@localhost2/"
- self.assertEqual(get_proxy_info("echo.websocket.org", True), ("localhost2", None, ("a", "b")))
- os.environ["http_proxy"] = "http://a:b@localhost:3128/"
- os.environ["https_proxy"] = "http://a:b@localhost2:3128/"
- self.assertEqual(get_proxy_info("echo.websocket.org", True), ("localhost2", 3128, ("a", "b")))
-
- os.environ["http_proxy"] = "http://a:b@localhost/"
- os.environ["https_proxy"] = "http://a:b@localhost2/"
- os.environ["no_proxy"] = "example1.com,example2.com"
- self.assertEqual(get_proxy_info("example.1.com", True), ("localhost2", None, ("a", "b")))
- os.environ["http_proxy"] = "http://a:b@localhost:3128/"
- os.environ["https_proxy"] = "http://a:b@localhost2:3128/"
- os.environ["no_proxy"] = "example1.com,example2.com, echo.websocket.org"
- self.assertEqual(get_proxy_info("echo.websocket.org", True), (None, 0, None))
- os.environ["http_proxy"] = "http://a:b@localhost:3128/"
- os.environ["https_proxy"] = "http://a:b@localhost2:3128/"
- os.environ["no_proxy"] = "example1.com,example2.com, .websocket.org"
- self.assertEqual(get_proxy_info("echo.websocket.org", True), (None, 0, None))
-
- os.environ["http_proxy"] = "http://a:b@localhost:3128/"
- os.environ["https_proxy"] = "http://a:b@localhost2:3128/"
- os.environ["no_proxy"] = "127.0.0.0/8, 192.168.0.0/16"
- self.assertEqual(get_proxy_info("127.0.0.1", False), (None, 0, None))
- self.assertEqual(get_proxy_info("192.168.1.1", False), (None, 0, None))
-
-
-if __name__ == "__main__":
- unittest.main()
diff --git a/contrib/python/websocket-client/py2/websocket/tests/test_websocket.py b/contrib/python/websocket-client/py2/websocket/tests/test_websocket.py
deleted file mode 100644
index b4aff8f7930..00000000000
--- a/contrib/python/websocket-client/py2/websocket/tests/test_websocket.py
+++ /dev/null
@@ -1,434 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-"""
-
-"""
-
-"""
-websocket - WebSocket client library for Python
-
-Copyright (C) 2010 Hiroki Ohtani(liris)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-
-import sys
-sys.path[0:0] = [""]
-
-import os
-import os.path
-import socket
-
-import six
-
-# websocket-client
-import websocket as ws
-from websocket._handshake import _create_sec_websocket_key, \
- _validate as _validate_header
-from websocket._http import read_headers
-from websocket._utils import validate_utf8
-
-if six.PY3:
- from base64 import decodebytes as base64decode
-else:
- from base64 import decodestring as base64decode
-
-if sys.version_info[0] == 2 and sys.version_info[1] < 7:
- import unittest2 as unittest
-else:
- import unittest
-
-try:
- from ssl import SSLError
-except ImportError:
- # dummy class of SSLError for ssl none-support environment.
- class SSLError(Exception):
- pass
-
-# Skip test to access the internet.
-TEST_WITH_INTERNET = os.environ.get('TEST_WITH_INTERNET', '0') == '1'
-TRACEABLE = True
-
-
-def create_mask_key(_):
- return "abcd"
-
-
-class SockMock(object):
- def __init__(self):
- self.data = []
- self.sent = []
-
- def add_packet(self, data):
- self.data.append(data)
-
- def gettimeout(self):
- return None
-
- def recv(self, bufsize):
- if self.data:
- e = self.data.pop(0)
- if isinstance(e, Exception):
- raise e
- if len(e) > bufsize:
- self.data.insert(0, e[bufsize:])
- return e[:bufsize]
-
- def send(self, data):
- self.sent.append(data)
- return len(data)
-
- def close(self):
- pass
-
-
-class HeaderSockMock(SockMock):
-
- def __init__(self, fname):
- SockMock.__init__(self)
- import yatest.common as yc
- path = os.path.join(os.path.dirname(yc.source_path(__file__)), fname)
- with open(path, "rb") as f:
- self.add_packet(f.read())
-
-
-class WebSocketTest(unittest.TestCase):
- def setUp(self):
- ws.enableTrace(TRACEABLE)
-
- def tearDown(self):
- pass
-
- def testDefaultTimeout(self):
- self.assertEqual(ws.getdefaulttimeout(), None)
- ws.setdefaulttimeout(10)
- self.assertEqual(ws.getdefaulttimeout(), 10)
- ws.setdefaulttimeout(None)
-
- def testWSKey(self):
- key = _create_sec_websocket_key()
- self.assertTrue(key != 24)
- self.assertTrue(six.u("¥n") not in key)
-
- def testNonce(self):
- """ WebSocket key should be a random 16-byte nonce.
- """
- key = _create_sec_websocket_key()
- nonce = base64decode(key.encode("utf-8"))
- self.assertEqual(16, len(nonce))
-
- def testWsUtils(self):
- key = "c6b8hTg4EeGb2gQMztV1/g=="
- required_header = {
- "upgrade": "websocket",
- "connection": "upgrade",
- "sec-websocket-accept": "Kxep+hNu9n51529fGidYu7a3wO0="}
- self.assertEqual(_validate_header(required_header, key, None), (True, None))
-
- header = required_header.copy()
- header["upgrade"] = "http"
- self.assertEqual(_validate_header(header, key, None), (False, None))
- del header["upgrade"]
- self.assertEqual(_validate_header(header, key, None), (False, None))
-
- header = required_header.copy()
- header["connection"] = "something"
- self.assertEqual(_validate_header(header, key, None), (False, None))
- del header["connection"]
- self.assertEqual(_validate_header(header, key, None), (False, None))
-
- header = required_header.copy()
- header["sec-websocket-accept"] = "something"
- self.assertEqual(_validate_header(header, key, None), (False, None))
- del header["sec-websocket-accept"]
- self.assertEqual(_validate_header(header, key, None), (False, None))
-
- header = required_header.copy()
- header["sec-websocket-protocol"] = "sub1"
- self.assertEqual(_validate_header(header, key, ["sub1", "sub2"]), (True, "sub1"))
- self.assertEqual(_validate_header(header, key, ["sub2", "sub3"]), (False, None))
-
- header = required_header.copy()
- header["sec-websocket-protocol"] = "sUb1"
- self.assertEqual(_validate_header(header, key, ["Sub1", "suB2"]), (True, "sub1"))
-
- header = required_header.copy()
- self.assertEqual(_validate_header(header, key, ["Sub1", "suB2"]), (False, None))
-
- def testReadHeader(self):
- status, header, status_message = read_headers(HeaderSockMock("data/header01.txt"))
- self.assertEqual(status, 101)
- self.assertEqual(header["connection"], "Upgrade")
-
- status, header, status_message = read_headers(HeaderSockMock("data/header03.txt"))
- self.assertEqual(status, 101)
- self.assertEqual(header["connection"], "Upgrade, Keep-Alive")
-
- HeaderSockMock("data/header02.txt")
- self.assertRaises(ws.WebSocketException, read_headers, HeaderSockMock("data/header02.txt"))
-
- def testSend(self):
- # TODO: add longer frame data
- sock = ws.WebSocket()
- sock.set_mask_key(create_mask_key)
- s = sock.sock = HeaderSockMock("data/header01.txt")
- sock.send("Hello")
- self.assertEqual(s.sent[0], six.b("\x81\x85abcd)\x07\x0f\x08\x0e"))
-
- sock.send("こんにちは")
- self.assertEqual(s.sent[1], six.b("\x81\x8fabcd\x82\xe3\xf0\x87\xe3\xf1\x80\xe5\xca\x81\xe2\xc5\x82\xe3\xcc"))
-
- sock.send(u"こんにちは")
- self.assertEqual(s.sent[1], six.b("\x81\x8fabcd\x82\xe3\xf0\x87\xe3\xf1\x80\xe5\xca\x81\xe2\xc5\x82\xe3\xcc"))
-
-# sock.send("x" * 5000)
-# self.assertEqual(s.sent[1], six.b("\x81\x8fabcd\x82\xe3\xf0\x87\xe3\xf1\x80\xe5\xca\x81\xe2\xc5\x82\xe3\xcc"))
-
- self.assertEqual(sock.send_binary(b'1111111111101'), 19)
-
- def testRecv(self):
- # TODO: add longer frame data
- sock = ws.WebSocket()
- s = sock.sock = SockMock()
- something = six.b("\x81\x8fabcd\x82\xe3\xf0\x87\xe3\xf1\x80\xe5\xca\x81\xe2\xc5\x82\xe3\xcc")
- s.add_packet(something)
- data = sock.recv()
- self.assertEqual(data, "こんにちは")
-
- s.add_packet(six.b("\x81\x85abcd)\x07\x0f\x08\x0e"))
- data = sock.recv()
- self.assertEqual(data, "Hello")
-
- @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
- def testIter(self):
- count = 2
- for _ in ws.create_connection('wss://stream.meetup.com/2/rsvps'):
- count -= 1
- if count == 0:
- break
-
- @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
- def testNext(self):
- sock = ws.create_connection('wss://stream.meetup.com/2/rsvps')
- self.assertEqual(str, type(next(sock)))
-
- def testInternalRecvStrict(self):
- sock = ws.WebSocket()
- s = sock.sock = SockMock()
- s.add_packet(six.b("foo"))
- s.add_packet(socket.timeout())
- s.add_packet(six.b("bar"))
- # s.add_packet(SSLError("The read operation timed out"))
- s.add_packet(six.b("baz"))
- with self.assertRaises(ws.WebSocketTimeoutException):
- sock.frame_buffer.recv_strict(9)
- # if six.PY2:
- # with self.assertRaises(ws.WebSocketTimeoutException):
- # data = sock._recv_strict(9)
- # else:
- # with self.assertRaises(SSLError):
- # data = sock._recv_strict(9)
- data = sock.frame_buffer.recv_strict(9)
- self.assertEqual(data, six.b("foobarbaz"))
- with self.assertRaises(ws.WebSocketConnectionClosedException):
- sock.frame_buffer.recv_strict(1)
-
- def testRecvTimeout(self):
- sock = ws.WebSocket()
- s = sock.sock = SockMock()
- s.add_packet(six.b("\x81"))
- s.add_packet(socket.timeout())
- s.add_packet(six.b("\x8dabcd\x29\x07\x0f\x08\x0e"))
- s.add_packet(socket.timeout())
- s.add_packet(six.b("\x4e\x43\x33\x0e\x10\x0f\x00\x40"))
- with self.assertRaises(ws.WebSocketTimeoutException):
- sock.recv()
- with self.assertRaises(ws.WebSocketTimeoutException):
- sock.recv()
- data = sock.recv()
- self.assertEqual(data, "Hello, World!")
- with self.assertRaises(ws.WebSocketConnectionClosedException):
- sock.recv()
-
- def testRecvWithSimpleFragmentation(self):
- sock = ws.WebSocket()
- s = sock.sock = SockMock()
- # OPCODE=TEXT, FIN=0, MSG="Brevity is "
- s.add_packet(six.b("\x01\x8babcd#\x10\x06\x12\x08\x16\x1aD\x08\x11C"))
- # OPCODE=CONT, FIN=1, MSG="the soul of wit"
- s.add_packet(six.b("\x80\x8fabcd\x15\n\x06D\x12\r\x16\x08A\r\x05D\x16\x0b\x17"))
- data = sock.recv()
- self.assertEqual(data, "Brevity is the soul of wit")
- with self.assertRaises(ws.WebSocketConnectionClosedException):
- sock.recv()
-
- def testRecvWithFireEventOfFragmentation(self):
- sock = ws.WebSocket(fire_cont_frame=True)
- s = sock.sock = SockMock()
- # OPCODE=TEXT, FIN=0, MSG="Brevity is "
- s.add_packet(six.b("\x01\x8babcd#\x10\x06\x12\x08\x16\x1aD\x08\x11C"))
- # OPCODE=CONT, FIN=0, MSG="Brevity is "
- s.add_packet(six.b("\x00\x8babcd#\x10\x06\x12\x08\x16\x1aD\x08\x11C"))
- # OPCODE=CONT, FIN=1, MSG="the soul of wit"
- s.add_packet(six.b("\x80\x8fabcd\x15\n\x06D\x12\r\x16\x08A\r\x05D\x16\x0b\x17"))
-
- _, data = sock.recv_data()
- self.assertEqual(data, six.b("Brevity is "))
- _, data = sock.recv_data()
- self.assertEqual(data, six.b("Brevity is "))
- _, data = sock.recv_data()
- self.assertEqual(data, six.b("the soul of wit"))
-
- # OPCODE=CONT, FIN=0, MSG="Brevity is "
- s.add_packet(six.b("\x80\x8babcd#\x10\x06\x12\x08\x16\x1aD\x08\x11C"))
-
- with self.assertRaises(ws.WebSocketException):
- sock.recv_data()
-
- with self.assertRaises(ws.WebSocketConnectionClosedException):
- sock.recv()
-
- def testClose(self):
- sock = ws.WebSocket()
- sock.sock = SockMock()
- sock.connected = True
- sock.close()
- self.assertEqual(sock.connected, False)
-
- sock = ws.WebSocket()
- s = sock.sock = SockMock()
- sock.connected = True
- s.add_packet(six.b('\x88\x80\x17\x98p\x84'))
- sock.recv()
- self.assertEqual(sock.connected, False)
-
- def testRecvContFragmentation(self):
- sock = ws.WebSocket()
- s = sock.sock = SockMock()
- # OPCODE=CONT, FIN=1, MSG="the soul of wit"
- s.add_packet(six.b("\x80\x8fabcd\x15\n\x06D\x12\r\x16\x08A\r\x05D\x16\x0b\x17"))
- self.assertRaises(ws.WebSocketException, sock.recv)
-
- def testRecvWithProlongedFragmentation(self):
- sock = ws.WebSocket()
- s = sock.sock = SockMock()
- # OPCODE=TEXT, FIN=0, MSG="Once more unto the breach, "
- s.add_packet(six.b("\x01\x9babcd.\x0c\x00\x01A\x0f\x0c\x16\x04B\x16\n\x15"
- "\rC\x10\t\x07C\x06\x13\x07\x02\x07\tNC"))
- # OPCODE=CONT, FIN=0, MSG="dear friends, "
- s.add_packet(six.b("\x00\x8eabcd\x05\x07\x02\x16A\x04\x11\r\x04\x0c\x07"
- "\x17MB"))
- # OPCODE=CONT, FIN=1, MSG="once more"
- s.add_packet(six.b("\x80\x89abcd\x0e\x0c\x00\x01A\x0f\x0c\x16\x04"))
- data = sock.recv()
- self.assertEqual(
- data,
- "Once more unto the breach, dear friends, once more")
- with self.assertRaises(ws.WebSocketConnectionClosedException):
- sock.recv()
-
- def testRecvWithFragmentationAndControlFrame(self):
- sock = ws.WebSocket()
- sock.set_mask_key(create_mask_key)
- s = sock.sock = SockMock()
- # OPCODE=TEXT, FIN=0, MSG="Too much "
- s.add_packet(six.b("\x01\x89abcd5\r\x0cD\x0c\x17\x00\x0cA"))
- # OPCODE=PING, FIN=1, MSG="Please PONG this"
- s.add_packet(six.b("\x89\x90abcd1\x0e\x06\x05\x12\x07C4.,$D\x15\n\n\x17"))
- # OPCODE=CONT, FIN=1, MSG="of a good thing"
- s.add_packet(six.b("\x80\x8fabcd\x0e\x04C\x05A\x05\x0c\x0b\x05B\x17\x0c"
- "\x08\x0c\x04"))
- data = sock.recv()
- self.assertEqual(data, "Too much of a good thing")
- with self.assertRaises(ws.WebSocketConnectionClosedException):
- sock.recv()
- self.assertEqual(
- s.sent[0],
- six.b("\x8a\x90abcd1\x0e\x06\x05\x12\x07C4.,$D\x15\n\n\x17"))
-
- @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
- def testWebSocket(self):
- s = ws.create_connection("ws://echo.websocket.org/")
- self.assertNotEqual(s, None)
- s.send("Hello, World")
- result = s.recv()
- self.assertEqual(result, "Hello, World")
-
- s.send(u"こにゃにゃちは、世界")
- result = s.recv()
- self.assertEqual(result, "こにゃにゃちは、世界")
- self.assertRaises(ValueError, s.send_close, -1, "")
- s.close()
-
- @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
- def testPingPong(self):
- s = ws.create_connection("ws://echo.websocket.org/")
- self.assertNotEqual(s, None)
- s.ping("Hello")
- s.pong("Hi")
- s.close()
-
- @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
- def testSecureWebSocket(self):
- import ssl
- s = ws.create_connection("wss://api.bitfinex.com/ws/2")
- self.assertNotEqual(s, None)
- self.assertTrue(isinstance(s.sock, ssl.SSLSocket))
- self.assertEqual(s.getstatus(), 101)
- self.assertNotEqual(s.getheaders(), None)
- s.close()
-
- @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
- def testWebSocketWithCustomHeader(self):
- s = ws.create_connection("ws://echo.websocket.org/",
- headers={"User-Agent": "PythonWebsocketClient"})
- self.assertNotEqual(s, None)
- s.send("Hello, World")
- result = s.recv()
- self.assertEqual(result, "Hello, World")
- self.assertRaises(ValueError, s.close, -1, "")
- s.close()
-
- @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
- def testAfterClose(self):
- s = ws.create_connection("ws://echo.websocket.org/")
- self.assertNotEqual(s, None)
- s.close()
- self.assertRaises(ws.WebSocketConnectionClosedException, s.send, "Hello")
- self.assertRaises(ws.WebSocketConnectionClosedException, s.recv)
-
-
-class SockOptTest(unittest.TestCase):
- @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
- def testSockOpt(self):
- sockopt = ((socket.IPPROTO_TCP, socket.TCP_NODELAY, 1),)
- s = ws.create_connection("ws://echo.websocket.org", sockopt=sockopt)
- self.assertNotEqual(s.sock.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY), 0)
- s.close()
-
-
-class UtilsTest(unittest.TestCase):
- def testUtf8Validator(self):
- state = validate_utf8(six.b('\xf0\x90\x80\x80'))
- self.assertEqual(state, True)
- state = validate_utf8(six.b('\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5\xed\xa0\x80edited'))
- self.assertEqual(state, False)
- state = validate_utf8(six.b(''))
- self.assertEqual(state, True)
-
-
-if __name__ == "__main__":
- unittest.main()
diff --git a/contrib/python/websocket-client/py2/ya.make b/contrib/python/websocket-client/py2/ya.make
deleted file mode 100644
index 5bcff2d4ff9..00000000000
--- a/contrib/python/websocket-client/py2/ya.make
+++ /dev/null
@@ -1,42 +0,0 @@
-# Generated by devtools/yamaker (pypi).
-
-PY2_LIBRARY()
-
-VERSION(0.59.0)
-
-LICENSE(LGPL-2.1-or-later)
-
-PEERDIR(
- contrib/python/six
-)
-
-NO_LINT()
-
-PY_SRCS(
- TOP_LEVEL
- websocket/__init__.py
- websocket/_abnf.py
- websocket/_app.py
- websocket/_cookiejar.py
- websocket/_core.py
- websocket/_exceptions.py
- websocket/_handshake.py
- websocket/_http.py
- websocket/_logging.py
- websocket/_socket.py
- websocket/_ssl_compat.py
- websocket/_url.py
- websocket/_utils.py
-)
-
-RESOURCE_FILES(
- PREFIX contrib/python/websocket-client/py2/
- .dist-info/METADATA
- .dist-info/top_level.txt
-)
-
-END()
-
-RECURSE_FOR_TESTS(
- tests
-)
diff --git a/contrib/python/websocket-client/py3/.dist-info/top_level.txt b/contrib/python/websocket-client/py3/.dist-info/top_level.txt
deleted file mode 100644
index ca4cb0cf822..00000000000
--- a/contrib/python/websocket-client/py3/.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-websocket
diff --git a/contrib/python/websocket-client/py3/websocket/tests/__init__.py b/contrib/python/websocket-client/py3/websocket/tests/__init__.py
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/contrib/python/websocket-client/py3/websocket/tests/__init__.py
+++ /dev/null
diff --git a/contrib/python/websocket-client/py3/websocket/tests/data/header01.txt b/contrib/python/websocket-client/py3/websocket/tests/data/header01.txt
deleted file mode 100644
index d44d24c205b..00000000000
--- a/contrib/python/websocket-client/py3/websocket/tests/data/header01.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-HTTP/1.1 101 WebSocket Protocol Handshake
-Connection: Upgrade
-Upgrade: WebSocket
-Sec-WebSocket-Accept: Kxep+hNu9n51529fGidYu7a3wO0=
-some_header: something
-
diff --git a/contrib/python/websocket-client/py3/websocket/tests/data/header02.txt b/contrib/python/websocket-client/py3/websocket/tests/data/header02.txt
deleted file mode 100644
index f481de928a8..00000000000
--- a/contrib/python/websocket-client/py3/websocket/tests/data/header02.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-HTTP/1.1 101 WebSocket Protocol Handshake
-Connection: Upgrade
-Upgrade WebSocket
-Sec-WebSocket-Accept: Kxep+hNu9n51529fGidYu7a3wO0=
-some_header: something
-
diff --git a/contrib/python/websocket-client/py3/ya.make b/contrib/python/websocket-client/py3/ya.make
deleted file mode 100644
index 1197cbe1171..00000000000
--- a/contrib/python/websocket-client/py3/ya.make
+++ /dev/null
@@ -1,41 +0,0 @@
-# Generated by devtools/yamaker (pypi).
-
-PY3_LIBRARY()
-
-VERSION(1.8.0)
-
-LICENSE(Apache-2.0)
-
-NO_LINT()
-
-PY_SRCS(
- TOP_LEVEL
- websocket/__init__.py
- websocket/_abnf.py
- websocket/_app.py
- websocket/_cookiejar.py
- websocket/_core.py
- websocket/_exceptions.py
- websocket/_handshake.py
- websocket/_http.py
- websocket/_logging.py
- websocket/_socket.py
- websocket/_ssl_compat.py
- websocket/_url.py
- websocket/_utils.py
- websocket/_wsdump.py
-)
-
-RESOURCE_FILES(
- PREFIX contrib/python/websocket-client/py3/
- .dist-info/METADATA
- .dist-info/entry_points.txt
- .dist-info/top_level.txt
- websocket/py.typed
-)
-
-END()
-
-RECURSE_FOR_TESTS(
- tests
-)
diff --git a/contrib/python/websocket-client/py3/tests/ya.make b/contrib/python/websocket-client/tests/ya.make
index df3343f388a..8b9aa757f44 100644
--- a/contrib/python/websocket-client/py3/tests/ya.make
+++ b/contrib/python/websocket-client/tests/ya.make
@@ -5,11 +5,11 @@ PEERDIR(
)
DATA(
- arcadia/contrib/python/websocket-client/py3/websocket/tests/data
+ arcadia/contrib/python/websocket-client/websocket/tests/data
)
SRCDIR(
- contrib/python/websocket-client/py3/websocket/tests
+ contrib/python/websocket-client/websocket/tests
)
TEST_SRCS(
diff --git a/contrib/python/websocket-client/py3/websocket/__init__.py b/contrib/python/websocket-client/websocket/__init__.py
index 559b38a6b7d..559b38a6b7d 100644
--- a/contrib/python/websocket-client/py3/websocket/__init__.py
+++ b/contrib/python/websocket-client/websocket/__init__.py
diff --git a/contrib/python/websocket-client/py3/websocket/_abnf.py b/contrib/python/websocket-client/websocket/_abnf.py
index d7754e0de2e..d7754e0de2e 100644
--- a/contrib/python/websocket-client/py3/websocket/_abnf.py
+++ b/contrib/python/websocket-client/websocket/_abnf.py
diff --git a/contrib/python/websocket-client/py3/websocket/_app.py b/contrib/python/websocket-client/websocket/_app.py
index 9fee76546b2..9fee76546b2 100644
--- a/contrib/python/websocket-client/py3/websocket/_app.py
+++ b/contrib/python/websocket-client/websocket/_app.py
diff --git a/contrib/python/websocket-client/py3/websocket/_cookiejar.py b/contrib/python/websocket-client/websocket/_cookiejar.py
index 7480e5fc21c..7480e5fc21c 100644
--- a/contrib/python/websocket-client/py3/websocket/_cookiejar.py
+++ b/contrib/python/websocket-client/websocket/_cookiejar.py
diff --git a/contrib/python/websocket-client/py3/websocket/_core.py b/contrib/python/websocket-client/websocket/_core.py
index f940ed0573d..f940ed0573d 100644
--- a/contrib/python/websocket-client/py3/websocket/_core.py
+++ b/contrib/python/websocket-client/websocket/_core.py
diff --git a/contrib/python/websocket-client/py3/websocket/_exceptions.py b/contrib/python/websocket-client/websocket/_exceptions.py
index cd196e44a38..cd196e44a38 100644
--- a/contrib/python/websocket-client/py3/websocket/_exceptions.py
+++ b/contrib/python/websocket-client/websocket/_exceptions.py
diff --git a/contrib/python/websocket-client/py3/websocket/_handshake.py b/contrib/python/websocket-client/websocket/_handshake.py
index 7bd61b82f44..7bd61b82f44 100644
--- a/contrib/python/websocket-client/py3/websocket/_handshake.py
+++ b/contrib/python/websocket-client/websocket/_handshake.py
diff --git a/contrib/python/websocket-client/py3/websocket/_http.py b/contrib/python/websocket-client/websocket/_http.py
index 9b1bf859d91..9b1bf859d91 100644
--- a/contrib/python/websocket-client/py3/websocket/_http.py
+++ b/contrib/python/websocket-client/websocket/_http.py
diff --git a/contrib/python/websocket-client/py3/websocket/_logging.py b/contrib/python/websocket-client/websocket/_logging.py
index 0f673d3aff1..0f673d3aff1 100644
--- a/contrib/python/websocket-client/py3/websocket/_logging.py
+++ b/contrib/python/websocket-client/websocket/_logging.py
diff --git a/contrib/python/websocket-client/py3/websocket/_socket.py b/contrib/python/websocket-client/websocket/_socket.py
index 81094ffc84b..81094ffc84b 100644
--- a/contrib/python/websocket-client/py3/websocket/_socket.py
+++ b/contrib/python/websocket-client/websocket/_socket.py
diff --git a/contrib/python/websocket-client/py3/websocket/_ssl_compat.py b/contrib/python/websocket-client/websocket/_ssl_compat.py
index 0a8a32b59b3..0a8a32b59b3 100644
--- a/contrib/python/websocket-client/py3/websocket/_ssl_compat.py
+++ b/contrib/python/websocket-client/websocket/_ssl_compat.py
diff --git a/contrib/python/websocket-client/py3/websocket/_url.py b/contrib/python/websocket-client/websocket/_url.py
index 902131710ba..902131710ba 100644
--- a/contrib/python/websocket-client/py3/websocket/_url.py
+++ b/contrib/python/websocket-client/websocket/_url.py
diff --git a/contrib/python/websocket-client/py3/websocket/_utils.py b/contrib/python/websocket-client/websocket/_utils.py
index 65f3c0daf7c..65f3c0daf7c 100644
--- a/contrib/python/websocket-client/py3/websocket/_utils.py
+++ b/contrib/python/websocket-client/websocket/_utils.py
diff --git a/contrib/python/websocket-client/py3/websocket/_wsdump.py b/contrib/python/websocket-client/websocket/_wsdump.py
index d4d76dc509e..d4d76dc509e 100644
--- a/contrib/python/websocket-client/py3/websocket/_wsdump.py
+++ b/contrib/python/websocket-client/websocket/_wsdump.py
diff --git a/contrib/python/websocket-client/py3/websocket/py.typed b/contrib/python/websocket-client/websocket/py.typed
index e69de29bb2d..e69de29bb2d 100644
--- a/contrib/python/websocket-client/py3/websocket/py.typed
+++ b/contrib/python/websocket-client/websocket/py.typed
diff --git a/contrib/python/websocket-client/py2/websocket/tests/__init__.py b/contrib/python/websocket-client/websocket/tests/__init__.py
index e69de29bb2d..e69de29bb2d 100644
--- a/contrib/python/websocket-client/py2/websocket/tests/__init__.py
+++ b/contrib/python/websocket-client/websocket/tests/__init__.py
diff --git a/contrib/python/websocket-client/py2/websocket/tests/data/header01.txt b/contrib/python/websocket-client/websocket/tests/data/header01.txt
index d44d24c205b..d44d24c205b 100644
--- a/contrib/python/websocket-client/py2/websocket/tests/data/header01.txt
+++ b/contrib/python/websocket-client/websocket/tests/data/header01.txt
diff --git a/contrib/python/websocket-client/py2/websocket/tests/data/header02.txt b/contrib/python/websocket-client/websocket/tests/data/header02.txt
index f481de928a8..f481de928a8 100644
--- a/contrib/python/websocket-client/py2/websocket/tests/data/header02.txt
+++ b/contrib/python/websocket-client/websocket/tests/data/header02.txt
diff --git a/contrib/python/websocket-client/py3/websocket/tests/data/header03.txt b/contrib/python/websocket-client/websocket/tests/data/header03.txt
index 1a81dc70ce5..1a81dc70ce5 100644
--- a/contrib/python/websocket-client/py3/websocket/tests/data/header03.txt
+++ b/contrib/python/websocket-client/websocket/tests/data/header03.txt
diff --git a/contrib/python/websocket-client/py3/websocket/tests/echo-server.py b/contrib/python/websocket-client/websocket/tests/echo-server.py
index 5d1e87087b6..5d1e87087b6 100644
--- a/contrib/python/websocket-client/py3/websocket/tests/echo-server.py
+++ b/contrib/python/websocket-client/websocket/tests/echo-server.py
diff --git a/contrib/python/websocket-client/py3/websocket/tests/test_abnf.py b/contrib/python/websocket-client/websocket/tests/test_abnf.py
index a749f13bd54..a749f13bd54 100644
--- a/contrib/python/websocket-client/py3/websocket/tests/test_abnf.py
+++ b/contrib/python/websocket-client/websocket/tests/test_abnf.py
diff --git a/contrib/python/websocket-client/py3/websocket/tests/test_app.py b/contrib/python/websocket-client/websocket/tests/test_app.py
index 18eace54427..18eace54427 100644
--- a/contrib/python/websocket-client/py3/websocket/tests/test_app.py
+++ b/contrib/python/websocket-client/websocket/tests/test_app.py
diff --git a/contrib/python/websocket-client/py3/websocket/tests/test_cookiejar.py b/contrib/python/websocket-client/websocket/tests/test_cookiejar.py
index 67eddb627ae..67eddb627ae 100644
--- a/contrib/python/websocket-client/py3/websocket/tests/test_cookiejar.py
+++ b/contrib/python/websocket-client/websocket/tests/test_cookiejar.py
diff --git a/contrib/python/websocket-client/py3/websocket/tests/test_http.py b/contrib/python/websocket-client/websocket/tests/test_http.py
index 72465c22057..72465c22057 100644
--- a/contrib/python/websocket-client/py3/websocket/tests/test_http.py
+++ b/contrib/python/websocket-client/websocket/tests/test_http.py
diff --git a/contrib/python/websocket-client/py3/websocket/tests/test_url.py b/contrib/python/websocket-client/websocket/tests/test_url.py
index 110fdfad70a..110fdfad70a 100644
--- a/contrib/python/websocket-client/py3/websocket/tests/test_url.py
+++ b/contrib/python/websocket-client/websocket/tests/test_url.py
diff --git a/contrib/python/websocket-client/py3/websocket/tests/test_websocket.py b/contrib/python/websocket-client/websocket/tests/test_websocket.py
index 892312a2dbd..892312a2dbd 100644
--- a/contrib/python/websocket-client/py3/websocket/tests/test_websocket.py
+++ b/contrib/python/websocket-client/websocket/tests/test_websocket.py
diff --git a/contrib/python/websocket-client/ya.make b/contrib/python/websocket-client/ya.make
index cb3ea7664b8..3c7e7f401d0 100644
--- a/contrib/python/websocket-client/ya.make
+++ b/contrib/python/websocket-client/ya.make
@@ -1,20 +1,41 @@
-PY23_LIBRARY()
+# Generated by devtools/yamaker (pypi).
-LICENSE(Service-Py23-Proxy)
+PY3_LIBRARY()
-VERSION(Service-proxy-version)
+VERSION(1.8.0)
-IF (PYTHON2)
- PEERDIR(contrib/python/websocket-client/py2)
-ELSE()
- PEERDIR(contrib/python/websocket-client/py3)
-ENDIF()
+LICENSE(Apache-2.0)
NO_LINT()
+PY_SRCS(
+ TOP_LEVEL
+ websocket/__init__.py
+ websocket/_abnf.py
+ websocket/_app.py
+ websocket/_cookiejar.py
+ websocket/_core.py
+ websocket/_exceptions.py
+ websocket/_handshake.py
+ websocket/_http.py
+ websocket/_logging.py
+ websocket/_socket.py
+ websocket/_ssl_compat.py
+ websocket/_url.py
+ websocket/_utils.py
+ websocket/_wsdump.py
+)
+
+RESOURCE_FILES(
+ PREFIX contrib/python/websocket-client/
+ .dist-info/METADATA
+ .dist-info/entry_points.txt
+ .dist-info/top_level.txt
+ websocket/py.typed
+)
+
END()
-RECURSE(
- py2
- py3
+RECURSE_FOR_TESTS(
+ tests
)