import qwebirc.dns as qdns
import qwebirc.util.qjson as json
import urlparse
+import qwebirc.util.autobahn_check as autobahn_check
TRANSPORTS = ["longpoll"]
-try:
- import autobahn.websocket
- import autobahn.resource
+has_websocket = False
+autobahn_status = autobahn_check.check()
+if autobahn_status == True:
+ import autobahn
+ import autobahn.twisted.websocket
+ import autobahn.twisted.resource
has_websocket = True
TRANSPORTS.append("websocket")
-except ImportError:
- has_websocket = False
+elif autobahn_status == False:
+ # they've been warned already
+ pass
+else:
+ print >>sys.stderr, "WARNING:"
+ print >>sys.stderr, " %s" % autobahn_status
+ print >>sys.stderr, " as a result websocket support is disabled."
+ print >>sys.stderr, " upgrade your version of autobahn from http://autobahn.ws/python/getstarted/"
BAD_SESSION_MESSAGE = "Invalid session, this most likely means the server has restarted; close this dialog and then try refreshing the page."
MAX_SEQNO = 9223372036854775807 # 2**63 - 1... yeah it doesn't wrap
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):
+ super(WebSocketEngineProtocol, self).__init__(*args, **kwargs)
self.__state = self.AWAITING_AUTH
self.__session = None
self.__channel = None
self.__session.unsubscribe(self.__channel)
self.__session = None
- def onMessage(self, msg, binary):
+ def onMessage(self, msg, isBinary):
# we don't bother checking the Origin header, as if you can auth then you've been able to pass the browser's
# normal origin handling (POSTed the new connection request and managed to get the session id)
state = self.__state
def close(self, reason=None):
self.__cancelTimeout()
if reason:
- self.sendClose(4999, reason)
+ self.sendClose(4999, unicode(reason))
else:
self.sendClose(4998)
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)
return resource
+