diff --git a/main.go b/main.go index 558f498..58000ad 100644 --- a/main.go +++ b/main.go @@ -58,11 +58,26 @@ func main() { app.Handle("GET /a/{postID}", wrapHandler(pages.HandlePost)) app.Handle("GET /a/{postID}/embed", wrapHandler(pages.HandleEmbed)) // app.Handle("GET /t/:tag.:type", pages.HandleTagRSS) - app.Handle("GET /t/{tag}", wrapHandler(pages.HandleTag)) + app.Handle("GET /t/{tag}", wrapHandler(func(w http.ResponseWriter, r *http.Request) error { + name, ext := utils.SplitNameExt(r.PathValue("tag")) + if ext != "" { + r.SetPathValue("tag", name[0:len(name)-1]) + r.SetPathValue("type", ext) + return pages.HandleTagRSS(w, r) + } + return pages.HandleTag(w, r) + })) app.Handle("GET /t/{tag}/{postID}", wrapHandler(pages.HandlePost)) app.Handle("GET /r/{sub}/{postID}", wrapHandler(pages.HandlePost)) - // app.Handle("GET /user/:userID.:type", pages.HandleUserRSS) - app.Handle("GET /user/{userID}", wrapHandler(pages.HandleUser)) + app.Handle("GET /user/{userID}", wrapHandler(func(w http.ResponseWriter, r *http.Request) error { + name, ext := utils.SplitNameExt(r.PathValue("userID")) + if ext != "" { + r.SetPathValue("userID", name[0:len(name)-1]) + r.SetPathValue("type", ext) + return pages.HandleUserRSS(w, r) + } + return pages.HandleUser(w, r) + })) app.Handle("GET /user/{userID}/favorites", wrapHandler(pages.HandleUserFavorites)) app.Handle("GET /user/{userID}/comments", wrapHandler(pages.HandleUserComments)) app.Handle("GET /user/{userID}/cover", wrapHandler(pages.HandleUserCover)) @@ -81,7 +96,9 @@ func main() { case component == "trending": return pages.HandleTrending(w, r) case strings.HasPrefix(component, "trending."): - // return pages.HandleTrendingRSS(w, r) + _, ext := utils.SplitNameExt(component) + r.SetPathValue("type", ext) + return pages.HandleTrendingRSS(w, r) case strings.HasSuffix(component, ".gifv"): r.SetPathValue("postID", component) return pages.HandleGifv(w, r) @@ -91,9 +108,8 @@ func main() { r.SetPathValue("postID", component) return pages.HandlePost(w, r) } - return nil })) - app.Handle("GET /stack/:baseName.:extension", wrapHandler(pages.HandleMedia)) + // app.Handle("GET /stack/:baseName.:extension", wrapHandler(pages.HandleMedia)) // matches anything with no more specific route app.Handle("GET /", wrapHandler(func(w http.ResponseWriter, r *http.Request) error { err := render.Render(w, "errors/404", nil) diff --git a/pages/rss.go b/pages/rss.go index d7b7890..e748b40 100644 --- a/pages/rss.go +++ b/pages/rss.go @@ -1,51 +1,54 @@ -//go:build fiber - package pages import ( + "mime" + "net/http" "time" "codeberg.org/rimgo/rimgo/api" "codeberg.org/rimgo/rimgo/utils" - "github.com/gofiber/fiber/v2" "github.com/gorilla/feeds" ) -func HandleTagRSS(c *fiber.Ctx) error { - utils.SetHeaders(c) +func HandleTagRSS(w http.ResponseWriter, r *http.Request) error { + utils.SetHeaders(w) - tag, err := ApiClient.FetchTag(c.Params("tag"), c.Query("sort"), "1") + tag, err := ApiClient.FetchTag(r.PathValue("tag"), r.URL.Query().Get("sort"), "1") if err != nil && err.Error() == "ratelimited by imgur" { - return c.Status(429).SendString("rate limited by imgur") + w.WriteHeader(429) + _, err := w.Write([]byte("rate limited by imgur")) + return err } if err != nil { return err } if tag.Display == "" { - return c.Status(404).SendString("tag not found") + w.WriteHeader(404) + _, err := w.Write([]byte("tag not found")) + return err } - instance := utils.GetInstanceUrl(c) + instance := utils.GetInstanceUrl(r) feed := &feeds.Feed{ Title: tag.Display + " on Imgur", - Link: &feeds.Link{Href: instance + "/t/" + c.Params("tag")}, + Link: &feeds.Link{Href: instance + "/t/" + r.PathValue("tag")}, Created: time.Now(), } - return handleFeed(c, instance, feed, tag.Posts) + return handleFeed(w, r, instance, feed, tag.Posts) } -func HandleTrendingRSS(c *fiber.Ctx) error { - utils.SetHeaders(c) +func HandleTrendingRSS(w http.ResponseWriter, r *http.Request) error { + utils.SetHeaders(w) - section := c.Query("section") + section := r.URL.Query().Get("section") switch section { case "hot", "new", "top": default: section = "hot" } - sort := c.Query("sort") + sort := r.URL.Query().Get("sort") switch sort { case "newest", "best", "popular": default: @@ -57,7 +60,7 @@ func HandleTrendingRSS(c *fiber.Ctx) error { return err } - instance := utils.GetInstanceUrl(c) + instance := utils.GetInstanceUrl(r) feed := &feeds.Feed{ Title: "Trending on Imgur", @@ -65,24 +68,23 @@ func HandleTrendingRSS(c *fiber.Ctx) error { Created: time.Now(), } - return handleFeed(c, instance, feed, results) + return handleFeed(w, r, instance, feed, results) } -func HandleUserRSS(c *fiber.Ctx) error { - utils.SetHeaders(c) +func HandleUserRSS(w http.ResponseWriter, r *http.Request) error { + utils.SetHeaders(w) - user := c.Params("userID") + user := r.PathValue("userID") submissions, err := ApiClient.FetchSubmissions(user, "newest", "1") if err != nil && err.Error() == "ratelimited by imgur" { - c.Status(429) - return utils.RenderError(c, 429) + return utils.RenderError(w, r, 429) } if err != nil { return err } - instance := utils.GetInstanceUrl(c) + instance := utils.GetInstanceUrl(r) feed := &feeds.Feed{ Title: user + " on Imgur", @@ -90,10 +92,10 @@ func HandleUserRSS(c *fiber.Ctx) error { Created: time.Now(), } - return handleFeed(c, instance, feed, submissions) + return handleFeed(w, r, instance, feed, submissions) } -func handleFeed(c *fiber.Ctx, instance string, feed *feeds.Feed, posts []api.Submission) error { +func handleFeed(w http.ResponseWriter, r *http.Request, instance string, feed *feeds.Feed, posts []api.Submission) error { feed.Items = []*feeds.Item{} for _, post := range posts { @@ -112,27 +114,30 @@ func handleFeed(c *fiber.Ctx, instance string, feed *feeds.Feed, posts []api.Sub feed.Items = append(feed.Items, item) } - c.Type(c.Params("type")) - switch c.Params("type") { + w.Header().Set("Content-Type", mime.TypeByExtension("."+r.PathValue("type"))) + switch r.PathValue("type") { case "atom": body, err := feed.ToAtom() if err != nil { return err } - return c.SendString(body) + w.Write([]byte(body)) case "json": body, err := feed.ToJSON() if err != nil { return err } - return c.JSON(body) + w.Write([]byte(body)) case "rss": body, err := feed.ToRss() if err != nil { return err } - return c.SendString(body) + w.Write([]byte(body)) default: - return c.Status(400).SendString("invalid type") + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(400) + w.Write([]byte("invalid type")) } + return nil } diff --git a/utils/splitNameExt.go b/utils/splitNameExt.go new file mode 100644 index 0000000..fc87bd2 --- /dev/null +++ b/utils/splitNameExt.go @@ -0,0 +1,16 @@ +package utils + +func SplitNameExt(path string) (name, ext string) { + name, ext = path, "" + for range 5 { + if len(name) == 0 || name[len(name)-1] == '.' || name[len(name)-1] == '/' { + break + } + name = name[:len(name)-1] + ext = path[len(name):] + } + if len(name) == 0 || name[len(name)-1] != '.' { + return path, "" + } + return +}