diff options
Diffstat (limited to 'routes/repo/download.go')
-rw-r--r-- | routes/repo/download.go | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/routes/repo/download.go b/routes/repo/download.go new file mode 100644 index 00000000..e9a29989 --- /dev/null +++ b/routes/repo/download.go @@ -0,0 +1,60 @@ +// 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 ( + "io" + "path" + + "github.com/gogits/git-module" + + "github.com/gogits/gogs/pkg/tool" + "github.com/gogits/gogs/pkg/context" + "github.com/gogits/gogs/pkg/setting" +) + +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] + } + + 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) + } +} |