Skip to main content

Websocket server for gevent.pywsgi

Project description

gevent-ws

A fast, MIT-licensed alternative to the abandoned non-free (as in freedom) gevent-websocket.

Why?

It's MIT-licensed, so it can be included to almost all software (both open-source and closed-source) without any licensing issues, as opposed to gevent-websocket. And it's several times faster!

Installation

gevent-ws can be installed from PyPI and GitHub.

PyPI

$ pip3 install gevent-ws

GitHub

$ git clone https://github.com/imachug/gevent-ws.git
$ cd gevent-ws
$ python3 setup.py install

Example

A simple echo server

from gevent.pywsgi import WSGIServer
from gevent_ws import WebSocketHandler


def app(env, start_response):
    ws = env["wsgi.websocket"]
    while True:
        msg = ws.receive()
        if msg is None:
            break
        ws.send(msg)
    return [b"Bye"]


server = WSGIServer(("", 8080), app, handler_class=WebSocketHandler)
server.serve_forever()

Both HTTP and websocket on a single port

from gevent.pywsgi import WSGIServer
from gevent_ws import WebSocketHandler


def app(env, start_response):
    if "wsgi.websocket" in env:
        ws = env["wsgi.websocket"]
        while True:
            msg = ws.receive()
            if msg is None:
                break
            ws.send(msg)
        return [b"Bye"]
    else:
        start_response("200 OK", [
            ("Content-Type", "text/html, charset=utf-8")
        ])

        return [
            b"""
                <script>
                    const ws = new WebSocket("ws://127.0.0.1:8080/");
                    ws.onopen = () => {
                        ws.send("Hello, world!");
                    };
                    ws.onmessage = e => {
                        ws.send(e.data);
                    };
                </script>
            """
        ]


server = WSGIServer(("", 8080), app, handler_class=WebSocketHandler)
server.serve_forever()

Docs

gevent_ws.WebSocketHandler

The main class. Pass it to gevent.pywsgi.WSGIServer as handler_class.

gevent_ws.WebSocket

You get this object by accessing wsgi.websocket property of the environment object. If it exists, it's a websocket connection; if it doesn't, it's an HTTP request. You can use "wsgi.websocket" in env to check this and route the request correctly.

gevent_ws.WebSocket.receive()

Waits for a message and returns it, either as str or bytes. Blocks. May return None if the connection is closed or an OSError if the socket can't be read from.

gevent_ws.WebSocket.receive_nowait()

Returns the message if it's available (the format is the same as in receive()) or None if no message is in the queue. May return None or raise OSError (see receive()).

gevent_ws.WebSocket.send(message)

Sends a message to the other party. message can be either str or bytes. May raise EOFError if the connection is closed or OSError if the message can't be sent for some other reason.

gevent_ws.WebSocket.close(status=1000)

Closes the websocket. Status 1000 (the default one) means that the connection is closed cleanly. Check RFC for more status codes.

gevent_ws.WebSocket.set_max_message_length(length)

Set maximum incoming message size (in bytes). 10 MiB is the default value.

gevent_ws.WebSocket.closed

A boolean showing whether the connection is closed (by any of the two parties) or is being closed.

gevent_ws.WebSocket.status

The close status code sent by the other party. None if the socket was closed by the client, the server didn't return the error code or the connection was aborted abnormally.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gevent-ws-2.1.0.tar.gz (5.2 kB view details)

Uploaded Source

Built Distribution

gevent_ws-2.1.0-py3-none-any.whl (6.1 kB view details)

Uploaded Python 3

File details

Details for the file gevent-ws-2.1.0.tar.gz.

File metadata

  • Download URL: gevent-ws-2.1.0.tar.gz
  • Upload date:
  • Size: 5.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.21.0 setuptools/41.1.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.7.5

File hashes

Hashes for gevent-ws-2.1.0.tar.gz
Algorithm Hash digest
SHA256 f69a80dac1c6f353ba338f2570a19d3076be94b49f348a570effd0ab9ffed4a4
MD5 008eaec7d30f84a689c6db914573af1f
BLAKE2b-256 04328797ddd58c8f87d2ff07f2198c1b70dd12f2fdf81b95738cc14873537731

See more details on using hashes here.

File details

Details for the file gevent_ws-2.1.0-py3-none-any.whl.

File metadata

  • Download URL: gevent_ws-2.1.0-py3-none-any.whl
  • Upload date:
  • Size: 6.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.21.0 setuptools/41.1.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.7.5

File hashes

Hashes for gevent_ws-2.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 dba0ea1dc87319385728ba32009af7324144dcbaac1139987830b556914ea2a6
MD5 ae1ae0f39a137f2b4c6ff1f7983f5f64
BLAKE2b-256 f54fa80e131f0d2039a5effce6edd9a6c9365f89dc5b24d64b84666f81fa17dd

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page