mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Ensure responses are context.ResponseWriters (#19843)
In order for web.Wrap to be able to detect if a response has been written we need to wrap any non-context.ResponseWriters as a such. Otherwise responses will be incorrectly detected as non-written to and handlers can double run. In the case of GZip this handler will change the response to a non-context.RW and this failure to correctly detect response writing causes fallthrough and a NPE. Fix #19839 Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
		@@ -21,6 +21,9 @@ func convertHandler(handler interface{}) wrappedHandlerFunc {
 | 
				
			|||||||
	case http.HandlerFunc:
 | 
						case http.HandlerFunc:
 | 
				
			||||||
		return func(resp http.ResponseWriter, req *http.Request, others ...wrappedHandlerFunc) (done bool, deferrable func()) {
 | 
							return func(resp http.ResponseWriter, req *http.Request, others ...wrappedHandlerFunc) (done bool, deferrable func()) {
 | 
				
			||||||
			routing.UpdateFuncInfo(req.Context(), funcInfo)
 | 
								routing.UpdateFuncInfo(req.Context(), funcInfo)
 | 
				
			||||||
 | 
								if _, ok := resp.(context.ResponseWriter); !ok {
 | 
				
			||||||
 | 
									resp = context.NewResponse(resp)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			t(resp, req)
 | 
								t(resp, req)
 | 
				
			||||||
			if r, ok := resp.(context.ResponseWriter); ok && r.Status() > 0 {
 | 
								if r, ok := resp.(context.ResponseWriter); ok && r.Status() > 0 {
 | 
				
			||||||
				done = true
 | 
									done = true
 | 
				
			||||||
@@ -92,6 +95,9 @@ func convertHandler(handler interface{}) wrappedHandlerFunc {
 | 
				
			|||||||
				next = wrapInternal(others)
 | 
									next = wrapInternal(others)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			routing.UpdateFuncInfo(req.Context(), funcInfo)
 | 
								routing.UpdateFuncInfo(req.Context(), funcInfo)
 | 
				
			||||||
 | 
								if _, ok := resp.(context.ResponseWriter); !ok {
 | 
				
			||||||
 | 
									resp = context.NewResponse(resp)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			t(next).ServeHTTP(resp, req)
 | 
								t(next).ServeHTTP(resp, req)
 | 
				
			||||||
			if r, ok := resp.(context.ResponseWriter); ok && r.Status() > 0 {
 | 
								if r, ok := resp.(context.ResponseWriter); ok && r.Status() > 0 {
 | 
				
			||||||
				done = true
 | 
									done = true
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user