Last active
October 26, 2017 11:01
-
-
Save neilzheng/eb14ef654fefc10c3c46946fddcc0aa3 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
revision 11 is broken, other old revisions may be buggy