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)