@@ -24,6 +24,7 @@ import (
2424 "io"
2525 "net"
2626 "net/http"
27+ "sort"
2728 "strings"
2829 "sync"
2930 "time"
@@ -507,23 +508,57 @@ func (s *inMemoryServer) startWebhook(webhook *Webhook) (err error) {
507508}
508509
509510func 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+ }
511525
512526 var payload io.Reader
513527 payload , err = render .RenderAsReader ("mock webhook server payload" , wh .Request .Body , wh )
514528 if err != nil {
515529 err = fmt .Errorf ("error when render payload: %w" , err )
516530 return
517531 }
532+ wh .Param = rawParams
518533
519- method := util .EmptyThenDefault (wh .Request .Method , http .MethodPost )
520534 var api string
521535 api , err = render .Render ("webhook request api" , wh .Request .Path , objCtx )
522536 if err != nil {
523537 err = fmt .Errorf ("error when render api: %w, template: %s" , err , wh .Request .Path )
524538 return
525539 }
526540
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+
527562 var bearerToken string
528563 bearerToken , err = getBearerToken (ctx , wh .Request )
529564 if err != nil {
@@ -550,7 +585,7 @@ func runWebhook(ctx context.Context, objCtx interface{}, wh *Webhook) (err error
550585 memLogger .Info ("send webhook request" , "api" , api )
551586 resp , err := client .Do (req )
552587 if err != nil {
553- err = fmt .Errorf ("error when sending webhook" )
588+ err = fmt .Errorf ("error when sending webhook: %v" , err )
554589 } else {
555590 if resp .StatusCode != http .StatusOK {
556591 memLogger .Info ("unexpected status" , "code" , resp .StatusCode )
0 commit comments