return 0
def check_autobahn():
- try:
- import autobahn, autobahn.twisted.websocket
- x = autobahn.version.split(".")
- if len(x) != 3:
- raise ImportError()
- if (int(x[1]) < 8) or (int(x[1]) == 8 and int(x[2]) < 14):
- raise ImportError()
+ import qwebirc.util.autobahn_check as autobahn_check
+ v = autobahn_check.check()
+ if v == True:
return 0
- except ImportError:
- warn("autobahn 0.8.14 (minimum) not installed; websocket support will be disabled.",
+
+ if v == False:
+ warn("autobahn not installed; websocket support will be disabled.",
"consider installing autobahn from:",
"http://autobahn.ws/python/getstarted/")
return 1
+ warn("error loading autobahn: %s; websocket support will be disabled." % v,
+ "consider installing/upgrading autobahn from:",
+ "http://autobahn.ws/python/getstarted/")
+ return 1
+
if __name__ == "__main__":
import dependencies
dependencies.check_dependencies()
import qwebirc.dns as qdns
import qwebirc.util.qjson as json
import urlparse
+import qwebirc.util.autobahn_check as autobahn_check
TRANSPORTS = ["longpoll"]
-try:
+has_websocket = False
+autobahn_status = autobahn_check.check()
+if autobahn_status == True:
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:
- 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
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)
factory.setProtocolOptions(maxMessagePayloadSize=512, maxFramePayloadSize=512, tcpNoDelay=False)
resource = WebSocketResource(factory)
return resource
+
--- /dev/null
+MINIMUM_VERSION = 0, 17, 2
+
+import config
+
+def check():
+ try:
+ import autobahn
+ import autobahn.twisted.websocket
+ import autobahn.twisted.resource
+ except ImportError:
+ return False
+
+ x = autobahn.version.split(".")
+ if len(x) != 3:
+ return "unable to parse autobahn version: %r" % autobahn.version
+
+ major, minor, veryminor = int(x[0]), int(x[1]), int(x[2])
+ if major > MINIMUM_VERSION[0]:
+ pass # ok
+ if minor > MINIMUM_VERSION[1]:
+ pass # ok
+ if veryminor >= MINIMUM_VERSION[2]:
+ pass # ok
+ elif hasattr(config, "FORCE_AUTOBAHN"):
+ pass # ok
+ else:
+ return "your version of autobahn (v%d.%d.%d) is too old, the minimum is v%d.%d.%d" % tuple([major, minor, veryminor] + list(MINIMUM_VERSION))
+
+ return True