This repository has no description
1package storage
2
3import (
4 "context"
5 "errors"
6 "fmt"
7 "io"
8 "path/filepath"
9 "regexp"
10 "strings"
11
12 "tangled.org/core/spindle/config"
13)
14
15var ErrNotExist = errors.New("storage: object does not exist")
16
17type Storage interface {
18 Get(ctx context.Context, key string) (io.ReadCloser, error)
19 Put(ctx context.Context, key string, r io.Reader) error
20 Delete(ctx context.Context, key string) error
21}
22
23var keyRe = regexp.MustCompile(`^[A-Za-z0-9][A-Za-z0-9._:/@%+=-]{0,511}$`)
24
25func ValidateKey(key string) error {
26 if !keyRe.MatchString(key) {
27 return fmt.Errorf("storage: invalid key %q", key)
28 }
29 for _, seg := range strings.Split(key, "/") {
30 if seg == "" || seg == "." || seg == ".." {
31 return fmt.Errorf("storage: invalid key %q", key)
32 }
33 }
34 return nil
35}
36
37func New(ctx context.Context, cfg *config.Config) (Storage, error) {
38 switch cfg.Cache.Backend {
39 case "":
40 return nil, nil
41 case "disk":
42 dir := cfg.Cache.DiskDir
43 if dir == "" {
44 dir = filepath.Join(filepath.Dir(cfg.Server.DBPath), "cache")
45 }
46 return NewDisk(dir)
47 case "s3":
48 return NewS3(ctx, cfg.Cache.S3Bucket, cfg.Cache.S3Prefix)
49 default:
50 return nil, fmt.Errorf("storage: unknown backend %q", cfg.Cache.Backend)
51 }
52}