Skip to content

Commit 45990f6

Browse files
Support catch all events (Fixes #2095)
1 parent c4f0218 commit 45990f6

File tree

4 files changed

+42
-13
lines changed

4 files changed

+42
-13
lines changed

example/app.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
app = Flask(__name__)
1313
app.config['SECRET_KEY'] = 'secret!'
14-
socketio = SocketIO(app, async_mode=async_mode)
14+
socketio = SocketIO(app, async_mode=async_mode, logger=True, engineio_logger=True)
1515
thread = None
1616
thread_lock = Lock()
1717

@@ -81,6 +81,13 @@ def my_room_event(message):
8181
to=message['room'])
8282

8383

84+
@socketio.on('*')
85+
def catch_all(event, data):
86+
session['receive_count'] = session.get('receive_count', 0) + 1
87+
emit('my_response',
88+
{'data': [event, data], 'count': session['receive_count']})
89+
90+
8491
@socketio.event
8592
def disconnect_request():
8693
@copy_current_request_context

example/templates/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<head>
44
<title>Flask-SocketIO Test</title>
55
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js" integrity="sha512-bLT0Qm9VnAYZDflyKcBaQ2gg0hSYNQrJ8RilYldYQ1FxQYoCLtUjuuRuZo+fjqhx/qtq/1itJ0C2ejDxltZVFg==" crossorigin="anonymous"></script>
6-
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/3.0.4/socket.io.js" integrity="sha512-aMGMvNYu8Ue4G+fHa359jcPb1u+ytAF+P2SCb+PxrjCdO3n3ZTxJ30zuH39rimUggmTwmh2u7wvQsDTHESnmfQ==" crossorigin="anonymous"></script>
6+
<script src="https://cdn.socket.io/4.7.5/socket.io.min.js" integrity="sha384-2huaZvOR9iDzHqslqwpR87isEmrfxqyWOF7hr7BY6KG0+hVKLoEXMPUJw3ynWuhO" crossorigin="anonymous"></script>
77
<script type="text/javascript" charset="utf-8">
88
$(document).ready(function() {
99
// Connect to the Socket.IO server.
@@ -56,7 +56,7 @@
5656
// These accept data from the user and send it to the server in a
5757
// variety of ways
5858
$('form#emit').submit(function(event) {
59-
socket.emit('my_event', {data: $('#emit_data').val()});
59+
socket.emit('my_event_foo', {data: $('#emit_data').val()});
6060
return false;
6161
});
6262
$('form#broadcast').submit(function(event) {

src/flask_socketio/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,12 @@ def _handler(sid, *args):
285285
real_ns = sid
286286
sid = args[0]
287287
args = args[1:]
288+
real_msg = message
289+
if message == '*':
290+
real_msg = sid
291+
sid = args[0]
292+
args = [real_msg] + list(args[1:])
293+
print(f'{real_msg=} {real_ns=} {sid=} {args=}')
288294
return self._handle_event(handler, message, real_ns, sid,
289295
*args)
290296

test_socketio.py

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,11 @@ def get_request_event2(data):
108108
socketio.on_event('yet another custom event', get_request_event2)
109109

110110

111+
@socketio.on('*')
112+
def catch_all(event, data):
113+
emit('my custom response', (event, data))
114+
115+
111116
@socketio.on('my custom namespace event', namespace='/test')
112117
def on_custom_event_test(data):
113118
emit('my custom namespace response', data, namespace='/test')
@@ -421,16 +426,6 @@ def test_send_json_namespace(self):
421426
self.assertEqual(len(received), 1)
422427
self.assertEqual(received[0]['args']['a'], 'b')
423428

424-
def test_send_catch_all_namespace(self):
425-
client = socketio.test_client(app, namespace='/test')
426-
client.get_received('/test')
427-
client.emit('wildcard', {'a': 'b'}, namespace='/test')
428-
received = client.get_received('/test')
429-
self.assertEqual(len(received), 1)
430-
self.assertEqual(len(received[0]['args']), 1)
431-
self.assertEqual(received[0]['name'], 'my custom response')
432-
self.assertEqual(received[0]['args'][0]['a'], 'b')
433-
434429
def test_emit(self):
435430
client = socketio.test_client(app, auth={'foo': 'bar'})
436431
client.get_received()
@@ -451,6 +446,27 @@ def test_emit_binary(self):
451446
self.assertEqual(received[0]['name'], 'my custom response')
452447
self.assertEqual(received[0]['args'][0]['a'], b'\x01\x02\x03')
453448

449+
def test_emit_catch_all_event(self):
450+
client = socketio.test_client(app, auth={'foo': 'bar'})
451+
client.get_received()
452+
client.emit('random event', {'foo': 'bar'})
453+
received = client.get_received()
454+
self.assertEqual(len(received), 1)
455+
self.assertEqual(len(received[0]['args']), 2)
456+
self.assertEqual(received[0]['name'], 'my custom response')
457+
self.assertEqual(received[0]['args'][0], 'random event')
458+
self.assertEqual(received[0]['args'][1], {'foo': 'bar'})
459+
460+
def test_send_catch_all_namespace(self):
461+
client = socketio.test_client(app, namespace='/test')
462+
client.get_received('/test')
463+
client.emit('wildcard', {'a': 'b'}, namespace='/test')
464+
received = client.get_received('/test')
465+
self.assertEqual(len(received), 1)
466+
self.assertEqual(len(received[0]['args']), 1)
467+
self.assertEqual(received[0]['name'], 'my custom response')
468+
self.assertEqual(received[0]['args'][0]['a'], 'b')
469+
454470
def test_request_event_data(self):
455471
client = socketio.test_client(app, auth={'foo': 'bar'})
456472
client.get_received()

0 commit comments

Comments
 (0)