1#!/usr/local/bin/python3.8 2 3''' 4A WebSocket server that echos back whatever it receives from the client. 5Copyright 2010 Joel Martin 6Licensed under LGPL version 3 (see docs/LICENSE.LGPL-3) 7 8You can make a cert/key with openssl using: 9openssl req -new -x509 -days 365 -nodes -out self.pem -keyout self.pem 10as taken from http://docs.python.org/dev/library/ssl.html#certificates 11''' 12 13import os, sys, select, optparse, logging 14sys.path.insert(0,os.path.join(os.path.dirname(__file__), "..")) 15from websockify.websocket import WebSocketServer, WebSocketRequestHandler 16 17class WebSocketEcho(WebSocketRequestHandler): 18 """ 19 WebSockets server that echos back whatever is received from the 20 client. """ 21 buffer_size = 8096 22 23 def new_websocket_client(self): 24 """ 25 Echo back whatever is received. 26 """ 27 28 cqueue = [] 29 c_pend = 0 30 cpartial = "" 31 rlist = [self.request] 32 33 while True: 34 wlist = [] 35 36 if cqueue or c_pend: wlist.append(self.request) 37 ins, outs, excepts = select.select(rlist, wlist, [], 1) 38 if excepts: raise Exception("Socket exception") 39 40 if self.request in outs: 41 # Send queued target data to the client 42 c_pend = self.send_frames(cqueue) 43 cqueue = [] 44 45 if self.request in ins: 46 # Receive client data, decode it, and send it back 47 frames, closed = self.recv_frames() 48 cqueue.extend(frames) 49 50 if closed: 51 self.send_close() 52 53if __name__ == '__main__': 54 parser = optparse.OptionParser(usage="%prog [options] listen_port") 55 parser.add_option("--verbose", "-v", action="store_true", 56 help="verbose messages and per frame traffic") 57 parser.add_option("--cert", default="self.pem", 58 help="SSL certificate file") 59 parser.add_option("--key", default=None, 60 help="SSL key file (if separate from cert)") 61 parser.add_option("--ssl-only", action="store_true", 62 help="disallow non-encrypted connections") 63 (opts, args) = parser.parse_args() 64 65 try: 66 if len(args) != 1: raise 67 opts.listen_port = int(args[0]) 68 except: 69 parser.error("Invalid arguments") 70 71 logging.basicConfig(level=logging.INFO) 72 73 opts.web = "." 74 server = WebSocketServer(WebSocketEcho, **opts.__dict__) 75 server.start_server() 76 77