summaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
Diffstat (limited to 'models')
-rw-r--r--models/migrations/migrations.go2
-rw-r--r--models/migrations/v86.go17
-rw-r--r--models/webhook.go43
3 files changed, 47 insertions, 15 deletions
diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go
index 1d8cf65785..b86c20576f 100644
--- a/models/migrations/migrations.go
+++ b/models/migrations/migrations.go
@@ -225,6 +225,8 @@ var migrations = []Migration{
NewMigration("add table to store original imported gpg keys", addGPGKeyImport),
// v85 -> v86
NewMigration("hash application token", hashAppToken),
+ // v86 -> v87
+ NewMigration("add http method to webhook", addHTTPMethodToWebhook),
}
// Migrate database to current version
diff --git a/models/migrations/v86.go b/models/migrations/v86.go
new file mode 100644
index 0000000000..492a08c71e
--- /dev/null
+++ b/models/migrations/v86.go
@@ -0,0 +1,17 @@
+// Copyright 2019 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package migrations
+
+import (
+ "github.com/go-xorm/xorm"
+)
+
+func addHTTPMethodToWebhook(x *xorm.Engine) error {
+ type Webhook struct {
+ HTTPMethod string `xorm:"http_method DEFAULT 'POST'"`
+ }
+
+ return x.Sync2(new(Webhook))
+}
diff --git a/models/webhook.go b/models/webhook.go
index 9be89241a4..8a7350bb6e 100644
--- a/models/webhook.go
+++ b/models/webhook.go
@@ -13,6 +13,7 @@ import (
"encoding/json"
"fmt"
"io/ioutil"
+ "net/http"
"strings"
"time"
@@ -105,6 +106,7 @@ type Webhook struct {
OrgID int64 `xorm:"INDEX"`
URL string `xorm:"url TEXT"`
Signature string `xorm:"TEXT"`
+ HTTPMethod string `xorm:"http_method"`
ContentType HookContentType
Secret string `xorm:"TEXT"`
Events string `xorm:"TEXT"`
@@ -553,6 +555,7 @@ type HookTask struct {
Signature string `xorm:"TEXT"`
api.Payloader `xorm:"-"`
PayloadContent string `xorm:"TEXT"`
+ HTTPMethod string `xorm:"http_method"`
ContentType HookContentType
EventType HookEventType
IsSSL bool
@@ -707,6 +710,7 @@ func prepareWebhook(e Engine, w *Webhook, repo *Repository, event HookEventType,
URL: w.URL,
Signature: signature,
Payloader: payloader,
+ HTTPMethod: w.HTTPMethod,
ContentType: w.ContentType,
EventType: event,
IsSSL: w.IsSSL,
@@ -751,9 +755,32 @@ func prepareWebhooks(e Engine, repo *Repository, event HookEventType, p api.Payl
func (t *HookTask) deliver() {
t.IsDelivered = true
+ t.RequestInfo = &HookRequest{
+ Headers: map[string]string{},
+ }
+ t.ResponseInfo = &HookResponse{
+ Headers: map[string]string{},
+ }
timeout := time.Duration(setting.Webhook.DeliverTimeout) * time.Second
- req := httplib.Post(t.URL).SetTimeout(timeout, timeout).
+
+ var req *httplib.Request
+ if t.HTTPMethod == http.MethodPost {
+ req = httplib.Post(t.URL)
+ switch t.ContentType {
+ case ContentTypeJSON:
+ req = req.Header("Content-Type", "application/json").Body(t.PayloadContent)
+ case ContentTypeForm:
+ req.Param("payload", t.PayloadContent)
+ }
+ } else if t.HTTPMethod == http.MethodGet {
+ req = httplib.Get(t.URL).Param("payload", t.PayloadContent)
+ } else {
+ t.ResponseInfo.Body = fmt.Sprintf("Invalid http method: %v", t.HTTPMethod)
+ return
+ }
+
+ req = req.SetTimeout(timeout, timeout).
Header("X-Gitea-Delivery", t.UUID).
Header("X-Gitea-Event", string(t.EventType)).
Header("X-Gitea-Signature", t.Signature).
@@ -764,25 +791,11 @@ func (t *HookTask) deliver() {
HeaderWithSensitiveCase("X-GitHub-Event", string(t.EventType)).
SetTLSClientConfig(&tls.Config{InsecureSkipVerify: setting.Webhook.SkipTLSVerify})
- switch t.ContentType {
- case ContentTypeJSON:
- req = req.Header("Content-Type", "application/json").Body(t.PayloadContent)
- case ContentTypeForm:
- req.Param("payload", t.PayloadContent)
- }
-
// Record delivery information.
- t.RequestInfo = &HookRequest{
- Headers: map[string]string{},
- }
for k, vals := range req.Headers() {
t.RequestInfo.Headers[k] = strings.Join(vals, ",")
}
- t.ResponseInfo = &HookResponse{
- Headers: map[string]string{},
- }
-
defer func() {
t.Delivered = time.Now().UnixNano()
if t.IsSucceed {