Skip to content

Commit fefc60f

Browse files
committed
Merge branch 'master' into fix-go-gitea#6946-pass-in-pr-into-hooks
2 parents a90466b + 84bfd00 commit fefc60f

File tree

1 file changed

+72
-26
lines changed

1 file changed

+72
-26
lines changed

models/webhook.go

Lines changed: 72 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@ import (
1313
"encoding/json"
1414
"fmt"
1515
"io/ioutil"
16+
"net"
1617
"net/http"
18+
"net/url"
1719
"strings"
1820
"time"
1921

20-
"code.gitea.io/gitea/modules/httplib"
2122
"code.gitea.io/gitea/modules/log"
2223
"code.gitea.io/gitea/modules/setting"
2324
api "code.gitea.io/gitea/modules/structs"
@@ -753,47 +754,66 @@ func prepareWebhooks(e Engine, repo *Repository, event HookEventType, p api.Payl
753754
return nil
754755
}
755756

756-
func (t *HookTask) deliver() {
757+
func (t *HookTask) deliver() error {
757758
t.IsDelivered = true
758759

759-
timeout := time.Duration(setting.Webhook.DeliverTimeout) * time.Second
760+
var req *http.Request
761+
var err error
760762

761-
var req *httplib.Request
762763
switch t.HTTPMethod {
763764
case "":
764765
log.Info("HTTP Method for webhook %d empty, setting to POST as default", t.ID)
765766
fallthrough
766767
case http.MethodPost:
767-
req = httplib.Post(t.URL)
768768
switch t.ContentType {
769769
case ContentTypeJSON:
770-
req = req.Header("Content-Type", "application/json").Body(t.PayloadContent)
770+
req, err = http.NewRequest("POST", t.URL, strings.NewReader(t.PayloadContent))
771+
if err != nil {
772+
return err
773+
}
774+
775+
req.Header.Set("Content-Type", "application/json")
771776
case ContentTypeForm:
772-
req.Param("payload", t.PayloadContent)
777+
var forms = url.Values{
778+
"payload": []string{t.PayloadContent},
779+
}
780+
781+
req, err = http.NewRequest("POST", t.URL, strings.NewReader(forms.Encode()))
782+
if err != nil {
783+
784+
return err
785+
}
773786
}
774787
case http.MethodGet:
775-
req = httplib.Get(t.URL).Param("payload", t.PayloadContent)
788+
u, err := url.Parse(t.URL)
789+
if err != nil {
790+
return err
791+
}
792+
vals := u.Query()
793+
vals["payload"] = []string{t.PayloadContent}
794+
u.RawQuery = vals.Encode()
795+
req, err = http.NewRequest("GET", u.String(), nil)
796+
if err != nil {
797+
return err
798+
}
776799
default:
777-
log.Error("Invalid http method for webhook: [%d] %v", t.ID, t.HTTPMethod)
778-
return
800+
return fmt.Errorf("Invalid http method for webhook: [%d] %v", t.ID, t.HTTPMethod)
779801
}
780802

781-
req = req.SetTimeout(timeout, timeout).
782-
Header("X-Gitea-Delivery", t.UUID).
783-
Header("X-Gitea-Event", string(t.EventType)).
784-
Header("X-Gitea-Signature", t.Signature).
785-
Header("X-Gogs-Delivery", t.UUID).
786-
Header("X-Gogs-Event", string(t.EventType)).
787-
Header("X-Gogs-Signature", t.Signature).
788-
HeaderWithSensitiveCase("X-GitHub-Delivery", t.UUID).
789-
HeaderWithSensitiveCase("X-GitHub-Event", string(t.EventType)).
790-
SetTLSClientConfig(&tls.Config{InsecureSkipVerify: setting.Webhook.SkipTLSVerify})
803+
req.Header.Add("X-Gitea-Delivery", t.UUID)
804+
req.Header.Add("X-Gitea-Event", string(t.EventType))
805+
req.Header.Add("X-Gitea-Signature", t.Signature)
806+
req.Header.Add("X-Gogs-Delivery", t.UUID)
807+
req.Header.Add("X-Gogs-Event", string(t.EventType))
808+
req.Header.Add("X-Gogs-Signature", t.Signature)
809+
req.Header["X-GitHub-Delivery"] = []string{t.UUID}
810+
req.Header["X-GitHub-Event"] = []string{string(t.EventType)}
791811

792812
// Record delivery information.
793813
t.RequestInfo = &HookRequest{
794814
Headers: map[string]string{},
795815
}
796-
for k, vals := range req.Headers() {
816+
for k, vals := range req.Header {
797817
t.RequestInfo.Headers[k] = strings.Join(vals, ",")
798818
}
799819

@@ -830,10 +850,10 @@ func (t *HookTask) deliver() {
830850
}
831851
}()
832852

833-
resp, err := req.Response()
853+
resp, err := webhookHTTPClient.Do(req)
834854
if err != nil {
835855
t.ResponseInfo.Body = fmt.Sprintf("Delivery: %v", err)
836-
return
856+
return err
837857
}
838858
defer resp.Body.Close()
839859

@@ -847,9 +867,10 @@ func (t *HookTask) deliver() {
847867
p, err := ioutil.ReadAll(resp.Body)
848868
if err != nil {
849869
t.ResponseInfo.Body = fmt.Sprintf("read body: %s", err)
850-
return
870+
return err
851871
}
852872
t.ResponseInfo.Body = string(p)
873+
return nil
853874
}
854875

855876
// DeliverHooks checks and delivers undelivered hooks.
@@ -864,7 +885,10 @@ func DeliverHooks() {
864885

865886
// Update hook task status.
866887
for _, t := range tasks {
867-
t.deliver()
888+
if err = t.deliver(); err != nil {
889+
log.Error("deliver: %v", err)
890+
continue
891+
}
868892
}
869893

870894
// Start listening on new hook requests.
@@ -884,12 +908,34 @@ func DeliverHooks() {
884908
continue
885909
}
886910
for _, t := range tasks {
887-
t.deliver()
911+
if err = t.deliver(); err != nil {
912+
log.Error("deliver: %v", err)
913+
}
888914
}
889915
}
890916
}
891917

918+
var webhookHTTPClient *http.Client
919+
892920
// InitDeliverHooks starts the hooks delivery thread
893921
func InitDeliverHooks() {
922+
timeout := time.Duration(setting.Webhook.DeliverTimeout) * time.Second
923+
924+
webhookHTTPClient = &http.Client{
925+
Transport: &http.Transport{
926+
TLSClientConfig: &tls.Config{InsecureSkipVerify: setting.Webhook.SkipTLSVerify},
927+
Dial: func(netw, addr string) (net.Conn, error) {
928+
conn, err := net.DialTimeout(netw, addr, timeout)
929+
if err != nil {
930+
return nil, err
931+
}
932+
933+
conn.SetDeadline(time.Now().Add(timeout))
934+
return conn, nil
935+
936+
},
937+
},
938+
}
939+
894940
go DeliverHooks()
895941
}

0 commit comments

Comments
 (0)