mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Refactor "route" related code, fix Safari cookie bug (#24330)
Fix #24176 Clean some misuses of route package, clean some legacy FIXMEs --------- Co-authored-by: Giteabot <teabot@gitea.io>
This commit is contained in:
		@@ -446,6 +446,17 @@ func (ctx *Context) JSON(status int, content interface{}) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func removeSessionCookieHeader(w http.ResponseWriter) {
 | 
			
		||||
	cookies := w.Header()["Set-Cookie"]
 | 
			
		||||
	w.Header().Del("Set-Cookie")
 | 
			
		||||
	for _, cookie := range cookies {
 | 
			
		||||
		if strings.HasPrefix(cookie, setting.SessionConfig.CookieName+"=") {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		w.Header().Add("Set-Cookie", cookie)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Redirect redirects the request
 | 
			
		||||
func (ctx *Context) Redirect(location string, status ...int) {
 | 
			
		||||
	code := http.StatusSeeOther
 | 
			
		||||
@@ -453,6 +464,15 @@ func (ctx *Context) Redirect(location string, status ...int) {
 | 
			
		||||
		code = status[0]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if strings.Contains(location, "://") || strings.HasPrefix(location, "//") {
 | 
			
		||||
		// Some browsers (Safari) have buggy behavior for Cookie + Cache + External Redirection, eg: /my-path => https://other/path
 | 
			
		||||
		// 1. the first request to "/my-path" contains cookie
 | 
			
		||||
		// 2. some time later, the request to "/my-path" doesn't contain cookie (caused by Prevent web tracking)
 | 
			
		||||
		// 3. Gitea's Sessioner doesn't see the session cookie, so it generates a new session id, and returns it to browser
 | 
			
		||||
		// 4. then the browser accepts the empty session, then the user is logged out
 | 
			
		||||
		// So in this case, we should remove the session cookie from the response header
 | 
			
		||||
		removeSessionCookieHeader(ctx.Resp)
 | 
			
		||||
	}
 | 
			
		||||
	http.Redirect(ctx.Resp, ctx.Req, location, code)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user