1717 ErrGitLabTokenVerificationFailed = errors .New ("X-Gitlab-Token validation failed" )
1818 ErrEventNotFound = errors .New ("event not defined to be parsed" )
1919 ErrParsingPayload = errors .New ("error parsing payload" )
20+ ErrParsingSystemPayload = errors .New ("error parsing system payload" )
2021 // ErrHMACVerificationFailed = errors.New("HMAC verification failed")
2122)
2223
@@ -31,6 +32,11 @@ const (
3132 WikiPageEvents Event = "Wiki Page Hook"
3233 PipelineEvents Event = "Pipeline Hook"
3334 BuildEvents Event = "Build Hook"
35+ SystemHookEvents Event = "System Hook"
36+
37+ objectPush string = "push"
38+ objectTag string = "tag_push"
39+ objectMergeRequest string = "merge_request"
3440)
3541
3642// Option is a configuration option for the webhook
@@ -55,7 +61,7 @@ type Webhook struct {
5561 secret string
5662}
5763
58- // Event defines a GitHub hook event type
64+ // Event defines a GitLab hook event type by the X-Gitlab-Event Header
5965type Event string
6066
6167// New creates and returns a WebHook instance denoted by the Provider type
@@ -83,13 +89,31 @@ func (hook Webhook) Parse(r *http.Request, events ...Event) (interface{}, error)
8389 return nil , ErrInvalidHTTPMethod
8490 }
8591
92+ // If we have a Secret set, we should check the MAC
93+ if len (hook .secret ) > 0 {
94+ signature := r .Header .Get ("X-Gitlab-Token" )
95+ if signature != hook .secret {
96+ return nil , ErrGitLabTokenVerificationFailed
97+ }
98+ }
99+
86100 event := r .Header .Get ("X-Gitlab-Event" )
87101 if len (event ) == 0 {
88102 return nil , ErrMissingGitLabEventHeader
89103 }
90104
91105 gitLabEvent := Event (event )
92106
107+ payload , err := ioutil .ReadAll (r .Body )
108+ if err != nil || len (payload ) == 0 {
109+ return nil , ErrParsingPayload
110+ }
111+
112+ return eventParsing (gitLabEvent , events , payload )
113+ }
114+
115+ func eventParsing (gitLabEvent Event , events []Event , payload []byte ) (interface {}, error ) {
116+
93117 var found bool
94118 for _ , evt := range events {
95119 if evt == gitLabEvent {
@@ -102,64 +126,68 @@ func (hook Webhook) Parse(r *http.Request, events ...Event) (interface{}, error)
102126 return nil , ErrEventNotFound
103127 }
104128
105- payload , err := ioutil .ReadAll (r .Body )
106- if err != nil || len (payload ) == 0 {
107- return nil , ErrParsingPayload
108- }
109-
110- // If we have a Secret set, we should check the MAC
111- if len (hook .secret ) > 0 {
112- signature := r .Header .Get ("X-Gitlab-Token" )
113- if signature != hook .secret {
114- return nil , ErrGitLabTokenVerificationFailed
115- }
116- }
117-
118129 switch gitLabEvent {
119130 case PushEvents :
120131 var pl PushEventPayload
121- err = json .Unmarshal ([]byte (payload ), & pl )
132+ err : = json .Unmarshal ([]byte (payload ), & pl )
122133 return pl , err
123134
124135 case TagEvents :
125136 var pl TagEventPayload
126- err = json .Unmarshal ([]byte (payload ), & pl )
137+ err : = json .Unmarshal ([]byte (payload ), & pl )
127138 return pl , err
128139
129140 case ConfidentialIssuesEvents :
130141 var pl ConfidentialIssueEventPayload
131- err = json .Unmarshal ([]byte (payload ), & pl )
142+ err : = json .Unmarshal ([]byte (payload ), & pl )
132143 return pl , err
133144
134145 case IssuesEvents :
135146 var pl IssueEventPayload
136- err = json .Unmarshal ([]byte (payload ), & pl )
147+ err : = json .Unmarshal ([]byte (payload ), & pl )
137148 return pl , err
138149
139150 case CommentEvents :
140151 var pl CommentEventPayload
141- err = json .Unmarshal ([]byte (payload ), & pl )
152+ err : = json .Unmarshal ([]byte (payload ), & pl )
142153 return pl , err
143154
144155 case MergeRequestEvents :
145156 var pl MergeRequestEventPayload
146- err = json .Unmarshal ([]byte (payload ), & pl )
157+ err : = json .Unmarshal ([]byte (payload ), & pl )
147158 return pl , err
148159
149160 case WikiPageEvents :
150161 var pl WikiPageEventPayload
151- err = json .Unmarshal ([]byte (payload ), & pl )
162+ err : = json .Unmarshal ([]byte (payload ), & pl )
152163 return pl , err
153164
154165 case PipelineEvents :
155166 var pl PipelineEventPayload
156- err = json .Unmarshal ([]byte (payload ), & pl )
167+ err : = json .Unmarshal ([]byte (payload ), & pl )
157168 return pl , err
158169
159170 case BuildEvents :
160171 var pl BuildEventPayload
161- err = json .Unmarshal ([]byte (payload ), & pl )
172+ err : = json .Unmarshal ([]byte (payload ), & pl )
162173 return pl , err
174+
175+ case SystemHookEvents :
176+ var pl SystemHookPayload
177+ err := json .Unmarshal ([]byte (payload ), & pl )
178+ if err != nil {
179+ return nil , err
180+ }
181+ switch pl .ObjectKind {
182+ case objectPush :
183+ return eventParsing (PushEvents , events , payload )
184+ case objectTag :
185+ return eventParsing (TagEvents , events , payload )
186+ case objectMergeRequest :
187+ return eventParsing (MergeRequestEvents , events , payload )
188+ default :
189+ return nil , fmt .Errorf ("unknown system hook event %s" , gitLabEvent )
190+ }
163191 default :
164192 return nil , fmt .Errorf ("unknown event %s" , gitLabEvent )
165193 }
0 commit comments