summaryrefslogtreecommitdiffstats
path: root/gitautodeploy/wsserver.py
blob: b9f631e1d5bb47e378c22e59bf5e08d2987f6562 (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
54
55
56
57
58
59
60
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']['remote-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)

        #def notify_refresh(self, payload):
        #    import json
        #    self.sendMessage(json.dumps({
        #        "event": "refresh",
        #        "payload": payload
        #    }))

    return WebSocketClientHandler