@@ -13,11 +13,12 @@ import (
13
13
"encoding/json"
14
14
"fmt"
15
15
"io/ioutil"
16
+ "net"
16
17
"net/http"
18
+ "net/url"
17
19
"strings"
18
20
"time"
19
21
20
- "code.gitea.io/gitea/modules/httplib"
21
22
"code.gitea.io/gitea/modules/log"
22
23
"code.gitea.io/gitea/modules/setting"
23
24
api "code.gitea.io/gitea/modules/structs"
@@ -753,47 +754,66 @@ func prepareWebhooks(e Engine, repo *Repository, event HookEventType, p api.Payl
753
754
return nil
754
755
}
755
756
756
- func (t * HookTask ) deliver () {
757
+ func (t * HookTask ) deliver () error {
757
758
t .IsDelivered = true
758
759
759
- timeout := time .Duration (setting .Webhook .DeliverTimeout ) * time .Second
760
+ var req * http.Request
761
+ var err error
760
762
761
- var req * httplib.Request
762
763
switch t .HTTPMethod {
763
764
case "" :
764
765
log .Info ("HTTP Method for webhook %d empty, setting to POST as default" , t .ID )
765
766
fallthrough
766
767
case http .MethodPost :
767
- req = httplib .Post (t .URL )
768
768
switch t .ContentType {
769
769
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" )
771
776
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
+ }
773
786
}
774
787
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
+ }
776
799
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 )
779
801
}
780
802
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 )}
791
811
792
812
// Record delivery information.
793
813
t .RequestInfo = & HookRequest {
794
814
Headers : map [string ]string {},
795
815
}
796
- for k , vals := range req .Headers () {
816
+ for k , vals := range req .Header {
797
817
t .RequestInfo .Headers [k ] = strings .Join (vals , "," )
798
818
}
799
819
@@ -830,10 +850,10 @@ func (t *HookTask) deliver() {
830
850
}
831
851
}()
832
852
833
- resp , err := req . Response ( )
853
+ resp , err := webhookHTTPClient . Do ( req )
834
854
if err != nil {
835
855
t .ResponseInfo .Body = fmt .Sprintf ("Delivery: %v" , err )
836
- return
856
+ return err
837
857
}
838
858
defer resp .Body .Close ()
839
859
@@ -847,9 +867,10 @@ func (t *HookTask) deliver() {
847
867
p , err := ioutil .ReadAll (resp .Body )
848
868
if err != nil {
849
869
t .ResponseInfo .Body = fmt .Sprintf ("read body: %s" , err )
850
- return
870
+ return err
851
871
}
852
872
t .ResponseInfo .Body = string (p )
873
+ return nil
853
874
}
854
875
855
876
// DeliverHooks checks and delivers undelivered hooks.
@@ -864,7 +885,10 @@ func DeliverHooks() {
864
885
865
886
// Update hook task status.
866
887
for _ , t := range tasks {
867
- t .deliver ()
888
+ if err = t .deliver (); err != nil {
889
+ log .Error ("deliver: %v" , err )
890
+ continue
891
+ }
868
892
}
869
893
870
894
// Start listening on new hook requests.
@@ -884,12 +908,34 @@ func DeliverHooks() {
884
908
continue
885
909
}
886
910
for _ , t := range tasks {
887
- t .deliver ()
911
+ if err = t .deliver (); err != nil {
912
+ log .Error ("deliver: %v" , err )
913
+ }
888
914
}
889
915
}
890
916
}
891
917
918
+ var webhookHTTPClient * http.Client
919
+
892
920
// InitDeliverHooks starts the hooks delivery thread
893
921
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
+
894
940
go DeliverHooks ()
895
941
}
0 commit comments