Skip to content

Instantly share code, notes, and snippets.

@inspirit941
Created October 25, 2024 01:59
Show Gist options
  • Save inspirit941/4b44c13dc92207cb116fa59565edd052 to your computer and use it in GitHub Desktop.
Save inspirit941/4b44c13dc92207cb116fa59565edd052 to your computer and use it in GitHub Desktop.
func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
payload, err := h.Hook.Parse(r, ValidEvents...)
if err != nil {
if err == gh.ErrEventNotFound {
w.WriteHeader(http.StatusNotFound)
h.Logger.Info("Event not found")
return
}
w.WriteHeader(http.StatusBadRequest)
h.Logger.Errorf("Error processing request: %v", err)
return
}
ctx := context.Background()
if len(h.SinkURI) > 0 {
ctx = cloudevents.ContextWithTarget(ctx, h.SinkURI)
}
err = h.handleEvent(ctx, payload, r.Header)
if err != nil {
h.Logger.Errorf("Event handler error: %v", err)
w.WriteHeader(400)
w.Write([]byte(err.Error()))
return
}
h.Logger.Infof("Event processed")
w.WriteHeader(202)
w.Write([]byte("accepted"))
}
func (h *Handler) handleEvent(ctx context.Context, payload interface{}, hdr http.Header) error {
gitHubEventType := hdr.Get(GHHeaderEvent)
if gitHubEventType == "" {
return fmt.Errorf("%q header is not set", GHHeaderEvent)
}
eventID := hdr.Get(GHHeaderDelivery)
if eventID == "" {
return fmt.Errorf("%q header is not set", GHHeaderDelivery)
}
h.Logger.Infof("Handling %s", gitHubEventType)
cloudEventType := sourcesv1alpha1.GitHubEventType(gitHubEventType)
subject, extensions := SubjectAndExtensionsFromGitHubEvent(gh.Event(gitHubEventType), payload, h.Logger)
event := cloudevents.NewEvent()
event.SetID(eventID)
event.SetType(cloudEventType)
event.SetSource(h.Source)
event.SetSubject(subject)
for k, v := range extensions {
event.SetExtension(k, v)
}
if err := event.SetData(cloudevents.ApplicationJSON, payload); err != nil {
return fmt.Errorf("failed to marshal event data: %w", err)
}
result := h.Client.Send(ctx, event)
if !cloudevents.IsACK(result) {
return result
}
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment