diff --git a/copyparty/httpcli.py b/copyparty/httpcli.py index 45df3b00..eb12b48e 100644 --- a/copyparty/httpcli.py +++ b/copyparty/httpcli.py @@ -112,7 +112,7 @@ class HttpCli(object): self.http_ver = "HTTP/1.1" # self.log("pebkac at httpcli.run #1: " + repr(ex)) self.keepalive = False - self.loud_reply(unicode(ex), status=ex.code) + self.loud_reply(unicode(ex), status=ex.code, volsan=True) return self.keepalive # time.sleep(0.4) @@ -224,19 +224,22 @@ class HttpCli(object): else: raise Pebkac(400, 'invalid HTTP mode "{0}"'.format(self.mode)) - except Pebkac as ex: + except Exception as ex: + pex = ex + if not hasattr(ex, "code"): + pex = Pebkac(500) + try: - # self.log("pebkac at httpcli.run #2: " + repr(ex)) post = self.mode in ["POST", "PUT"] or "content-length" in self.headers - if not self._check_nonfatal(ex, post): + if not self._check_nonfatal(pex, post): self.keepalive = False - self.log("{}\033[0m, {}".format(str(ex), self.vpath), 3) + self.log("{}\033[0m, {}".format(min_ex(), self.vpath), 3) msg = "
{}\r\nURL: {}\r\n".format(str(ex), self.vpath)
if self.hint:
msg += "hint: {}\r\n".format(self.hint)
- self.reply(msg.encode("utf-8", "replace"), status=ex.code)
+ self.reply(msg.encode("utf-8", "replace"), status=pex.code, volsan=True)
return self.keepalive
except Pebkac:
return False
@@ -269,8 +272,12 @@ class HttpCli(object):
except:
raise Pebkac(400, "client d/c while replying headers")
- def reply(self, body, status=200, mime=None, headers=None):
+ def reply(self, body, status=200, mime=None, headers=None, volsan=False):
# TODO something to reply with user-supplied values safely
+
+ if volsan:
+ body = vol_san(self.asrv.vfs.all_vols.values(), body)
+
self.send_headers(len(body), status, mime, headers)
try:
@@ -1029,7 +1036,7 @@ class HttpCli(object):
raise
except Pebkac as ex:
- errmsg = unicode(ex)
+ errmsg = volsan(self.asrv.vfs.all_vols.values(), unicode(ex))
td = max(0.1, time.time() - t0)
sz_total = sum(x[0] for x in files)
diff --git a/copyparty/util.py b/copyparty/util.py
index 016b6e96..89c430f9 100644
--- a/copyparty/util.py
+++ b/copyparty/util.py
@@ -344,6 +344,15 @@ def log_thrs(log, ival, name):
log(name, "\033[0m \033[33m".join(tv), 3)
+def vol_san(vols, txt):
+ for vol in vols:
+ txt = txt.replace(
+ vol.realpath.encode("utf-8"), vol.vpath.encode("utf-8")
+ )
+
+ return txt
+
+
def min_ex():
et, ev, tb = sys.exc_info()
tb = traceback.extract_tb(tb)