X-Git-Url: https://jfr.im/git/irc/quakenet/qwebirc.git/blobdiff_plain/06dbebbc194d88d204cf8a46385a556f58e3c1a5..74ee64b3cdc820cf306a832ff38cb2cfaef97b33:/qwebirc/engines/ajaxengine.py diff --git a/qwebirc/engines/ajaxengine.py b/qwebirc/engines/ajaxengine.py index e885e61..2d3769e 100644 --- a/qwebirc/engines/ajaxengine.py +++ b/qwebirc/engines/ajaxengine.py @@ -13,8 +13,15 @@ import urlparse TRANSPORTS = ["longpoll"] try: - import autobahn.websocket - import autobahn.resource + import autobahn + x = autobahn.version.split(".") + if len(x) != 3: + raise ImportError("Unknown version: %s", autobahn.vesrion) + if (int(x[1]) < 8) or (int(x[1]) == 8 and int(x[2]) < 14): + raise ImportError() + + import autobahn.twisted.websocket + import autobahn.twisted.resource has_websocket = True TRANSPORTS.append("websocket") except ImportError: @@ -65,7 +72,7 @@ class IRCSession: if len(self.subscriptions) >= config.MAXSUBSCRIPTIONS: self.subscriptions.pop(0).close() - if seqNo < self.subSeqNo: + if seqNo is not None and seqNo < self.subSeqNo: if self.old_buffer is None or seqNo != self.old_buffer[0]: channel.write(json.dumps([False, "Unable to reconnect -- sequence number too old."]), seqNo + 1) return @@ -87,7 +94,7 @@ class IRCSession: return self.unsubscribe(channel) - channel.write(EMPTY_JSON_LIST) + channel.write(EMPTY_JSON_LIST, self.subSeqNo) def flush(self, scheduled=False): if scheduled: @@ -355,7 +362,7 @@ if has_websocket: def close(self): self.channel.close() - class WebSocketEngineProtocol(autobahn.websocket.WebSocketServerProtocol): + class WebSocketEngineProtocol(autobahn.twisted.websocket.WebSocketServerProtocol): AWAITING_AUTH, AUTHED = 0, 1 def __init__(self, *args, **kwargs): @@ -380,7 +387,7 @@ if has_websocket: message_type, message = msg[:1], msg[1:] if state == self.AWAITING_AUTH: if message_type == "s": # subscribe - tokens = message.split(",", 2) + tokens = message.split(",", 1) if len(tokens) != 2: self.close("Bad tokens") return @@ -407,7 +414,7 @@ if has_websocket: return elif state == self.AUTHED: if message_type == "p": # push - tokens = message.split(",", 2) + tokens = message.split(",", 1) if len(tokens) != 2: self.close("Bad tokens") return @@ -446,23 +453,14 @@ if has_websocket: def send(self, message_type, message): self.sendMessage(message_type + message) - class WebSocketResource(autobahn.resource.WebSocketResource): + class WebSocketResource(autobahn.twisted.resource.WebSocketResource): def render(self, request): request.channel.setTimeout(None) - return autobahn.resource.WebSocketResource.render(self, request) + return autobahn.twisted.resource.WebSocketResource.render(self, request) def WebSocketEngine(path=None): - parsed = urlparse.urlparse(config.BASE_URL) - port = parsed.port - if port is None: - if parsed.scheme == "http": - port = 80 - elif parsed.scheme == "https": - port = 443 - else: - raise Exception("Unable to determine port from BASE_URL: " + config.BASE_URL) - - factory = autobahn.websocket.WebSocketServerFactory("ws://localhost:%d" % port) + factory = autobahn.twisted.websocket.WebSocketServerFactory("ws://localhost") + factory.externalPort = None factory.protocol = WebSocketEngineProtocol factory.setProtocolOptions(maxMessagePayloadSize=512, maxFramePayloadSize=512, tcpNoDelay=False) resource = WebSocketResource(factory)