MCPcopy Create free account
hub / github.com/krau/SaveAny-Bot / SendWebhook

Function SendWebhook

api/webhook.go:19–77  ·  view source on GitHub ↗

SendWebhook 发送 Webhook 回调

(ctx context.Context, payload *WebhookPayload)

Source from the content-addressed store, hash-verified

17
18// SendWebhook 发送 Webhook 回调
19func SendWebhook(ctx context.Context, payload *WebhookPayload) {
20 if payload == nil || payload.TaskID == "" {
21 return
22 }
23
24 // 获取任务信息以获取 webhook URL
25 info, ok := GetTask(payload.TaskID)
26 if !ok || info.Webhook == "" {
27 return
28 }
29
30 webhookURL := info.Webhook
31
32 // Async send with retries.
33 go func() {
34 var logger *log.Logger
35 if ctx != nil {
36 logger = log.FromContext(ctx).With("task_id", payload.TaskID)
37 } else {
38 logger = log.Default().With("task_id", payload.TaskID)
39 }
40
41 payloadBytes, err := json.Marshal(payload)
42 if err != nil {
43 logger.Errorf("Failed to marshal webhook payload: %v", err)
44 return
45 }
46
47 // 重试 3 次
48 for i := range 3 {
49 req, err := http.NewRequestWithContext(context.Background(), http.MethodPost, webhookURL, bytes.NewBuffer(payloadBytes))
50 if err != nil {
51 logger.Errorf("Failed to create webhook request: %v", err)
52 return
53 }
54
55 req.Header.Set("Content-Type", "application/json")
56 req.Header.Set("User-Agent", "SaveAny-Bot/1.0")
57
58 resp, err := webhookClient.Do(req)
59 if err != nil {
60 logger.Warnf("Webhook request failed (attempt %d/3): %v", i+1, err)
61 time.Sleep(time.Second * time.Duration(i+1))
62 continue
63 }
64 resp.Body.Close()
65
66 if resp.StatusCode >= 200 && resp.StatusCode < 300 {
67 logger.Debugf("Webhook sent successfully: %s", webhookURL)
68 return
69 }
70
71 logger.Warnf("Webhook returned non-2xx status (attempt %d/3): %d", i+1, resp.StatusCode)
72 time.Sleep(time.Second * time.Duration(i+1))
73 }
74
75 logger.Errorf("Failed to send webhook after 3 attempts")
76 }()

Callers 1

EmitMethod · 0.85

Calls 3

GetTaskFunction · 0.85
SetMethod · 0.45
CloseMethod · 0.45

Tested by

no test coverage detected