diff options
-rwxr-xr-x | arch-proxy.py | 17 | ||||
-rw-r--r-- | upload-svr.go | 9 |
2 files changed, 21 insertions, 5 deletions
diff --git a/arch-proxy.py b/arch-proxy.py index 1ce6fa8..a456c77 100755 --- a/arch-proxy.py +++ b/arch-proxy.py @@ -31,6 +31,9 @@ class RequestHandler(http.server.BaseHTTPRequestHandler): if range_offset is None: code = 200 else: + if size is None: + raise BadRequest("Content-Length missing in upstream response" + " for range request") if range_offset >= size: # TODO need different status code raise BadRequest("416 Requested Range Not Satisfiable") @@ -41,7 +44,8 @@ class RequestHandler(http.server.BaseHTTPRequestHandler): self.log_message('"%s" %d %s %s', self.requestline, code, size, "HIT" if upstream is None else "MISS:%s" % (upstream,)) self.send_response_only(code) - self.send_header('Content-Length', size) + if size is not None: + self.send_header('Content-Length', size) for k, v in headers.items(): self.send_header(k, v) self.end_headers() @@ -83,8 +87,12 @@ class RequestHandler(http.server.BaseHTTPRequestHandler): mtime_out[0] = mtime except ValueError: self.log_error("Unable to parse Last-Modified header") - self.send_ok(int(r.headers['Content-Length']), response_headers, - upstream=upstream, range_offset=range_offset) + if 'Content-Length' in r.headers: + self.send_ok(int(r.headers['Content-Length']), response_headers, + upstream=upstream, range_offset=range_offset) + else: + self.send_ok(None, response_headers, + upstream=upstream, range_offset=range_offset) if not head_only: yield from r.iter_content(4096) @@ -159,6 +167,9 @@ class RequestHandler(http.server.BaseHTTPRequestHandler): try: # Try to open cached file and yield data from it stat_info = os.stat(path) + if stat_info.st_size == 0: + # Treat empty files as missing. + raise FileNotFoundError response_headers = {'Last-Modified': epoch_to_text(stat_info.st_mtime)} self.send_ok(stat_info.st_size, response_headers, diff --git a/upload-svr.go b/upload-svr.go index 9edb808..248b34c 100644 --- a/upload-svr.go +++ b/upload-svr.go @@ -20,7 +20,6 @@ import ( "path/filepath" "strconv" "strings" - "time" ) const ( @@ -351,7 +350,13 @@ func serveFile(w http.ResponseWriter, r *http.Request) { return } defer f.Close() - http.ServeContent(w, r, r.URL.Path, time.Time{}, f) + fileInfo, err := f.Stat() + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + log.Println(err) + return + } + http.ServeContent(w, r, r.URL.Path, fileInfo.ModTime(), f) } var ( |