14 Star 29 Fork 41

openEuler/go-gitee
关闭

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
messages.go 2.27 KB
一键复制 编辑 原始数据 按行查看 历史
edisonxiang 提交于 2019-09-26 12:45 +08:00 . init hook events
package gitee
import (
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"net/http"
"net/url"
)
/*
Header Example:
Request URL: http://gitee.com/webhook
Request Method: POST
Content-Type: application/json
User-Agent: git-oschina-hook
X-Gitee-Token: ******
X-Gitee-Ping: false
X-Gitee-Event: Merge Request Hook
X-Git-Oschina-Event: Merge Request Hook
*/
const (
// eventTypeHeader is the Gitee header key used to pass the event type.
eventTypeHeader = "X-Gitee-Event"
// tokenTypeHeader is the Gitee header key used to pass the webhook secret.
tokenTypeHeader = "X-Gitee-Token"
)
var (
// eventTypeMapping maps webhooks types
eventTypeMapping = map[string]string{
"Note Hook": "NoteEvent",
"Push Hook": "PushEvent",
"Issue Hook": "IssueEvent",
"Merge Request Hook": "PullRequestEvent",
"Tag Push Hook": "TagPushEvent",
}
)
// ValidatePayload validates an incoming Gitee Webhook event request
func ValidatePayload(r *http.Request, secretKey []byte) (payload []byte, err error) {
var body []byte
switch ct := r.Header.Get("Content-Type"); ct {
case "application/json":
var err error
if body, err = ioutil.ReadAll(r.Body); err != nil {
return nil, err
}
payload = body
case "application/x-www-form-urlencoded":
const payloadFormParam = "payload"
var err error
if body, err = ioutil.ReadAll(r.Body); err != nil {
return nil, err
}
form, err := url.ParseQuery(string(body))
if err != nil {
return nil, err
}
payload = []byte(form.Get(payloadFormParam))
default:
return nil, fmt.Errorf("webhook request has unsupported Content-Type %q", ct)
}
token := r.Header.Get(tokenTypeHeader)
if token != string(secretKey) {
return nil, errors.New("payload token check failed")
}
return payload, nil
}
// WebHookType returns the event type of webhook request r.
func WebHookType(r *http.Request) string {
return r.Header.Get(eventTypeHeader)
}
// ParseWebHook parses the event payload.
func ParseWebHook(messageType string, payload []byte) (interface{}, error) {
eventType, ok := eventTypeMapping[messageType]
if !ok {
return nil, fmt.Errorf("unknown X-Gitee-Event in message: %v", messageType)
}
hookEvent := HookEvent{
Type: &eventType,
RawPayload: (*json.RawMessage)(&payload),
}
return hookEvent.ParsePayload()
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/openeuler/go-gitee.git
git@gitee.com:openeuler/go-gitee.git
openeuler
go-gitee
go-gitee
3af895bc380c

搜索帮助