Refactor the whole event switch into own function

This commit is contained in:
Martin Treml
2019-02-27 17:58:42 +01:00
parent 399cac5122
commit 175959ef60
+47 -50
View File
@@ -32,7 +32,7 @@ const (
WikiPageEvents Event = "Wiki Page Hook" WikiPageEvents Event = "Wiki Page Hook"
PipelineEvents Event = "Pipeline Hook" PipelineEvents Event = "Pipeline Hook"
BuildEvents Event = "Build Hook" BuildEvents Event = "Build Hook"
SystemHooks Event = "System Hook" SystemHookEvents Event = "System Hook"
objectPush string = "push" objectPush string = "push"
objectTag string = "tag_push" objectTag string = "tag_push"
@@ -82,9 +82,6 @@ func (hook Webhook) Parse(r *http.Request, events ...Event) (interface{}, error)
_ = r.Body.Close() _ = r.Body.Close()
}() }()
var err error
var payload []byte
if len(events) == 0 { if len(events) == 0 {
return nil, ErrEventNotSpecifiedToParse return nil, ErrEventNotSpecifiedToParse
} }
@@ -92,6 +89,17 @@ func (hook Webhook) Parse(r *http.Request, events ...Event) (interface{}, error)
return nil, ErrInvalidHTTPMethod 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") event := r.Header.Get("X-Gitlab-Event")
if len(event) == 0 { if len(event) == 0 {
return nil, ErrMissingGitLabEventHeader return nil, ErrMissingGitLabEventHeader
@@ -99,29 +107,17 @@ func (hook Webhook) Parse(r *http.Request, events ...Event) (interface{}, error)
gitLabEvent := Event(event) gitLabEvent := Event(event)
if gitLabEvent == SystemHooks { // check if payload is empty - that means it was no system hook call
payload, err := ioutil.ReadAll(r.Body)
payload, err = ioutil.ReadAll(r.Body) if err != nil || len(payload) == 0 {
if err != nil || len(payload) == 0 { return nil, ErrParsingPayload
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
}
} }
return eventParsing(gitLabEvent, events, payload)
}
func eventParsing(gitLabEvent Event, events []Event, payload []byte) (interface{}, error) {
var found bool var found bool
for _, evt := range events { for _, evt := range events {
if evt == gitLabEvent { if evt == gitLabEvent {
@@ -134,67 +130,68 @@ func (hook Webhook) Parse(r *http.Request, events ...Event) (interface{}, error)
return nil, ErrEventNotFound 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 { switch gitLabEvent {
case PushEvents: case PushEvents:
var pl PushEventPayload var pl PushEventPayload
err = json.Unmarshal([]byte(payload), &pl) err := json.Unmarshal([]byte(payload), &pl)
return pl, err return pl, err
case TagEvents: case TagEvents:
var pl TagEventPayload var pl TagEventPayload
err = json.Unmarshal([]byte(payload), &pl) err := json.Unmarshal([]byte(payload), &pl)
return pl, err return pl, err
case ConfidentialIssuesEvents: case ConfidentialIssuesEvents:
var pl ConfidentialIssueEventPayload var pl ConfidentialIssueEventPayload
err = json.Unmarshal([]byte(payload), &pl) err := json.Unmarshal([]byte(payload), &pl)
return pl, err return pl, err
case IssuesEvents: case IssuesEvents:
var pl IssueEventPayload var pl IssueEventPayload
err = json.Unmarshal([]byte(payload), &pl) err := json.Unmarshal([]byte(payload), &pl)
return pl, err return pl, err
case CommentEvents: case CommentEvents:
var pl CommentEventPayload var pl CommentEventPayload
err = json.Unmarshal([]byte(payload), &pl) err := json.Unmarshal([]byte(payload), &pl)
return pl, err return pl, err
case MergeRequestEvents: case MergeRequestEvents:
var pl MergeRequestEventPayload var pl MergeRequestEventPayload
err = json.Unmarshal([]byte(payload), &pl) err := json.Unmarshal([]byte(payload), &pl)
return pl, err return pl, err
case WikiPageEvents: case WikiPageEvents:
var pl WikiPageEventPayload var pl WikiPageEventPayload
err = json.Unmarshal([]byte(payload), &pl) err := json.Unmarshal([]byte(payload), &pl)
return pl, err return pl, err
case PipelineEvents: case PipelineEvents:
var pl PipelineEventPayload var pl PipelineEventPayload
err = json.Unmarshal([]byte(payload), &pl) err := json.Unmarshal([]byte(payload), &pl)
return pl, err return pl, err
case BuildEvents: case BuildEvents:
var pl BuildEventPayload var pl BuildEventPayload
err = json.Unmarshal([]byte(payload), &pl) err := json.Unmarshal([]byte(payload), &pl)
return pl, err 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: default:
return nil, fmt.Errorf("unknown event %s", gitLabEvent) return nil, fmt.Errorf("unknown event %s", gitLabEvent)
} }