-
Notifications
You must be signed in to change notification settings - Fork 0
/
github.go
69 lines (60 loc) · 1.54 KB
/
github.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package event
import (
"encoding/json"
"errors"
"io/ioutil"
"net/http"
"strings"
)
type githubPayloadType struct {
Ref string
HeadCommit headCommit `json:"head_commit" yaml:"head_commit"`
}
type headCommit struct {
ID string
Author commitAuthor
}
type commitAuthor struct {
Username string
}
// NewGithubEvent takes an http.Request object and parses it corresponding
// to Github webhook syntax into an RepoEvent object.
// It returns a RepoEvent object and an error in case of error
func NewGithubEvent(request *http.Request) (event *RepoEvent, err error) {
var payload []byte
if request.Body == nil {
err = errors.New("Unable to parse request.Body == nil")
return
}
switch request.Header.Get("Content-Type") {
case "application/json":
payload, err = ioutil.ReadAll(request.Body)
case "application/x-www-form-urlencoded":
err = request.ParseForm()
payload = []byte(request.PostFormValue("payload"))
}
if err != nil {
return nil, err
}
var parsedPayload githubPayloadType
var branch, author, commit string
err = json.Unmarshal(payload, &parsedPayload)
if err != nil {
return nil, err
}
sl := strings.Split(parsedPayload.Ref, "/")
branch = sl[len(sl)-1]
commit = parsedPayload.HeadCommit.ID
author = parsedPayload.HeadCommit.Author.Username
if branch == "" {
err = errors.New("Unable to parse branch")
}
if commit == "" {
err = errors.New("Unable to parse commit")
}
if author == "" {
err = errors.New("Unable to parse author")
}
event = &RepoEvent{Author: author, Branch: branch, Commit: commit}
return
}