1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import socket
from simplejson.encoder import JSONEncoder
encode = JSONEncoder().encode
END = '\r\n'

LQUEUE_SIZE = 500
BUFFER_SIZE = 4096

def client_socket(addr, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setblocking(0)
    sock.connect_ex((addr, port))
    return sock    


def debug(data):
    pass

class Client(object):
    version = 'Orbit 1.0'
    def __init__(self, addr="localhost", port=9000):
        self.addr = addr
        self.port = port
        self.socket = None
        self.id = 0
        self.connected = False
    
    def connect(self):
        self.connected = True
        if self.socket:
            debug("Already Connected")
            return
        self.socket = client_socket(self.addr, self.port)
        self.socket.setblocking(1)
    
    def disconnect(self):
        self.connected = False
        self.socket.close()
        self.socket = None
    
    def reconnect(self):
        self.disconnect()
        self.connect()
    
    def sendline(self, line=""):
        self.socket.send('%s%s' % (line, END))
    
    def event(self, recipients, body, json=True, retry=True):
        if not self.connected:
            self.connect()
        try:
            if json:
                body = encode(body)
            if not self.socket:
                raise "ConnectionLost"
            try:
                self.id += 1
                self.sendline(self.version)
                self.sendline('Event')
                self.sendline('id: %s' % self.id)
                for recipient in recipients:
                    self.sendline('recipient: %s' % (str(recipient)))
                self.sendline('length: %s' % len(body))
                self.sendline()
                self.socket.send(body)
                return self.read_response()
            except socket.error:
                self.disconnect()
                raise "ConnectionLost"
        except "ConnectionLost":
            if retry:
                self.reconnect()
                self.event(recipients, body, json, False)
            else:
                raise
    
    def read_response(self):
        return self.socket.recv(BUFFER_SIZE)
    

client = Client()
user_key = "user, 0, /demo"
headers = "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n"
client.event([user_key], headers, False)
client.event([user_key], "Hello from python!<br>", False)
client.event([user_key], "Hello <b>again</b><br>", False)