Hack for parsing multipart/form-data from iOS

Well I have no idea~

Signed-off-by: Yuan Si <do4suki@gmail.com>
This commit is contained in:
2023-04-22 22:17:57 +08:00
parent 1e0871a4db
commit 404ae115bc
5 changed files with 54 additions and 26 deletions
+1 -1
View File
@@ -22,7 +22,7 @@ func ApiHandler(ctx *gin.Context) {
CheckErr(err)
var formdata []model.SifApi
err = json.Unmarshal([]byte(ctx.PostForm("request_data")), &formdata)
err = json.Unmarshal([]byte(ctx.GetString("request_data")), &formdata)
if err != nil {
fmt.Println(err)
return
+3 -3
View File
@@ -39,7 +39,7 @@ func PartyListHandler(ctx *gin.Context) {
func PlayLiveHandler(ctx *gin.Context) {
playReq := model.PlayReq{}
err := json.Unmarshal([]byte(ctx.PostForm("request_data")), &playReq)
err := json.Unmarshal([]byte(ctx.GetString("request_data")), &playReq)
CheckErr(err)
tDifficultyId := playReq.LiveDifficultyID
@@ -459,7 +459,7 @@ func GameOverHandler(ctx *gin.Context) {
func PlayScoreHandler(ctx *gin.Context) {
playScoreReq := model.PlayScoreReq{}
err := json.Unmarshal([]byte(ctx.PostForm("request_data")), &playScoreReq)
err := json.Unmarshal([]byte(ctx.GetString("request_data")), &playScoreReq)
CheckErr(err)
tDifficultyId := playScoreReq.LiveDifficultyID
@@ -557,7 +557,7 @@ func PlayScoreHandler(ctx *gin.Context) {
func PlayRewardHandler(ctx *gin.Context) {
playRewardReq := model.PlayRewardReq{}
err := json.Unmarshal([]byte(ctx.PostForm("request_data")), &playRewardReq)
err := json.Unmarshal([]byte(ctx.GetString("request_data")), &playRewardReq)
CheckErr(err)
difficultyId := playRewardReq.LiveDifficultyID
+15 -15
View File
@@ -49,9 +49,9 @@ func main() {
// Server APIs
m := r.Group("main.php").Use(middleware.Common)
{
m.POST("/album/seriesAll", handler.AlbumSeriesAllHandler)
m.POST("/announce/checkState", handler.AnnounceCheckStateHandler)
m.POST("/api", handler.ApiHandler)
m.POST("/album/seriesAll", middleware.ParseMultipartForm, handler.AlbumSeriesAllHandler)
m.POST("/announce/checkState", middleware.ParseMultipartForm, handler.AnnounceCheckStateHandler)
m.POST("/api", middleware.ParseMultipartForm, handler.ApiHandler)
m.POST("/award/set", handler.AwardSet)
m.POST("/background/set", handler.BackgroundSet)
m.POST("/download/additional", handler.DownloadAdditionalHandler)
@@ -59,29 +59,29 @@ func main() {
m.POST("/download/event", handler.DownloadEventHandler)
m.POST("/download/getUrl", handler.DownloadUrlHandler)
m.POST("/download/update", handler.DownloadUpdateHandler)
m.POST("/event/eventList", handler.EventListHandler)
m.POST("/gdpr/get", handler.GdprHandler)
m.POST("/event/eventList", middleware.ParseMultipartForm, handler.EventListHandler)
m.POST("/gdpr/get", middleware.ParseMultipartForm, handler.GdprHandler)
m.POST("/lbonus/execute", handler.LBonusExecuteHandler)
m.POST("/live/gameover", handler.GameOverHandler)
m.POST("/live/partyList", handler.PartyListHandler)
m.POST("/live/play", handler.PlayLiveHandler)
m.POST("/live/preciseScore", handler.PlayScoreHandler)
m.POST("/live/reward", handler.PlayRewardHandler)
m.POST("/live/play", middleware.ParseMultipartForm, handler.PlayLiveHandler)
m.POST("/live/preciseScore", middleware.ParseMultipartForm, handler.PlayScoreHandler)
m.POST("/live/reward", middleware.ParseMultipartForm, handler.PlayRewardHandler)
m.POST("/login/authkey", middleware.AuthKey, handler.AuthKey)
m.POST("/login/login", middleware.Login, handler.Login)
m.POST("/multiunit/scenarioStartup", handler.MultiUnitStartUpHandler)
m.POST("/museum/info", handler.MuseumInfo)
m.POST("/notice/noticeFriendGreeting", handler.NoticeFriendGreetingHandler)
m.POST("/notice/noticeFriendVariety", handler.NoticeFriendVarietyHandler)
m.POST("/museum/info", middleware.ParseMultipartForm, handler.MuseumInfo)
m.POST("/notice/noticeFriendGreeting", middleware.ParseMultipartForm, handler.NoticeFriendGreetingHandler)
m.POST("/notice/noticeFriendVariety", middleware.ParseMultipartForm, handler.NoticeFriendVarietyHandler)
m.POST("/notice/noticeUserGreetingHistory", handler.NoticeUserGreetingHandler)
m.POST("/payment/productList", handler.ProductListHandler)
m.POST("/personalnotice/get", handler.PersonalNoticeHandler)
m.POST("/payment/productList", middleware.ParseMultipartForm, handler.ProductListHandler)
m.POST("/personalnotice/get", middleware.ParseMultipartForm, handler.PersonalNoticeHandler)
m.POST("/profile/profileRegister", handler.ProfileRegister)
m.POST("/scenario/reward", handler.ScenarioRewardHandler)
m.POST("/scenario/startup", handler.ScenarioStartupHandler)
m.POST("/subscenario/reward", handler.SubScenarioStartupHandler)
m.POST("/subscenario/startup", handler.SubScenarioStartupHandler)
m.POST("/tos/tosCheck", handler.TosCheckHandler)
m.POST("/tos/tosCheck", middleware.ParseMultipartForm, handler.TosCheckHandler)
m.POST("/unit/deck", handler.SetDeckHandler)
m.POST("/unit/deckName", handler.SetDeckNameHandler)
m.POST("/unit/favorite", handler.SetDisplayRankHandler)
@@ -91,7 +91,7 @@ func main() {
m.POST("/user/changeName", handler.ChangeNameHandler)
m.POST("/user/changeNavi", handler.ChangeNaviHandler)
m.POST("/user/setNotificationToken", handler.SetNotificationTokenHandler)
m.POST("/user/userInfo", handler.UserInfoHandler)
m.POST("/user/userInfo", middleware.ParseMultipartForm, handler.UserInfoHandler)
}
r.GET("/webview.php/announce/index", handler.AnnounceIndexHandler)
// Server APIs
-7
View File
@@ -24,13 +24,6 @@ func CheckErr(err error) {
func Common(ctx *gin.Context) {
ctx.Set("req_time", time.Now().Unix())
ctx.Request.ParseMultipartForm(0)
if len(ctx.PostForm("request_data")) == 0 {
// 弱智iOS客户端经常发些空的表单上来...
fmt.Println("Fuck you, iOS!")
ctx.Abort()
}
authorize := ctx.Request.Header.Get("Authorize")
if authorize == "" {
ctx.String(http.StatusForbidden, ErrorMsg)
+35
View File
@@ -0,0 +1,35 @@
package middleware
import (
"io"
"mime/multipart"
"strings"
"github.com/gin-gonic/gin"
)
func ParseMultipartForm(ctx *gin.Context) {
if ctx.Request.Header.Get("OS") != "Android" {
// I don't know why mime.ParseMediaType() is failed
// mime.ParseMediaType(ctx.Request.Header.Get("Content-Type"))
boundary := strings.ReplaceAll(ctx.Request.Header.Get("Content-Type"), "multipart/form-data; boundary=", "")
var reqData []byte
mReader := multipart.NewReader(ctx.Request.Body, boundary)
for {
part, err := mReader.NextPart()
if err == io.EOF {
break
}
CheckErr(err)
data, err := io.ReadAll(part)
CheckErr(err)
reqData = data
}
ctx.Set("request_data", string(reqData))
}
ctx.Next()
}