Skip to content

Instantly share code, notes, and snippets.

@neilzheng
Last active October 26, 2017 11:01
Show Gist options
  • Save neilzheng/eb14ef654fefc10c3c46946fddcc0aa3 to your computer and use it in GitHub Desktop.
Save neilzheng/eb14ef654fefc10c3c46946fddcc0aa3 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
import sys
import asyncio
import websockets
class Server:
def __init__(self, ws_uri, ssl_verify=True, loop=None, **wskwargs):
super().__init__()
self.ws_uri = ws_uri
self.ssl_context = None
self.loop = loop
self.wskwargs = wskwargs
if not ssl_verify and self.ws_uri.startswith("wss://"):
import ssl
self.ssl_context = ssl.create_default_context()
self.ssl_context.check_hostname = False
self.ssl_context.verify_mode = ssl.CERT_NONE
if not self.loop:
self.loop = asyncio.get_event_loop()
def listen(self, host, port, **kwargs):
return asyncio.start_server(self._server_run, host, port, loop=self.loop, **kwargs)
async def _server_run(self, reader, writer):
print("Sock connected.")
try:
if self.ssl_context:
client = await websockets.client.connect(self.ws_uri, ssl=self.ssl_context, **self.wskwargs)
else:
client = await websockets.client.connect(self.ws_uri, **self.wskwargs)
self.loop.create_task(self._ws_run(writer, client))
try:
while True:
data = await reader.read(65536)
if not data:
break
await client.send(data)
except:
pass
await client.close()
except Exception as err:
writer.close()
print(err)
print("Sock disconnected.")
async def _ws_run(self, writer, client):
print("WS connected.")
try:
while True:
data = await client.recv()
if not data:
break
writer.write(data)
except:
pass
writer.close()
print("WS disconnected")
def _usage():
print("Usage: {} bind_address bind_port websocket_uri".format(sys.argv[0]))
if __name__ == '__main__':
if len(sys.argv) != 4:
_usage()
exit(1)
loop = asyncio.get_event_loop()
server = Server(sys.argv[3])
loop.run_until_complete(server.listen(sys.argv[1], sys.argv[2]))
loop.run_forever()
loop.close()
@neilzheng
Copy link
Author

revision 11 is broken, other old revisions may be buggy

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment