diff options
Diffstat (limited to 'models')
-rw-r--r-- | models/migrations/migrations.go | 2 | ||||
-rw-r--r-- | models/migrations/v86.go | 17 | ||||
-rw-r--r-- | models/webhook.go | 43 |
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 { |