diff --git a/init.lua b/init.lua index 586a12c..1b26783 100644 --- a/init.lua +++ b/init.lua @@ -146,8 +146,12 @@ function MatrixChat:send(msg) function(res) if res.code == 200 then local data = minetest.parse_json(res.data) - minetest.log("action", "got " .. data["event_id"]) - self.eventid = data["event_id"] + if data then + minetest.log("action", "got " .. data["event_id"]) + self.eventid = data["event_id"] + else + minetest.log("error", "matrix_bridge - cannot parse json") + end elseif res.code == 401 then minetest.log("error", "matrix_bridge - not authorized to send messages") elseif res.code == 404 then @@ -193,8 +197,8 @@ minetest.register_globalstep(function(dtime) local activity = minetest.parse_json(result.data) if activity ~= nil then MatrixChat:minechat(activity) + MatrixChat.since = activity.next_batch end - MatrixChat.since = activity.next_batch elseif result.code == 0 then elseif result.code == 404 then end diff --git a/proxy.py b/proxy.py index 14fabb7..8e60d6b 100644 --- a/proxy.py +++ b/proxy.py @@ -1,4 +1,4 @@ -import http.client, re, socket, sys, time +import http.client, re, socket, sys, time, _thread RECBUF = 1024 @@ -10,6 +10,104 @@ def getargv(arg, default="", n=1, args=sys.argv): p_clen = re.compile("\r?\ncontent-length: *(\d+)\r?\n?", re.IGNORECASE) +def handle(client): + # Get request + paquet = b"" + header = b"" + content = b"" + content_len = 0 + resp = {} + lf = 0 + while True: + raw = client.recv(RECBUF) + if raw: + paquet += raw + if lf >= 0: + for c in raw: + if c == 10:# LF + lf += 1 + elif c != 13:# CR + lf = 0 + if lf > 1: + parts = paquet.split(b"\r\n\r\n") + header = parts[0] + content = parts[1] + try: + content_len = int(p_clen.search(header.decode()).group(1)) + except (AttributeError, ValueError): + content_len = 0 + break + if lf > 1: + break + else: + break + while len(content) < content_len: + raw = client.recv(RECBUF) + paquet += raw + content += raw + + httpreq = paquet.split(b" ", 2) + if len(httpreq) != 3: + client.close() + return + method = httpreq[0] + url = httpreq[1] + rest = httpreq[2] + + if b"/send/m.room.message/" in url: + method = b"PUT" + + matrix_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + if matrix_https: + matrix_sock = ssl_ctx.wrap_socket(matrix_sock, server_hostname=matrix_addr) + matrix_sock.settimeout(60) + try: + matrix_sock.connect((matrix_addr, matrix_port)) + except socket.timeout: + sys.stderr.write("timeout connecting to matrix") + return + matrix_sock.settimeout(None) + + matrix_sock.sendall(b" ".join([method, url, rest])) + + paquet = b"" + header = b"" + content = b"" + content_len = 0 + resp = {} + lf = 0 + while True: + raw = matrix_sock.recv(RECBUF) + if raw: + paquet += raw + if lf >= 0: + for c in raw: + if c == 10:# LF + lf += 1 + elif c != 13:# CR + lf = 0 + if lf > 1: + parts = paquet.split(b"\r\n\r\n") + header = parts[0] + content = parts[1] + try: + content_len = int(p_clen.search(header.decode()).group(1)) + except AttributeError: + content_len = 0 + break + if lf > 1: + break + else: + break + while len(content) < content_len: + raw = matrix_sock.recv(RECBUF) + paquet += raw + content += raw + + client.sendall(paquet) + + client.close() + if __name__ == "__main__": if "--help" in sys.argv or "-h" in sys.argv: print("""MineTest Matrix Bridge mod proxy @@ -50,98 +148,7 @@ Options: (with defaults) except socket.timeout: continue - # Get request - paquet = b"" - header = b"" - content = b"" - content_len = 0 - resp = {} - lf = 0 - while True: - raw = client.recv(RECBUF) - if raw: - paquet += raw - if lf >= 0: - for c in raw: - if c == 10:# LF - lf += 1 - elif c != 13:# CR - lf = 0 - if lf > 1: - parts = paquet.split(b"\r\n\r\n") - header = parts[0] - content = parts[1] - try: - content_len = int(p_clen.search(header.decode()).group(1)) - except (AttributeError, ValueError): - content_len = 0 - break - if lf > 1: - break - else: - break - while len(content) < content_len: - raw = client.recv(RECBUF) - paquet += raw - content += raw - - httpreq = paquet.split(b" ", 2) - if len(httpreq) != 3: - client.close() - continue - method = httpreq[0] - url = httpreq[1] - rest = httpreq[2] - - if b"/send/m.room.message/" in url: - method = b"PUT" - - matrix_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - if matrix_https: - matrix_sock = ssl_ctx.wrap_socket(matrix_sock, server_hostname=matrix_addr) - matrix_sock.settimeout(60) - matrix_sock.connect((matrix_addr, matrix_port)) - matrix_sock.settimeout(None) - - matrix_sock.sendall(b" ".join([method, url, rest])) - - paquet = b"" - header = b"" - content = b"" - content_len = 0 - resp = {} - lf = 0 - while True: - raw = matrix_sock.recv(RECBUF) - if raw: - paquet += raw - if lf >= 0: - for c in raw: - if c == 10:# LF - lf += 1 - elif c != 13:# CR - lf = 0 - if lf > 1: - parts = paquet.split(b"\r\n\r\n") - header = parts[0] - content = parts[1] - try: - content_len = int(p_clen.search(header.decode()).group(1)) - except AttributeError: - content_len = 0 - break - if lf > 1: - break - else: - break - while len(content) < content_len: - raw = matrix_sock.recv(RECBUF) - paquet += raw - content += raw - - client.sendall(paquet) - - client.close() + _thread.start_new_thread(handle, (client,)) sock.close() except KeyboardInterrupt: sock.shutdown(socket.SHUT_WR)