From 175959ef6086b75df475b86cda4c20dcfbcc9421 Mon Sep 17 00:00:00 2001 From: Martin Treml Date: Wed, 27 Feb 2019 17:58:42 +0100 Subject: [PATCH] Refactor the whole event switch into own function --- gitlab/gitlab.go | 97 +++++++++++++++++++++++------------------------- 1 file changed, 47 insertions(+), 50 deletions(-) diff --git a/gitlab/gitlab.go b/gitlab/gitlab.go index e1279da..9d478fc 100644 --- a/gitlab/gitlab.go +++ b/gitlab/gitlab.go @@ -32,7 +32,7 @@ const ( WikiPageEvents Event = "Wiki Page Hook" PipelineEvents Event = "Pipeline Hook" BuildEvents Event = "Build Hook" - SystemHooks Event = "System Hook" + SystemHookEvents Event = "System Hook" objectPush string = "push" objectTag string = "tag_push" @@ -82,9 +82,6 @@ func (hook Webhook) Parse(r *http.Request, events ...Event) (interface{}, error) _ = r.Body.Close() }() - var err error - var payload []byte - if len(events) == 0 { return nil, ErrEventNotSpecifiedToParse } @@ -92,6 +89,17 @@ func (hook Webhook) Parse(r *http.Request, events ...Event) (interface{}, error) return nil, ErrInvalidHTTPMethod } + // Add SystemHookEvents to event slice to allow parsing of it + events = append(events, SystemHookEvents) + + // If we have a Secret set, we should check the MAC + if len(hook.secret) > 0 { + signature := r.Header.Get("X-Gitlab-Token") + if signature != hook.secret { + return nil, ErrGitLabTokenVerificationFailed + } + } + event := r.Header.Get("X-Gitlab-Event") if len(event) == 0 { return nil, ErrMissingGitLabEventHeader @@ -99,29 +107,17 @@ func (hook Webhook) Parse(r *http.Request, events ...Event) (interface{}, error) gitLabEvent := Event(event) - if gitLabEvent == SystemHooks { - - payload, err = ioutil.ReadAll(r.Body) - if err != nil || len(payload) == 0 { - return nil, ErrParsingSystemPayload - } - - var sysPl SystemHookPayload - err = json.Unmarshal([]byte(payload), &sysPl) - if err != nil { - return nil, err - } - - switch sysPl.ObjectKind { - case objectPush: - gitLabEvent = PushEvents - case objectTag: - gitLabEvent = TagEvents - case objectMergeRequest: - gitLabEvent = MergeRequestEvents - } + // check if payload is empty - that means it was no system hook call + payload, err := ioutil.ReadAll(r.Body) + if err != nil || len(payload) == 0 { + return nil, ErrParsingPayload } + return eventParsing(gitLabEvent, events, payload) +} + +func eventParsing(gitLabEvent Event, events []Event, payload []byte) (interface{}, error) { + var found bool for _, evt := range events { if evt == gitLabEvent { @@ -134,67 +130,68 @@ func (hook Webhook) Parse(r *http.Request, events ...Event) (interface{}, error) return nil, ErrEventNotFound } - // check if payload is empty - that means it was no system hook call - if len(payload) == 0 { - payload, err = ioutil.ReadAll(r.Body) - if err != nil || len(payload) == 0 { - return nil, ErrParsingPayload - } - } - - // If we have a Secret set, we should check the MAC - if len(hook.secret) > 0 { - signature := r.Header.Get("X-Gitlab-Token") - if signature != hook.secret { - return nil, ErrGitLabTokenVerificationFailed - } - } - switch gitLabEvent { case PushEvents: var pl PushEventPayload - err = json.Unmarshal([]byte(payload), &pl) + err := json.Unmarshal([]byte(payload), &pl) return pl, err case TagEvents: var pl TagEventPayload - err = json.Unmarshal([]byte(payload), &pl) + err := json.Unmarshal([]byte(payload), &pl) return pl, err case ConfidentialIssuesEvents: var pl ConfidentialIssueEventPayload - err = json.Unmarshal([]byte(payload), &pl) + err := json.Unmarshal([]byte(payload), &pl) return pl, err case IssuesEvents: var pl IssueEventPayload - err = json.Unmarshal([]byte(payload), &pl) + err := json.Unmarshal([]byte(payload), &pl) return pl, err case CommentEvents: var pl CommentEventPayload - err = json.Unmarshal([]byte(payload), &pl) + err := json.Unmarshal([]byte(payload), &pl) return pl, err case MergeRequestEvents: var pl MergeRequestEventPayload - err = json.Unmarshal([]byte(payload), &pl) + err := json.Unmarshal([]byte(payload), &pl) return pl, err case WikiPageEvents: var pl WikiPageEventPayload - err = json.Unmarshal([]byte(payload), &pl) + err := json.Unmarshal([]byte(payload), &pl) return pl, err case PipelineEvents: var pl PipelineEventPayload - err = json.Unmarshal([]byte(payload), &pl) + err := json.Unmarshal([]byte(payload), &pl) return pl, err case BuildEvents: var pl BuildEventPayload - err = json.Unmarshal([]byte(payload), &pl) + err := json.Unmarshal([]byte(payload), &pl) return pl, err + + case SystemHookEvents: + var pl SystemHookPayload + err := json.Unmarshal([]byte(payload), &pl) + if err != nil { + return nil, err + } + switch pl.ObjectKind { + case objectPush: + return eventParsing(PushEvents, events, payload) + case objectTag: + return eventParsing(TagEvents, events, payload) + case objectMergeRequest: + return eventParsing(MergeRequestEvents, events, payload) + default: + return nil, fmt.Errorf("unknown system hook event %s", gitLabEvent) + } default: return nil, fmt.Errorf("unknown event %s", gitLabEvent) }