#!/usr/bin/env python # # This is an example program that illustrates # how to interact with the zeromq remote control # using JSON. # # LICENSE: see bottom of file import sys import zmq from pprint import pprint import json import re from http.server import BaseHTTPRequestHandler, HTTPServer import time re_url = re.compile(r"/([a-zA-Z0-9]+).json") ZMQ_REMOTE = "tcp://localhost:9400" HTTP_HOSTNAME = "localhost" HTTP_PORT = 8080 class DabMuxServer(BaseHTTPRequestHandler): def err500(self, message): self.send_response(500) self.send_header("Content-type", "application/json") self.end_headers() self.wfile.write(json.dumps({"error": message}).encode()) def do_GET(self): m = re_url.match(self.path) if m: sock = context.socket(zmq.REQ) poller = zmq.Poller() poller.register(sock, zmq.POLLIN) sock.connect(ZMQ_REMOTE) sock.send(b"ping") socks = dict(poller.poll(1000)) if socks: if socks.get(sock) == zmq.POLLIN: data = sock.recv() if data != b"ok": print(f"Received {data} to ping!", file=sys.stderr) self.err500("ping failure") return else: print("ZMQ error: ping timeout", file=sys.stderr) self.err500("ping timeout") return sock.send(b"showjson", flags=zmq.SNDMORE) sock.send(m.group(1).encode()) socks = dict(poller.poll(1000)) if socks: if socks.get(sock) == zmq.POLLIN: data = sock.recv_multipart() print("Received: {}".format(len(data)), file=sys.stderr) parts = [] for i, part_data in enumerate(data): part = part_data.decode() print(" RX {}: {}".format(i, part.replace('\n',' ')), file=sys.stderr) if i == 0 and part != "fail": self.send_response(200) self.send_header("Content-type", "application/json") self.end_headers() self.wfile.write(part_data) return parts.append(part) self.err500("data error " + " ".join(parts)) return else: print("ZMQ error: timeout", file=sys.stderr) self.err500("timeout") return else: self.send_response(200) self.send_header("Content-type", "text/html") self.end_headers() self.wfile.write("""