Skip to content

Commit a2a34ed

Browse files
authored
Add InitializeResponder to improve testing (#34)
Allow code other than the default dispatcher to initialize a request context for use with Set/GetResponder.
1 parent da539ea commit a2a34ed

File tree

1 file changed

+12
-7
lines changed

1 file changed

+12
-7
lines changed

githubapp/dispatcher.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -134,10 +134,7 @@ func (d *eventDispatcher) ServeHTTP(w http.ResponseWriter, r *http.Request) {
134134
ctx := r.Context()
135135

136136
// initialize context for SetResponder/GetResponder
137-
// we store a pointer in the context so that functions deeper in the call
138-
// tree can modify the value without creating a new context
139-
var responder func(http.ResponseWriter, *http.Request)
140-
ctx = context.WithValue(ctx, responderKey{}, &responder)
137+
ctx = InitializeResponder(ctx)
141138
r = r.WithContext(ctx)
142139

143140
eventType := r.Header.Get("X-GitHub-Event")
@@ -216,17 +213,25 @@ func DefaultResponseCallback(w http.ResponseWriter, r *http.Request, event strin
216213

217214
type responderKey struct{}
218215

216+
// InitializeResponder prepares the context to work with SetResponder and
217+
// GetResponder. It is used to test handlers that call SetResponder or to
218+
// implement custom event dispatchers that support responders.
219+
func InitializeResponder(ctx context.Context) context.Context {
220+
var responder func(http.ResponseWriter, *http.Request)
221+
return context.WithValue(ctx, responderKey{}, &responder)
222+
}
223+
219224
// SetResponder sets a function that sends a response to GitHub after event
220-
// processing completes. This function may only be called from event handler
221-
// functions invoked by the event dispatcher.
225+
// processing completes. The context must be initialized by InitializeResponder.
226+
// The event dispatcher does this automatically before calling a handler.
222227
//
223228
// Customizing individual handler responses should be rare. Applications that
224229
// want to modify the standard responses should consider registering a response
225230
// callback before using this function.
226231
func SetResponder(ctx context.Context, responder func(http.ResponseWriter, *http.Request)) {
227232
r, ok := ctx.Value(responderKey{}).(*func(http.ResponseWriter, *http.Request))
228233
if !ok || r == nil {
229-
panic("SetResponder() must be called from an event handler invoked by the go-githubapp event dispatcher")
234+
panic("SetResponder() must be called with an initialized context, such as one from the event dispatcher")
230235
}
231236
*r = responder
232237
}

0 commit comments

Comments
 (0)