openmedialibrary/oml/websocket.py

57 lines
1.6 KiB
Python
Raw Normal View History

2014-05-04 17:26:43 +00:00
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
2014-09-02 22:32:44 +00:00
2014-05-04 17:26:43 +00:00
from tornado.websocket import WebSocketHandler
from tornado.ioloop import IOLoop
import json
from oxtornado import json_dumps
2014-05-04 17:26:43 +00:00
import state
2014-05-18 03:01:24 +00:00
import logging
2014-05-17 14:26:59 +00:00
logger = logging.getLogger('oml.websocket')
2014-05-04 17:26:43 +00:00
class Handler(WebSocketHandler):
def check_origin(self, origin):
# allow access to websocket from site, installer and loader (local file)
return self.request.host in origin \
2014-08-12 13:35:50 +00:00
or origin == 'http://127.0.0.1:9842' \
or origin == 'null'
2014-05-04 17:26:43 +00:00
def open(self):
2014-08-12 13:35:50 +00:00
if self.request.headers['origin'] not in ('null', 'http://127.0.0.1:9842') \
and self.request.host not in self.request.headers['origin']:
2014-05-17 14:26:59 +00:00
logger.debug('reject cross site attempt to open websocket %s', self.request)
2014-05-14 09:57:11 +00:00
self.close()
if self not in state.websockets:
state.websockets.append(self)
2014-05-04 17:26:43 +00:00
#websocket calls
def on_message(self, message):
2014-09-01 07:51:48 +00:00
action, data = json.loads(message)
if state.tasks:
state.tasks.queue(action, data)
2014-05-04 17:26:43 +00:00
def on_close(self):
if self in state.websockets:
state.websockets.remove(self)
def post(self, event, data):
message = json_dumps([event, data])
main = IOLoop.instance()
main.add_callback(lambda: self.write_message(message))
2014-05-04 17:26:43 +00:00
def trigger_event(event, data):
if len(state.websockets):
2014-05-17 14:57:34 +00:00
logger.debug('trigger event %s %s %s', event, data, len(state.websockets))
2014-05-04 17:26:43 +00:00
for ws in state.websockets:
try:
ws.post(event, data)
2014-05-04 17:26:43 +00:00
except:
2014-05-18 03:01:24 +00:00
logger.debug('failed to send to ws %s %s %s', ws, event, data, exc_info=1)