def websocket_handler(request):
ws = web.WebSocketResponse()
request.app[WS].append(ws)
await ws.prepare(request)
ws_type_lookup = {k.value: v for v, k in aiohttp.MsgType.__members__.items()}
async for msg in ws:
if msg.tp == aiohttp.MsgType.text:
try:
data = json.loads(msg.data)
except json.JSONDecodeError as e:
logger.error('JSON decode error: %s', str(e))
else:
command = data['command']
if command == 'hello':
if 'http://livereload.com/protocols/official-7' not in data['protocols']:
logger.error('live reload protocol 7 not supported by client %s', msg.data)
ws.close()
else:
handshake = {
'command': 'hello',
'protocols': [
'http://livereload.com/protocols/official-7',
],
'serverName': 'livereload-aiohttp',
}
ws.send_str(json.dumps(handshake))
elif command == 'info':
logger.info('browser connected at %s', data['url'])
logger.debug('browser plugins: %s', data['plugins'])
else:
logger.error('Unknown ws message %s', msg.data)
elif msg.tp == aiohttp.MsgType.error:
logger.error('ws connection closed with exception %s', ws.exception())
else:
logger.error('unknown websocket message type %s, data: %s', ws_type_lookup[msg.tp], msg.data)
# TODO gracefully close websocket connections on app shutdown
logger.debug('browser disconnected')
request.app[WS].remove(ws)
return ws
评论列表
文章目录