port most routes

This commit is contained in:
orangix
2026-01-19 18:57:06 +01:00
parent 04fbc7f5f4
commit cd4a36c9f7
17 changed files with 310 additions and 213 deletions

View File

@@ -1,54 +1,58 @@
package pages
import (
"io"
"mime"
"net/http"
"strings"
"codeberg.org/rimgo/rimgo/utils"
"github.com/gofiber/fiber/v2"
)
func HandleMedia(c *fiber.Ctx) error {
c.Set("Cache-Control", "public,max-age=31557600")
c.Set("Content-Security-Policy", "default-src 'none'; style-src 'self'; img-src 'self'")
if strings.HasPrefix(c.Path(), "/stack") {
return handleMedia(c, "https://i.stack.imgur.com/"+strings.ReplaceAll(c.Params("baseName"), "stack/", "")+"."+c.Params("extension"))
func HandleMedia(w http.ResponseWriter, r *http.Request) error {
w.Header().Set("Cache-Control", "public,max-age=31557600")
w.Header().Set("Content-Security-Policy", "default-src 'none'; style-src 'self'; img-src 'self'")
splitName := strings.SplitN(r.PathValue("component"), ".", 2)
baseName, extension := splitName[0], splitName[1]
if strings.HasPrefix(r.URL.Path, "/stack") {
return handleMedia(w, r, "https://i.stack.imgur.com/"+strings.ReplaceAll(baseName, "stack/", "")+"."+extension)
} else {
return handleMedia(c, "https://i.imgur.com/"+c.Params("baseName")+"."+c.Params("extension"))
return handleMedia(w, r, "https://i.imgur.com/"+baseName+"."+extension)
}
}
func HandleUserCover(c *fiber.Ctx) error {
c.Set("Cache-Control", "public,max-age=604800")
c.Set("Content-Security-Policy", "default-src 'none'")
return handleMedia(c, "https://imgur.com/user/"+c.Params("userID")+"/cover?maxwidth=2560")
func HandleUserCover(w http.ResponseWriter, r *http.Request) error {
w.Header().Set("Cache-Control", "public,max-age=604800")
w.Header().Set("Content-Security-Policy", "default-src 'none'")
return handleMedia(w, r, "https://imgur.com/user/"+r.PathValue("userID")+"/cover?maxwidth=2560")
}
func HandleUserAvatar(c *fiber.Ctx) error {
c.Set("Cache-Control", "public,max-age=604800")
c.Set("Content-Security-Policy", "default-src 'none'")
return handleMedia(c, "https://imgur.com/user/"+c.Params("userID")+"/avatar")
func HandleUserAvatar(w http.ResponseWriter, r *http.Request) error {
w.Header().Set("Cache-Control", "public,max-age=604800")
w.Header().Set("Content-Security-Policy", "default-src 'none'")
return handleMedia(w, r, "https://imgur.com/user/"+r.PathValue("userID")+"/avatar")
}
func handleMedia(c *fiber.Ctx, url string) error {
utils.SetHeaders(c)
func handleMedia(w http.ResponseWriter, r *http.Request, url string) error {
utils.SetHeaders(w)
path := r.URL.Path
if utils.Config.ForceWebp &&
!strings.HasSuffix(c.Path(), ".webp") &&
c.Get("Sec-Fetch-Dest") == "image" &&
c.Query("no_webp") == "" &&
c.Accepts("image/webp") == "image/webp" &&
!strings.HasPrefix(c.Path(), "/stack") {
!strings.HasSuffix(path, ".webp") &&
r.Header.Get("Sec-Fetch-Dest") == "image" &&
r.URL.Query().Get("no_webp") == "" &&
utils.Accepts(r, "image/webp") &&
!strings.HasPrefix(path, "/stack") {
url = strings.ReplaceAll(url, ".png", ".webp")
url = strings.ReplaceAll(url, ".jpg", ".webp")
url = strings.ReplaceAll(url, ".jpeg", ".webp")
filename := strings.TrimPrefix(c.Path(), "/")
c.Set("Content-Disposition", mime.FormatMediaType("attachment", map[string]string{"filename*": filename}))
filename := strings.TrimPrefix(path, "/")
w.Header().Set("Content-Disposition", mime.FormatMediaType("attachment", map[string]string{"filename*": filename}))
}
if strings.HasPrefix(c.Path(), "/stack") && strings.Contains(c.OriginalURL(), "?") {
url = url + "?" + strings.Split(c.OriginalURL(), "?")[1]
queryStr := r.URL.Query().Encode()
if strings.HasPrefix(path, "/stack") && queryStr != "" {
url = url + "?" + queryStr
}
req, err := http.NewRequest("GET", url, nil)
@@ -58,8 +62,9 @@ func handleMedia(c *fiber.Ctx, url string) error {
utils.SetReqHeaders(req)
if c.Get("Range") != "" {
req.Header.Set("Range", c.Get("Range"))
rng := r.URL.Query().Get("Range")
if rng != "" {
req.Header.Set("Range", rng)
}
res, err := http.DefaultClient.Do(req)
@@ -68,17 +73,18 @@ func handleMedia(c *fiber.Ctx, url string) error {
}
if res.StatusCode == 404 || strings.Contains(res.Request.URL.String(), "error/404") {
return utils.RenderError(c, 404)
return utils.RenderError(w, r, 404)
} else if res.StatusCode == 429 {
return utils.RenderError(c, 429)
return utils.RenderError(w, r, 429)
}
c.Set("Accept-Ranges", "bytes")
c.Set("Content-Type", res.Header.Get("Content-Type"))
c.Set("Content-Length", res.Header.Get("Content-Length"))
w.Header().Set("Accept-Ranges", "bytes")
w.Header().Set("Content-Type", res.Header.Get("Content-Type"))
w.Header().Set("Content-Length", res.Header.Get("Content-Length"))
if res.Header.Get("Content-Range") != "" {
c.Set("Content-Range", res.Header.Get("Content-Range"))
w.Header().Set("Content-Range", res.Header.Get("Content-Range"))
}
return c.SendStream(res.Body)
_, err = io.Copy(w, res.Body)
return err
}