Skip to content

Commit 2c44f4c

Browse files
authored
Merge pull request Pithikos#78 from eado/master
Add ssl support
2 parents 2927b43 + 8cec44b commit 2c44f4c

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

README.md

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ A minimal Websockets Server in Python with no external dependencies.
1111
* No dependencies
1212

1313
Notice that this implementation does not support the more advanced features
14-
like SSL etc. The project is focused mainly on making it easy to run a
14+
like multithreading etc. The project is focused mainly on making it easy to run a
1515
websocket server for prototyping, testing or for making a GUI for your application.
1616

1717

@@ -59,6 +59,10 @@ The WebsocketServer can be initialized with the below parameters.
5959

6060
*`loglevel`* - logging level to print. By default WARNING is used. You can use `logging.DEBUG` or `logging.INFO` for more verbose output.
6161

62+
*`key`* - If using SSL, this is the path to the key.
63+
64+
*`cert`* - If using SSL, this is the path to the certificate.
65+
6266

6367
### Properties
6468

@@ -101,7 +105,19 @@ def new_client(client, server):
101105
server = WebsocketServer(13254, host='127.0.0.1', loglevel=logging.INFO)
102106
server.set_fn_new_client(new_client)
103107
server.run_forever()
104-
````
108+
````
109+
Example (SSL):
110+
````py
111+
import logging
112+
from websocket_server import WebsocketServer
113+
114+
def new_client(client, server):
115+
server.send_message_to_all("Hey all, a new client has joined us")
116+
117+
server = WebsocketServer(13254, host='127.0.0.1', loglevel=logging.INFO, key="key.pem", cert="cert.pem")
118+
server.set_fn_new_client(new_client)
119+
server.run_forever()
120+
````
105121

106122
## Client
107123

websocket_server/websocket_server.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import sys
55
import struct
6+
import ssl
67
from base64 import b64encode
78
from hashlib import sha1
89
import logging
@@ -112,10 +113,13 @@ class WebsocketServer(ThreadingMixIn, TCPServer, API):
112113
allow_reuse_address = True
113114
daemon_threads = True # comment to keep threads alive until finished
114115

115-
def __init__(self, port, host='127.0.0.1', loglevel=logging.WARNING):
116+
def __init__(self, port, host='127.0.0.1', loglevel=logging.WARNING, key=None, cert=None):
116117
logger.setLevel(loglevel)
117118
TCPServer.__init__(self, (host, port), WebSocketHandler)
118119
self.port = self.socket.getsockname()[1]
120+
121+
self.key = key
122+
self.cert = cert
119123

120124
self.clients = []
121125
self.id_counter = 0
@@ -162,6 +166,11 @@ class WebSocketHandler(StreamRequestHandler):
162166

163167
def __init__(self, socket, addr, server):
164168
self.server = server
169+
if server.key and server.cert:
170+
try:
171+
socket = ssl.wrap_socket(socket, server_side=True, certfile=server.cert, keyfile=server.key)
172+
except: # Not sure which exception it throws if the key/cert isn't found
173+
logger.warn("SSL not available (are the paths {} and {} correct for the key and cert?)".format(server.key, server.cert))
165174
StreamRequestHandler.__init__(self, socket, addr, server)
166175

167176
def setup(self):

0 commit comments

Comments
 (0)