in internal/serving/disk/reader.go [220:267]
func (reader *Reader) serveFile(ctx context.Context, w http.ResponseWriter, r *http.Request, root vfs.Root, origPath, sha string, accessControl bool) bool {
defer slowlogs.Recorder(r.Context(), "reader.serveFile")()
fullPath := reader.handleContentEncoding(ctx, w, r, root, origPath)
file, err := root.Open(ctx, fullPath)
if err != nil {
httperrors.Serve500WithRequest(w, r, "root.Open", err)
return true
}
defer file.Close()
fi, err := root.Lstat(ctx, fullPath)
if err != nil {
httperrors.Serve500WithRequest(w, r, "root.Lstat", err)
return true
}
ce := w.Header().Get("Content-Encoding")
w.Header().Set("ETag", fmt.Sprintf("%q", etag(ce, sha)))
if !accessControl {
// Set caching headers
w.Header().Set("Cache-Control", "max-age=600")
w.Header().Set("Expires", time.Now().Add(10*time.Minute).Format(time.RFC1123))
}
contentType, err := reader.detectContentType(ctx, root, origPath)
if err != nil {
httperrors.Serve500WithRequest(w, r, "detectContentType", err)
return true
}
w.Header().Set("Content-Type", contentType)
reader.fileSizeMetric.WithLabelValues(reader.vfs.Name()).Observe(float64(fi.Size()))
// Support vfs.SeekableFile if available (uncompressed files)
if rs, ok := file.(vfs.SeekableFile); ok {
http.ServeContent(w, r, origPath, fi.ModTime(), rs)
} else {
w.Header().Set("Content-Length", strconv.FormatInt(fi.Size(), 10))
vfsServing.ServeCompressedFile(w, r, fi.ModTime(), file)
}
return true
}