get_procfile.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package gitinstallation
  2. import (
  3. "context"
  4. "net/http"
  5. "regexp"
  6. "strings"
  7. "github.com/google/go-github/v41/github"
  8. "github.com/porter-dev/porter/api/server/authz"
  9. "github.com/porter-dev/porter/api/server/handlers"
  10. "github.com/porter-dev/porter/api/server/shared"
  11. "github.com/porter-dev/porter/api/server/shared/apierrors"
  12. "github.com/porter-dev/porter/api/server/shared/commonutils"
  13. "github.com/porter-dev/porter/api/server/shared/config"
  14. "github.com/porter-dev/porter/api/types"
  15. )
  16. var procfileRegex = regexp.MustCompile("^([A-Za-z0-9_]+):\\s*(.+)$")
  17. type GithubGetProcfileHandler struct {
  18. handlers.PorterHandlerReadWriter
  19. authz.KubernetesAgentGetter
  20. }
  21. func NewGithubGetProcfileHandler(
  22. config *config.Config,
  23. decoderValidator shared.RequestDecoderValidator,
  24. writer shared.ResultWriter,
  25. ) *GithubGetProcfileHandler {
  26. return &GithubGetProcfileHandler{
  27. PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
  28. }
  29. }
  30. func (c *GithubGetProcfileHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  31. request := &types.GetProcfileRequest{}
  32. ok := c.DecodeAndValidate(w, r, request)
  33. if !ok {
  34. return
  35. }
  36. owner, name, ok := commonutils.GetOwnerAndNameParams(c, w, r)
  37. if !ok {
  38. return
  39. }
  40. branch, ok := commonutils.GetBranchParam(c, w, r)
  41. if !ok {
  42. return
  43. }
  44. client, err := GetGithubAppClientFromRequest(c.Config(), r)
  45. if err != nil {
  46. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  47. return
  48. }
  49. resp, _, _, err := client.Repositories.GetContents(
  50. context.TODO(),
  51. owner,
  52. name,
  53. request.Path,
  54. &github.RepositoryContentGetOptions{
  55. Ref: branch,
  56. },
  57. )
  58. if err != nil {
  59. http.NotFound(w, r)
  60. return
  61. }
  62. fileData, err := resp.GetContent()
  63. if err != nil {
  64. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  65. return
  66. }
  67. parsedContents := make(types.GetProcfileResponse)
  68. // parse the procfile information
  69. for _, line := range strings.Split(fileData, "\n") {
  70. if matches := procfileRegex.FindStringSubmatch(line); matches != nil {
  71. parsedContents[matches[1]] = matches[2]
  72. }
  73. }
  74. c.WriteResult(w, r, parsedContents)
  75. }