]>
Commit | Line | Data |
---|---|---|
507b473a JM |
1 | #!/usr/bin/python |
2 | ||
3 | ''' | |
4 | WebSocket server-side load test program. Sends and receives traffic | |
5 | that has a random payload (length and content) that is checksummed and | |
6 | given a sequence number. Any errors are reported and counted. | |
7 | ''' | |
8 | ||
9 | import sys, os, socket, ssl, time, traceback | |
10 | import random, time | |
11 | from base64 import b64encode, b64decode | |
12 | from codecs import utf_8_encode, utf_8_decode | |
13 | from select import select | |
14 | ||
7210e79e | 15 | sys.path.insert(0,os.path.dirname(__file__) + "/../utils/") |
507b473a JM |
16 | from websocket import * |
17 | ||
18 | buffer_size = 65536 | |
19 | recv_cnt = send_cnt = 0 | |
20 | ||
21 | ||
22 | def check(buf): | |
23 | ||
24 | if buf[0] != '\x00' or buf[-1] != '\xff': | |
25 | raise Exception("Invalid WS packet") | |
26 | ||
27 | for decoded in decode(buf): | |
28 | nums = [ord(c) for c in decoded] | |
29 | print "Received nums: ", nums | |
30 | ||
31 | return | |
32 | ||
33 | ||
34 | def responder(client): | |
35 | cpartial = "" | |
36 | socks = [client] | |
37 | sent = False | |
38 | received = False | |
39 | ||
40 | while True: | |
41 | ins, outs, excepts = select(socks, socks, socks, 1) | |
42 | if excepts: raise Exception("Socket exception") | |
43 | ||
44 | if client in ins: | |
45 | buf = client.recv(buffer_size) | |
46 | if len(buf) == 0: raise Exception("Client closed") | |
47 | received = True | |
48 | #print "Client recv: %s (%d)" % (repr(buf[1:-1]), len(buf)) | |
49 | if buf[-1] == '\xff': | |
50 | if cpartial: | |
51 | err = check(cpartial + buf) | |
52 | cpartial = "" | |
53 | else: | |
54 | err = check(buf) | |
55 | if err: | |
56 | print err | |
57 | else: | |
58 | print "received partitial" | |
59 | cpartial = cpartial + buf | |
60 | ||
61 | if received and not sent and client in outs: | |
62 | sent = True | |
63 | #nums = "".join([unichr(c) for c in range(0,256)]) | |
64 | #nums = "".join([chr(c) for c in range(1,128)]) | |
65 | #nums = nums + chr(194) + chr(128) + chr(194) + chr(129) | |
66 | #nums = "".join([chr(c) for c in range(0,256)]) | |
67 | nums = "\x81\xff" | |
68 | nums = nums + "".join([chr(c) for c in range(0,256,4)]) | |
69 | nums = nums + "\x00\x40\x41\xff\x81" | |
70 | # print nums | |
71 | client.send(encode(nums)) | |
72 | # client.send("\x00" + nums + "\xff") | |
73 | # print "Sent characters 0-255" | |
74 | # #print "Client send: %s (%d)" % (repr(nums), len(nums)) | |
75 | ||
76 | if __name__ == '__main__': | |
77 | try: | |
78 | if len(sys.argv) < 2: raise | |
79 | listen_port = int(sys.argv[1]) | |
80 | except: | |
81 | print "Usage: <listen_port>" | |
82 | sys.exit(1) | |
83 | ||
6ee61a4c JM |
84 | settings['listen_port'] = listen_port |
85 | settings['daemon'] = False | |
86 | settings['handler'] = responder | |
87 | start_server() |