Skip to content

WebsocketMismatch #4299

@hansehe

Description

@hansehe

New version of Flask (>1.1.4) does not work with Flask-Sockets (websockets).

Replicate bug by running server and client.

requirements:

Flask==2.0.2
Flask-Sockets==0.2.1
Werkzeug==2.0.2
gevent==21.8.0
websocket-client==1.2.1

flash_ws_server.py:

from flask import Flask
from flask_sockets import Sockets


app = Flask(__name__)
sockets = Sockets(app)


@sockets.route('/mixed_ws_path')
def echo_socket(ws):
    while not ws.closed:
        message = ws.receive()
        ws.send(message)


@app.route('/mixed_ws_path')
def hello():
    return 'Hello World!'


if __name__ == "__main__":
    from gevent import pywsgi
    from geventwebsocket.handler import WebSocketHandler
    server = pywsgi.WSGIServer(('', 5000), app, handler_class=WebSocketHandler)
    server.serve_forever()

flask_ws_client.py:

import websocket
import _thread
import time


def on_message(ws, message):
    print(message)


def on_error(ws, error):
    print(error)


def on_close(ws, close_status_code, close_msg):
    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://localhost:5000/mixed_ws_path",
                                on_open=on_open,
                                on_message=on_message,
                                on_error=on_error,
                                on_close=on_close)

    ws.run_forever()

The server responds with this exception:

Traceback (most recent call last):
  File "C:\Users\heh\AppData\Local\Programs\Python\Python39\lib\site-packages\gevent\pywsgi.py", line 999, in handle_one_response
    self.run_application()
  File "C:\Users\heh\AppData\Local\Programs\Python\Python39\lib\site-packages\geventwebsocket\handler.py", line 75, in run_application
    self.run_websocket()
  File "C:\Users\heh\AppData\Local\Programs\Python\Python39\lib\site-packages\geventwebsocket\handler.py", line 52, in run_websocket
    list(self.application(self.environ, lambda s, h, e=None: []))
  File "C:\Users\heh\AppData\Local\Programs\Python\Python39\lib\site-packages\flask\app.py", line 2091, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\heh\AppData\Local\Programs\Python\Python39\lib\site-packages\flask_sockets.py", line 40, in __call__
    handler, values = adapter.match()
  File "C:\Users\heh\AppData\Local\Programs\Python\Python39\lib\site-packages\werkzeug\routing.py", line 2039, in match
    raise WebsocketMismatch()
werkzeug.routing.WebsocketMismatch: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
2021-10-08T09:59:35Z {'REMOTE_ADDR': '::1', 'REMOTE_PORT': '56214', 'HTTP_HOST': 'localhost:5000', (hidden keys: 24)} failed with WebsocketMismatch

Everything works fine with Flask version ==1.1.4

Environment:

  • Python version: 3.9.0
  • Flask version: 2.0.2

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions