Skip to content

Commit 12da966

Browse files
committed
Full Python 2+3 support
1 parent 668d11e commit 12da966

File tree

8 files changed

+38
-30
lines changed

8 files changed

+38
-30
lines changed

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def run_tests(self):
2727
license="BSD",
2828
url="https://github.com/abourget/gevent-socketio",
2929
download_url="https://github.com/abourget/gevent-socketio",
30-
install_requires=("gevent", "gevent-websocket",),
30+
install_requires=("gevent", "gevent-websocket","six"),
3131
setup_requires=('versiontools >= 1.7'),
3232
cmdclass = {'test': PyTest},
3333
tests_require=['pytest', 'mock'],

socketio/handler.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import sys
22
import re
33
import gevent
4-
import urlparse
4+
from six.moves.urllib.parse import parse_qs
55

66
from gevent.pywsgi import WSGIHandler
77
from socketio import transports
88

9+
910
class SocketIOHandler(WSGIHandler):
1011
RE_REQUEST_URL = re.compile(r"""
1112
^/(?P<resource>.+?)
@@ -45,23 +46,23 @@ def __init__(self, config, *args, **kwargs):
4546

4647
super(SocketIOHandler, self).__init__(*args, **kwargs)
4748

48-
self.transports = self.handler_types.keys()
49+
self.transports = list(self.handler_types.keys())
4950
if self.server.transports:
5051
self.transports = self.server.transports
5152
if not set(self.transports).issubset(set(self.handler_types)):
5253
raise ValueError("transports should be elements of: %s" %
53-
(self.handler_types.keys()))
54+
list(self.handler_types.keys()))
5455

5556
def _do_handshake(self, tokens):
5657
if tokens["resource"] != self.server.resource:
5758
self.log_error("socket.io URL mismatch")
5859
else:
5960
socket = self.server.get_socket()
6061
data = "%s:%s:%s:%s" % (socket.sessid,
61-
self.config['heartbeat_timeout'] or '',
62-
self.config['close_timeout'] or '',
63-
",".join(self.transports))
64-
self.write_smart(data)
62+
self.config['heartbeat_timeout'] or '',
63+
self.config['close_timeout'] or '',
64+
",".join(self.transports))
65+
self.write_smart(data.encode('latin-1'))
6566

6667
def write_jsonp_result(self, data, wrapper="0"):
6768
self.start_response("200 OK", [
@@ -74,13 +75,13 @@ def write_plain_result(self, data):
7475
("Access-Control-Allow-Origin", self.environ.get('HTTP_ORIGIN', '*')),
7576
("Access-Control-Allow-Credentials", "true"),
7677
("Access-Control-Allow-Methods", "POST, GET, OPTIONS"),
77-
("Access-Control-Max-Age", 3600),
78+
("Access-Control-Max-Age", "3600"),
7879
("Content-Type", "text/plain"),
7980
])
8081
self.result = [data]
8182

8283
def write_smart(self, data):
83-
args = urlparse.parse_qs(self.environ.get("QUERY_STRING"))
84+
args = parse_qs(self.environ.get("QUERY_STRING"))
8485

8586
if "jsonp" in args:
8687
self.write_jsonp_result(data, args["jsonp"][0])

socketio/mixins.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
You'll likely want to create your own Mixins.
66
"""
77

8+
import six
9+
810

911
class RoomsMixin(object):
1012
def __init__(self, *args, **kwargs):
@@ -30,7 +32,7 @@ def emit_to_room(self, room, event, *args):
3032
args=args,
3133
endpoint=self.ns_name)
3234
room_name = self._get_room_name(room)
33-
for sessid, socket in self.socket.server.sockets.iteritems():
35+
for sessid, socket in six.iteritems(self.socket.server.sockets):
3436
if 'rooms' not in socket.session:
3537
continue
3638
if room_name in socket.session['rooms'] and self.socket != socket:
@@ -55,7 +57,7 @@ def broadcast_event(self, event, *args):
5557
args=args,
5658
endpoint=self.ns_name)
5759

58-
for sessid, socket in self.socket.server.sockets.iteritems():
60+
for sessid, socket in six.iteritems(self.socket.server.sockets):
5961
socket.send_packet(pkt)
6062

6163
def broadcast_event_not_me(self, event, *args):
@@ -68,6 +70,6 @@ def broadcast_event_not_me(self, event, *args):
6870
args=args,
6971
endpoint=self.ns_name)
7072

71-
for sessid, socket in self.socket.server.sockets.iteritems():
73+
for sessid, socket in six.iteritems(self.socket.server.sockets):
7274
if socket is not self.socket:
7375
socket.send_packet(pkt)

socketio/namespace.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,14 +167,14 @@ def process_packet(self, packet):
167167
elif packet_type == 'ack':
168168
callback = self.socket._pop_ack_callback(packet['ackId'])
169169
if not callback:
170-
print "ERROR: No such callback for ackId %s" % packet['ackId']
170+
print("ERROR: No such callback for ackId %s" % packet['ackId'])
171171
return
172172
return callback(*(packet['args']))
173173
elif packet_type == 'disconnect':
174174
# Force a disconnect on the namespace.
175175
return self.call_method_with_acl('recv_disconnect', packet)
176176
else:
177-
print "Unprocessed packet", packet
177+
print("Unprocessed packet", packet)
178178
# TODO: manage the other packet types: disconnect
179179

180180
def process_event(self, packet):

socketio/packet.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import six
12
from socketio.defaultjson import default_json_dumps, default_json_loads
23

34
MSG_TYPES = {
@@ -12,21 +13,21 @@
1213
'noop': 8,
1314
}
1415

