diff options
Diffstat (limited to 'internal/route/repo/download.go')
-rw-r--r-- | internal/route/repo/download.go | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/internal/route/repo/download.go b/internal/route/repo/download.go new file mode 100644 index 00000000..88b75082 --- /dev/null +++ b/internal/route/repo/download.go @@ -0,0 +1,68 @@ +// Copyright 2014 The Gogs Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package repo + +import ( + "fmt" + "io" + "net/http" + "path" + + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/setting" + "gogs.io/gogs/internal/tool" +) + +func ServeData(c *context.Context, name string, reader io.Reader) error { + buf := make([]byte, 1024) + n, _ := reader.Read(buf) + if n >= 0 { + buf = buf[:n] + } + + commit, err := c.Repo.Commit.GetCommitByPath(c.Repo.TreePath) + if err != nil { + return fmt.Errorf("GetCommitByPath: %v", err) + } + c.Resp.Header().Set("Last-Modified", commit.Committer.When.Format(http.TimeFormat)) + + if !tool.IsTextFile(buf) { + if !tool.IsImageFile(buf) { + c.Resp.Header().Set("Content-Disposition", "attachment; filename=\""+name+"\"") + c.Resp.Header().Set("Content-Transfer-Encoding", "binary") + } + } else if !setting.Repository.EnableRawFileRenderMode || !c.QueryBool("render") { + c.Resp.Header().Set("Content-Type", "text/plain; charset=utf-8") + } + c.Resp.Write(buf) + _, err = io.Copy(c.Resp, reader) + return err +} + +func ServeBlob(c *context.Context, blob *git.Blob) error { + dataRc, err := blob.Data() + if err != nil { + return err + } + + return ServeData(c, path.Base(c.Repo.TreePath), dataRc) +} + +func SingleDownload(c *context.Context) { + blob, err := c.Repo.Commit.GetBlobByPath(c.Repo.TreePath) + if err != nil { + if git.IsErrNotExist(err) { + c.Handle(404, "GetBlobByPath", nil) + } else { + c.Handle(500, "GetBlobByPath", err) + } + return + } + if err = ServeBlob(c, blob); err != nil { + c.Handle(500, "ServeBlob", err) + } +} |