From 16a6ac7a61b511c21ce9a7593c097dcf33fc17e3 Mon Sep 17 00:00:00 2001 From: Lars Lehtonen Date: Thu, 20 Oct 2016 15:53:15 -0700 Subject: [PATCH] Added http headers as another param to ProcessPayloadFunc --- bitbucket/bitbucket.go | 44 +++++++++++++------------ bitbucket/bitbucket_test.go | 2 +- examples/multiple-handlers/main.go | 4 +-- examples/single-handler/main.go | 2 +- github/github.go | 53 ++++++++++++++++-------------- github/github_test.go | 2 +- webhooks.go | 5 ++- 7 files changed, 60 insertions(+), 52 deletions(-) diff --git a/bitbucket/bitbucket.go b/bitbucket/bitbucket.go index b43c154..961630b 100644 --- a/bitbucket/bitbucket.go +++ b/bitbucket/bitbucket.go @@ -100,80 +100,82 @@ func (hook Webhook) ParsePayload(w http.ResponseWriter, r *http.Request) { return } + hd := webhooks.Header(r.Header) + switch bitbucketEvent { case RepoPushEvent: var pl RepoPushPayload json.Unmarshal([]byte(payload), &pl) - hook.runProcessPayloadFunc(fn, pl) + hook.runProcessPayloadFunc(fn, pl, hd) case RepoForkEvent: var pl RepoForkPayload json.Unmarshal([]byte(payload), &pl) - hook.runProcessPayloadFunc(fn, pl) + hook.runProcessPayloadFunc(fn, pl, hd) case RepoCommitCommentCreatedEvent: var pl RepoCommitCommentCreatedPayload json.Unmarshal([]byte(payload), &pl) - hook.runProcessPayloadFunc(fn, pl) + hook.runProcessPayloadFunc(fn, pl, hd) case RepoCommitStatusCreatedEvent: var pl RepoCommitStatusCreatedPayload json.Unmarshal([]byte(payload), &pl) - hook.runProcessPayloadFunc(fn, pl) + hook.runProcessPayloadFunc(fn, pl, hd) case RepoCommitStatusUpdatedEvent: var pl RepoCommitStatusUpdatedPayload json.Unmarshal([]byte(payload), &pl) - hook.runProcessPayloadFunc(fn, pl) + hook.runProcessPayloadFunc(fn, pl, hd) case IssueCreatedEvent: var pl IssueCreatedPayload json.Unmarshal([]byte(payload), &pl) - hook.runProcessPayloadFunc(fn, pl) + hook.runProcessPayloadFunc(fn, pl, hd) case IssueUpdatedEvent: var pl IssueUpdatedPayload json.Unmarshal([]byte(payload), &pl) - hook.runProcessPayloadFunc(fn, pl) + hook.runProcessPayloadFunc(fn, pl, hd) case IssueCommentCreatedEvent: var pl IssueCommentCreatedPayload json.Unmarshal([]byte(payload), &pl) - hook.runProcessPayloadFunc(fn, pl) + hook.runProcessPayloadFunc(fn, pl, hd) case PullRequestCreatedEvent: var pl PullRequestCreatedPayload json.Unmarshal([]byte(payload), &pl) - hook.runProcessPayloadFunc(fn, pl) + hook.runProcessPayloadFunc(fn, pl, hd) case PullRequestUpdatedEvent: var pl PullRequestUpdatedPayload json.Unmarshal([]byte(payload), &pl) - hook.runProcessPayloadFunc(fn, pl) + hook.runProcessPayloadFunc(fn, pl, hd) case PullRequestApprovedEvent: var pl PullRequestApprovedPayload json.Unmarshal([]byte(payload), &pl) - hook.runProcessPayloadFunc(fn, pl) + hook.runProcessPayloadFunc(fn, pl, hd) case PullRequestApprovalRemovedEvent: var pl PullRequestApprovalRemovedPayload json.Unmarshal([]byte(payload), &pl) - hook.runProcessPayloadFunc(fn, pl) + hook.runProcessPayloadFunc(fn, pl, hd) case PullRequestMergedEvent: var pl PullRequestMergedPayload json.Unmarshal([]byte(payload), &pl) - hook.runProcessPayloadFunc(fn, pl) + hook.runProcessPayloadFunc(fn, pl, hd) case PullRequestDeclinedEvent: var pl PullRequestDeclinedPayload json.Unmarshal([]byte(payload), &pl) - hook.runProcessPayloadFunc(fn, pl) + hook.runProcessPayloadFunc(fn, pl, hd) case PullRequestCommentCreatedEvent: var pl PullRequestCommentCreatedPayload json.Unmarshal([]byte(payload), &pl) - hook.runProcessPayloadFunc(fn, pl) + hook.runProcessPayloadFunc(fn, pl, hd) case PullRequestCommentUpdatedEvent: var pl PullRequestCommentUpdatedPayload json.Unmarshal([]byte(payload), &pl) - hook.runProcessPayloadFunc(fn, pl) + hook.runProcessPayloadFunc(fn, pl, hd) case PullRequestCommentDeletedEvent: var pl PullRequestCommentDeletedPayload json.Unmarshal([]byte(payload), &pl) - hook.runProcessPayloadFunc(fn, pl) + hook.runProcessPayloadFunc(fn, pl, hd) } } -func (hook Webhook) runProcessPayloadFunc(fn webhooks.ProcessPayloadFunc, results interface{}) { - go func(fn webhooks.ProcessPayloadFunc, results interface{}) { - fn(results) - }(fn, results) +func (hook Webhook) runProcessPayloadFunc(fn webhooks.ProcessPayloadFunc, results interface{}, header webhooks.Header) { + go func(fn webhooks.ProcessPayloadFunc, results interface{}, header webhooks.Header) { + fn(results, header) + }(fn, results, header) } diff --git a/bitbucket/bitbucket_test.go b/bitbucket/bitbucket_test.go index 602e084..da2b1c2 100644 --- a/bitbucket/bitbucket_test.go +++ b/bitbucket/bitbucket_test.go @@ -29,7 +29,7 @@ const ( ) // HandlePayload handles GitHub event(s) -func HandlePayload(payload interface{}) { +func HandlePayload(payload interface{}, header webhooks.Header) { } diff --git a/examples/multiple-handlers/main.go b/examples/multiple-handlers/main.go index 5f5214b..d1524d9 100644 --- a/examples/multiple-handlers/main.go +++ b/examples/multiple-handlers/main.go @@ -25,7 +25,7 @@ func main() { } // HandleRelease handles GitHub release events -func HandleRelease(payload interface{}) { +func HandleRelease(payload interface{}, header webhooks.Header) { fmt.Println("Handling Release") @@ -41,7 +41,7 @@ func HandleRelease(payload interface{}) { } // HandlePullRequest handles GitHub pull_request events -func HandlePullRequest(payload interface{}) { +func HandlePullRequest(payload interface{}, header webhooks.Header) { fmt.Println("Handling Pull Request") diff --git a/examples/single-handler/main.go b/examples/single-handler/main.go index dfc46db..484211c 100644 --- a/examples/single-handler/main.go +++ b/examples/single-handler/main.go @@ -24,7 +24,7 @@ func main() { } // HandleMultiple handles multiple GitHub events -func HandleMultiple(payload interface{}) { +func HandleMultiple(payload interface{}, header webhooks.Header) { fmt.Println("Handling Payload..") diff --git a/github/github.go b/github/github.go index efced88..5790e77 100644 --- a/github/github.go +++ b/github/github.go @@ -129,96 +129,99 @@ func (hook Webhook) ParsePayload(w http.ResponseWriter, r *http.Request) { } } + // Make headers available to ProcessPayloadFunc as a webhooks type + hd := webhooks.Header(r.Header) + switch gitHubEvent { case CommitCommentEvent: var cc CommitCommentPayload json.Unmarshal([]byte(payload), &cc) - hook.runProcessPayloadFunc(fn, cc) + hook.runProcessPayloadFunc(fn, cc, hd) case CreateEvent: var c CreatePayload json.Unmarshal([]byte(payload), &c) - hook.runProcessPayloadFunc(fn, c) + hook.runProcessPayloadFunc(fn, c, hd) case DeleteEvent: var d DeletePayload json.Unmarshal([]byte(payload), &d) - hook.runProcessPayloadFunc(fn, d) + hook.runProcessPayloadFunc(fn, d, hd) case DeploymentEvent: var d DeploymentPayload json.Unmarshal([]byte(payload), &d) - hook.runProcessPayloadFunc(fn, d) + hook.runProcessPayloadFunc(fn, d, hd) case DeploymentStatusEvent: var d DeploymentStatusPayload json.Unmarshal([]byte(payload), &d) - hook.runProcessPayloadFunc(fn, d) + hook.runProcessPayloadFunc(fn, d, hd) case ForkEvent: var f ForkPayload json.Unmarshal([]byte(payload), &f) - hook.runProcessPayloadFunc(fn, f) + hook.runProcessPayloadFunc(fn, f, hd) case GollumEvent: var g GollumPayload json.Unmarshal([]byte(payload), &g) - hook.runProcessPayloadFunc(fn, g) + hook.runProcessPayloadFunc(fn, g, hd) case IssueCommentEvent: var i IssueCommentPayload json.Unmarshal([]byte(payload), &i) - hook.runProcessPayloadFunc(fn, i) + hook.runProcessPayloadFunc(fn, i, hd) case IssuesEvent: var i IssuesPayload json.Unmarshal([]byte(payload), &i) - hook.runProcessPayloadFunc(fn, i) + hook.runProcessPayloadFunc(fn, i, hd) case MemberEvent: var m MemberPayload json.Unmarshal([]byte(payload), &m) - hook.runProcessPayloadFunc(fn, m) + hook.runProcessPayloadFunc(fn, m, hd) case MembershipEvent: var m MembershipPayload json.Unmarshal([]byte(payload), &m) - hook.runProcessPayloadFunc(fn, m) + hook.runProcessPayloadFunc(fn, m, hd) case PageBuildEvent: var p PageBuildPayload json.Unmarshal([]byte(payload), &p) - hook.runProcessPayloadFunc(fn, p) + hook.runProcessPayloadFunc(fn, p, hd) case PublicEvent: var p PublicPayload json.Unmarshal([]byte(payload), &p) - hook.runProcessPayloadFunc(fn, p) + hook.runProcessPayloadFunc(fn, p, hd) case PullRequestReviewCommentEvent: var p PullRequestReviewCommentPayload json.Unmarshal([]byte(payload), &p) - hook.runProcessPayloadFunc(fn, p) + hook.runProcessPayloadFunc(fn, p, hd) case PullRequestEvent: var p PullRequestPayload json.Unmarshal([]byte(payload), &p) - hook.runProcessPayloadFunc(fn, p) + hook.runProcessPayloadFunc(fn, p, hd) case PushEvent: var p PushPayload json.Unmarshal([]byte(payload), &p) - hook.runProcessPayloadFunc(fn, p) + hook.runProcessPayloadFunc(fn, p, hd) case RepositoryEvent: var r RepositoryPayload json.Unmarshal([]byte(payload), &r) - hook.runProcessPayloadFunc(fn, r) + hook.runProcessPayloadFunc(fn, r, hd) case ReleaseEvent: var r ReleasePayload json.Unmarshal([]byte(payload), &r) - hook.runProcessPayloadFunc(fn, r) + hook.runProcessPayloadFunc(fn, r, hd) case StatusEvent: var s StatusPayload json.Unmarshal([]byte(payload), &s) - hook.runProcessPayloadFunc(fn, s) + hook.runProcessPayloadFunc(fn, s, hd) case TeamAddEvent: var t TeamAddPayload json.Unmarshal([]byte(payload), &t) - hook.runProcessPayloadFunc(fn, t) + hook.runProcessPayloadFunc(fn, t, hd) case WatchEvent: var w WatchPayload json.Unmarshal([]byte(payload), &w) - hook.runProcessPayloadFunc(fn, w) + hook.runProcessPayloadFunc(fn, w, hd) } } -func (hook Webhook) runProcessPayloadFunc(fn webhooks.ProcessPayloadFunc, results interface{}) { - go func(fn webhooks.ProcessPayloadFunc, results interface{}) { - fn(results) - }(fn, results) +func (hook Webhook) runProcessPayloadFunc(fn webhooks.ProcessPayloadFunc, results interface{}, header webhooks.Header) { + go func(fn webhooks.ProcessPayloadFunc, results interface{}, header webhooks.Header) { + fn(results, header) + }(fn, results, header) } diff --git a/github/github_test.go b/github/github_test.go index cc74298..7bde7a4 100644 --- a/github/github_test.go +++ b/github/github_test.go @@ -29,7 +29,7 @@ const ( ) // HandlePayload handles GitHub event(s) -func HandlePayload(payload interface{}) { +func HandlePayload(payload interface{}, header webhooks.Header) { } diff --git a/webhooks.go b/webhooks.go index 6dcd6f1..fcd1ba2 100644 --- a/webhooks.go +++ b/webhooks.go @@ -2,6 +2,9 @@ package webhooks import "net/http" +// Webhook provides http.Header to minimize imports +type Header http.Header + // Provider defines the type of webhook type Provider int @@ -34,7 +37,7 @@ type server struct { } // ProcessPayloadFunc is a common function for payload return values -type ProcessPayloadFunc func(payload interface{}) +type ProcessPayloadFunc func(payload interface{}, header Header) // Run runs a server func Run(hook Webhook, addr string, path string) error {