Mercurial > libervia-web
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} |