X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/dfe0ec7bfec3fd72cd40d3962e5c8af08d2413d2..353eb4f4c4fb52e7f2a1c9aaad93e9d6bf0088f4:/services/keep-web/handler.go diff --git a/services/keep-web/handler.go b/services/keep-web/handler.go index 11d0d96b29..db7517adc6 100644 --- a/services/keep-web/handler.go +++ b/services/keep-web/handler.go @@ -4,14 +4,14 @@ import ( "fmt" "html" "io" - "mime" "net/http" "net/url" "os" - "regexp" + "path" "strconv" "strings" "sync" + "time" "git.curoverse.com/arvados.git/sdk/go/arvadosclient" "git.curoverse.com/arvados.git/sdk/go/auth" @@ -335,51 +335,15 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) { } defer rdr.Close() - basenamePos := strings.LastIndex(filename, "/") - if basenamePos < 0 { - basenamePos = 0 - } - extPos := strings.LastIndex(filename, ".") - if extPos > basenamePos { - // Now extPos is safely >= 0. - if t := mime.TypeByExtension(filename[extPos:]); t != "" { - w.Header().Set("Content-Type", t) - } - } - if rdr, ok := rdr.(keepclient.ReadCloserWithLen); ok { - w.Header().Set("Content-Length", fmt.Sprintf("%d", rdr.Len())) - } + basename := path.Base(filename) + applyContentDispositionHdr(w, r, basename, attachment) - applyContentDispositionHdr(w, r, filename[basenamePos:], attachment) - rangeRdr, statusCode := applyRangeHdr(w, r, rdr) - - w.WriteHeader(statusCode) - _, err = io.Copy(w, rangeRdr) + modstr, _ := collection["modified_at"].(string) + modtime, err := time.Parse(time.RFC3339Nano, modstr) if err != nil { - statusCode, statusText = http.StatusBadGateway, err.Error() - } -} - -var rangeRe = regexp.MustCompile(`^bytes=0-([0-9]*)$`) - -func applyRangeHdr(w http.ResponseWriter, r *http.Request, rdr keepclient.ReadCloserWithLen) (io.Reader, int) { - w.Header().Set("Accept-Ranges", "bytes") - hdr := r.Header.Get("Range") - fields := rangeRe.FindStringSubmatch(hdr) - if fields == nil { - return rdr, http.StatusOK - } - rangeEnd, err := strconv.ParseInt(fields[1], 10, 64) - if err != nil { - // Empty or too big for int64 == send entire content - return rdr, http.StatusOK - } - if uint64(rangeEnd) >= rdr.Len() { - return rdr, http.StatusOK + modtime = time.Now() } - w.Header().Set("Content-Length", fmt.Sprintf("%d", rangeEnd+1)) - w.Header().Set("Content-Range", fmt.Sprintf("bytes %d-%d/%d", 0, rangeEnd, rdr.Len())) - return &io.LimitedReader{R: rdr, N: rangeEnd + 1}, http.StatusPartialContent + http.ServeContent(w, r, basename, modtime, rdr) } func applyContentDispositionHdr(w http.ResponseWriter, r *http.Request, filename string, isAttachment bool) {