1
0

download.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package repo
  2. import (
  3. "net/http"
  4. "path"
  5. "github.com/cockroachdb/errors"
  6. "github.com/gogs/git-module"
  7. "gogs.io/gogs/internal/conf"
  8. "gogs.io/gogs/internal/context"
  9. "gogs.io/gogs/internal/gitutil"
  10. "gogs.io/gogs/internal/tool"
  11. )
  12. func serveData(c *context.Context, name string, data []byte) error {
  13. commit, err := c.Repo.Commit.CommitByPath(git.CommitByRevisionOptions{Path: c.Repo.TreePath})
  14. if err != nil {
  15. return errors.Newf("get commit by path %q: %v", c.Repo.TreePath, err)
  16. }
  17. c.Resp.Header().Set("Last-Modified", commit.Committer.When.Format(http.TimeFormat))
  18. if !tool.IsTextFile(data) {
  19. if !tool.IsImageFile(data) {
  20. c.Resp.Header().Set("Content-Disposition", "attachment; filename=\""+name+"\"")
  21. c.Resp.Header().Set("Content-Transfer-Encoding", "binary")
  22. }
  23. } else if !conf.Repository.EnableRawFileRenderMode || !c.QueryBool("render") {
  24. c.Resp.Header().Set("Content-Type", "text/plain; charset=utf-8")
  25. }
  26. if _, err := c.Resp.Write(data); err != nil {
  27. return errors.Newf("write buffer to response: %v", err)
  28. }
  29. return nil
  30. }
  31. func ServeBlob(c *context.Context, blob *git.Blob) error {
  32. p, err := blob.Bytes()
  33. if err != nil {
  34. return err
  35. }
  36. return serveData(c, path.Base(c.Repo.TreePath), p)
  37. }
  38. func SingleDownload(c *context.Context) {
  39. blob, err := c.Repo.Commit.Blob(c.Repo.TreePath)
  40. if err != nil {
  41. c.NotFoundOrError(gitutil.NewError(err), "get blob")
  42. return
  43. }
  44. if err = ServeBlob(c, blob); err != nil {
  45. c.Error(err, "serve blob")
  46. return
  47. }
  48. }