From 72541725451a4153090cf55f98f2bd1e7f298a9a Mon Sep 17 00:00:00 2001 From: Roy Hyunjin Han Date: Mon, 17 Nov 2014 18:43:25 -0500 Subject: [PATCH 1/8] Save experiments --- experiments/app.js | 16 ++++++++++ experiments/client0.py | 16 ++++++++++ experiments/client1.py | 52 +++++++++++++++++++++++++++++++++ experiments/index.html | 8 +++++ experiments/interpretation.log | Bin 0 -> 3414 bytes experiments/proxy.js | 29 ++++++++++++++++++ experiments/proxy.log | Bin 0 -> 4311 bytes 7 files changed, 121 insertions(+) create mode 100644 experiments/app.js create mode 100644 experiments/client0.py create mode 100644 experiments/client1.py create mode 100644 experiments/index.html create mode 100644 experiments/interpretation.log create mode 100644 experiments/proxy.js create mode 100644 experiments/proxy.log diff --git a/experiments/app.js b/experiments/app.js new file mode 100644 index 0000000..8beb129 --- /dev/null +++ b/experiments/app.js @@ -0,0 +1,16 @@ +var app = require('express')(); +var server = require('http').Server(app); +var io = require('socket.io')(server); + +server.listen(9000); + +app.get('/', function (req, res) { + res.sendFile(__dirname + '/index.html'); +}); + +io.on('connection', function (socket) { + socket.emit('news', { hello: 'world' }); + socket.on('my other event', function (data) { + console.log(data); + }); +}); diff --git a/experiments/client0.py b/experiments/client0.py new file mode 100644 index 0000000..fe849a5 --- /dev/null +++ b/experiments/client0.py @@ -0,0 +1,16 @@ +class SocketIO(object): + + def __init__(self, host, port): + pass + + def on(self, event, callback): + pass + + +def on_news(self, data): + print(data) + self.emit('my other event', {'my': 'data'}) + + +s = SocketIO('localhost', 9000) +s.on('news', on_news) diff --git a/experiments/client1.py b/experiments/client1.py new file mode 100644 index 0000000..c2c6290 --- /dev/null +++ b/experiments/client1.py @@ -0,0 +1,52 @@ +import requests + + +def get_packets(content): + packets = [] + index = 0 + content_length = len(content) + while index < content_length: + index, packet_length = read_packet_length(content, index) + index, packet = read_packet(content, index, packet_length) + packets.append((packet[0], packet[1:])) + return packets + + +def read_packet_length(content, index): + while ord(content[index]) != 0: + index += 1 + index += 1 + packet_length_string = '' + while ord(content[index]) != 255: + packet_length_string += str(ord(content[index])) + index += 1 + return index, int(packet_length_string) + + +def read_packet(content, index, packet_length): + while ord(content[index]) == 255: + index += 1 + packet = content[index:index + packet_length] + return index + packet_length, packet + + +base_url = 'http://localhost:9000' +session = requests.Session() +# Establish engine.io connection +response = session.get( + base_url + '/socket.io/?EIO=3&transport=polling&t=1416156610842-0') +packets = get_packets(response.content) +for packet_type, packet in packets: + print packet_type, packet +packet_type, packet = packets[0] +import json +packet_json = json.loads(packet) +print packet_json +print packet_json['pingInterval'] +print packet_json['pingTimeout'] +print packet_json['sid'] +# Establish socket.io connection +# Receive socket.io event +# Send socket.io event +# Send socket.io ping +# Receive socket.io pong diff --git a/experiments/index.html b/experiments/index.html new file mode 100644 index 0000000..90f066c --- /dev/null +++ b/experiments/index.html @@ -0,0 +1,8 @@ + + diff --git a/experiments/interpretation.log b/experiments/interpretation.log new file mode 100644 index 0000000000000000000000000000000000000000..2afb8e24769945acbdaacf98e77d1814320474d3 GIT binary patch literal 3414 zcmd5;+fExX5alKT`3lPq2qXgb-m-}lRa8wSUYeFmFN*T8>{`i+&3f52K@sB9s(w;` zp=0j`Ok<@=Qc543XvW_0`1qU|_s%+>E<5KJeRN##@S2IEm><9CoOavxp2&l=$apT= z8BdZp9qfrVb*M*O&!fb5tU9T&bP%TuK0;Z}1rK?G#w;&lo}xCgwdu!T;IG2zv+;-( zA{b>b`)mv2nvmb7g5|K5)Ou%~^N-yR=bfXs-FM&mXl-}<=a28?9v5+hTe$l*Ity-S zc=@Gp$M(hNlarJ8_z>S_gFJ{>fm=O%$F9nwIzKrqbSp(JbdJX>Y@5l(sExNDqEJ*R}1^>qsww;rOM)m5zHD z)Y2gwGDtZ`fKx6|I1KV2oT8vzLm+PvCEyW52+?e45LOXb8a?~I%;oX^QC7wflZ-(G zg7!n6rYsZ(wV5@L=Sw3kuXtIGdTyQW0TbFL9%#V41bIDI+dw=L{E56&gR@|T5=|Td z;>KiWh`s?ta>&}oj{LWJIAwPQKD@_6mLwdgf5-DA!VmqDQ%0(8z-CrCuc$ghO+{D- zR=L$OGgmbUc#^wX+=jGwU{u`pr9HDxQ+oA%sLIy@uS?1VsS;NYJWZ+ryOb!b*#Kru z%;>7pgoE~>U=_iD88l(g%~PD^^7a2k!WP;-~5p8Z&!W>Ny7elDr3SBAD(FF7v1tOR)&rKkE)gzQVx1>l)HO%QGx{OpO(N(16 z`FBKQJO2SG|A6i9MU!7^)sO?6l+voa$O?2VJw&HP$VVfP1o+|8m5A=w?N=kZUOr4j zw-+M%(lFSr@A-A-RbWtiYlJny;4B2g^jR|1`#Q+I>XOE0yDrI9l5I}2t;D)w!!UHn v#Tp#+0{Ij^kazw3eJzh!6{Qu9X#*IpA$aD-^!~aeO%o literal 0 HcmV?d00001 diff --git a/experiments/proxy.js b/experiments/proxy.js new file mode 100644 index 0000000..4dec919 --- /dev/null +++ b/experiments/proxy.js @@ -0,0 +1,29 @@ +var proxy = require('http-proxy').createProxyServer({ + target: {host: 'localhost', port: 9000} +}); +var server = require('http').createServer(function(req, res) { + console.log('[REQUEST] ' + req.url); + if (req.method == 'POST') { + var body = ''; + req.on('data', function (data) { + body += data; + }); + req.on('end', function () { + print_body('[REQUEST.BODY] ', body); + }); + } + var _write = res.write; + res.write = function(data) { + print_body('[RESPONSE.BODY] ', data); + _write.call(res, data); + } + proxy.web(req, res); +}); +function print_body(header, body) { + var text = String(body); + console.log(header + text); + for (var i = 0; i < text.length; i++) { + console.log('body[%s] = %s = %s', i, text[i], text.charCodeAt(i)); + } +} +server.listen(8000); diff --git a/experiments/proxy.log b/experiments/proxy.log new file mode 100644 index 0000000000000000000000000000000000000000..45d08726609b2eb8b35e47b7493851c07f711015 GIT binary patch literal 4311 zcmcJS-EP}B5QWpUK!2XX&_%A|M3h8|GGHvSXbR+Jy_=u53&R&qEF|7ImTM~sf*_B! z=p*$NmOL|RIhE5E2=+p4G#HT|59e^`;o<&YC;Laoqt5P|;kUn6)!AiP?@X)RuYc|Q zvs$0=+y23zpKjI5@qD$YmUVwo&1Td2`BvRmnKDWnqhgyS-PnJB^ylD@qy3%V2XFr# zbv9nV{POwV_&!=qCs8jNe4HGPKdG~m4=a6>9>3q)+j|#nN7sw<<#%1#IO)S)(GT&-`ai1k@)kVtK6zs6Y4!51oKoNR$9uyClt%CBVLM5v6z~ z39wV2qzF3!_OTzE)lY!^-bW1QfO^kG3=^fG77}>|{5<{^{SzGT6=pkqZ z^swAApby4;O3zE;i2qT=?4nd=3CE9|Ll+#RlXDE-PmO z1915rz{Oe&$i<3HyIOLv3j^hV4+|&<`^FOYx$mcmZ_d73b5S0C}ig(NerH!1jQmt$CnoIFABv=n(4X;c@y{KNmGi4PBUB zfms~73fSU2rIsH0hFW^)E$ZmvK9c}E{47BcU-Wn6gzn5=2HpxdooSOh0^9;iVYNdO0E$HsDjN!g+6K< zQ4C}oF(JT3Ws_}0BPHL6Eb@)8E*VFV(q%Z*g?tm5l58VQ3Bko@P+YVmx(o|JAM;J< zEwW8GHn~Rn0j>#e4rCg!I5Le$YH^ciq>Ui?Hyeo`jn!pv{L4DTe+IoEN~uWfbDyixcU&03Sf1MJDxPj5duTmA{7^G~nu QNB^Jq$Vq8cS3fT0f8?ro>i_@% literal 0 HcmV?d00001 From 895d2447fdf9a6bb081f7ea153be64176af44ea7 Mon Sep 17 00:00:00 2001 From: Roy Hyunjin Han Date: Tue, 18 Nov 2014 10:45:22 -0500 Subject: [PATCH 2/8] Experiment with socket.io 1.2.0 --- experiments/client1.py | 41 +++++++++++++++++++++++++++++---- experiments/interpretation.log | Bin 3414 -> 3436 bytes 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/experiments/client1.py b/experiments/client1.py index c2c6290..e88abf8 100644 --- a/experiments/client1.py +++ b/experiments/client1.py @@ -1,4 +1,6 @@ +import json import requests +import time def get_packets(content): @@ -8,7 +10,9 @@ def get_packets(content): while index < content_length: index, packet_length = read_packet_length(content, index) index, packet = read_packet(content, index, packet_length) - packets.append((packet[0], packet[1:])) + packet_type = int(packet[0]) + packet_payload = packet[1:] + packets.append((packet_type, packet_payload)) return packets @@ -30,23 +34,52 @@ def read_packet(content, index, packet_length): return index + packet_length, packet +request_counter = 0 + + +def get_timestamp(): + global request_counter + timestamp = '%s-%s' % (int(time.time() * 1000), request_counter) + request_counter += 1 + return timestamp + + base_url = 'http://localhost:9000' session = requests.Session() # Establish engine.io connection -response = session.get( - base_url + '/socket.io/?EIO=3&transport=polling&t=1416156610842-0') +url = base_url + '/socket.io/' +response = session.get(url, params={ + 'EIO': 3, + 'transport': 'polling', + 't': get_timestamp(), +}) +print response.url + + packets = get_packets(response.content) for packet_type, packet in packets: print packet_type, packet packet_type, packet = packets[0] -import json packet_json = json.loads(packet) print packet_json print packet_json['pingInterval'] print packet_json['pingTimeout'] print packet_json['sid'] +assert packet_type == 0 + + # Establish socket.io connection +session.get + + +# [REQUEST] /socket.io/?EIO=3&transport=polling&t=1416156610865-1&sid=OXdRaq1cUWs5v3TVAAAF # Receive socket.io event + + # Send socket.io event +# [REQUEST] /socket.io/?EIO=3&transport=polling&t=1416156610887-2&sid=OXdRaq1cUWs5v3TVAAAF + + # Send socket.io ping +# [REQUEST] /socket.io/?EIO=3&transport=polling&t=1416156635868-4&sid=OXdRaq1cUWs5v3TVAAAF # Receive socket.io pong diff --git a/experiments/interpretation.log b/experiments/interpretation.log index 2afb8e24769945acbdaacf98e77d1814320474d3..ea51ac8d4150cd24d3bb94a58513ace66b5687e6 100644 GIT binary patch delta 67 zcmca6^+t+2I>p~`GD0}mLraWe5y#W8s-fXX7qNbCxI4^?* It+}L`0ma%A>Hq)$ delta 50 zcmaDObxn#bI>5~j()Tn3w;FcmU`8C`5U!6K8(Ij?UH=8|Lv0K2{r A-T(jq From c3428e0b68128b54444c6cf99a3ac24895fba15e Mon Sep 17 00:00:00 2001 From: Roy Hyunjin Han Date: Tue, 25 Nov 2014 06:01:46 -0500 Subject: [PATCH 3/8] Working through parse error on send --- experiments/client1.py | 145 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 133 insertions(+), 12 deletions(-) diff --git a/experiments/client1.py b/experiments/client1.py index e88abf8..55fd870 100644 --- a/experiments/client1.py +++ b/experiments/client1.py @@ -3,6 +3,8 @@ import requests import time +# def unwrap_payload +# def decode_payload(payload) def get_packets(content): packets = [] index = 0 @@ -44,9 +46,10 @@ def get_timestamp(): return timestamp +print '*** Connect' base_url = 'http://localhost:9000' session = requests.Session() -# Establish engine.io connection +print session.cookies.items() url = base_url + '/socket.io/' response = session.get(url, params={ 'EIO': 3, @@ -54,8 +57,7 @@ response = session.get(url, params={ 't': get_timestamp(), }) print response.url - - +print session.cookies.items() packets = get_packets(response.content) for packet_type, packet in packets: print packet_type, packet @@ -68,18 +70,137 @@ print packet_json['sid'] assert packet_type == 0 -# Establish socket.io connection -session.get +"" +base_url = 'http://localhost:9000' +url = base_url + '/socket.io/' +response = session.get(url, params={ + 'EIO': 3, + 'transport': 'polling', + 't': get_timestamp(), + 'sid': packet_json['sid'], +}) +print response.url +print session.cookies.items() +packets = get_packets(response.content) +for packet_type, packet in packets: + print 'engineIO_packet_type = %s' % packet_type + print 'socketIO_packet_type = %s' % packet[0] + print 'packet = %s' % packet[1:] +# from IPython import embed; embed() -# [REQUEST] /socket.io/?EIO=3&transport=polling&t=1416156610865-1&sid=OXdRaq1cUWs5v3TVAAAF -# Receive socket.io event +# def wrap_payload +def encode_payload(packs): + parts = [] + for packet_type, packet in packs: + content = str(packet_type) + str(packet) + parts.append(make_header(content) + content) + return ''.join(parts) -# Send socket.io event -# [REQUEST] /socket.io/?EIO=3&transport=polling&t=1416156610887-2&sid=OXdRaq1cUWs5v3TVAAAF +def make_header(content): + length_string = str(len(content)) + print length_string + header_digits = [0] + for index in xrange(len(length_string)): + header_digits.append(ord(length_string[index]) - 48) + header_digits.append(255) + return ''.join(chr(x) for x in header_digits) -# Send socket.io ping -# [REQUEST] /socket.io/?EIO=3&transport=polling&t=1416156635868-4&sid=OXdRaq1cUWs5v3TVAAAF -# Receive socket.io pong +# print '***' +# base_url = 'http://localhost:9000' +# url = base_url + '/socket.io/' +# response = session.get(url, params={ + # 'EIO': 3, + # 'transport': 'polling', + # 't': get_timestamp(), + # 'sid': packet_json['sid'], +# }) +# print response.url +# print response.content +# packets = get_packets(response.content) +# for packet_type, packet in packets: + # print packet_type, packet + + +print '*** Send event' +packets = [ + (4, '2["my other event",{"my":"data"}]'), +] +payload = encode_payload(packets) +print payload +base_url = 'http://localhost:9000' +url = base_url + '/socket.io/' +print session.cookies.items() +response = session.post(url, params={ + 'EIO': 3, + 'transport': 'polling', + 't': get_timestamp(), + 'sid': packet_json['sid'], +}, data=payload) +print response.url +print response.content + +from time import sleep +sleep(10) + + +print '*** Send event' +packets = [ + (4, '2["my other event",{"my":"data"}]'), +] +payload = encode_payload(packets) +print payload +base_url = 'http://localhost:9000' +url = base_url + '/socket.io/' +print session.cookies.items() +response = session.post(url, params={ + 'EIO': 3, + 'transport': 'polling', + 't': get_timestamp(), + 'sid': packet_json['sid'], +}, data=payload) +print response.url +print response.content + + +""" +print '*** Send ping' +packets = [ + (2, ''), +] +payload = encode_payload(packets) +print payload +base_url = 'http://localhost:9000' +url = base_url + '/socket.io/' +response = session.post(url, params={ + 'EIO': 3, + 'transport': 'polling', + 't': get_timestamp(), + 'sid': packet_json['sid'], +}, data=payload) +print response.url +print response.content +# packets = get_packets(response.content) +# for packet_type, packet in packets: + # print packet_type, packet + + +print '*** Send ping' +packets = [ + (2, ''), +] +payload = encode_payload(packets) +print payload +base_url = 'http://localhost:9000' +url = base_url + '/socket.io/' +response = session.post(url, params={ + 'EIO': 3, + 'transport': 'polling', + 't': get_timestamp(), + 'sid': packet_json['sid'], +}, data=payload) +print response.url +print response.content +""" From cbdf009d46e53ed8de046a30f08896752bd63c5e Mon Sep 17 00:00:00 2001 From: Roy Hyunjin Han Date: Sun, 30 Nov 2014 05:17:22 -0500 Subject: [PATCH 4/8] Add content-type --- experiments/app.js | 1 + experiments/client1.py | 31 +++++++++++++++++++------------ experiments/proxy.js | 3 ++- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/experiments/app.js b/experiments/app.js index 8beb129..4df4754 100644 --- a/experiments/app.js +++ b/experiments/app.js @@ -1,3 +1,4 @@ +// DEBUG=* node app.js var app = require('express')(); var server = require('http').Server(app); var io = require('socket.io')(server); diff --git a/experiments/client1.py b/experiments/client1.py index 55fd870..0a270d4 100644 --- a/experiments/client1.py +++ b/experiments/client1.py @@ -46,8 +46,10 @@ def get_timestamp(): return timestamp +base_url = 'http://localhost:8000' + + print '*** Connect' -base_url = 'http://localhost:9000' session = requests.Session() print session.cookies.items() url = base_url + '/socket.io/' @@ -70,8 +72,6 @@ print packet_json['sid'] assert packet_type == 0 -"" -base_url = 'http://localhost:9000' url = base_url + '/socket.io/' response = session.get(url, params={ 'EIO': 3, @@ -105,11 +105,14 @@ def make_header(content): for index in xrange(len(length_string)): header_digits.append(ord(length_string[index]) - 48) header_digits.append(255) + print '---' + for x in header_digits: + print str(x) + print '---' return ''.join(chr(x) for x in header_digits) # print '***' -# base_url = 'http://localhost:9000' # url = base_url + '/socket.io/' # response = session.get(url, params={ # 'EIO': 3, @@ -130,7 +133,6 @@ packets = [ ] payload = encode_payload(packets) print payload -base_url = 'http://localhost:9000' url = base_url + '/socket.io/' print session.cookies.items() response = session.post(url, params={ @@ -138,7 +140,9 @@ response = session.post(url, params={ 'transport': 'polling', 't': get_timestamp(), 'sid': packet_json['sid'], -}, data=payload) +}, data=payload, headers={ + 'content-type': 'application/octet-stream', +}) print response.url print response.content @@ -152,7 +156,6 @@ packets = [ ] payload = encode_payload(packets) print payload -base_url = 'http://localhost:9000' url = base_url + '/socket.io/' print session.cookies.items() response = session.post(url, params={ @@ -160,7 +163,9 @@ response = session.post(url, params={ 'transport': 'polling', 't': get_timestamp(), 'sid': packet_json['sid'], -}, data=payload) +}, data=payload, headers={ + 'content-type': 'application/octet-stream', +}) print response.url print response.content @@ -172,14 +177,15 @@ packets = [ ] payload = encode_payload(packets) print payload -base_url = 'http://localhost:9000' url = base_url + '/socket.io/' response = session.post(url, params={ 'EIO': 3, 'transport': 'polling', 't': get_timestamp(), 'sid': packet_json['sid'], -}, data=payload) +}, data=payload, headers={ + 'content-type': 'application/octet-stream', +}) print response.url print response.content # packets = get_packets(response.content) @@ -193,14 +199,15 @@ packets = [ ] payload = encode_payload(packets) print payload -base_url = 'http://localhost:9000' url = base_url + '/socket.io/' response = session.post(url, params={ 'EIO': 3, 'transport': 'polling', 't': get_timestamp(), 'sid': packet_json['sid'], -}, data=payload) +}, data=payload, headers={ + 'content-type': 'application/octet-stream', +}) print response.url print response.content """ diff --git a/experiments/proxy.js b/experiments/proxy.js index 4dec919..756da12 100644 --- a/experiments/proxy.js +++ b/experiments/proxy.js @@ -2,7 +2,8 @@ var proxy = require('http-proxy').createProxyServer({ target: {host: 'localhost', port: 9000} }); var server = require('http').createServer(function(req, res) { - console.log('[REQUEST] ' + req.url); + console.log('[REQUEST.%s] %s', req.method, req.url); + console.log(req['headers']); if (req.method == 'POST') { var body = ''; req.on('data', function (data) { From eda747ec4e084567ab3c48951a32f40b326569ec Mon Sep 17 00:00:00 2001 From: Roy Hyunjin Han Date: Sun, 30 Nov 2014 05:58:02 -0500 Subject: [PATCH 5/8] Use GET request to get pong --- experiments/client1.py | 28 +++++++++++++------------ experiments/{client0.py => client2.py} | 8 +------ experiments/socketIO_client/__init__.py | 7 +++++++ 3 files changed, 23 insertions(+), 20 deletions(-) rename experiments/{client0.py => client2.py} (54%) create mode 100644 experiments/socketIO_client/__init__.py diff --git a/experiments/client1.py b/experiments/client1.py index 0a270d4..68fdaba 100644 --- a/experiments/client1.py +++ b/experiments/client1.py @@ -46,13 +46,13 @@ def get_timestamp(): return timestamp -base_url = 'http://localhost:8000' +base_url = 'http://localhost:9000' +url = base_url + '/socket.io/' print '*** Connect' session = requests.Session() print session.cookies.items() -url = base_url + '/socket.io/' response = session.get(url, params={ 'EIO': 3, 'transport': 'polling', @@ -72,7 +72,6 @@ print packet_json['sid'] assert packet_type == 0 -url = base_url + '/socket.io/' response = session.get(url, params={ 'EIO': 3, 'transport': 'polling', @@ -113,7 +112,6 @@ def make_header(content): # print '***' -# url = base_url + '/socket.io/' # response = session.get(url, params={ # 'EIO': 3, # 'transport': 'polling', @@ -133,7 +131,6 @@ packets = [ ] payload = encode_payload(packets) print payload -url = base_url + '/socket.io/' print session.cookies.items() response = session.post(url, params={ 'EIO': 3, @@ -156,7 +153,6 @@ packets = [ ] payload = encode_payload(packets) print payload -url = base_url + '/socket.io/' print session.cookies.items() response = session.post(url, params={ 'EIO': 3, @@ -170,14 +166,12 @@ print response.url print response.content -""" print '*** Send ping' packets = [ (2, ''), ] payload = encode_payload(packets) print payload -url = base_url + '/socket.io/' response = session.post(url, params={ 'EIO': 3, 'transport': 'polling', @@ -188,9 +182,6 @@ response = session.post(url, params={ }) print response.url print response.content -# packets = get_packets(response.content) -# for packet_type, packet in packets: - # print packet_type, packet print '*** Send ping' @@ -199,7 +190,6 @@ packets = [ ] payload = encode_payload(packets) print payload -url = base_url + '/socket.io/' response = session.post(url, params={ 'EIO': 3, 'transport': 'polling', @@ -210,4 +200,16 @@ response = session.post(url, params={ }) print response.url print response.content -""" + + +response = session.get(url, params={ + 'EIO': 3, + 'transport': 'polling', + 't': get_timestamp(), + 'sid': packet_json['sid'], +}) +print response.url +print session.cookies.items() +packets = get_packets(response.content) +for packet_type, packet in packets: + print packet_type, packet diff --git a/experiments/client0.py b/experiments/client2.py similarity index 54% rename from experiments/client0.py rename to experiments/client2.py index fe849a5..9b91509 100644 --- a/experiments/client0.py +++ b/experiments/client2.py @@ -1,10 +1,4 @@ -class SocketIO(object): - - def __init__(self, host, port): - pass - - def on(self, event, callback): - pass +from socketIO_client import SocketIO def on_news(self, data): diff --git a/experiments/socketIO_client/__init__.py b/experiments/socketIO_client/__init__.py new file mode 100644 index 0000000..42266b7 --- /dev/null +++ b/experiments/socketIO_client/__init__.py @@ -0,0 +1,7 @@ +class SocketIO(object): + + def __init__(self, host, port): + pass + + def on(self, event, callback): + pass From 63dea4f7a33f855b74a05589c956f2dae85c594f Mon Sep 17 00:00:00 2001 From: Roy Hyunjin Han Date: Mon, 22 Dec 2014 12:38:40 +0900 Subject: [PATCH 6/8] Wrote basic connect() --- experiments/client1.py | 4 +- experiments/socketIO_client/__init__.py | 80 ++++++++++++++++++++++++- 2 files changed, 81 insertions(+), 3 deletions(-) diff --git a/experiments/client1.py b/experiments/client1.py index 68fdaba..4880a14 100644 --- a/experiments/client1.py +++ b/experiments/client1.py @@ -3,7 +3,6 @@ import requests import time -# def unwrap_payload # def decode_payload(payload) def get_packets(content): packets = [] @@ -88,6 +87,9 @@ for packet_type, packet in packets: # from IPython import embed; embed() +# def wrap_payload +# def pack_packets +# def pack_packs # def wrap_payload def encode_payload(packs): parts = [] diff --git a/experiments/socketIO_client/__init__.py b/experiments/socketIO_client/__init__.py index 42266b7..cd94394 100644 --- a/experiments/socketIO_client/__init__.py +++ b/experiments/socketIO_client/__init__.py @@ -1,7 +1,83 @@ -class SocketIO(object): +import json +import requests +import time + + +class EngineIO(object): + + _path = 'engine.io' + _engine_io_protocol = 3 + _request_index = 0 def __init__(self, host, port): - pass + url = 'http://%s:%s/%s/' % (host, port, self._path) + session = requests.Session() + response = session.get(url, params={ + 'EIO': self._engine_io_protocol, + 'transport': 'polling', + 't': self._get_timestamp(), + }) + packs = _decode_content(response.content) + packet_type, packet = packs[0] + assert packet_type == 0 + packet_json = json.loads(packet) + print(packet_json) + response = session.get(url, params={ + 'EIO': self._engine_io_protocol, + 'transport': 'polling', + 't': self._get_timestamp(), + 'sid': packet_json['sid'], + }) + packs = _decode_content(response.content) + for packet_type, packet in packs: + print 'engineIO_packet_type = %s' % packet_type + print 'socketIO_packet_type = %s' % packet[0] + print 'packet = %s' % packet[1:] + + def _get_timestamp(self): + timestamp = '%s-%s' % (int(time.time() * 1000), self._request_index) + self._request_index += 1 + return timestamp + + +class SocketIO(EngineIO): + + _path = 'socket.io' + _socket_io_protocol = 4 + + def __init__(self, host, port): + super(SocketIO, self).__init__(host, port) def on(self, event, callback): pass + + +def _decode_content(content): + packs = [] + index = 0 + content_length = len(content) + while index < content_length: + index, packet_length = _read_packet_length(content, index) + index, packet = _read_packet(content, index, packet_length) + packet_type = int(packet[0]) + packet_payload = packet[1:] + packs.append((packet_type, packet_payload)) + return packs + + +def _read_packet_length(content, index): + while ord(content[index]) != 0: + index += 1 + index += 1 + packet_length_string = '' + while ord(content[index]) != 255: + packet_length_string += str(ord(content[index])) + index += 1 + return index, int(packet_length_string) + + +def _read_packet(content, index, packet_length): + while ord(content[index]) == 255: + index += 1 + packet = content[index:index + packet_length] + return index + packet_length, packet From b9e63ff7cd2ed4ab08d6ece197572cef6f951218 Mon Sep 17 00:00:00 2001 From: Roy Hyunjin Han Date: Sun, 25 Jan 2015 10:17:03 +0900 Subject: [PATCH 7/8] Save before flight --- TODO.goals | 14 ++++++++++-- experiments/client2.py | 9 ++++---- experiments/socketIO_client/__init__.py | 29 +++++++++++++++++++++---- 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/TODO.goals b/TODO.goals index d63b1d2..ff6edf1 100644 --- a/TODO.goals +++ b/TODO.goals @@ -1,2 +1,12 @@ -# US/Pacific 11/19/2013 -Include graingert's pull request on travis.yml +Check that SSL websocket connections work properly +Use continuous integration with TravisCI +Do not connect to blank namespace if overriding default namespace exists #40 +Upgrade to socket.io 1.2 #41 +Write a unit test to make sure that the client can disconnect properly #42 +Check that setting stream=True makes sure that we receive all server events #45 +Revive heartbeat as separate process thanks to sarietta +Credit everyone who took the time to submit an issue or pull request +Support Python 3 + Use urllib.parse.urlparse +Merge sarietta's pull request +Add __version__ diff --git a/experiments/client2.py b/experiments/client2.py index 9b91509..14c0d7a 100644 --- a/experiments/client2.py +++ b/experiments/client2.py @@ -1,10 +1,11 @@ from socketIO_client import SocketIO -def on_news(self, data): - print(data) - self.emit('my other event', {'my': 'data'}) +# def on_news(self, data): + # print(data) + # self.emit('my other event', {'my': 'data'}) s = SocketIO('localhost', 9000) -s.on('news', on_news) +s.emit('whee') +# s.on('news', on_news) diff --git a/experiments/socketIO_client/__init__.py b/experiments/socketIO_client/__init__.py index cd94394..52413f9 100644 --- a/experiments/socketIO_client/__init__.py +++ b/experiments/socketIO_client/__init__.py @@ -11,8 +11,8 @@ class EngineIO(object): def __init__(self, host, port): url = 'http://%s:%s/%s/' % (host, port, self._path) - session = requests.Session() - response = session.get(url, params={ + self.session = requests.Session() + response = self.session.get(url, params={ 'EIO': self._engine_io_protocol, 'transport': 'polling', 't': self._get_timestamp(), @@ -21,12 +21,13 @@ class EngineIO(object): packet_type, packet = packs[0] assert packet_type == 0 packet_json = json.loads(packet) + self._session_id = packet_json['sid'] print(packet_json) - response = session.get(url, params={ + response = self.session.get(url, params={ 'EIO': self._engine_io_protocol, 'transport': 'polling', 't': self._get_timestamp(), - 'sid': packet_json['sid'], + 'sid': self._session_id, }) packs = _decode_content(response.content) for packet_type, packet in packs: @@ -39,6 +40,17 @@ class EngineIO(object): self._request_index += 1 return timestamp + def _message(self, packet): + packet_type = 4 + response = self.session.post(self.url, params={ + 'EIO': self._engine_io_protocol, + 'transport': 'polling', + 't': self._get_timestamp(), + 'sid': self._session_id, + }, data=_encode_content([(packet_type, packet)]), headers={ + 'content-type': 'application/octet-stream', + }) + class SocketIO(EngineIO): @@ -51,6 +63,11 @@ class SocketIO(EngineIO): def on(self, event, callback): pass + def emit(self, event): + packet_type = 2 + packet = json.dumps([event]) + self._message(str(packet_type) + packet) + def _decode_content(content): packs = [] @@ -81,3 +98,7 @@ def _read_packet(content, index, packet_length): index += 1 packet = content[index:index + packet_length] return index + packet_length, packet + + +def _encode_content(packs): + pass From cfbaaa21eb5d821481a8a994bf022732841edf23 Mon Sep 17 00:00:00 2001 From: Roy Hyunjin Han Date: Tue, 10 Feb 2015 22:04:38 -0500 Subject: [PATCH 8/8] Update goals --- TODO.goals | 28 +++++++++++++++++++--------- setup.cfg | 10 ++++++---- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/TODO.goals b/TODO.goals index ff6edf1..e3f90f9 100644 --- a/TODO.goals +++ b/TODO.goals @@ -1,12 +1,22 @@ -Check that SSL websocket connections work properly -Use continuous integration with TravisCI -Do not connect to blank namespace if overriding default namespace exists #40 -Upgrade to socket.io 1.2 #41 -Write a unit test to make sure that the client can disconnect properly #42 Check that setting stream=True makes sure that we receive all server events #45 -Revive heartbeat as separate process thanks to sarietta -Credit everyone who took the time to submit an issue or pull request -Support Python 3 +Use HTTP headers for Websocket connection #44 +Do not connect to blank namespace if overriding default namespace exists #40 +Pass wait timeout to underlying transports #34 +Make heartbeat time independent from elapsed time #38 + Check that heartbeats are sent even with short wait time #64 + Revive heartbeat as separate process thanks to sarietta +Restore namespace as separate process #50 +Check that we have the correct version of websocket #62 +Fall back to next transport #48 +Check that SSL websocket connections work properly #54 +Write a unit test to make sure that the client can disconnect properly #42 #46 +Make sure that on_reconnect works #61 +Check that the library reconnects despite server restart #63 #53 +Upgrade to socket.io 1.2 #41 #52 + Merge sarietta's pull request +Implement rooms #65 +Run under Python 3 #51 Use urllib.parse.urlparse -Merge sarietta's pull request +Use continuous integration with TravisCI +Credit everyone who took the time to submit an issue or pull request Add __version__ diff --git a/setup.cfg b/setup.cfg index 8a2014f..468f360 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,7 @@ [nosetests] -detailed-errors=TRUE -with-coverage=TRUE -cover-package=socketIO_client -cover-erase=TRUE +detailed-errors = TRUE +with-coverage = TRUE +cover-package = socketIO_client +cover-erase = TRUE + +[easy_install]