package main import ( "code.gitea.io/sdk/gitea" "fmt" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/recover" "github.com/kpango/glg" "sync" ) type Channel int const ( Stable Channel = iota Prerelease ) type Attachement struct { User string Repo string Tag string Filename string Channel Channel } type RegionCounter struct { RegionCount map[string]int sync.RWMutex } const giteaURL = "https://git.entr0py.de" func getAttachementURL(attachement Attachement) (string, error) { client, err := gitea.NewClient(giteaURL) if err != nil { return "", fmt.Errorf("Failed to create gitea client: %v") } var release *gitea.Release if attachement.Tag != "" { release, _, err = client.GetReleaseByTag(attachement.User, attachement.Repo, attachement.Tag) if err != nil { return "", fmt.Errorf("Failed to get release by tag: %v") } } else { isPrerelease := false if attachement.Channel == Prerelease { isPrerelease = true } releases, _, err := client.ListReleases(attachement.User, attachement.Repo, gitea.ListReleasesOptions{IsPreRelease: &isPrerelease}) if err != nil { return "", fmt.Errorf("Failed to get releases: %v") } if len(releases) == 0 { return "", fmt.Errorf("no release found") } release = releases[0] } for _, a := range release.Attachments { if a.Name == attachement.Filename { return a.DownloadURL, nil } } return "", fmt.Errorf("no matching attachement found") } func (r *RegionCounter) countRegion(region string) { glg.Infof("Region %s", region) glg.Debugf("%+v", r.RegionCount) if region == "" { return } _, ok := r.RegionCount[region] if !ok { glg.Info("New region") r.RegionCount[region] = 1 glg.Debugf("%+v", r.RegionCount) return } r.Lock() defer r.Unlock() r.RegionCount[region]++ glg.Debugf("%+v", r.RegionCount) } func main() { regionCounter := &RegionCounter{ RegionCount: make(map[string]int), } app := fiber.New(fiber.Config{ GETOnly: true, ServerHeader: "Fiber", AppName: "Gitea Attachement Proxy", }) app.Use(recover.New()) app.Get("/:user/:repo/releases/download/latest/:name", func(c *fiber.Ctx) error { glg.Debugf("%+v", map[string]string{"user": c.Params("user"), "repo": c.Params("repo"), "name": c.Params("name")}) attachement := Attachement{ User: c.Params("user"), Repo: c.Params("repo"), Filename: c.Params("name"), Channel: Stable, } url, err := getAttachementURL(attachement) if err != nil { glg.Debug(err) c.SendString(err.Error()) c.SendStatus(404) return nil } go regionCounter.countRegion(c.GetReqHeaders()["Fly-Region"]) c.Redirect(url, 307) return nil }) app.Get("/:user/:repo/releases/download/latest\\::channel/:name", func(c *fiber.Ctx) error { glg.Debugf("%+v", map[string]string{"user": c.Params("user"), "repo": c.Params("repo"), "name": c.Params("name"), "channel": c.Params("channel")}) channel := Stable if c.Params("channel") == "prerelease" { channel = Prerelease } attachement := Attachement{ User: c.Params("user"), Repo: c.Params("repo"), Filename: c.Params("name"), Channel: channel, } url, err := getAttachementURL(attachement) if err != nil { glg.Debug(err) c.SendString(err.Error()) c.SendStatus(404) return nil } go regionCounter.countRegion(c.GetReqHeaders()["Fly-Region"]) c.Redirect(url, 307) return nil }) app.Get("/:user/:repo/releases/download/tag\\::tag/:name", func(c *fiber.Ctx) error { glg.Debugf("%+v", map[string]string{"user": c.Params("user"), "repo": c.Params("repo"), "name": c.Params("name"), "tag": c.Params("tag")}) attachement := Attachement{ User: c.Params("user"), Repo: c.Params("repo"), Filename: c.Params("name"), Tag: c.Params("tag"), } url, err := getAttachementURL(attachement) if err != nil { glg.Debug(err) c.SendString(err.Error()) c.SendStatus(404) return nil } go regionCounter.countRegion(c.GetReqHeaders()["Fly-Region"]) c.Redirect(url, 307) return nil }) app.Get("/regions", func(c *fiber.Ctx) error { regionCounter.RLock() defer regionCounter.RUnlock() c.JSON(regionCounter.RegionCount) glg.Debugf("%+v", regionCounter.RegionCount) return nil }) app.Listen(":8080") }