diff --git a/remote/gitlab/client/gitlab.go b/remote/gitlab/client/gitlab.go index a44946aee..1b4bad749 100644 --- a/remote/gitlab/client/gitlab.go +++ b/remote/gitlab/client/gitlab.go @@ -74,6 +74,10 @@ func (c *Client) Do(method, url, opaque string, body []byte) ([]byte, error) { req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", c.Token)) + if len(opaque) > 0 { + req.URL.Opaque = opaque + } + resp, err := c.Client.Do(req) if err != nil { return nil, fmt.Errorf("Client.Do error: %q", err) diff --git a/remote/gitlab/client/hook.go b/remote/gitlab/client/hook.go index 0263e1008..8ea89689e 100644 --- a/remote/gitlab/client/hook.go +++ b/remote/gitlab/client/hook.go @@ -1,5 +1,41 @@ package client +import ( + "encoding/json" + "fmt" +) + +// ParseHook parses hook payload from GitLab func ParseHook(payload []byte) (*HookPayload, error) { - return nil, nil + hp := HookPayload{} + if err := json.Unmarshal(payload, &hp); err != nil { + return nil, err + } + + // Basic sanity check + switch { + case len(hp.ObjectKind) == 0: + // Assume this is a post-receive within repository + if len(hp.After) == 0 { + return nil, fmt.Errorf("Invalid hook received, commit hash not found.") + } + case hp.ObjectKind == "push": + if hp.Repository == nil { + return nil, fmt.Errorf("Invalid push hook received, attributes not found") + } + case hp.ObjectKind == "tag_push": + if hp.Repository == nil { + return nil, fmt.Errorf("Invalid tag push hook received, attributes not found") + } + case hp.ObjectKind == "issue": + fallthrough + case hp.ObjectKind == "merge_request": + if hp.ObjectAttributes == nil { + return nil, fmt.Errorf("Invalid hook received, attributes not found.") + } + default: + return nil, fmt.Errorf("Invalid hook received, payload format not recognized.") + } + + return &hp, nil }