@@ -134,10 +134,7 @@ func (d *eventDispatcher) ServeHTTP(w http.ResponseWriter, r *http.Request) {
134
134
ctx := r .Context ()
135
135
136
136
// 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 )
141
138
r = r .WithContext (ctx )
142
139
143
140
eventType := r .Header .Get ("X-GitHub-Event" )
@@ -216,17 +213,25 @@ func DefaultResponseCallback(w http.ResponseWriter, r *http.Request, event strin
216
213
217
214
type responderKey struct {}
218
215
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
+
219
224
// 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 .
222
227
//
223
228
// Customizing individual handler responses should be rare. Applications that
224
229
// want to modify the standard responses should consider registering a response
225
230
// callback before using this function.
226
231
func SetResponder (ctx context.Context , responder func (http.ResponseWriter , * http.Request )) {
227
232
r , ok := ctx .Value (responderKey {}).(* func (http.ResponseWriter , * http.Request ))
228
233
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" )
230
235
}
231
236
* r = responder
232
237
}
0 commit comments