@@ -83,26 +83,48 @@ func New(options ...Option) (*Webhook, error) {
83
83
return hook , nil
84
84
}
85
85
86
+ // Parse verifies and parses the events specified and returns the payload object or an error
86
87
func (hook * Webhook ) Parse (r * http.Request , events ... Event ) (interface {}, error ) {
87
88
defer func () {
88
89
_ , _ = io .Copy (ioutil .Discard , r .Body )
89
90
_ = r .Body .Close ()
90
91
}()
91
92
92
- if len (events ) == 0 {
93
- return nil , ErrEventNotSpecifiedToParse
94
- }
95
-
96
93
if r .Method != http .MethodPost {
97
94
return nil , ErrInvalidHTTPMethod
98
95
}
99
96
100
- event := r .Header .Get ("X-Event-Key" )
97
+ payload , err := ioutil .ReadAll (r .Body )
98
+ if err != nil || len (payload ) == 0 {
99
+ return nil , ErrParsingPayload
100
+ }
101
+
102
+ return hook .ParsePayload (
103
+ payload ,
104
+ r .Header .Get ("X-Event-Key" ),
105
+ r .Header .Get ("X-Hub-Signature" ),
106
+ events ... ,
107
+ )
108
+ }
109
+
110
+ // ParsePayload verifies and parses the events from a payload and string
111
+ // metadata (event type and signature), and returns the payload object or an
112
+ // error.
113
+ //
114
+ // Similar to Parse (which uses this method under the hood), this is useful in
115
+ // cases where payloads are not represented as HTTP requests - for example are
116
+ // put on a queue for pull processing.
117
+ func (hook Webhook ) ParsePayload (payload []byte , eventType , signature string , events ... Event ) (interface {}, error ) {
118
+ if len (events ) == 0 {
119
+ return nil , ErrEventNotSpecifiedToParse
120
+ }
121
+
122
+ event := eventType
101
123
if event == "" {
102
124
return nil , ErrMissingEventKeyHeader
103
125
}
104
126
105
- bitbucketEvent := Event (event )
127
+ bitbucketEvent := Event (eventType )
106
128
107
129
var found bool
108
130
for _ , evt := range events {
@@ -120,13 +142,7 @@ func (hook *Webhook) Parse(r *http.Request, events ...Event) (interface{}, error
120
142
return DiagnosticsPingPayload {}, nil
121
143
}
122
144
123
- payload , err := ioutil .ReadAll (r .Body )
124
- if err != nil || len (payload ) == 0 {
125
- return nil , ErrParsingPayload
126
- }
127
-
128
145
if len (hook .secret ) > 0 {
129
- signature := r .Header .Get ("X-Hub-Signature" )
130
146
if len (signature ) == 0 {
131
147
return nil , ErrMissingHubSignatureHeader
132
148
}
@@ -142,76 +158,58 @@ func (hook *Webhook) Parse(r *http.Request, events ...Event) (interface{}, error
142
158
switch bitbucketEvent {
143
159
case RepositoryReferenceChangedEvent :
144
160
var pl RepositoryReferenceChangedPayload
145
- err = json .Unmarshal ([]byte (payload ), & pl )
146
- return pl , err
161
+ return pl , json .Unmarshal (payload , & pl )
147
162
case RepositoryModifiedEvent :
148
163
var pl RepositoryModifiedPayload
149
- err = json .Unmarshal ([]byte (payload ), & pl )
150
- return pl , err
164
+ return pl , json .Unmarshal (payload , & pl )
151
165
case RepositoryForkedEvent :
152
166
var pl RepositoryForkedPayload
153
- err = json .Unmarshal ([]byte (payload ), & pl )
154
- return pl , err
167
+ return pl , json .Unmarshal (payload , & pl )
155
168
case RepositoryCommentAddedEvent :
156
169
var pl RepositoryCommentAddedPayload
157
- err = json .Unmarshal ([]byte (payload ), & pl )
158
- return pl , err
170
+ return pl , json .Unmarshal (payload , & pl )
159
171
case RepositoryCommentEditedEvent :
160
172
var pl RepositoryCommentEditedPayload
161
- err = json .Unmarshal ([]byte (payload ), & pl )
162
- return pl , err
173
+ return pl , json .Unmarshal (payload , & pl )
163
174
case RepositoryCommentDeletedEvent :
164
175
var pl RepositoryCommentDeletedPayload
165
- err = json .Unmarshal ([]byte (payload ), & pl )
166
- return pl , err
176
+ return pl , json .Unmarshal (payload , & pl )
167
177
case PullRequestOpenedEvent :
168
178
var pl PullRequestOpenedPayload
169
- err = json .Unmarshal ([]byte (payload ), & pl )
170
- return pl , err
179
+ return pl , json .Unmarshal (payload , & pl )
171
180
case PullRequestModifiedEvent :
172
181
var pl PullRequestModifiedPayload
173
- err = json .Unmarshal ([]byte (payload ), & pl )
174
- return pl , err
182
+ return pl , json .Unmarshal (payload , & pl )
175
183
case PullRequestMergedEvent :
176
184
var pl PullRequestMergedPayload
177
- err = json .Unmarshal ([]byte (payload ), & pl )
178
- return pl , err
185
+ return pl , json .Unmarshal (payload , & pl )
179
186
case PullRequestDeclinedEvent :
180
187
var pl PullRequestDeclinedPayload
181
- err = json .Unmarshal ([]byte (payload ), & pl )
182
- return pl , err
188
+ return pl , json .Unmarshal (payload , & pl )
183
189
case PullRequestDeletedEvent :
184
190
var pl PullRequestDeletedPayload
185
- err = json .Unmarshal ([]byte (payload ), & pl )
186
- return pl , err
191
+ return pl , json .Unmarshal (payload , & pl )
187
192
case PullRequestReviewerUpdatedEvent :
188
193
var pl PullRequestReviewerUpdatedPayload
189
- err = json .Unmarshal ([]byte (payload ), & pl )
190
- return pl , err
194
+ return pl , json .Unmarshal (payload , & pl )
191
195
case PullRequestReviewerApprovedEvent :
192
196
var pl PullRequestReviewerApprovedPayload
193
- err = json .Unmarshal ([]byte (payload ), & pl )
194
- return pl , err
197
+ return pl , json .Unmarshal (payload , & pl )
195
198
case PullRequestReviewerUnapprovedEvent :
196
199
var pl PullRequestReviewerUnapprovedPayload
197
- err = json .Unmarshal ([]byte (payload ), & pl )
198
- return pl , err
200
+ return pl , json .Unmarshal (payload , & pl )
199
201
case PullRequestReviewerNeedsWorkEvent :
200
202
var pl PullRequestReviewerNeedsWorkPayload
201
- err = json .Unmarshal ([]byte (payload ), & pl )
202
- return pl , err
203
+ return pl , json .Unmarshal (payload , & pl )
203
204
case PullRequestCommentAddedEvent :
204
205
var pl PullRequestCommentAddedPayload
205
- err = json .Unmarshal ([]byte (payload ), & pl )
206
- return pl , err
206
+ return pl , json .Unmarshal (payload , & pl )
207
207
case PullRequestCommentEditedEvent :
208
208
var pl PullRequestCommentEditedPayload
209
- err = json .Unmarshal ([]byte (payload ), & pl )
210
- return pl , err
209
+ return pl , json .Unmarshal (payload , & pl )
211
210
case PullRequestCommentDeletedEvent :
212
211
var pl PullRequestCommentDeletedPayload
213
- err = json .Unmarshal ([]byte (payload ), & pl )
214
- return pl , err
212
+ return pl , json .Unmarshal (payload , & pl )
215
213
default :
216
214
return nil , fmt .Errorf ("unknown event %s" , bitbucketEvent )
217
215
}
0 commit comments