Implemented ack callbacks

This commit is contained in:
Sean Arietta 2014-12-22 18:39:58 -08:00
commit 5c1d38ac86
3 changed files with 66 additions and 25 deletions

View file

@ -444,7 +444,7 @@ class SocketIO(object):
_log.debug("[event] %s (%s)" % (repr(event), repr(args))); _log.debug("[event] %s (%s)" % (repr(event), repr(args)));
if packet.payload.id is not None: if packet.payload.id is not None:
args.append(self._prepare_to_send_ack(path, packet_id)) args.append(self._prepare_to_send_ack(packet.payload.path, packet.payload.id))
find_event_callback(event)(*args); find_event_callback(event)(*args);
def _on_ack(self, packet, find_event_callback): def _on_ack(self, packet, find_event_callback):

View file

@ -32,6 +32,27 @@ class Packet():
def __str__(self): def __str__(self):
return "PACKET{type: " + str(self.type) + ", payload: " + str(self.payload) + "}"; return "PACKET{type: " + str(self.type) + ", payload: " + str(self.payload) + "}";
def encode_as_string(self, for_websocket = False):
data = "";
path = "";
if self.type == PacketType.MESSAGE:
data = self.payload.encode_as_string();
path = self.payload.path;
else:
data = self.payload;
code_length = len(str(self.type));
data_length = len(data);
length = code_length + data_length;
encoded = "";
if for_websocket:
encoded = str(self.type) + str(data);
else:
encoded = str(length) + ":" + str(self.type) + str(data);
return encoded;
class Message(): class Message():
def __init__(self, message_type, message, path = "", attachments = "", message_id = None): def __init__(self, message_type, message, path = "", attachments = "", message_id = None):
self.type = message_type; self.type = message_type;
@ -67,15 +88,30 @@ class Message():
Assumes the message payload will be dumped as a json string. Assumes the message payload will be dumped as a json string.
""" """
data = json.dumps(self.message);
if self.id is not None:
data = str(self.id) + json.dumps(self.message);
if self.path == "": if self.path == "":
return str(self.type) + json.dumps(self.message); return str(self.type) + data;
return str(self.type) + self.path + "," + json.dumps(self.message); return str(self.type) + self.path + "," + data;
def encode_as_string(self): def encode_as_string(self):
"""Same as the encode_as_string method except it doesn't encode things as a JSON string""" """Same as the encode_as_string method except it doesn't encode things as a JSON string"""
data = self.message;
if self.id is not None:
data = str(self.id) + self.message;
if self.path == "": if self.path == "":
return str(self.type) + self.message; return str(self.type) + data;
return str(self.type) + self.path + "," + self.message; return str(self.type) + self.path + "," + data;
def _is_integer(s):
try:
int(s);
except ValueError:
return False;
return True;
def decode_message(payload): def decode_message(payload):
""" Decodes a message encoded via socket.io """ Decodes a message encoded via socket.io
@ -112,11 +148,15 @@ def decode_message(payload):
i += len(path); i += len(path);
if len(payload) > i: if len(payload) > i:
# This is the same pecularity as above. # This is another oddity. According to the socket.io-parser we
if "," in payload[i:]: # need to loop over the next chars until we stop finding ints
split_point = payload.index(","); # to determine if there is a message id.
message_id = int(payload[i:split_point]); message_id_str = "";
i += split_point; while _is_integer(payload[i]):
message_id_str += payload[i];
i += 1;
if message_id_str != "":
message_id = int(message_id_str);
if len(payload) > i: if len(payload) > i:
message = payload[i:]; message = payload[i:];
@ -198,8 +238,3 @@ def encode_packet_string(code, path, data):
"""Encodes packet to be sent to socket.io server. """Encodes packet to be sent to socket.io server.
""" """
code_length = len(str(code));
data_length = len(data);
length = code_length + data_length;
return str(length) + ":" + str(code) + str(data);

View file

@ -1,7 +1,7 @@
import json import json
import logging import logging
import parser import parser
from parser import Message, MessageType, PacketType from parser import Message, Packet, MessageType, PacketType
import re import re
import requests import requests
import six import six
@ -75,18 +75,16 @@ class _AbstractTransport(object):
self.send_packet(PacketType.MESSAGE, path, message.encode_as_json(), callback) self.send_packet(PacketType.MESSAGE, path, message.encode_as_json(), callback)
def ack(self, path, packet_id, *args): def ack(self, path, packet_id, *args):
packet_id = packet_id.rstrip('+') _log.debug("[ack] Sending ACK for packet: %d" % packet_id);
data = '%s+%s' % ( message = Message(MessageType.ACK, "", path, "", packet_id);
packet_id, packet = Packet(PacketType.MESSAGE, message);
json.dumps(args, ensure_ascii=False), self.send_engineio_packet(packet)
) if args else packet_id
#self.send_packet(6, path, data)
def noop(self, path=''): def noop(self, path=''):
self.send_packet(PacketType.NOOP, path) self.send_packet(PacketType.NOOP, path)
def send_packet(self, code, path='', data='', callback=None): def send_packet(self, code, path='', data='', callback=None):
packet_text = parser.encode_packet_string(code, path, data); packet_text = Packet(code, data).encode_as_string();
self.send(packet_text) self.send(packet_text)
_log.debug('[packet sent] %s', packet_text) _log.debug('[packet sent] %s', packet_text)
@ -140,11 +138,19 @@ class WebsocketTransport(_AbstractTransport):
def connected(self): def connected(self):
return self._connection.connected return self._connection.connected
def send_packet(self, code, path="", data='', callback=None): def send_message(self, message, callback = None):
packet_text = Message(code, data).encode_as_string(); packet_text = message.encode_as_string();
self.send(packet_text) self.send(packet_text)
_log.debug('[packet sent] %s', packet_text) _log.debug('[packet sent] %s', packet_text)
def send_engineio_packet(self, packet, callback=None):
packet_text = packet.encode_as_string(for_websocket = True);
self.send(packet_text)
_log.debug('[packet sent] %s', packet_text)
def send_packet(self, code, path="", data='', callback=None):
self.send_message(Message(code, data), callback);
def send(self, packet_text): def send(self, packet_text):
try: try:
self._connection.send(packet_text) self._connection.send(packet_text)