gitea源码

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package helper
  4. import (
  5. "fmt"
  6. "io"
  7. "net/http"
  8. "net/url"
  9. packages_model "code.gitea.io/gitea/models/packages"
  10. "code.gitea.io/gitea/modules/log"
  11. "code.gitea.io/gitea/modules/setting"
  12. "code.gitea.io/gitea/services/context"
  13. )
  14. // ProcessErrorForUser logs the error and returns a user-error message for the end user.
  15. // If the status is http.StatusInternalServerError, the message is stripped for non-admin users in production.
  16. func ProcessErrorForUser(ctx *context.Context, status int, errObj any) string {
  17. var message string
  18. if err, ok := errObj.(error); ok {
  19. message = err.Error()
  20. } else if errObj != nil {
  21. message = fmt.Sprint(errObj)
  22. }
  23. if status == http.StatusInternalServerError {
  24. log.Log(2, log.ERROR, "Package registry API internal error: %d %s", status, message)
  25. if setting.IsProd && (ctx.Doer == nil || !ctx.Doer.IsAdmin) {
  26. message = "internal server error"
  27. }
  28. return message
  29. }
  30. log.Log(2, log.DEBUG, "Package registry API user error: %d %s", status, message)
  31. return message
  32. }
  33. // ServePackageFile the content of the package file
  34. // If the url is set it will redirect the request, otherwise the content is copied to the response.
  35. func ServePackageFile(ctx *context.Context, s io.ReadSeekCloser, u *url.URL, pf *packages_model.PackageFile, forceOpts ...*context.ServeHeaderOptions) {
  36. if u != nil {
  37. ctx.Redirect(u.String())
  38. return
  39. }
  40. defer s.Close()
  41. var opts *context.ServeHeaderOptions
  42. if len(forceOpts) > 0 {
  43. opts = forceOpts[0]
  44. } else {
  45. opts = &context.ServeHeaderOptions{
  46. Filename: pf.Name,
  47. LastModified: pf.CreatedUnix.AsLocalTime(),
  48. }
  49. }
  50. ctx.ServeContent(s, opts)
  51. }