Refactor the whole event switch into own function
This commit is contained in:
+47
-50
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user