notify: a reply other than 2xx is a failed delivery (closes #287)
check / check (push) Waiting to run
check / check (push) Waiting to run
A notification endpoint that answered with a redirect was counted as delivered: the request is not sent through a client, so the redirect is never followed, and only a status of 400 or more counted as a failure. Now any status outside 200-299 fails the delivery for ntfy, Slack and Mattermost, so it is retried and logged like the others. Model: opus-5-5
This commit is contained in:
@@ -25,9 +25,6 @@ import (
|
||||
// HTTP client timeout.
|
||||
const httpClientTimeout = 10 * time.Second
|
||||
|
||||
// HTTP status code thresholds.
|
||||
const httpStatusClientError = 400
|
||||
|
||||
// Sentinel errors for notification failures.
|
||||
var (
|
||||
// ErrNtfyFailed indicates the ntfy request failed.
|
||||
@@ -344,7 +341,10 @@ func (svc *Service) sendNtfy(
|
||||
|
||||
defer func() { _ = resp.Body.Close() }()
|
||||
|
||||
if resp.StatusCode >= httpStatusClientError {
|
||||
// Only a 2xx reply means ntfy took the notification. A
|
||||
// redirect is not followed, so it is a failure too.
|
||||
if resp.StatusCode < http.StatusOK ||
|
||||
resp.StatusCode >= http.StatusMultipleChoices {
|
||||
return fmt.Errorf(
|
||||
"%w: status %d",
|
||||
ErrNtfyFailed, resp.StatusCode,
|
||||
@@ -385,9 +385,9 @@ type SlackAttachment struct {
|
||||
// sendSlack posts to a Slack or Mattermost incoming webhook, which
|
||||
// take the same payload. endpoint, "slack" or "mattermost", names
|
||||
// the webhook in the log in place of its URL, which lets anyone who
|
||||
// has it post to the channel. An HTTP error status is returned
|
||||
// wrapped in failed, ErrSlackFailed or ErrMattermostFailed, so the
|
||||
// error names the endpoint.
|
||||
// has it post to the channel. A reply status other than 2xx is
|
||||
// returned wrapped in failed, ErrSlackFailed or ErrMattermostFailed,
|
||||
// so the error names the endpoint.
|
||||
func (svc *Service) sendSlack(
|
||||
ctx context.Context,
|
||||
webhookURL *url.URL,
|
||||
@@ -437,7 +437,10 @@ func (svc *Service) sendSlack(
|
||||
|
||||
defer func() { _ = resp.Body.Close() }()
|
||||
|
||||
if resp.StatusCode >= httpStatusClientError {
|
||||
// Only a 2xx reply means the webhook took the notification. A
|
||||
// redirect is not followed, so it is a failure too.
|
||||
if resp.StatusCode < http.StatusOK ||
|
||||
resp.StatusCode >= http.StatusMultipleChoices {
|
||||
return fmt.Errorf(
|
||||
"%w: status %d",
|
||||
failed, resp.StatusCode,
|
||||
|
||||
Reference in New Issue
Block a user