From 573347f4dd91134eecacfc67c8d486e2caf3a20a Mon Sep 17 00:00:00 2001 From: iacore Date: Tue, 27 Aug 2024 16:42:29 +0000 Subject: [PATCH] remove CompatRequest --- main.go | 12 +++---- routes/about.go | 2 +- routes/actions.go | 33 ++++++++++--------- routes/artwork.go | 6 ++-- routes/artworkMulti.go | 6 ++-- routes/discovery.go | 12 +++---- routes/helpers.go | 33 +++++++++++++++++++ routes/index.go | 23 ++++++------- routes/newest.go | 8 ++--- routes/novel.go | 14 ++++---- routes/personal.go | 24 +++++++------- routes/pixivision.go | 14 ++++---- routes/proxy.go | 6 ++-- routes/ranking.go | 12 +++---- routes/rankingCalendar.go | 12 +++---- routes/render.go | 12 +++---- routes/settings.go | 49 ++++++++++++--------------- routes/tag.go | 62 +++++++++++++++++------------------ routes/types.go | 7 ---- routes/user.go | 14 ++++---- utils/compat.go | 69 --------------------------------------- utils/http.go | 46 ++++++++++++++++++++++++++ 22 files changed, 237 insertions(+), 239 deletions(-) create mode 100644 routes/helpers.go delete mode 100644 routes/types.go delete mode 100644 utils/compat.go create mode 100644 utils/http.go diff --git a/main.go b/main.go index 85b812f..1da6991 100644 --- a/main.go +++ b/main.go @@ -82,8 +82,8 @@ func main() { } - CatchError(func(w http.ResponseWriter, r utils.CompatRequest) error { - err := GetUserContext(r.Request).err + CatchError(func(w http.ResponseWriter, r *http.Request) error { + err := GetUserContext(r).err if err != nil { // error handler log.Println("Within handler: ", err) code := http.StatusInternalServerError @@ -226,7 +226,7 @@ func defineRoutes() *mux.Router { // Legacy illust URL router.HandleFunc("/member_illust.php", func(w http.ResponseWriter, r *http.Request) { - http.Redirect(w, r, "/artworks/"+utils.CompatRequest{Request: r}.Query("illust_id"), http.StatusPermanentRedirect) + http.Redirect(w, r, "/artworks/"+ routes.GetQueryParam(r, "illust_id"), http.StatusPermanentRedirect) }).Methods("GET") // Proxy routes @@ -234,16 +234,16 @@ func defineRoutes() *mux.Router { handlePrefix(router, "/proxy/s.pximg.net/", CatchError(routes.SPximgProxy)).Methods("GET") handlePrefix(router, "/proxy/ugoira.com/", CatchError(routes.UgoiraProxy)).Methods("GET") - router.NewRoute().HandlerFunc(CatchError(func(w http.ResponseWriter, r utils.CompatRequest) error { + router.NewRoute().HandlerFunc(CatchError(func(w http.ResponseWriter, r *http.Request) error { return errors.New("Route not found") })) return router } -func CatchError(handler func(w http.ResponseWriter, r utils.CompatRequest) error) http.HandlerFunc { +func CatchError(handler func(w http.ResponseWriter, r *http.Request) error) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - GetUserContext(r).err = handler(w, utils.CompatRequest{Request: r}) + GetUserContext(r).err = handler(w, r) } } diff --git a/routes/about.go b/routes/about.go index e701492..75b8adc 100644 --- a/routes/about.go +++ b/routes/about.go @@ -5,7 +5,7 @@ import ( "net/http" ) -func AboutPage(w http.ResponseWriter, r CompatRequest) error { +func AboutPage(w http.ResponseWriter, r *http.Request) error { return Render(w, r, Data_about{ Time: config.GlobalServerConfig.StartingTime, Version: config.GlobalServerConfig.Version, diff --git a/routes/actions.go b/routes/actions.go index 6fde8a8..4a50b96 100644 --- a/routes/actions.go +++ b/routes/actions.go @@ -8,10 +8,11 @@ import ( "net/http" "codeberg.org/vnpower/pixivfe/v2/session" + "codeberg.org/vnpower/pixivfe/v2/utils" "github.com/tidwall/gjson" ) -func pixivPostRequest(r CompatRequest, url, payload, token, csrf string, isJSON bool) error { +func pixivPostRequest(r *http.Request, url, payload, token, csrf string, isJSON bool) error { requestBody := []byte(payload) req, err := http.NewRequestWithContext(r.Context(), "POST", url, bytes.NewBuffer(requestBody)) @@ -58,15 +59,15 @@ func pixivPostRequest(r CompatRequest, url, payload, token, csrf string, isJSON return nil } -func AddBookmarkRoute(w http.ResponseWriter, r CompatRequest) error { - token := session.GetPixivToken(r.Request) - csrf := session.GetCookie(r.Request, session.Cookie_CSRF) +func AddBookmarkRoute(w http.ResponseWriter, r *http.Request) error { + token := session.GetPixivToken(r) + csrf := session.GetCookie(r, session.Cookie_CSRF) if token == "" || csrf == "" { return PromptUserToLoginPage(w, r) } - id := r.Params("id") + id := GetPathVar(r, "id") if id == "" { return errors.New("No ID provided.") } @@ -82,19 +83,19 @@ func AddBookmarkRoute(w http.ResponseWriter, r CompatRequest) error { return err } - RedirectToWhenceYouCame(w, r) + utils.RedirectToWhenceYouCame(w, r) return nil } -func DeleteBookmarkRoute(w http.ResponseWriter, r CompatRequest) error { - token := session.GetPixivToken(r.Request) - csrf := session.GetCookie(r.Request, session.Cookie_CSRF) +func DeleteBookmarkRoute(w http.ResponseWriter, r *http.Request) error { + token := session.GetPixivToken(r) + csrf := session.GetCookie(r, session.Cookie_CSRF) if token == "" || csrf == "" { return PromptUserToLoginPage(w, r) } - id := r.Params("id") + id := GetPathVar(r, "id") if id == "" { return errors.New("No ID provided.") } @@ -106,19 +107,19 @@ func DeleteBookmarkRoute(w http.ResponseWriter, r CompatRequest) error { return err } - RedirectToWhenceYouCame(w, r) + utils.RedirectToWhenceYouCame(w, r) return nil } -func LikeRoute(w http.ResponseWriter, r CompatRequest) error { - token := session.GetPixivToken(r.Request) - csrf := session.GetCookie(r.Request, session.Cookie_CSRF) +func LikeRoute(w http.ResponseWriter, r *http.Request) error { + token := session.GetPixivToken(r) + csrf := session.GetCookie(r, session.Cookie_CSRF) if token == "" || csrf == "" { return PromptUserToLoginPage(w, r) } - id := r.Params("id") + id := GetPathVar(r, "id") if id == "" { return errors.New("No ID provided.") } @@ -129,6 +130,6 @@ func LikeRoute(w http.ResponseWriter, r CompatRequest) error { return err } - RedirectToWhenceYouCame(w, r) + utils.RedirectToWhenceYouCame(w, r) return nil } diff --git a/routes/artwork.go b/routes/artwork.go index f4041cb..33fe2b2 100644 --- a/routes/artwork.go +++ b/routes/artwork.go @@ -8,13 +8,13 @@ import ( "net/http" ) -func ArtworkPage(w http.ResponseWriter, r CompatRequest) error { - id := r.Params("id") +func ArtworkPage(w http.ResponseWriter, r *http.Request) error { + id := GetPathVar(r, "id") if _, err := strconv.Atoi(id); err != nil { return fmt.Errorf("Invalid ID: %s", id) } - illust, err := core.GetArtworkByID(r.Request, id, true) + illust, err := core.GetArtworkByID(r, id, true) if err != nil { return err } diff --git a/routes/artworkMulti.go b/routes/artworkMulti.go index 5bcfe6c..a657c83 100644 --- a/routes/artworkMulti.go +++ b/routes/artworkMulti.go @@ -10,8 +10,8 @@ import ( "net/http" ) -func ArtworkMultiPage(w http.ResponseWriter, r CompatRequest) error { - ids_ := r.Params("ids") +func ArtworkMultiPage(w http.ResponseWriter, r *http.Request) error { + ids_ := GetPathVar(r, "ids") ids := strings.Split(ids_, ",") artworks := make([]core.Illust, len(ids)) @@ -34,7 +34,7 @@ func ArtworkMultiPage(w http.ResponseWriter, r CompatRequest) error { go func(i int, id string) { defer wg.Done() - illust, err := core.GetArtworkByID(r.Request, id, false) + illust, err := core.GetArtworkByID(r, id, false) if err != nil { artworks[i] = core.Illust{ Title: err.Error(), // this might be flaky diff --git a/routes/discovery.go b/routes/discovery.go index 0b169c8..7d3620d 100644 --- a/routes/discovery.go +++ b/routes/discovery.go @@ -6,10 +6,10 @@ import ( "net/http" ) -func DiscoveryPage(w http.ResponseWriter, r CompatRequest) error { - mode := r.Query("mode", "safe") +func DiscoveryPage(w http.ResponseWriter, r *http.Request) error { + mode := GetQueryParam(r, "mode", "safe") - works, err := core.GetDiscoveryArtwork(r.Request, mode) + works, err := core.GetDiscoveryArtwork(r, mode) if err != nil { return err } @@ -19,10 +19,10 @@ func DiscoveryPage(w http.ResponseWriter, r CompatRequest) error { return Render(w, r, Data_discovery{Artworks: works, Title: "Discovery", Queries: urlc}) } -func NovelDiscoveryPage(w http.ResponseWriter, r CompatRequest) error { - mode := r.Query("mode", "safe") +func NovelDiscoveryPage(w http.ResponseWriter, r *http.Request) error { + mode := GetQueryParam(r, "mode", "safe") - works, err := core.GetDiscoveryNovels(r.Request, mode) + works, err := core.GetDiscoveryNovels(r, mode) if err != nil { return err } diff --git a/routes/helpers.go b/routes/helpers.go new file mode 100644 index 0000000..3ae4def --- /dev/null +++ b/routes/helpers.go @@ -0,0 +1,33 @@ +package routes + +import ( + "net/http" + + "github.com/gorilla/mux" +) + + +func GetQueryParam(r *http.Request, name string, defaultValue ...string) string { + if v := r.URL.Query().Get(name); v != "" { + return v + } else { + if len(defaultValue) == 0 { + return "" + } else { + return defaultValue[0] + } + } +} + +// get path segment. no idea why it's called "params" +func GetPathVar(r *http.Request, name string, defaultValue ...string) string { + if v := mux.Vars(r)[name]; v != "" { + return v + } else { + if len(defaultValue) == 0 { + return "" + } else { + return defaultValue[0] + } + } +} diff --git a/routes/index.go b/routes/index.go index 9d64f15..074bbc4 100644 --- a/routes/index.go +++ b/routes/index.go @@ -1,19 +1,19 @@ package routes import ( - "encoding/json" "net/http" "codeberg.org/vnpower/pixivfe/v2/core" "codeberg.org/vnpower/pixivfe/v2/session" + "codeberg.org/vnpower/pixivfe/v2/utils" ) -func IndexPage(w http.ResponseWriter, r CompatRequest) error { +func IndexPage(w http.ResponseWriter, r *http.Request) error { // If token is set, do the landing request... - if token := session.GetPixivToken(r.Request); token != "" { - mode := r.Query("mode", "all") + if token := session.GetPixivToken(r); token != "" { + mode := GetQueryParam(r, "mode", "all") - works, err := core.GetLanding(r.Request, mode) + works, err := core.GetLanding(r, mode) if err != nil { return err @@ -27,7 +27,7 @@ func IndexPage(w http.ResponseWriter, r CompatRequest) error { } // ...otherwise, default to today's illustration ranking - works, err := core.GetRanking(r.Request, "daily", "illust", "", "1") + works, err := core.GetRanking(r, "daily", "illust", "", "1") if err != nil { return err } @@ -38,10 +38,10 @@ func IndexPage(w http.ResponseWriter, r CompatRequest) error { }) } -func Oembed(w http.ResponseWriter, r CompatRequest) error { - pageURL := r.BaseURL() - artistName := r.Query("a", "") - artistURL := r.Query("u", "") +func Oembed(w http.ResponseWriter, r *http.Request) error { + pageURL := utils.Origin(r) + artistName := GetQueryParam(r, "a", "") + artistURL := GetQueryParam(r, "u", "") data := map[string]any{ "version": "1.0", @@ -52,5 +52,6 @@ func Oembed(w http.ResponseWriter, r CompatRequest) error { "author_url": artistURL, } - return json.NewEncoder(w).Encode(data) + utils.SendJson(w, data) + return nil } diff --git a/routes/newest.go b/routes/newest.go index c24bd35..a6c0c6b 100644 --- a/routes/newest.go +++ b/routes/newest.go @@ -5,12 +5,12 @@ import ( "net/http" ) -func NewestPage(w http.ResponseWriter, r CompatRequest) error { - worktype := r.Query("type", "illust") +func NewestPage(w http.ResponseWriter, r *http.Request) error { + worktype := GetQueryParam(r, "type", "illust") - r18 := r.Query("r18", "false") + r18 := GetQueryParam(r, "r18", "false") - works, err := core.GetNewestArtworks(r.Request, worktype, r18) + works, err := core.GetNewestArtworks(r, worktype, r18) if err != nil { return err } diff --git a/routes/novel.go b/routes/novel.go index fea1012..bea36a8 100644 --- a/routes/novel.go +++ b/routes/novel.go @@ -10,32 +10,32 @@ import ( "net/http" ) -func NovelPage(w http.ResponseWriter, r CompatRequest) error { - id := r.Params("id") +func NovelPage(w http.ResponseWriter, r *http.Request) error { + id := GetPathVar(r, "id") if _, err := strconv.Atoi(id); err != nil { return fmt.Errorf("Invalid ID: %s", id) } - novel, err := core.GetNovelByID(r.Request, id) + novel, err := core.GetNovelByID(r, id) if err != nil { return err } - related, err := core.GetNovelRelated(r.Request, id) + related, err := core.GetNovelRelated(r, id) if err != nil { return err } - user, err := core.GetUserBasicInformation(r.Request, novel.UserID) + user, err := core.GetUserBasicInformation(r, novel.UserID) if err != nil { return err } - fontType := session.GetCookie(r.Request, session.Cookie_NovelFontType) + fontType := session.GetCookie(r, session.Cookie_NovelFontType) if fontType == "" { fontType = "gothic" } - viewMode := session.GetCookie(r.Request, session.Cookie_NovelViewMode) + viewMode := session.GetCookie(r, session.Cookie_NovelViewMode) if viewMode == "" { viewMode = strconv.Itoa(novel.Settings.ViewMode) } diff --git a/routes/personal.go b/routes/personal.go index 174d73d..58c8cc3 100644 --- a/routes/personal.go +++ b/routes/personal.go @@ -9,7 +9,7 @@ import ( "codeberg.org/vnpower/pixivfe/v2/session" ) -func PromptUserToLoginPage(w http.ResponseWriter, r CompatRequest) error { +func PromptUserToLoginPage(w http.ResponseWriter, r *http.Request) error { err := Render(w, r, Data_unauthorized{}) if err != nil { return err @@ -18,8 +18,8 @@ func PromptUserToLoginPage(w http.ResponseWriter, r CompatRequest) error { return nil } -func LoginUserPage(w http.ResponseWriter, r CompatRequest) error { - token := session.GetPixivToken(r.Request) +func LoginUserPage(w http.ResponseWriter, r *http.Request) error { + token := session.GetPixivToken(r) if token == "" { return PromptUserToLoginPage(w, r) @@ -28,12 +28,12 @@ func LoginUserPage(w http.ResponseWriter, r CompatRequest) error { // The left part of the token is the member ID userId := strings.Split(token, "_") - http.Redirect(w, r.Request, "/users/" + userId[0], http.StatusSeeOther) + http.Redirect(w, r, "/users/" + userId[0], http.StatusSeeOther) return nil } -func LoginBookmarkPage(w http.ResponseWriter, r CompatRequest) error { - token := session.GetPixivToken(r.Request) +func LoginBookmarkPage(w http.ResponseWriter, r *http.Request) error { + token := session.GetPixivToken(r) if token == "" { return PromptUserToLoginPage(w, r) } @@ -41,24 +41,24 @@ func LoginBookmarkPage(w http.ResponseWriter, r CompatRequest) error { // The left part of the token is the member ID userId := strings.Split(token, "_") - http.Redirect(w, r.Request, "/users/" + userId[0] + "/bookmarks#checkpoint", http.StatusSeeOther) + http.Redirect(w, r, "/users/" + userId[0] + "/bookmarks#checkpoint", http.StatusSeeOther) return nil } -func FollowingWorksPage(w http.ResponseWriter, r CompatRequest) error { - if token := session.GetPixivToken(r.Request); token == "" { +func FollowingWorksPage(w http.ResponseWriter, r *http.Request) error { + if token := session.GetPixivToken(r); token == "" { return PromptUserToLoginPage(w, r) } - mode := r.Query("mode", "all") - page := r.Query("page", "1") + mode := GetQueryParam(r, "mode", "all") + page := GetQueryParam(r, "page", "1") pageInt, err := strconv.Atoi(page) if err != nil { return err } - works, err := core.GetNewestFromFollowing(r.Request, mode, page) + works, err := core.GetNewestFromFollowing(r, mode, page) if err != nil { return err } diff --git a/routes/pixivision.go b/routes/pixivision.go index 803df9a..2d915de 100644 --- a/routes/pixivision.go +++ b/routes/pixivision.go @@ -7,30 +7,30 @@ import ( "net/http" ) -func PixivisionHomePage(w http.ResponseWriter, r CompatRequest) error { +func PixivisionHomePage(w http.ResponseWriter, r *http.Request) error { data, err := pixivision.GetHomepage() if err != nil { return err } for i := range data { - data[i].Thumbnail = session.ProxyImageUrlNoEscape(r.Request, data[i].Thumbnail) + data[i].Thumbnail = session.ProxyImageUrlNoEscape(r, data[i].Thumbnail) } return Render(w, r, Data_pixivision_index{Data: data}) } -func PixivisionArticlePage(w http.ResponseWriter, r CompatRequest) error { - id := r.Params("id") +func PixivisionArticlePage(w http.ResponseWriter, r *http.Request) error { + id := GetPathVar(r, "id") data, err := pixivision.GetArticle(id) if err != nil { return err } - data.Thumbnail = session.ProxyImageUrlNoEscape(r.Request, data.Thumbnail) + data.Thumbnail = session.ProxyImageUrlNoEscape(r, data.Thumbnail) for i := range data.Items { - data.Items[i].Image = session.ProxyImageUrlNoEscape(r.Request, data.Items[i].Image) - data.Items[i].Avatar = session.ProxyImageUrlNoEscape(r.Request, data.Items[i].Avatar) + data.Items[i].Image = session.ProxyImageUrlNoEscape(r, data.Items[i].Image) + data.Items[i].Avatar = session.ProxyImageUrlNoEscape(r, data.Items[i].Avatar) } return Render(w, r, Data_pixivision_article{Article: data}) diff --git a/routes/proxy.go b/routes/proxy.go index d710e2a..cc2640d 100644 --- a/routes/proxy.go +++ b/routes/proxy.go @@ -19,7 +19,7 @@ func makeRequest(w http.ResponseWriter, req *http.Request) error { return err } -func SPximgProxy(w http.ResponseWriter, r CompatRequest) error { +func SPximgProxy(w http.ResponseWriter, r *http.Request) error { URL := fmt.Sprintf("https://s.pximg.net/%s", r.URL.Path) req, err := http.NewRequestWithContext(r.Context(), "GET", URL, nil) if err != nil { @@ -28,7 +28,7 @@ func SPximgProxy(w http.ResponseWriter, r CompatRequest) error { return makeRequest(w, req) } -func IPximgProxy(w http.ResponseWriter, r CompatRequest) error { +func IPximgProxy(w http.ResponseWriter, r *http.Request) error { URL := fmt.Sprintf("https://i.pximg.net/%s", r.URL.Path) req, err := http.NewRequestWithContext(r.Context(), "GET", URL, nil) if err != nil { @@ -38,7 +38,7 @@ func IPximgProxy(w http.ResponseWriter, r CompatRequest) error { return makeRequest(w, req) } -func UgoiraProxy(w http.ResponseWriter, r CompatRequest) error { +func UgoiraProxy(w http.ResponseWriter, r *http.Request) error { URL := fmt.Sprintf("https://ugoira.com/api/mp4/%s", r.URL.Path) req, err := http.NewRequestWithContext(r.Context(), "GET", URL, nil) if err != nil { diff --git a/routes/ranking.go b/routes/ranking.go index b366672..90df37e 100644 --- a/routes/ranking.go +++ b/routes/ranking.go @@ -7,18 +7,18 @@ import ( "net/http" ) -func RankingPage(w http.ResponseWriter, r CompatRequest) error { - mode := r.Query("mode", "daily") - content := r.Query("content", "all") - date := r.Query("date", "") +func RankingPage(w http.ResponseWriter, r *http.Request) error { + mode := GetQueryParam(r, "mode", "daily") + content := GetQueryParam(r, "content", "all") + date := GetQueryParam(r, "date", "") - page := r.Query("page", "1") + page := GetQueryParam(r, "page", "1") pageInt, err := strconv.Atoi(page) if err != nil { return err } - works, err := core.GetRanking(r.Request, mode, content, date, page) + works, err := core.GetRanking(r, mode, content, date, page) if err != nil { return err } diff --git a/routes/rankingCalendar.go b/routes/rankingCalendar.go index 63051b9..ea58ab7 100644 --- a/routes/rankingCalendar.go +++ b/routes/rankingCalendar.go @@ -35,22 +35,22 @@ func parseDate(t time.Time) DateWrap { return d } -func RankingCalendarPicker(w http.ResponseWriter, r CompatRequest) error { +func RankingCalendarPicker(w http.ResponseWriter, r *http.Request) error { mode := r.FormValue("mode") if mode == "" { mode = "daily" } date := r.FormValue("date") - return utils.RedirectToRoute(w, r,"/rankingCalendar", map[string]string{ + return utils.RedirectTo(w, r,"/rankingCalendar", map[string]string{ "mode": mode, "date": date, }) } -func RankingCalendarPage(w http.ResponseWriter, r CompatRequest) error { - mode := r.Query("mode", "daily") - date := r.Query("date", "") +func RankingCalendarPage(w http.ResponseWriter, r *http.Request) error { + mode := GetQueryParam(r, "mode", "daily") + date := GetQueryParam(r, "date", "") var year int var month int @@ -76,7 +76,7 @@ func RankingCalendarPage(w http.ResponseWriter, r CompatRequest) error { monthBefore := realDate.AddDate(0, -1, 0) monthAfter := realDate.AddDate(0, 1, 0) - render, err := core.GetRankingCalendar(r.Request, mode, year, month) + render, err := core.GetRankingCalendar(r, mode, year, month) if err != nil { return err } diff --git a/routes/render.go b/routes/render.go index 92b76f0..0900020 100644 --- a/routes/render.go +++ b/routes/render.go @@ -33,7 +33,7 @@ func InitTemplatingEngine(DisableCache bool) { } // render the template selected based on the name of type `T` -func Render[T any](w http.ResponseWriter, r CompatRequest, data T) error { +func Render[T any](w http.ResponseWriter, r *http.Request, data T) error { w.Header().Set("content-type", "text/html; charset=utf-8") return RenderInner(w, GetTemplatingVariables(r), data) } @@ -54,15 +54,15 @@ func RenderInner[T any](w io.Writer, variables jet.VarMap, data T) error { return template.Execute(w, variables, data) } -func GetTemplatingVariables(r CompatRequest) jet.VarMap { +func GetTemplatingVariables(r *http.Request) jet.VarMap { // Pass in values that we want to be available to all pages here - token := session.GetPixivToken(r.Request) - baseURL := r.BaseURL() - pageURL := r.PageURL() + token := session.GetPixivToken(r) + baseURL := utils.Origin(r) + pageURL := r.URL.String() cookies := map[string]string{} for _, name := range session.AllCookieNames { - value := session.GetCookie(r.Request, name) + value := session.GetCookie(r, name) cookies[string(name)] = value } diff --git a/routes/settings.go b/routes/settings.go index e249128..9443248 100644 --- a/routes/settings.go +++ b/routes/settings.go @@ -10,16 +10,17 @@ import ( "strings" "codeberg.org/vnpower/pixivfe/v2/config" - httpc "codeberg.org/vnpower/pixivfe/v2/core" + "codeberg.org/vnpower/pixivfe/v2/core" "codeberg.org/vnpower/pixivfe/v2/session" + "codeberg.org/vnpower/pixivfe/v2/utils" ) -func setToken(w http.ResponseWriter, r CompatRequest) error { +func setToken(w http.ResponseWriter, r *http.Request) error { token := r.FormValue("token") if token != "" { - URL := httpc.GetNewestFromFollowingURL("all", "1") + URL := core.GetNewestFromFollowingURL("all", "1") - _, err := httpc.UnwrapWebAPIRequest(r.Context(), URL, token) + _, err := core.UnwrapWebAPIRequest(r.Context(), URL, token) if err != nil { return errors.New("Cannot authorize with supplied token.") } @@ -27,9 +28,9 @@ func setToken(w http.ResponseWriter, r CompatRequest) error { // Make a test request to verify the token. // THE TEST URL IS NSFW! req, err := http.NewRequestWithContext(r.Context(), "GET", "https://www.pixiv.net/en/artworks/115365120", nil) - if err != nil { - return err - } + if err != nil { + return err + } req.Header.Add("User-Agent", "Mozilla/5.0") req.AddCookie(&http.Cookie{ Name: "PHPSESSID", @@ -63,7 +64,7 @@ func setToken(w http.ResponseWriter, r CompatRequest) error { return errors.New("You submitted an empty/invalid form.") } -func setImageServer(w http.ResponseWriter, r CompatRequest) error { +func setImageServer(w http.ResponseWriter, r *http.Request) error { token := r.FormValue("image-proxy") if token != "" { session.SetCookie(w, session.Cookie_ImageProxy, token) @@ -73,7 +74,7 @@ func setImageServer(w http.ResponseWriter, r CompatRequest) error { return nil } -func setNovelFontType(w http.ResponseWriter, r CompatRequest) error { +func setNovelFontType(w http.ResponseWriter, r *http.Request) error { fontType := r.FormValue("font-type") if fontType != "" { session.SetCookie(w, session.Cookie_NovelFontType, fontType) @@ -82,7 +83,7 @@ func setNovelFontType(w http.ResponseWriter, r CompatRequest) error { return nil } -func setNovelViewMode(w http.ResponseWriter, r CompatRequest) error { +func setNovelViewMode(w http.ResponseWriter, r *http.Request) error { viewMode := r.FormValue("view-mode") if viewMode != "" { session.SetCookie(w, session.Cookie_NovelViewMode, viewMode) @@ -91,7 +92,7 @@ func setNovelViewMode(w http.ResponseWriter, r CompatRequest) error { return nil } -func setThumbnailToNewTab(w http.ResponseWriter, r CompatRequest) error { +func setThumbnailToNewTab(w http.ResponseWriter, r *http.Request) error { ttnt := r.FormValue("ttnt") if ttnt == "_blank" || ttnt == "_self" { session.SetCookie(w, session.Cookie_ThumbnailToNewTab, ttnt) @@ -100,7 +101,7 @@ func setThumbnailToNewTab(w http.ResponseWriter, r CompatRequest) error { return nil } -func setArtworkPreview(w http.ResponseWriter, r CompatRequest) error { +func setArtworkPreview(w http.ResponseWriter, r *http.Request) error { value := r.FormValue("app") if value == "cover" || value == "button" || value == "" { session.SetCookie(w, session.Cookie_ArtworkPreview, value) @@ -109,13 +110,13 @@ func setArtworkPreview(w http.ResponseWriter, r CompatRequest) error { return nil } -func setLogout(w http.ResponseWriter, _ CompatRequest) error { +func setLogout(w http.ResponseWriter, _ *http.Request) error { session.ClearCookie(w, session.Cookie_Token) session.ClearCookie(w, session.Cookie_CSRF) return nil } -func setCookie(w http.ResponseWriter, r CompatRequest) error { +func setCookie(w http.ResponseWriter, r *http.Request) error { key := r.FormValue("key") value := r.FormValue("value") for _, cookie_name := range session.AllCookieNames { @@ -127,7 +128,7 @@ func setCookie(w http.ResponseWriter, r CompatRequest) error { return fmt.Errorf("Invalid Cookie Name: %s", key) } -func setRawCookie(w http.ResponseWriter, r CompatRequest) error { +func setRawCookie(w http.ResponseWriter, r *http.Request) error { raw := r.FormValue("raw") lines := strings.Split(raw, "\n") @@ -149,17 +150,17 @@ func setRawCookie(w http.ResponseWriter, r CompatRequest) error { return nil } -func resetAll(w http.ResponseWriter, _ CompatRequest) error { +func resetAll(w http.ResponseWriter, _ *http.Request) error { session.ClearAllCookies(w) return nil } -func SettingsPage(w http.ResponseWriter, r CompatRequest) error { +func SettingsPage(w http.ResponseWriter, r *http.Request) error { return Render(w, r, Data_settings{WorkingProxyList: config.GetWorkingProxies(), ProxyList: config.BuiltinProxyList}) } -func SettingsPost(w http.ResponseWriter, r CompatRequest) error { - t := r.Params("type") +func SettingsPost(w http.ResponseWriter, r *http.Request) error { + t := GetPathVar(r, "type") var err error switch t { @@ -191,14 +192,6 @@ func SettingsPost(w http.ResponseWriter, r CompatRequest) error { return err } - RedirectToWhenceYouCame(w, r) + utils.RedirectToWhenceYouCame(w, r) return nil } - -func RedirectToWhenceYouCame(w http.ResponseWriter, r CompatRequest) { - if strings.HasPrefix(r.Referer(), r.BaseURL()) { - http.Redirect(w, r.Request, r.Referer(), http.StatusSeeOther) - } else { - w.WriteHeader(200) - } -} diff --git a/routes/tag.go b/routes/tag.go index d05f932..dcd9e8c 100644 --- a/routes/tag.go +++ b/routes/tag.go @@ -9,14 +9,14 @@ import ( "codeberg.org/vnpower/pixivfe/v2/utils" ) -func TagPage(w http.ResponseWriter, r CompatRequest) error { - param := r.Params("name", r.Query("name")) +func TagPage(w http.ResponseWriter, r *http.Request) error { + param := GetPathVar(r, "name", GetQueryParam(r, "name")) name, err := url.PathUnescape(param) if err != nil { return err } - page := r.Query("page", "1") + page := GetQueryParam(r, "page", "1") pageInt, err := strconv.Atoi(page) if err != nil { return err @@ -26,25 +26,25 @@ func TagPage(w http.ResponseWriter, r CompatRequest) error { // I made a struct type just to manage the queries queries := core.SearchPageSettings{ Name: name, - Category: r.Query("category", "artworks"), - Order: r.Query("order", "date_d"), - Mode: r.Query("mode", "safe"), - Ratio: r.Query("ratio", ""), - Wlt: r.Query("wlt", ""), - Wgt: r.Query("wgt", ""), - Hlt: r.Query("hlt", ""), - Hgt: r.Query("hgt", ""), - Tool: r.Query("tool", ""), - Scd: r.Query("scd", ""), - Ecd: r.Query("ecd", ""), + Category: GetQueryParam(r, "category", "artworks"), + Order: GetQueryParam(r, "order", "date_d"), + Mode: GetQueryParam(r, "mode", "safe"), + Ratio: GetQueryParam(r, "ratio", ""), + Wlt: GetQueryParam(r, "wlt", ""), + Wgt: GetQueryParam(r, "wgt", ""), + Hlt: GetQueryParam(r, "hlt", ""), + Hgt: GetQueryParam(r, "hgt", ""), + Tool: GetQueryParam(r, "tool", ""), + Scd: GetQueryParam(r, "scd", ""), + Ecd: GetQueryParam(r, "ecd", ""), Page: page, } - tag, err := core.GetTagData(r.Request, name) + tag, err := core.GetTagData(r, name) if err != nil { return err } - result, err := core.GetSearch(r.Request, queries) + result, err := core.GetSearch(r, queries) if err != nil { return err } @@ -54,20 +54,20 @@ func TagPage(w http.ResponseWriter, r CompatRequest) error { return Render(w, r, Data_tag{Title: "Results for " + name, Tag: tag, Data: *result, QueriesC: urlc, TrueTag: param, Page: pageInt}) } -func AdvancedTagPost(w http.ResponseWriter, r CompatRequest) error { - return utils.RedirectToRoute(w, r,"/tags", map[string]string{ - "name": r.Query("name", r.FormValue("name")), - "category": r.Query("category", "artworks"), - "order": r.Query("order", "date_d"), - "mode": r.Query("mode", "safe"), - "ratio": r.Query("ratio"), - "page": r.Query("page", "1"), - "wlt": r.Query("wlt", r.FormValue("wlt")), - "wgt": r.Query("wgt", r.FormValue("wgt")), - "hlt": r.Query("hlt", r.FormValue("hlt")), - "hgt": r.Query("hgt", r.FormValue("hgt")), - "tool": r.Query("tool", r.FormValue("tool")), - "scd": r.Query("scd", r.FormValue("scd")), - "ecd": r.Query("ecd", r.FormValue("ecd")), +func AdvancedTagPost(w http.ResponseWriter, r *http.Request) error { + return utils.RedirectTo(w, r,"/tags", map[string]string{ + "name": GetQueryParam(r, "name", r.FormValue("name")), + "category": GetQueryParam(r, "category", "artworks"), + "order": GetQueryParam(r, "order", "date_d"), + "mode": GetQueryParam(r, "mode", "safe"), + "ratio": GetQueryParam(r, "ratio"), + "page": GetQueryParam(r, "page", "1"), + "wlt": GetQueryParam(r, "wlt", r.FormValue("wlt")), + "wgt": GetQueryParam(r, "wgt", r.FormValue("wgt")), + "hlt": GetQueryParam(r, "hlt", r.FormValue("hlt")), + "hgt": GetQueryParam(r, "hgt", r.FormValue("hgt")), + "tool": GetQueryParam(r, "tool", r.FormValue("tool")), + "scd": GetQueryParam(r, "scd", r.FormValue("scd")), + "ecd": GetQueryParam(r, "ecd", r.FormValue("ecd")), }) } diff --git a/routes/types.go b/routes/types.go deleted file mode 100644 index 5423bc4..0000000 --- a/routes/types.go +++ /dev/null @@ -1,7 +0,0 @@ -package routes - -import "codeberg.org/vnpower/pixivfe/v2/utils" - -type CompatRequest = utils.CompatRequest - -var SendString = utils.SendString \ No newline at end of file diff --git a/routes/user.go b/routes/user.go index 65bcd91..2bf1c7b 100644 --- a/routes/user.go +++ b/routes/user.go @@ -16,24 +16,24 @@ type userPageData struct { page int } -func fetchData(r CompatRequest, getTags bool) (userPageData, error) { - id := r.Params("id") +func fetchData(r *http.Request, getTags bool) (userPageData, error) { + id := GetPathVar(r, "id") if _, err := strconv.Atoi(id); err != nil { return userPageData{}, err } - category := core.UserArtCategory(r.Params("category", string(core.UserArt_Any))) + category := core.UserArtCategory(GetPathVar(r, "category", string(core.UserArt_Any))) err := category.Validate() if err != nil { return userPageData{}, err } - page_param := r.Query("page", "1") + page_param := GetQueryParam(r, "page", "1") page, err := strconv.Atoi(page_param) if err != nil { return userPageData{}, err } - user, err := core.GetUserArtwork(r.Request, id, category, page, getTags) + user, err := core.GetUserArtwork(r, id, category, page, getTags) if err != nil { return userPageData{}, err } @@ -53,7 +53,7 @@ func fetchData(r CompatRequest, getTags bool) (userPageData, error) { return userPageData{user, category, pageLimit, page}, nil } -func UserPage(w http.ResponseWriter, r CompatRequest) error { +func UserPage(w http.ResponseWriter, r *http.Request) error { data, err := fetchData(r, true) if err != nil { return err @@ -62,7 +62,7 @@ func UserPage(w http.ResponseWriter, r CompatRequest) error { return Render(w, r, Data_user{Title: data.user.Name, User: data.user, Category: data.category, PageLimit: data.pageLimit, Page: data.page, MetaImage: data.user.BackgroundImage}) } -func UserAtomFeed(w http.ResponseWriter, r CompatRequest) error { +func UserAtomFeed(w http.ResponseWriter, r *http.Request) error { data, err := fetchData(r, false) if err != nil { return err diff --git a/utils/compat.go b/utils/compat.go deleted file mode 100644 index d02692c..0000000 --- a/utils/compat.go +++ /dev/null @@ -1,69 +0,0 @@ -package utils - -import ( - "encoding/json" - "net/http" - "net/url" - - "github.com/gorilla/mux" -) - -type CompatRequest struct { - *http.Request -} - -func (r CompatRequest) BaseURL() string { - return (&url.URL{ - Scheme: r.URL.Scheme, - Opaque: r.URL.Opaque, - User: r.URL.User, - Host: r.URL.Host, - }).String() -} -func (r CompatRequest) PageURL() string { - return r.URL.String() -} - -func (r CompatRequest) Query(name string, defaultValue ...string) string { - if v := r.URL.Query().Get(name); v != "" { - return v - } else { - if len(defaultValue) == 0 { - return "" - } else { - return defaultValue[0] - } - } -} - -// get path segment. no idea why it's called "params" -func (r CompatRequest) Params(name string, defaultValue ...string) string { - if v := mux.Vars(r.Request)[name]; v != "" { - return v - } else { - if len(defaultValue) == 0 { - return "" - } else { - return defaultValue[0] - } - } -} - -func SendString(w http.ResponseWriter, text string) error { - w.Header().Set("content-type", "text/plain") - _, err := w.Write([]byte(text)) - return err -} - -func RedirectToRoute(w http.ResponseWriter, r CompatRequest, path string, query_params map[string]string) error { - query := url.Values{} - for k, v := range query_params { - query.Add(k, v) - } - http.Redirect(w, r.Request, path+query.Encode(), http.StatusSeeOther) - return nil -} - -func WriteJson(w http.ResponseWriter, data any) { - json.NewEncoder(w).Encode(data) -} \ No newline at end of file diff --git a/utils/http.go b/utils/http.go new file mode 100644 index 0000000..37dbc30 --- /dev/null +++ b/utils/http.go @@ -0,0 +1,46 @@ +package utils + +import ( + "encoding/json" + "net/http" + "net/url" + "strings" +) + + +func SendString(w http.ResponseWriter, text string) error { + w.Header().Set("content-type", "text/plain") + _, err := w.Write([]byte(text)) + return err +} + +func SendJson(w http.ResponseWriter, data any) { + json.NewEncoder(w).Encode(data) +} + +func RedirectTo(w http.ResponseWriter, r *http.Request, path string, query_params map[string]string) error { + query := url.Values{} + for k, v := range query_params { + query.Add(k, v) + } + http.Redirect(w, r, path+query.Encode(), http.StatusSeeOther) + return nil +} + +func RedirectToWhenceYouCame(w http.ResponseWriter, r *http.Request) { + referrer := r.Referer() + if strings.HasPrefix(referrer, Origin(r)) { + http.Redirect(w, r, referrer, http.StatusSeeOther) + } else { + w.WriteHeader(200) + } +} + +func Origin(r *http.Request) string { + return (&url.URL{ + Scheme: r.URL.Scheme, + Opaque: r.URL.Opaque, + User: r.URL.User, + Host: r.URL.Host, + }).String() +}