about summary refs log tree commit diff
path: root/tools/nixery/storage/filesystem.go
diff options
context:
space:
mode:
Diffstat (limited to 'tools/nixery/storage/filesystem.go')
-rw-r--r--tools/nixery/storage/filesystem.go17
1 files changed, 15 insertions, 2 deletions
diff --git a/tools/nixery/storage/filesystem.go b/tools/nixery/storage/filesystem.go
index bd757587b4..2be3457f32 100644
--- a/tools/nixery/storage/filesystem.go
+++ b/tools/nixery/storage/filesystem.go
@@ -23,6 +23,7 @@ import (
 	"os"
 	"path"
 
+	"github.com/pkg/xattr"
 	log "github.com/sirupsen/logrus"
 )
 
@@ -49,8 +50,7 @@ func (b *FSBackend) Name() string {
 	return fmt.Sprintf("Filesystem (%s)", b.path)
 }
 
-// TODO(tazjin): Implement support for persisting content-types for the filesystem backend.
-func (b *FSBackend) Persist(ctx context.Context, key, _type string, f Persister) (string, int64, error) {
+func (b *FSBackend) Persist(ctx context.Context, key, contentType string, f Persister) (string, int64, error) {
 	full := path.Join(b.path, key)
 	dir := path.Dir(full)
 	err := os.MkdirAll(dir, 0755)
@@ -66,6 +66,12 @@ func (b *FSBackend) Persist(ctx context.Context, key, _type string, f Persister)
 	}
 	defer file.Close()
 
+	err = xattr.Set(full, "user.mime_type", []byte(contentType))
+	if err != nil {
+		log.WithError(err).WithField("file", full).Error("failed to store file type in xattrs")
+		return "", 0, err
+	}
+
 	return f(file)
 }
 
@@ -92,6 +98,13 @@ func (b *FSBackend) Serve(digest string, r *http.Request, w http.ResponseWriter)
 		"path":   p,
 	}).Info("serving blob from filesystem")
 
+	contentType, err := xattr.Get(p, "user.mime_type")
+	if err != nil {
+		log.WithError(err).WithField("file", p).Error("failed to read file type from xattrs")
+		return err
+	}
+	w.Header().Add("Content-Type", string(contentType))
+
 	http.ServeFile(w, r, p)
 	return nil
 }