1 Commits

Author SHA1 Message Date
3ddfebcd24 Allow empty upload prefix
All checks were successful
Main workflow / Run unit tests (push) Successful in 38s
Main workflow / Build docker image (push) Successful in 56s
2023-06-17 13:54:59 +02:00
2 changed files with 68 additions and 12 deletions

View File

@@ -209,12 +209,14 @@ func handlePut(
} }
func newHandler(config *Config, client *minio.Client) http.HandlerFunc { func newHandler(config *Config, client *minio.Client) http.HandlerFunc {
subDir := config.UploadSubDir var subPath string
if subDir != "" { if config.UploadSubDir == "" || config.UploadSubDir == "/" {
subDir = "/" + strings.Trim(subDir, "/") + "/" subPath = "/"
} else {
subPath = "/" + strings.Trim(config.UploadSubDir, "/") + "/"
} }
getFilename := func(r *http.Request) string { getFilename := func(r *http.Request) string {
return strings.TrimPrefix(r.URL.Path, subDir) return strings.TrimPrefix(r.URL.Path, subPath)
} }
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
@@ -274,13 +276,12 @@ func loadConfig(filename string) (*Config, error) {
} }
for name, value := range map[string]string{ for name, value := range map[string]string{
"Address": config.Address, "Address": config.Address,
"Secret": config.Secret, "Secret": config.Secret,
"UploadSubDir": config.UploadSubDir, "S3Endpoint": config.S3Endpoint,
"S3Endpoint": config.S3Endpoint, "S3AccessKey": config.S3AccessKey,
"S3AccessKey": config.S3AccessKey, "S3SecretKey": config.S3SecretKey,
"S3SecretKey": config.S3SecretKey, "S3Bucket": config.S3Bucket,
"S3Bucket": config.S3Bucket,
} { } {
if value == "" { if value == "" {
return nil, fmt.Errorf("missing required config value %s", name) return nil, fmt.Errorf("missing required config value %s", name)
@@ -326,7 +327,13 @@ func main() {
log.Fatal().Err(err).Msg("failed to initialize s3 client") log.Fatal().Err(err).Msg("failed to initialize s3 client")
} }
http.HandleFunc("/"+config.UploadSubDir, newHandler(config, client)) var pattern string
if config.UploadSubDir == "" || config.UploadSubDir == "/" {
pattern = "/"
} else {
pattern = "/" + strings.TrimPrefix(config.UploadSubDir, "/")
}
http.HandleFunc(pattern, newHandler(config, client))
log.Info().Msgf("starting server on %s", config.Address) log.Info().Msgf("starting server on %s", config.Address)
if err := http.ListenAndServe(config.Address, nil); err != nil { if err := http.ListenAndServe(config.Address, nil); err != nil {
log.Fatal().Err(err).Msg("failed to start server") log.Fatal().Err(err).Msg("failed to start server")

View File

@@ -166,6 +166,32 @@ func TestUploadValid(t *testing.T) {
} }
} }
func TestUploadValidNoPrefix(t *testing.T) {
config := testConfig()
config.UploadSubDir = ""
client, err := initS3Client(config)
assert.NoError(t, err)
setupBucket(t, config, client)
defer teardownBucket(t, config, client)
f, err := os.ReadFile("../../catmetal.jpg")
assert.NoError(t, err)
req, err := http.NewRequest("PUT", "/catmetal.jpg", bytes.NewBuffer(f))
assert.NoError(t, err)
req.Header.Set("Content-Type", "image/jpeg")
q := req.URL.Query()
q.Set("v2", "26a2b6e27b451bf695f769c8cbb23f8856e80a1fb5963a831f1c79a19873365d")
req.URL.RawQuery = q.Encode()
rr := httptest.NewRecorder()
handler := http.HandlerFunc(newHandler(config, client))
handler.ServeHTTP(rr, req)
assert.Equal(t, http.StatusCreated, rr.Code)
}
func TestUploadMissingMAC(t *testing.T) { func TestUploadMissingMAC(t *testing.T) {
f, err := os.ReadFile("../../catmetal.jpg") f, err := os.ReadFile("../../catmetal.jpg")
assert.NoError(t, err) assert.NoError(t, err)
@@ -296,3 +322,26 @@ func TestDownloadOK(t *testing.T) {
}) })
} }
} }
func TestDownloadValidNoPrefix(t *testing.T) {
config := testConfig()
config.ProxyMode = true
config.UploadSubDir = ""
client, err := initS3Client(config)
assert.NoError(t, err)
setupBucket(t, config, client)
defer teardownBucket(t, config, client)
uploadFile(t, config, client)
req, err := http.NewRequest("GET", "/catmetal.jpg", nil)
assert.NoError(t, err)
rr := httptest.NewRecorder()
handler := http.HandlerFunc(newHandler(config, client))
handler.ServeHTTP(rr, req)
assert.Equal(t, http.StatusOK, rr.Code)
assert.Equal(t, "image/jpeg", rr.Header().Get("Content-Type"))
assert.Equal(t, "inline", rr.Header().Get("Content-Disposition"))
}