|
56 | 56 | #####################
|
57 | 57 | # Server stuff
|
58 | 58 | #####################
|
59 |
| -class ThreadedTCPServer(SocketServer.TCPServer): |
60 |
| - pass |
61 | 59 |
|
62 |
| -class RequestHandler(SocketServer.StreamRequestHandler): |
63 |
| - def handle(self): |
64 |
| - length = 0 |
65 |
| - currentLine = '' |
66 |
| - data = '' |
67 |
| - while self.server.enabled: |
68 |
| - if not '\r\n' in data: |
69 |
| - try: |
70 |
| - data += self.request.recv(4096) |
71 |
| - except socket.timeout: |
72 |
| - time.sleep(0.1) # in case of odd problem |
73 |
| - continue |
74 |
| - if not data: # Server closed connection |
75 |
| - return |
76 |
| - if data.startswith('payload=') and \ |
77 |
| - len(data) == length: |
78 |
| - payload = StringIO() |
79 |
| - payload.write(urllib.unquote(data[len('payload='):])) |
80 |
| - payload.seek(0) |
81 |
| - self.server._plugin.announce.onPayload(json.load(payload)) |
82 |
| - return |
83 |
| - elif '\r\n' in data: |
84 |
| - splitted = data.split('\r\n') |
85 |
| - currentLine = splitted[0] |
86 |
| - data = '\r\n'.join(splitted[1:]) |
87 |
| - |
88 |
| - if currentLine.startswith('Content-Length: '): |
89 |
| - length = int(currentLine[len('Content-Length: '):]) |
| 60 | +class GithubCallback(utils.httpserver.SupyHTTPServerCallback): |
| 61 | + def doPost(self, handler, path, form): |
| 62 | + self.plugin.announce.onPayload(json.loads(form['payload'].value)) |
90 | 63 |
|
91 | 64 | #####################
|
92 | 65 | # API access stuff
|
@@ -115,24 +88,9 @@ def __init__(self, irc):
|
115 | 88 | callbacks.Plugin.__init__(self, irc)
|
116 | 89 | instance = self
|
117 | 90 |
|
118 |
| - |
119 |
| - if not world.testing: |
120 |
| - host = self.registryValue('server.host') |
121 |
| - port = self.registryValue('server.port') |
122 |
| - while True: |
123 |
| - try: |
124 |
| - self._server = ThreadedTCPServer((host, port), |
125 |
| - RequestHandler) |
126 |
| - break |
127 |
| - except socket.error: # Address already in use |
128 |
| - time.sleep(1) |
129 |
| - self._server.timeout = 0.5 |
130 |
| - |
131 |
| - # Used by request handlers: |
132 |
| - self._server._plugin = self |
133 |
| - self._server.enabled = True |
134 |
| - threading.Thread(target=self._server.serve_forever, |
135 |
| - name='GitHub commits listener').start() |
| 91 | + callback = GithubCallback() |
| 92 | + callback.plugin = self |
| 93 | + utils.httpserver.hook('github', callback) |
136 | 94 |
|
137 | 95 | class announce(callbacks.Commands):
|
138 | 96 | def _createPrivmsg(self, channel, payload, commit):
|
@@ -294,11 +252,7 @@ def info(self, irc, msg, args, owner, name, optlist):
|
294 | 252 | 'disable': 'anything'})])
|
295 | 253 | def die(self):
|
296 | 254 | self.__parent.die()
|
297 |
| - if not world.testing: |
298 |
| - self._server.enabled = False |
299 |
| - time.sleep(1) |
300 |
| - self._server.shutdown() |
301 |
| - del self._server |
| 255 | + utils.httpserver.unhook('github') |
302 | 256 |
|
303 | 257 |
|
304 | 258 | Class = GitHub
|
|
0 commit comments