{ "info": { "author": "Yoann Cerda", "author_email": "tuxlinuxien@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 2 - Pre-Alpha", "Environment :: Console", "Framework :: Twisted", "Intended Audience :: Developers" ], "description": "TwistedWebsocket\r\n================\r\n\r\nWebsocket server implementation based on Twisted with SSL support.\r\n\r\nRequirements\r\n------------\r\n\r\n- Python 2.7+\r\n- Twisted\r\n\r\nInstallation\r\n------------\r\n\r\n::\r\n \r\n pip install TwistedWebsocket\r\n\r\nTesting\r\n-------\r\n\r\n::\r\n \r\n python setup.py test\r\n\r\n \r\nBuilt-in broadcast server\r\n-------------------------\r\n\r\nA server is already integrated into TwistedWebsocket package.\r\n::\r\n\r\n python -m TwistedWebsocket.server\r\n\r\n\r\nAdvanced options\r\n\r\n::\r\n\r\n usage: python -m TwistedWebsocket.server [-h] [-p PORT] [-ssl] [-key KEY] [-cert CERT]\r\n\r\n Websocket server implementation based on Twisted with SSL support.\r\n\r\n optional arguments:\r\n -h, --help show this help message and exit\r\n -p PORT, --port PORT Change listening port (default 9999).\r\n -ssl Activate SSL.\r\n -key KEY Path to your *.key file.\r\n -cert CERT Path to yout *.crt file.\r\n\r\n\r\n\r\nAPI\r\n---\r\n\r\nFrame manager\r\n\r\n- ``TwistedWebsocket.frame.Frame(buf)``: Create Frame instance\r\n- ``TwistedWebsocket.frame.Frame.message()``: Return decoded message from frame instance\r\n- ``TwistedWebsocket.frame.Frame.length()``: Return frame length from frame instance\r\n- ``TwistedWebsocket.frame.Frame.buildMessage(msg, mask=True)``: (@staticmethod) Create a websocket compatible frame. If mask == True, it will be a client->server frame.\r\n\r\nServer Protocol\r\n\r\n- ``TwistedWebsocket.server.Protocol.onHandshake(header)``: Callback when HTTP-like client header is received\r\n- ``TwistedWebsocket.server.Protocol.onConnect()``: Callback when the client is connected\r\n- ``TwistedWebsocket.server.Protocol.onDisconnect()``: Callback when the client is disconnected\r\n- ``TwistedWebsocket.server.Protocol.onMessage(msg)``: Callback when the client receive a message\r\n- ``TwistedWebsocket.server.Protocol.sendMessage(msg)``: Send a message to the client\r\n- ``TwistedWebsocket.server.Protocol.users``: Dictionnary ( self == self.clients[self.id] ) off all the clients connected to the server\r\n- ``TwistedWebsocket.server.Protocol.id``: Client UUID4 id\r\n\r\nExceptions\r\n\r\n- ``TwistedWebsocket.exception.FrameError``\r\n- ``TwistedWebsocket.exception.ProtocolError``\r\n\r\nPackage information\r\n\r\n- ``TwistedWebsocket.server.__VERSION__``\r\n\r\n\r\nDefault Implementation\r\n----------------------\r\n\r\nBroadcast server example:\r\n\r\n::\r\n\r\n from twisted.internet.protocol import Factory\r\n from twisted.internet import reactor\r\n from TwistedWebsocket.server import Protocol\r\n import re\r\n\r\n\r\n class WebSocketHandler(Protocol):\r\n\r\n def onHandshake(self, header):\r\n g = re.search('Origin\\s*:\\s*(\\S+)', header)\r\n if not g: return\r\n print \"\\n[HANDSHAKE] %s origin : %s\" % (self.id, g.group(1))\r\n\r\n def onConnect(self):\r\n print \"\\n[CONNECTION] %s connected\" % self.id\r\n for _id, user in self.users.items():\r\n user.sendMessage(\"%s connected\" % self.id)\r\n print \"\\n[FRAME] from %s to %s:\\n%s connected\" % (self.id, _id, self.id)\r\n\r\n def onDisconnect(self):\r\n print \"\\n[DISCONNECTION] %s disconnected\" % self.id\r\n for _id, user in self.users.items():\r\n user.sendMessage(\"%s disconnected\" % self.id)\r\n print \"\\n[FRAME] from %s to %s:\\n%s disconnected\" % (self.id, _id, self.id)\r\n\r\n def onMessage(self, msg):\r\n for _id, user in self.users.items():\r\n user.sendMessage(msg)\r\n print \"\\n[FRAME] from %s to %s:\\n%s\" % (self.id, _id, msg)\r\n\r\n\r\n class WebSocketFactory(Factory):\r\n \r\n def __init__(self):\r\n self.users = {}\r\n \r\n def buildProtocol(self, addr):\r\n return WebSocketHandler(self.users)\r\n\r\n\r\n reactor.listenTCP(9999, WebSocketFactory())\r\n reactor.run()\r\n\r\n\r\nWSS support\r\n------------\r\n\r\n::\r\n\r\n from twisted.internet.protocol import Factory\r\n from twisted.internet import reactor, ssl\r\n from TwistedWebsocket.server import Protocol\r\n import re\r\n\r\n class WebSocketHandler(Protocol):\r\n ...\r\n\r\n class WebSocketFactory(Factory):\r\n ...\r\n\r\n with open(\"./keys/ssl.localhost.key\") as keyFile:\r\n with open(\"./keys/ssl.localhost.cert\") as certFile:\r\n cert = ssl.PrivateCertificate.loadPEM(keyFile.read() + certFile.read())\r\n\r\n reactor.listenSSL(PORT, WebSocketFactory(), cert.options())\r\n reactor.run()\r\n\r\n\r\nGenerate self-signed SSL certificates:\r\n\r\n::\r\n\r\n $> openssl genrsa -out ./keys/ssl.localhost.key 2048\r\n $> openssl req -new -x509 -key ./keys/ssl.localhost.key -out ./keys/ssl.localhost.cert -days 3650 -subj /CN=ssl.localhost\r\n\r\nTODO\r\n----\r\n\r\n- Improve frame building\r\n- Add WSS example with self-signed certificates", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/tuxlinuxien/TwistedWebsocket", "keywords": "websocket server twisted ssl", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "TwistedWebsocket", "package_url": "https://pypi.org/project/TwistedWebsocket/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/TwistedWebsocket/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/tuxlinuxien/TwistedWebsocket" }, "release_url": "https://pypi.org/project/TwistedWebsocket/0.0.7/", "requires_dist": null, "requires_python": null, "summary": "Websocket server implementation based on Twisted with SSL support.", "version": "0.0.7" }, "last_serial": 1024353, "releases": { "0.0.6": [ { "comment_text": "", "digests": { "md5": "26dcf7bca4e7b6539c1590fc69818864", "sha256": "1f578c227f1b66c7fde9bbc587a2a8c0f0aaa8622bf9c7a9996e1c107c104679" }, "downloads": -1, "filename": "TwistedWebsocket-0.0.6.tar.gz", "has_sig": false, "md5_digest": "26dcf7bca4e7b6539c1590fc69818864", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3934, "upload_time": "2014-02-16T14:25:03", "url": "https://files.pythonhosted.org/packages/d2/83/d41735a3b7df1761bbbf6f9a5df422ee424fdc8623d77126a69f3303a76b/TwistedWebsocket-0.0.6.tar.gz" } ], "0.0.6.1": [ { "comment_text": "", "digests": { "md5": "3348709b0d964c00851858292b1bea41", "sha256": "080dee7695c47cf7f21bf80c75f23db6a1b6ef92b4381acb0e72c6f0db469641" }, "downloads": -1, "filename": "TwistedWebsocket-0.0.6.1.tar.gz", "has_sig": false, "md5_digest": "3348709b0d964c00851858292b1bea41", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4232, "upload_time": "2014-02-19T11:02:00", "url": "https://files.pythonhosted.org/packages/f2/2b/359413036c072b9be74e9f52244676066ff6e264b94d7ca136afdadc3670/TwistedWebsocket-0.0.6.1.tar.gz" } ], "0.0.6.2": [ { "comment_text": "", "digests": { "md5": "a4dabb2aa81d642cc61dc28ef1345a54", "sha256": "3c061f158301252e5ab2ba34a26b64a12cd117ce9f09cd86b7e767cb749b2865" }, "downloads": -1, "filename": "TwistedWebsocket-0.0.6.2.tar.gz", "has_sig": false, "md5_digest": "a4dabb2aa81d642cc61dc28ef1345a54", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4425, "upload_time": "2014-03-04T13:10:05", "url": "https://files.pythonhosted.org/packages/75/db/f18292b04c7deb81a92ce60bb2123c631344569f34d6abcadba1b0f95103/TwistedWebsocket-0.0.6.2.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "2a9593e75933dd9de1a3b2d1a68d1e29", "sha256": "60856f97bbf6c41e0252d6ea7ede7ffe2120fa84bc9d7141c29ea6b2f922eadc" }, "downloads": -1, "filename": "TwistedWebsocket-0.0.7.tar.gz", "has_sig": false, "md5_digest": "2a9593e75933dd9de1a3b2d1a68d1e29", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5284, "upload_time": "2014-03-07T03:00:40", "url": "https://files.pythonhosted.org/packages/21/38/aa3d3c3951288c184aea7be7101cb5f3f62cfc83ee79f6054410f174158e/TwistedWebsocket-0.0.7.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "2a9593e75933dd9de1a3b2d1a68d1e29", "sha256": "60856f97bbf6c41e0252d6ea7ede7ffe2120fa84bc9d7141c29ea6b2f922eadc" }, "downloads": -1, "filename": "TwistedWebsocket-0.0.7.tar.gz", "has_sig": false, "md5_digest": "2a9593e75933dd9de1a3b2d1a68d1e29", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5284, "upload_time": "2014-03-07T03:00:40", "url": "https://files.pythonhosted.org/packages/21/38/aa3d3c3951288c184aea7be7101cb5f3f62cfc83ee79f6054410f174158e/TwistedWebsocket-0.0.7.tar.gz" } ] }