@@ -9,25 +9,15 @@ import (
99 "net/http"
1010 "reflect"
1111
12- "code.gitea.io/gitea/modules/context"
1312 "code.gitea.io/gitea/modules/log"
1413 "code.gitea.io/gitea/modules/web/routing"
14+ "code.gitea.io/gitea/modules/web/types"
1515)
1616
17- // ResponseStatusProvider is an interface to check whether the response has been written by the handler
18- type ResponseStatusProvider interface {
19- Written () bool
20- }
21-
22- // TODO: decouple this from the context package, let the context package register these providers
23- var argTypeProvider = map [reflect.Type ]func (req * http.Request ) ResponseStatusProvider {
24- reflect .TypeOf (& context.APIContext {}): func (req * http.Request ) ResponseStatusProvider { return context .GetAPIContext (req ) },
25- reflect .TypeOf (& context.Context {}): func (req * http.Request ) ResponseStatusProvider { return context .GetWebContext (req ) },
26- reflect .TypeOf (& context.PrivateContext {}): func (req * http.Request ) ResponseStatusProvider { return context .GetPrivateContext (req ) },
27- }
17+ var responseStatusProviders = map [reflect.Type ]func (req * http.Request ) types.ResponseStatusProvider {}
2818
29- func RegisterHandleTypeProvider [T any ](fn func (req * http.Request ) ResponseStatusProvider ) {
30- argTypeProvider [reflect .TypeOf ((* T )(nil )).Elem ()] = fn
19+ func RegisterResponseStatusProvider [T any ](fn func (req * http.Request ) types. ResponseStatusProvider ) {
20+ responseStatusProviders [reflect .TypeOf ((* T )(nil )).Elem ()] = fn
3121}
3222
3323// responseWriter is a wrapper of http.ResponseWriter, to check whether the response has been written
@@ -36,10 +26,10 @@ type responseWriter struct {
3626 status int
3727}
3828
39- var _ ResponseStatusProvider = (* responseWriter )(nil )
29+ var _ types. ResponseStatusProvider = (* responseWriter )(nil )
4030
41- func (r * responseWriter ) Written () bool {
42- return r .status > 0
31+ func (r * responseWriter ) WrittenStatus () int {
32+ return r .status
4333}
4434
4535func (r * responseWriter ) Header () http.Header {
6858func preCheckHandler (fn reflect.Value , argsIn []reflect.Value ) {
6959 hasStatusProvider := false
7060 for _ , argIn := range argsIn {
71- if _ , hasStatusProvider = argIn .Interface ().(ResponseStatusProvider ); hasStatusProvider {
61+ if _ , hasStatusProvider = argIn .Interface ().(types. ResponseStatusProvider ); hasStatusProvider {
7262 break
7363 }
7464 }
@@ -101,7 +91,7 @@ func prepareHandleArgsIn(resp http.ResponseWriter, req *http.Request, fn reflect
10191 case httpReqType :
10292 argsIn [i ] = reflect .ValueOf (req )
10393 default :
104- if argFn , ok := argTypeProvider [argTyp ]; ok {
94+ if argFn , ok := responseStatusProviders [argTyp ]; ok {
10595 if isPreCheck {
10696 argsIn [i ] = reflect .ValueOf (& responseWriter {})
10797 } else {
@@ -129,8 +119,8 @@ func handleResponse(fn reflect.Value, ret []reflect.Value) goctx.CancelFunc {
129119
130120func hasResponseBeenWritten (argsIn []reflect.Value ) bool {
131121 for _ , argIn := range argsIn {
132- if statusProvider , ok := argIn .Interface ().(ResponseStatusProvider ); ok {
133- if statusProvider .Written () {
122+ if statusProvider , ok := argIn .Interface ().(types. ResponseStatusProvider ); ok {
123+ if statusProvider .WrittenStatus () != 0 {
134124 return true
135125 }
136126 }
@@ -161,7 +151,7 @@ func toHandlerProvider(handler any) func(next http.Handler) http.Handler {
161151 return http .HandlerFunc (func (respOrig http.ResponseWriter , req * http.Request ) {
162152 // wrap the response writer to check whether the response has been written
163153 resp := respOrig
164- if _ , ok := resp .(ResponseStatusProvider ); ! ok {
154+ if _ , ok := resp .(types. ResponseStatusProvider ); ! ok {
165155 resp = & responseWriter {respWriter : resp }
166156 }
167157
0 commit comments