diff --git a/go.mod b/go.mod index a4f5a04..564573d 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/ihexxa/gocfg v0.0.0-20201206115732-ab537e3b1086 github.com/ihexxa/multipart v0.0.0-20201207132919-72f6e0e58b25 github.com/jessevdk/go-flags v1.4.0 + github.com/mitchellh/gox v1.0.1 // indirect github.com/natefinch/lumberjack v2.0.0+incompatible github.com/parnurzeal/gorequest v0.2.16 github.com/pkg/errors v0.9.1 // indirect diff --git a/go.sum b/go.sum index 70c0f80..0aa6860 100644 --- a/go.sum +++ b/go.sum @@ -34,6 +34,8 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/hashicorp/go-version v1.0.0 h1:21MVWPKDphxa7ineQQTrCU5brh7OuVVAzGOCnnCPtE8= +github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/ihexxa/gocfg v0.0.0-20201206115732-ab537e3b1086 h1:1IzU4pzD8NyEHgJGLOS3Iq56b0zlAylRwbJq+08PD9Y= github.com/ihexxa/gocfg v0.0.0-20201206115732-ab537e3b1086/go.mod h1:oqDTq1ywx4Qi9DdhFwwMHoPCYv6Txrfj2SY5WWcgiJs= github.com/ihexxa/multipart v0.0.0-20201207132919-72f6e0e58b25 h1:gQCaP2qoFWCTz17jj9EUhE/plgqJwk3nHbcS4RHQYCw= @@ -57,6 +59,10 @@ github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgx github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mitchellh/gox v1.0.1 h1:x0jD3dcHk9a9xPSDN6YEL4xL6Qz0dvNYm8yZqui5chI= +github.com/mitchellh/gox v1.0.1/go.mod h1:ED6BioOGXMswlXa2zxfh/xdd5QhwYliBFn9V18Ap4z4= +github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= diff --git a/src/handlers/fileshdr/handlers.go b/src/handlers/fileshdr/handlers.go index 88d5905..8df6f26 100644 --- a/src/handlers/fileshdr/handlers.go +++ b/src/handlers/fileshdr/handlers.go @@ -396,9 +396,13 @@ func (h *FileHandlers) Download(c *gin.Context) { } // reader will be closed by multipart response writer + extraHeaders := map[string]string{ + "Content-Disposition": fmt.Sprintf(`attachment; filename="%s"`, info.Name()), + } + // respond to normal requests if ifRangeVal != "" || rangeVal == "" { - c.DataFromReader(200, info.Size(), contentType, r, map[string]string{}) + c.DataFromReader(200, info.Size(), contentType, r, extraHeaders) return } @@ -417,9 +421,6 @@ func (h *FileHandlers) Download(c *gin.Context) { go mw.Write() - extraHeaders := map[string]string{ - "Content-Disposition": fmt.Sprintf(`attachment; filename="%s"`, info.Name()), - } // it takes the \r\n before body into account, so contentLength+2 c.DataFromReader(206, contentLength+2, contentType, mw, extraHeaders) } diff --git a/src/server/server.go b/src/server/server.go index 667abff..82f2268 100644 --- a/src/server/server.go +++ b/src/server/server.go @@ -135,7 +135,7 @@ func initHandlers(router *gin.Engine, cfg gocfg.ICfg, deps *depidx.Deps) (*gin.E return nil, err } - deps.Log().Info("user (%s) is created\n", adminName) + deps.Log().Infof("user (%s) is created\n", adminName) } fileHdrs, err := fileshdr.NewFileHandlers(cfg, deps) diff --git a/src/server/server_files_test.go b/src/server/server_files_test.go index eebfdcb..7b66020 100644 --- a/src/server/server_files_test.go +++ b/src/server/server_files_test.go @@ -98,13 +98,21 @@ func TestFileHandlers(t *testing.T) { }) } + fileName := path.Base(filePath) + contentDispositionHeader := res.Header.Get("Content-Disposition") if len(errs) > 0 { t.Error(errs) return false - } else if res.StatusCode != 200 && res.StatusCode != 206 { + } + if res.StatusCode != 200 && res.StatusCode != 206 { t.Error(res.StatusCode) return false } + if contentDispositionHeader != fmt.Sprintf(`attachment; filename="%s"`, fileName) { + t.Errorf("incorrect Content-Disposition header: %s", contentDispositionHeader) + return false + } + switch rd { case 0: if body != content { diff --git a/src/server/test_helpers.go b/src/server/test_helpers.go index ddf9b81..154740a 100644 --- a/src/server/test_helpers.go +++ b/src/server/test_helpers.go @@ -38,7 +38,7 @@ func waitForReady(addr string) bool { for retry > 0 { _, _, errs := setCl.Health() if len(errs) > 0 { - time.Sleep(100) + time.Sleep(100 * time.Millisecond) } else { return true }