From fb3a497119222c20c523bc09a658f71dcff28d49 Mon Sep 17 00:00:00 2001 From: Rob Watson Date: Thu, 9 Dec 2021 04:05:34 +0100 Subject: [PATCH] Add base URL to serve file system store objects over HTTP --- backend/.env.example | 7 ++++- backend/cmd/clipper/main.go | 2 +- backend/config/config.go | 55 +++++++++++++++++++++---------------- backend/filestore/fs.go | 3 +- 4 files changed, 40 insertions(+), 27 deletions(-) diff --git a/backend/.env.example b/backend/.env.example index cd14011..f42d85d 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -15,7 +15,12 @@ ASSETS_HTTP_ROOT= # NOTE: Enabling the file system store will disable serving assets over HTTP. FILE_STORE=filesystem -# The base path for the file system store. + +# The base URL used for serving file store assets. +# Example: http://localhost:8888 +FILE_STORE_HTTP_BASE_URL= + +# The root directory for the file system store. FILE_STORE_HTTP_ROOT=data/ # AWS credentials, required for the S3 store. diff --git a/backend/cmd/clipper/main.go b/backend/cmd/clipper/main.go index 2df4c87..bd9c108 100644 --- a/backend/cmd/clipper/main.go +++ b/backend/cmd/clipper/main.go @@ -101,5 +101,5 @@ func buildFileStore(ctx context.Context, c config.Config, logger *zap.Logger) (m } logger.Info("Initializing file sysytem store") - return filestore.NewFileSystemStore(c.FileStoreHTTPRoot, "/") + return filestore.NewFileSystemStore(c.FileStoreHTTPRoot, c.FileStoreHTTPBaseURL) } diff --git a/backend/config/config.go b/backend/config/config.go index 568a120..01144f6 100644 --- a/backend/config/config.go +++ b/backend/config/config.go @@ -21,18 +21,19 @@ const ( ) type Config struct { - Environment Environment - BindAddr string - TLSCertFile string - TLSKeyFile string - DatabaseURL string - FileStore FileStore - FileStoreHTTPRoot string - AWSAccessKeyID string - AWSSecretAccessKey string - AWSRegion string - S3Bucket string - AssetsHTTPRoot string + Environment Environment + BindAddr string + TLSCertFile string + TLSKeyFile string + DatabaseURL string + FileStore FileStore + FileStoreHTTPRoot string + FileStoreHTTPBaseURL string + AWSAccessKeyID string + AWSSecretAccessKey string + AWSRegion string + S3Bucket string + AssetsHTTPRoot string } func NewFromEnv() (Config, error) { @@ -76,6 +77,11 @@ func NewFromEnv() (Config, error) { return Config{}, fmt.Errorf("invalid FILE_STORE value: %s", fileStoreString) } + fileStoreHTTPBaseURL := os.Getenv("FILE_STORE_HTTP_BASE_URL") + if fileStoreHTTPBaseURL == "" { + fileStoreHTTPBaseURL = "/" + } + var awsAccessKeyID, awsSecretAccessKey, awsRegion, s3Bucket, fileStoreHTTPRoot string if fileStore == S3Store { awsAccessKeyID = os.Getenv("AWS_ACCESS_KEY_ID") @@ -106,17 +112,18 @@ func NewFromEnv() (Config, error) { assetsHTTPRoot := os.Getenv("ASSETS_HTTP_ROOT") return Config{ - Environment: env, - BindAddr: bindAddr, - TLSCertFile: tlsCertFile, - TLSKeyFile: tlsKeyFile, - DatabaseURL: databaseURL, - FileStore: fileStore, - AWSAccessKeyID: awsAccessKeyID, - AWSSecretAccessKey: awsSecretAccessKey, - AWSRegion: awsRegion, - S3Bucket: s3Bucket, - AssetsHTTPRoot: assetsHTTPRoot, - FileStoreHTTPRoot: fileStoreHTTPRoot, + Environment: env, + BindAddr: bindAddr, + TLSCertFile: tlsCertFile, + TLSKeyFile: tlsKeyFile, + DatabaseURL: databaseURL, + FileStore: fileStore, + AWSAccessKeyID: awsAccessKeyID, + AWSSecretAccessKey: awsSecretAccessKey, + AWSRegion: awsRegion, + S3Bucket: s3Bucket, + AssetsHTTPRoot: assetsHTTPRoot, + FileStoreHTTPRoot: fileStoreHTTPRoot, + FileStoreHTTPBaseURL: fileStoreHTTPBaseURL, }, nil } diff --git a/backend/filestore/fs.go b/backend/filestore/fs.go index af9a66a..3ab6a90 100644 --- a/backend/filestore/fs.go +++ b/backend/filestore/fs.go @@ -63,7 +63,8 @@ func (s *FileSystemStore) GetObjectWithRange(ctx context.Context, key string, st // GetURL returns an HTTP URL for the provided file path. func (s *FileSystemStore) GetURL(ctx context.Context, key string) (string, error) { - url := url.URL{} + var url url.URL + url.Scheme = s.baseURL.Scheme url.Host = s.baseURL.Host url.Path = fmt.Sprintf("%s%s", s.baseURL.Path, key) return url.String(), nil