@@ -24,6 +24,7 @@ import (
24
24
"io"
25
25
"net"
26
26
"net/http"
27
+ "sort"
27
28
"strings"
28
29
"sync"
29
30
"time"
@@ -507,23 +508,57 @@ func (s *inMemoryServer) startWebhook(webhook *Webhook) (err error) {
507
508
}
508
509
509
510
func runWebhook (ctx context.Context , objCtx interface {}, wh * Webhook ) (err error ) {
510
- client := http .DefaultClient
511
+ rawParams := make (map [string ]string , len (wh .Param ))
512
+ paramKeys := make ([]string , 0 , len (wh .Param ))
513
+ for k , v := range wh .Param {
514
+ paramKeys = append (paramKeys , k )
515
+ rawParams [k ] = v
516
+ }
517
+ sort .Strings (paramKeys )
518
+
519
+ for _ , k := range paramKeys {
520
+ v , vErr := render .Render ("mock webhook server param" , wh .Param [k ], wh )
521
+ if vErr == nil {
522
+ wh .Param [k ] = v
523
+ }
524
+ }
511
525
512
526
var payload io.Reader
513
527
payload , err = render .RenderAsReader ("mock webhook server payload" , wh .Request .Body , wh )
514
528
if err != nil {
515
529
err = fmt .Errorf ("error when render payload: %w" , err )
516
530
return
517
531
}
532
+ wh .Param = rawParams
518
533
519
- method := util .EmptyThenDefault (wh .Request .Method , http .MethodPost )
520
534
var api string
521
535
api , err = render .Render ("webhook request api" , wh .Request .Path , objCtx )
522
536
if err != nil {
523
537
err = fmt .Errorf ("error when render api: %w, template: %s" , err , wh .Request .Path )
524
538
return
525
539
}
526
540
541
+ switch wh .Request .Protocol {
542
+ case "syslog" :
543
+ err = sendSyslogWebhookRequest (ctx , wh , api , payload )
544
+ default :
545
+ err = sendHTTPWebhookRequest (ctx , wh , api , payload )
546
+ }
547
+ return
548
+ }
549
+
550
+ func sendSyslogWebhookRequest (ctx context.Context , wh * Webhook , api string , payload io.Reader ) (err error ) {
551
+ var conn net.Conn
552
+ if conn , err = net .Dial ("udp" , api ); err == nil {
553
+ _ , err = io .Copy (conn , payload )
554
+ }
555
+ return
556
+ }
557
+
558
+ func sendHTTPWebhookRequest (ctx context.Context , wh * Webhook , api string , payload io.Reader ) (err error ) {
559
+ method := util .EmptyThenDefault (wh .Request .Method , http .MethodPost )
560
+ client := http .DefaultClient
561
+
527
562
var bearerToken string
528
563
bearerToken , err = getBearerToken (ctx , wh .Request )
529
564
if err != nil {
@@ -550,7 +585,7 @@ func runWebhook(ctx context.Context, objCtx interface{}, wh *Webhook) (err error
550
585
memLogger .Info ("send webhook request" , "api" , api )
551
586
resp , err := client .Do (req )
552
587
if err != nil {
553
- err = fmt .Errorf ("error when sending webhook" )
588
+ err = fmt .Errorf ("error when sending webhook: %v" , err )
554
589
} else {
555
590
if resp .StatusCode != http .StatusOK {
556
591
memLogger .Info ("unexpected status" , "code" , resp .StatusCode )
0 commit comments