From 75cae0261f55e4cc1548572974be1e96ca71147f Mon Sep 17 00:00:00 2001 From: ed Date: Tue, 28 May 2019 19:38:44 +0000 Subject: [PATCH] conn. keep-alive --- copyparty/httpcli.py | 48 ++++++++++++++++++++++++++++---------------- copyparty/mpsrv.py | 10 ++++++--- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/copyparty/httpcli.py b/copyparty/httpcli.py index efc44d24..983f362d 100644 --- a/copyparty/httpcli.py +++ b/copyparty/httpcli.py @@ -30,25 +30,31 @@ class HttpCli(object): self.log_func(self.log_src, msg) def run(self): - headerlines = self.read_header() - if not self.ok: - return + while self.ok: + headerlines = self.read_header() + if not self.ok: + return - self.headers = {} - mode, self.req, _ = headerlines[0].split(" ") + self.headers = {} + try: + mode, self.req, _ = headerlines[0].split(" ") + except: + self.log("bad headers:\n" + "\n".join(headerlines)) + self.s.close() + return - for header_line in headerlines[1:]: - k, v = header_line.split(":", 1) - self.headers[k.lower()] = v.strip() + for header_line in headerlines[1:]: + k, v = header_line.split(":", 1) + self.headers[k.lower()] = v.strip() - # self.bufsz = int(self.req.split('/')[-1]) * 1024 + # self.bufsz = int(self.req.split('/')[-1]) * 1024 - if mode == "GET": - self.handle_get() - elif mode == "POST": - self.handle_post() - else: - self.loud_reply(u'invalid HTTP mode "{0}"'.format(mode)) + if mode == "GET": + self.handle_get() + elif mode == "POST": + self.handle_post() + else: + self.loud_reply(u'invalid HTTP mode "{0}"'.format(mode)) def panic(self, msg): self.log("client disconnected ({0})".format(msg).upper()) @@ -79,7 +85,7 @@ class HttpCli(object): return ret[:-4].decode("utf-8", "replace").split("\r\n") def reply(self, body): - header = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: {0}\r\n\r\n".format( + header = "HTTP/1.1 200 OK\r\nConnection: Keep-Alive\r\nContent-Type: text/html\r\nContent-Length: {0}\r\n\r\n".format( len(body) ).encode( "utf-8" @@ -87,7 +93,6 @@ class HttpCli(object): if self.ok: self.s.send(header + body) - self.s.close() return body def loud_reply(self, body): @@ -188,6 +193,15 @@ class HttpCli(object): ).encode("utf-8") ) + try: + # TODO: check if actually part of multipart footer + buf = self.sr.recv(2) + if buf != b"\r\n": + raise Exception("oh") + except: + self.log("client is done") + self.s.close() + def handle_multipart(self, ofd): tlen = 0 hashobj = hashlib.sha512() diff --git a/copyparty/mpsrv.py b/copyparty/mpsrv.py index 73aaa17e..827f7c16 100644 --- a/copyparty/mpsrv.py +++ b/copyparty/mpsrv.py @@ -200,12 +200,16 @@ class MpSrv(object): proc.workload += 50 def debug_load_balancer(self): - while True: + last = "" + while self.procs: msg = "" for proc in self.procs: - msg += "{} \033[36m{}\033[0m ".format( + msg += "\033[1m{}\033[0;36m{:4}\033[0m ".format( len(proc.clients), proc.workload ) - print(msg) + if msg != last: + last = msg + print(msg) + time.sleep(0.1)