import sys import time import uuid import tnetstring import zmq client_id = b'getstream.py' ctx = zmq.Context() out_sock = ctx.socket(zmq.PUSH) out_sock.connect('ipc://server-in') out_stream_sock = ctx.socket(zmq.ROUTER) out_stream_sock.connect('ipc://server-in-stream') in_sock = ctx.socket(zmq.SUB) in_sock.setsockopt(zmq.SUBSCRIBE, client_id) in_sock.connect('ipc://server-out') time.sleep(0.5) rid = str(uuid.uuid4()).encode('utf-8') inseq = 0 outseq = 0 out_sock.send(b'T' + tnetstring.dumps({ b'from': client_id, b'id': rid, b'seq': outseq, b'method': b'GET', b'uri': sys.argv[1].encode('utf-8'), b'stream': True, b'credits': 8192, })) outseq += 1 while True: buf = in_sock.recv() at = buf.find(b' ') receiver = buf[:at] indata = tnetstring.loads(buf[at + 2:]) if indata[b'id'] != rid: continue print('IN: {}'.format(indata)) assert(indata[b'seq'] == inseq) inseq += 1 if (b'type' in indata and (indata[b'type'] == b'error' or indata[b'type'] == b'cancel')) or (b'type' not in indata and b'more' not in indata): break raddr = indata[b'from'] if b'body' in indata and len(indata[b'body']) > 0: outdata = { b'id': rid, b'from': client_id, b'seq': outseq, b'type': b'credit', b'credits': len(indata[b'body']), } print('OUT: {}'.format(outdata)) out_stream_sock.send_multipart([raddr, b'', b'T' + tnetstring.dumps(outdata)]) outseq += 1