You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.7 KiB
72 lines
2.7 KiB
"""
|
|
@author Georg Hopp
|
|
"""
|
|
from contextlib import contextmanager
|
|
|
|
from Connection import Connection
|
|
from Event.EventHandler import EventHandler
|
|
|
|
class ProtocolHandler(EventHandler):
|
|
def __init__(self):
|
|
super(ProtocolHandler, self).__init__()
|
|
|
|
self._event_methods = {
|
|
Connection.eventId('new_data') : self._parse,
|
|
Connection.eventId('send_msg') : self._compose,
|
|
Connection.eventId('upgrade') : self._upgrade
|
|
}
|
|
|
|
def _parse(self, event):
|
|
for message in event.subject:
|
|
try:
|
|
"""
|
|
only because websockets currently have no message
|
|
class which would handle this correctly...so we
|
|
just ignore this problem here.
|
|
"""
|
|
if message.isCloseMessage():
|
|
self.issueEvent(event.subject, 'new_msg', message)
|
|
if message.isResponse():
|
|
event.subject.setClose() # setting this results in
|
|
# closing the endpoint as
|
|
# soon as everything was tried
|
|
elif message.isUpgradeMessage():
|
|
if message.isRequest():
|
|
protocol = event.subject.getProtocol()
|
|
response = protocol.createUpgradeResponse(message)
|
|
self.issueEvent(event.subject, 'send_msg', response)
|
|
else:
|
|
protocol = event.subject.getProtocol()
|
|
self.issueEvent(event.subject, 'upgrade', message)
|
|
else:
|
|
self.issueEvent(event.subject, 'new_msg', message)
|
|
except Exception:
|
|
pass
|
|
|
|
def _compose(self, event):
|
|
endpoint = event.subject
|
|
message = event.data
|
|
|
|
if endpoint.compose(message):
|
|
self.issueEvent(endpoint, 'write_ready')
|
|
|
|
try:
|
|
"""
|
|
only because websockets currently have no message
|
|
class which would handle this correctly...so we
|
|
just ignore this problem here.
|
|
"""
|
|
if message.isResponse():
|
|
if message.isCloseMessage():
|
|
endpoint.setClose()
|
|
if message.isUpgradeMessage():
|
|
self.issueEvent(endpoint, 'upgrade', message)
|
|
except Exception:
|
|
pass
|
|
|
|
def _upgrade(self, event):
|
|
protocol = event.subject.getProtocol()
|
|
new_proto = protocol.upgrade(event.data)
|
|
event.subject.setProtocol(new_proto)
|
|
|
|
# vim: set ft=python et ts=4 sw=4 sts=4:
|