comparison src/server/websockets.py @ 1113:cdd389ef97bc

server: code style reformatting using black
author Goffi <goffi@goffi.org>
date Fri, 29 Jun 2018 17:45:26 +0200
parents f2170536ba23
children
comparison
equal deleted inserted replaced
1112:f287fc8bb31a 1113:cdd389ef97bc
17 # You should have received a copy of the GNU Affero General Public License 17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. 18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 19
20 from sat.core.i18n import _ 20 from sat.core.i18n import _
21 from sat.core.log import getLogger 21 from sat.core.log import getLogger
22
22 log = getLogger(__name__) 23 log = getLogger(__name__)
23 from sat.core import exceptions 24 from sat.core import exceptions
24 25
25 from autobahn.twisted import websocket 26 from autobahn.twisted import websocket
26 from autobahn.twisted import resource as resource 27 from autobahn.twisted import resource as resource
27 from autobahn.websocket import types 28 from autobahn.websocket import types
28 29
29 import json 30 import json
30 31
31 LIBERVIA_PROTOCOL = 'libervia_page' 32 LIBERVIA_PROTOCOL = "libervia_page"
32 33
33 34
34 class LiberviaPageWSProtocol(websocket.WebSocketServerProtocol): 35 class LiberviaPageWSProtocol(websocket.WebSocketServerProtocol):
35 host = None 36 host = None
36 tokens_map = {} 37 tokens_map = {}
37 38
38 def onConnect(self, request): 39 def onConnect(self, request):
39 prefix = LIBERVIA_PROTOCOL + u'_' 40 prefix = LIBERVIA_PROTOCOL + u"_"
40 for protocol in request.protocols: 41 for protocol in request.protocols:
41 if protocol.startswith(prefix): 42 if protocol.startswith(prefix):
42 token = protocol[len(prefix):].strip() 43 token = protocol[len(prefix) :].strip()
43 if token: 44 if token:
44 break 45 break
45 else: 46 else:
46 raise types.ConnectionDeny(types.ConnectionDeny.NOT_IMPLEMENTED, 47 raise types.ConnectionDeny(
47 u"Can't use this subprotocol") 48 types.ConnectionDeny.NOT_IMPLEMENTED, u"Can't use this subprotocol"
49 )
48 50
49 if token not in self.tokens_map: 51 if token not in self.tokens_map:
50 log.warning(_(u"Can't activate page socket: unknown token")) 52 log.warning(_(u"Can't activate page socket: unknown token"))
51 raise types.ConnectionDeny(types.ConnectionDeny.FORBIDDEN, 53 raise types.ConnectionDeny(
52 u"Bad token, please reload page") 54 types.ConnectionDeny.FORBIDDEN, u"Bad token, please reload page"
55 )
53 self.token = token 56 self.token = token
54 self.page = self.tokens_map[token]['page'] 57 self.page = self.tokens_map[token]["page"]
55 self.request = self.tokens_map[token]['request'] 58 self.request = self.tokens_map[token]["request"]
56 return protocol 59 return protocol
57 60
58 def onOpen(self): 61 def onOpen(self):
59 log.debug(_(u"Websocket opened for {page} (token: {token})".format( 62 log.debug(
60 page = self.page, 63 _(
61 token = self.token))) 64 u"Websocket opened for {page} (token: {token})".format(
65 page=self.page, token=self.token
66 )
67 )
68 )
62 self.request.sendData = self.sendJSONData 69 self.request.sendData = self.sendJSONData
63 self.page.onSocketOpen(self.request) 70 self.page.onSocketOpen(self.request)
64 71
65 def onMessage(self, payload, isBinary): 72 def onMessage(self, payload, isBinary):
66 try: 73 try:
67 data_json = json.loads(payload.decode('utf8')) 74 data_json = json.loads(payload.decode("utf8"))
68 except ValueError as e: 75 except ValueError as e:
69 log.warning(_(u"Not valid JSON, ignoring data: {msg}\n{data}").format(msg=e, data=payload)) 76 log.warning(
77 _(u"Not valid JSON, ignoring data: {msg}\n{data}").format(
78 msg=e, data=payload
79 )
80 )
70 return 81 return
71 # we request page first, to raise an AttributeError 82 #  we request page first, to raise an AttributeError
72 # if it is not set (which should never happen) 83 # if it is not set (which should never happen)
73 page = self.page 84 page = self.page
74 try: 85 try:
75 cb = page.on_data 86 cb = page.on_data
76 except AttributeError: 87 except AttributeError:
77 log.warning(_(u'No "on_data" method set on dynamic page, ignoring data:\n{data}').format(data=data_json)) 88 log.warning(
89 _(
90 u'No "on_data" method set on dynamic page, ignoring data:\n{data}'
91 ).format(data=data_json)
92 )
78 else: 93 else:
79 cb(page, self.request, data_json) 94 cb(page, self.request, data_json)
80 95
81 def onClose(self, wasClean, code, reason): 96 def onClose(self, wasClean, code, reason):
82 try: 97 try:
83 token = self.token 98 token = self.token
84 except AttributeError: 99 except AttributeError:
85 log.warning(_(u'Websocket closed but no token is associated')) 100 log.warning(_(u"Websocket closed but no token is associated"))
86 return 101 return
87 102
88 self.page.onSocketClose(self.request) 103 self.page.onSocketClose(self.request)
89 104
90 try: 105 try:
91 del self.tokens_map[token] 106 del self.tokens_map[token]
92 del self.request.sendData 107 del self.request.sendData
93 except (KeyError, AttributeError): 108 except (KeyError, AttributeError):
94 raise exceptions.InternalError(_(u"Token or sendData doesn't exist, this should never happen!")) 109 raise exceptions.InternalError(
95 log.debug(_(u"Websocket closed for {page} (token: {token}). {reason}".format( 110 _(u"Token or sendData doesn't exist, this should never happen!")
96 page = self.page, 111 )
97 token = self.token, 112 log.debug(
98 reason = u'' if wasClean else _(u'Reason: {reason}').format(reason=reason)))) 113 _(
114 u"Websocket closed for {page} (token: {token}). {reason}".format(
115 page=self.page,
116 token=self.token,
117 reason=u""
118 if wasClean
119 else _(u"Reason: {reason}").format(reason=reason),
120 )
121 )
122 )
99 123
100 def sendJSONData(self, type_, **data): 124 def sendJSONData(self, type_, **data):
101 assert 'type' not in data 125 assert "type" not in data
102 data['type'] = type_ 126 data["type"] = type_
103 self.sendMessage(json.dumps(data, ensure_ascii = False).encode('utf8')) 127 self.sendMessage(json.dumps(data, ensure_ascii=False).encode("utf8"))
104 128
105 @classmethod 129 @classmethod
106 def getBaseURL(cls, host, secure): 130 def getBaseURL(cls, host, secure):
107 return u"ws{sec}://localhost:{port}".format( 131 return u"ws{sec}://localhost:{port}".format(
108 sec='s' if secure else '', 132 sec="s" if secure else "",
109 port=cls.host.options['port_https' if secure else 'port']) 133 port=cls.host.options["port_https" if secure else "port"],
134 )
110 135
111 @classmethod 136 @classmethod
112 def getResource(cls, host, secure): 137 def getResource(cls, host, secure):
113 if cls.host is None: 138 if cls.host is None:
114 cls.host = host 139 cls.host = host
117 return resource.WebSocketResource(factory) 142 return resource.WebSocketResource(factory)
118 143
119 @classmethod 144 @classmethod
120 def registerToken(cls, token, page, request): 145 def registerToken(cls, token, page, request):
121 if token in cls.tokens_map: 146 if token in cls.tokens_map:
122 raise exceptions.ConflictError(_(u'This token is already registered')) 147 raise exceptions.ConflictError(_(u"This token is already registered"))
123 cls.tokens_map[token] = {'page': page, 148 cls.tokens_map[token] = {"page": page, "request": request}
124 'request': request}