summaryrefslogtreecommitdiffstats
path: root/gitautodeploy/wsserver.py
blob: 1c1e0ecb03104e6f42adfe523f9a37c70d26f973 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
try:
    from autobahn.websocket import WebSocketServerProtocol
except ImportError:
    WebSocketServerProtocol = object

def WebSocketClientHandlerFactory(config, clients, event_store):
    """Factory method for webhook request handler class"""

    class WebSocketClientHandler(WebSocketServerProtocol, object):
        from .events import SystemEvent

        def __init__(self, *args, **kwargs):
            self._config = config
            self.clients = clients
            self.event_store = event_store
            import logging
            self.logger = logging.getLogger()
            super(WebSocketClientHandler, self).__init__(*args, **kwargs)

        def onConnect(self, request):
            self.logger.info("Client connecting: {0}".format(request.peer))

            # Validate the request
            if not self._config['web-ui-enabled'] or not self.peer.host in self._config['web-ui-whitelist']:
                self.sendClose()
                logger.info("Unautorized connection attempt from %s" % self.peer.host)
                return

            self.clients.append(self)

        def onOpen(self):
            self.logger.info("WebSocket connection open.")

        def onMessage(self, payload, isBinary):
            self.logger.info("WebSocket connection open.")
            if isBinary:
                self.logger.info("Binary message received: {0} bytes".format(len(payload)))
            else:
                self.logger.info("Text message received: {0}".format(payload.decode('utf8')))

            for client in self.clients:
                client.sendMessage(payload, isBinary)

            # echo back message verbatim
            self.sendMessage(payload, isBinary)

        def onClose(self, wasClean, code, reason):
            self.logger.info("WebSocket connection closed: {0}".format(reason))

            if self in self.clients:
                self.clients.remove(self)

    return WebSocketClientHandler