From d20a41c7a7309007aaec7e7e26047b808d0dd33e Mon Sep 17 00:00:00 2001 From: TwiN Date: Thu, 20 Oct 2022 15:16:27 -0400 Subject: [PATCH] fix(alerting): Make sure to close response body --- alerting/provider/custom/custom.go | 1 + alerting/provider/discord/discord.go | 1 + alerting/provider/googlechat/googlechat.go | 1 + alerting/provider/matrix/matrix.go | 1 + alerting/provider/mattermost/mattermost.go | 1 + alerting/provider/messagebird/messagebird.go | 1 + alerting/provider/ntfy/ntfy.go | 3 ++- alerting/provider/opsgenie/opsgenie.go | 25 ++++++++++---------- alerting/provider/pagerduty/pagerduty.go | 1 + alerting/provider/slack/slack.go | 1 + alerting/provider/teams/teams.go | 1 + alerting/provider/telegram/telegram.go | 1 + alerting/provider/twilio/twilio.go | 1 + 13 files changed, 25 insertions(+), 14 deletions(-) diff --git a/alerting/provider/custom/custom.go b/alerting/provider/custom/custom.go index 1c668ef6..7a4e6874 100644 --- a/alerting/provider/custom/custom.go +++ b/alerting/provider/custom/custom.go @@ -84,6 +84,7 @@ func (provider *AlertProvider) Send(endpoint *core.Endpoint, alert *alert.Alert, if err != nil { return err } + defer response.Body.Close() if response.StatusCode > 399 { body, _ := io.ReadAll(response.Body) return fmt.Errorf("call to provider alert returned status code %d: %s", response.StatusCode, string(body)) diff --git a/alerting/provider/discord/discord.go b/alerting/provider/discord/discord.go index 57d2bbbb..64281d7d 100644 --- a/alerting/provider/discord/discord.go +++ b/alerting/provider/discord/discord.go @@ -54,6 +54,7 @@ func (provider *AlertProvider) Send(endpoint *core.Endpoint, alert *alert.Alert, if err != nil { return err } + defer response.Body.Close() if response.StatusCode > 399 { body, _ := io.ReadAll(response.Body) return fmt.Errorf("call to provider alert returned status code %d: %s", response.StatusCode, string(body)) diff --git a/alerting/provider/googlechat/googlechat.go b/alerting/provider/googlechat/googlechat.go index 81ba56a5..99b62ae8 100644 --- a/alerting/provider/googlechat/googlechat.go +++ b/alerting/provider/googlechat/googlechat.go @@ -62,6 +62,7 @@ func (provider *AlertProvider) Send(endpoint *core.Endpoint, alert *alert.Alert, if err != nil { return err } + defer response.Body.Close() if response.StatusCode > 399 { body, _ := io.ReadAll(response.Body) return fmt.Errorf("call to provider alert returned status code %d: %s", response.StatusCode, string(body)) diff --git a/alerting/provider/matrix/matrix.go b/alerting/provider/matrix/matrix.go index 7567d3c8..ef2746eb 100644 --- a/alerting/provider/matrix/matrix.go +++ b/alerting/provider/matrix/matrix.go @@ -86,6 +86,7 @@ func (provider *AlertProvider) Send(endpoint *core.Endpoint, alert *alert.Alert, if err != nil { return err } + defer response.Body.Close() if response.StatusCode > 399 { body, _ := io.ReadAll(response.Body) return fmt.Errorf("call to provider alert returned status code %d: %s", response.StatusCode, string(body)) diff --git a/alerting/provider/mattermost/mattermost.go b/alerting/provider/mattermost/mattermost.go index 509e8275..3ea1d2f8 100644 --- a/alerting/provider/mattermost/mattermost.go +++ b/alerting/provider/mattermost/mattermost.go @@ -60,6 +60,7 @@ func (provider *AlertProvider) Send(endpoint *core.Endpoint, alert *alert.Alert, if err != nil { return err } + defer response.Body.Close() if response.StatusCode > 399 { body, _ := io.ReadAll(response.Body) return fmt.Errorf("call to provider alert returned status code %d: %s", response.StatusCode, string(body)) diff --git a/alerting/provider/messagebird/messagebird.go b/alerting/provider/messagebird/messagebird.go index f2f665f2..a0581757 100644 --- a/alerting/provider/messagebird/messagebird.go +++ b/alerting/provider/messagebird/messagebird.go @@ -45,6 +45,7 @@ func (provider *AlertProvider) Send(endpoint *core.Endpoint, alert *alert.Alert, if err != nil { return err } + defer response.Body.Close() if response.StatusCode > 399 { body, _ := io.ReadAll(response.Body) return fmt.Errorf("call to provider alert returned status code %d: %s", response.StatusCode, string(body)) diff --git a/alerting/provider/ntfy/ntfy.go b/alerting/provider/ntfy/ntfy.go index bef21802..b1e95907 100644 --- a/alerting/provider/ntfy/ntfy.go +++ b/alerting/provider/ntfy/ntfy.go @@ -40,7 +40,7 @@ func (provider *AlertProvider) IsValid() bool { // Send an alert using the provider func (provider *AlertProvider) Send(endpoint *core.Endpoint, alert *alert.Alert, result *core.Result, resolved bool) error { - buffer := bytes.NewBuffer([]byte(provider.buildRequestBody(endpoint, alert, result, resolved))) + buffer := bytes.NewBuffer(provider.buildRequestBody(endpoint, alert, result, resolved)) request, err := http.NewRequest(http.MethodPost, provider.URL, buffer) if err != nil { return err @@ -50,6 +50,7 @@ func (provider *AlertProvider) Send(endpoint *core.Endpoint, alert *alert.Alert, if err != nil { return err } + defer response.Body.Close() if response.StatusCode > 399 { body, _ := io.ReadAll(response.Body) return fmt.Errorf("call to provider alert returned status code %d: %s", response.StatusCode, string(body)) diff --git a/alerting/provider/opsgenie/opsgenie.go b/alerting/provider/opsgenie/opsgenie.go index ed4ebe0e..9913fba4 100644 --- a/alerting/provider/opsgenie/opsgenie.go +++ b/alerting/provider/opsgenie/opsgenie.go @@ -83,37 +83,36 @@ func (provider *AlertProvider) Send(endpoint *core.Endpoint, alert *alert.Alert, func (provider *AlertProvider) createAlert(endpoint *core.Endpoint, alert *alert.Alert, result *core.Result, resolved bool) error { payload := provider.buildCreateRequestBody(endpoint, alert, result, resolved) - _, err := provider.sendRequest(restAPI, http.MethodPost, payload) - return err + return provider.sendRequest(restAPI, http.MethodPost, payload) } func (provider *AlertProvider) closeAlert(endpoint *core.Endpoint, alert *alert.Alert) error { payload := provider.buildCloseRequestBody(endpoint, alert) url := restAPI + "/" + provider.alias(buildKey(endpoint)) + "/close?identifierType=alias" - _, err := provider.sendRequest(url, http.MethodPost, payload) - return err + return provider.sendRequest(url, http.MethodPost, payload) } -func (provider *AlertProvider) sendRequest(url, method string, payload interface{}) (*http.Response, error) { +func (provider *AlertProvider) sendRequest(url, method string, payload interface{}) error { body, err := json.Marshal(payload) if err != nil { - return nil, fmt.Errorf("fail to build alert payload: %v", payload) + return fmt.Errorf("error build alert with payload %v: %w", payload, err) } request, err := http.NewRequest(method, url, bytes.NewBuffer(body)) if err != nil { - return nil, err + return err } request.Header.Set("Content-Type", "application/json") request.Header.Set("Authorization", "GenieKey "+provider.APIKey) - res, err := client.GetHTTPClient(nil).Do(request) + response, err := client.GetHTTPClient(nil).Do(request) if err != nil { - return nil, err + return err } - if res.StatusCode > 399 { - rBody, _ := io.ReadAll(res.Body) - return nil, fmt.Errorf("call to provider alert returned status code %d: %s", res.StatusCode, string(rBody)) + defer response.Body.Close() + if response.StatusCode > 399 { + rBody, _ := io.ReadAll(response.Body) + return fmt.Errorf("call to provider alert returned status code %d: %s", response.StatusCode, string(rBody)) } - return res, nil + return nil } func (provider *AlertProvider) buildCreateRequestBody(endpoint *core.Endpoint, alert *alert.Alert, result *core.Result, resolved bool) alertCreateRequest { diff --git a/alerting/provider/pagerduty/pagerduty.go b/alerting/provider/pagerduty/pagerduty.go index 616a85c0..322dec28 100644 --- a/alerting/provider/pagerduty/pagerduty.go +++ b/alerting/provider/pagerduty/pagerduty.go @@ -63,6 +63,7 @@ func (provider *AlertProvider) Send(endpoint *core.Endpoint, alert *alert.Alert, if err != nil { return err } + defer response.Body.Close() if response.StatusCode > 399 { body, _ := io.ReadAll(response.Body) return fmt.Errorf("call to provider alert returned status code %d: %s", response.StatusCode, string(body)) diff --git a/alerting/provider/slack/slack.go b/alerting/provider/slack/slack.go index df2c26a6..f3487bc2 100644 --- a/alerting/provider/slack/slack.go +++ b/alerting/provider/slack/slack.go @@ -53,6 +53,7 @@ func (provider *AlertProvider) Send(endpoint *core.Endpoint, alert *alert.Alert, if err != nil { return err } + defer response.Body.Close() if response.StatusCode > 399 { body, _ := io.ReadAll(response.Body) return fmt.Errorf("call to provider alert returned status code %d: %s", response.StatusCode, string(body)) diff --git a/alerting/provider/teams/teams.go b/alerting/provider/teams/teams.go index 00abbad6..01c98c5a 100644 --- a/alerting/provider/teams/teams.go +++ b/alerting/provider/teams/teams.go @@ -54,6 +54,7 @@ func (provider *AlertProvider) Send(endpoint *core.Endpoint, alert *alert.Alert, if err != nil { return err } + defer response.Body.Close() if response.StatusCode > 399 { body, _ := io.ReadAll(response.Body) return fmt.Errorf("call to provider alert returned status code %d: %s", response.StatusCode, string(body)) diff --git a/alerting/provider/telegram/telegram.go b/alerting/provider/telegram/telegram.go index bfa5209d..d79c8845 100644 --- a/alerting/provider/telegram/telegram.go +++ b/alerting/provider/telegram/telegram.go @@ -50,6 +50,7 @@ func (provider *AlertProvider) Send(endpoint *core.Endpoint, alert *alert.Alert, if err != nil { return err } + defer response.Body.Close() if response.StatusCode > 399 { body, _ := io.ReadAll(response.Body) return fmt.Errorf("call to provider alert returned status code %d: %s", response.StatusCode, string(body)) diff --git a/alerting/provider/twilio/twilio.go b/alerting/provider/twilio/twilio.go index a99fa8ea..546ed2d6 100644 --- a/alerting/provider/twilio/twilio.go +++ b/alerting/provider/twilio/twilio.go @@ -42,6 +42,7 @@ func (provider *AlertProvider) Send(endpoint *core.Endpoint, alert *alert.Alert, if err != nil { return err } + defer response.Body.Close() if response.StatusCode > 399 { body, _ := io.ReadAll(response.Body) return fmt.Errorf("call to provider alert returned status code %d: %s", response.StatusCode, string(body))