15-
MSG_VALUES = dict((v, k) for k, v in MSG_TYPES.iteritems())
16+
MSG_VALUES = dict((v, k) for k, v in six.iteritems(MSG_TYPES))
1617

1718
ERROR_REASONS = {
1819
'transport not supported': 0,
1920
'client not handshaken': 1,
2021
'unauthorized': 2
2122
}
2223

23-
REASONS_VALUES = dict((v, k) for k, v in ERROR_REASONS.iteritems())
24+
REASONS_VALUES = dict((v, k) for k, v in six.iteritems(ERROR_REASONS))
2425

2526
ERROR_ADVICES = {
2627
'reconnect': 0,
2728
}
2829

29-
ADVICES_VALUES = dict((v, k) for k, v in ERROR_ADVICES.iteritems())
30+
ADVICES_VALUES = dict((v, k) for k, v in six.iteritems(ERROR_ADVICES))
3031

3132
socketio_packet_attributes = ['type', 'name', 'data', 'endpoint', 'args',
3233
'ackId', 'reason', 'advice', 'qs', 'id']
@@ -107,7 +108,7 @@ def decode(rawstr, json_loads=default_json_loads):
107108
Decode a rawstr packet arriving from the socket into a dict.
108109
"""
109110
decoded_msg = {}
110-
split_data = rawstr.split(":", 3)
111+
split_data = rawstr.decode('utf-8').split(":", 3)
111112
msg_type = split_data[0]
112113
msg_id = split_data[1]
113114
endpoint = split_data[2]
@@ -153,7 +154,7 @@ def decode(rawstr, json_loads=default_json_loads):
153154
elif msg_type == "5": # event
154155
try:
155156
data = json_loads(data)
156-
except ValueError, e:
157+
except ValueError:
157158
print("Invalid JSON event message", data)
158159
decoded_msg['args'] = []
159160
else:
@@ -183,6 +184,7 @@ def decode(rawstr, json_loads=default_json_loads):
183184
decoded_msg['reason'] = REASONS_VALUES[int(data)]
184185
else:
185186
decoded_msg['reason'] = ''
187+
186188
elif msg_type == "8": # noop
187189
pass
188190

socketio/server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def start_accepting(self):
105105
try:
106106
if not self.policy_server.started:
107107
self.policy_server.start()
108-
except error, ex:
108+
except error as ex:
109109
sys.stderr.write(
110110
'FAILED to start flash policy server: %s\n' % (ex, ))
111111
except Exception:

socketio/transports.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import gevent
2-
import urllib
3-
import urlparse
2+
import six
3+
from six.moves.urllib.parse import parse_qs, unquote_plus
44
from geventwebsocket import WebSocketError
55
from gevent.queue import Empty
66

@@ -21,7 +21,7 @@ def __init__(self, handler, config, **kwargs):
2121
("Access-Control-Allow-Origin", "*"),
2222
("Access-Control-Allow-Credentials", "true"),
2323
("Access-Control-Allow-Methods", "POST, GET, OPTIONS"),
24-
("Access-Control-Max-Age", 3600),
24+
("Access-Control-Max-Age", "3600"),
2525
]
2626
self.handler = handler
2727
self.config = config
@@ -162,7 +162,7 @@ def __init__(self, handler, config):
162162
def _request_body(self):
163163
data = super(JSONPolling, self)._request_body()
164164
# resolve %20%3F's, take out wrapping d="...", etc..
165-
data = urllib.unquote_plus(data)[3:-1] \
165+
data = unquote_plus(data)[3:-1] \
166166
.replace(r'\"', '"') \
167167
.replace(r"\\", "\\")
168168

@@ -175,7 +175,7 @@ def _request_body(self):
175175

176176
def write(self, data):
177177
"""Just quote out stuff before sending it out"""
178-
args = urlparse.parse_qs(self.handler.environ.get("QUERY_STRING"))
178+
args = parse_qs(self.handler.environ.get("QUERY_STRING"))
179179
if "i" in args:
180180
i = args["i"]
181181
else:
@@ -249,7 +249,9 @@ def send_into_ws():
249249
break
250250
try:
251251
websocket.send(message)
252-
except (WebSocketError, TypeError):
252+
except (WebSocketError, TypeError) as e:
253+
print(e)
254+
raise
253255
# We can't send a message on the socket
254256
# it is dead, let the other sockets know
255257
socket.disconnect()

socketio/virtsocket.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
1111
"""
1212
import random
13+
import six
1314
import weakref
1415
import logging
1516

@@ -311,7 +312,7 @@ def disconnect(self, silent=False):
311312
:meth:`~socketio.namespace.BaseNamespace.disconnect`
312313
calls.
313314
"""
314-
for ns_name, ns in list(self.active_ns.iteritems()):
315+
for ns_name, ns in list(six.iteritems(self.active_ns)):
315316
ns.recv_disconnect()
316317

317318
def remove_namespace(self, namespace):
@@ -362,7 +363,7 @@ def _receiver_loop(self):
362363
continue # or close the connection ?
363364
try:
364365
pkt = packet.decode(rawdata, self.json_loads)
365-
except (ValueError, KeyError, Exception), e:
366+
except (ValueError, KeyError, Exception) as e:
366367
self.error('invalid_packet',
367368
"There was a decoding error when dealing with packet "
368369
"with event: %s... (%s)" % (rawdata[:20], e))
@@ -436,7 +437,7 @@ def _watcher(self):
436437
while True:
437438
gevent.sleep(1.0)
438439
if not self.connected:
439-
for ns_name, ns in list(self.active_ns.iteritems()):
440+
for ns_name, ns in list(six.iteritems(self.active_ns)):
440441
ns.recv_disconnect()
441442
# Killing Socket-level jobs
442443
gevent.killall(self.jobs)

0 commit comments

Comments
 (0)