mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Fix slack contact point panic (code review changes) (#40770)
* panic when unexpected Slack response fixed, tests added * fix linting errors, add test * Code review changes * Apply PR comments Co-authored-by: Armand Grillet <armand.grillet@outlook.com>
This commit is contained in:
parent
0a97d0fff3
commit
1095f69740
@ -382,18 +382,22 @@ func (sn *SlackNotifier) sendRequest(ctx context.Context, data []byte) error {
|
||||
return fmt.Errorf("failed to read response body: %w", err)
|
||||
}
|
||||
|
||||
if resp.StatusCode >= http.StatusOK && resp.StatusCode < http.StatusMultipleChoices {
|
||||
if resp.StatusCode >= 200 && resp.StatusCode < 300 {
|
||||
// Slack responds to some requests with a JSON document, that might contain an error
|
||||
rslt := struct {
|
||||
Ok bool `json:"ok"`
|
||||
Err string `json:"error"`
|
||||
}{}
|
||||
if err := json.Unmarshal(body, &rslt); err == nil {
|
||||
if !rslt.Ok && rslt.Err != "" {
|
||||
sn.log.Warn("Sending Slack API request failed", "url", sn.url.String(), "statusCode", resp.Status,
|
||||
"err", rslt.Err)
|
||||
return fmt.Errorf("failed to make Slack API request: %s", rslt.Err)
|
||||
}
|
||||
if err := json.Unmarshal(body, &rslt); err != nil {
|
||||
sn.log.Warn("Failed to unmarshal Slack API response", "url", sn.url.String(), "statusCode", resp.Status,
|
||||
"err", err)
|
||||
return fmt.Errorf("failed to unmarshal Slack API response with status code %d: %s", resp.StatusCode, err)
|
||||
}
|
||||
|
||||
if !rslt.Ok && rslt.Err != "" {
|
||||
sn.log.Warn("Sending Slack API request failed", "url", sn.url.String(), "statusCode", resp.Status,
|
||||
"err", rslt.Err)
|
||||
return fmt.Errorf("failed to make Slack API request: %s", rslt.Err)
|
||||
}
|
||||
|
||||
sn.log.Debug("Sending Slack API request succeeded", "url", sn.url.String(), "statusCode", resp.Status)
|
||||
|
@ -273,20 +273,20 @@ func TestSendSlackRequest(t *testing.T) {
|
||||
expectError: false,
|
||||
},
|
||||
{
|
||||
name: "Success case, no response body",
|
||||
name: "No response body",
|
||||
statusCode: http.StatusOK,
|
||||
expectError: false,
|
||||
expectError: true,
|
||||
},
|
||||
{
|
||||
name: "Success case, unexpected response body",
|
||||
statusCode: http.StatusOK,
|
||||
slackResponse: "{}",
|
||||
slackResponse: `{"test": true}`,
|
||||
expectError: false,
|
||||
},
|
||||
{
|
||||
name: "Success case, ok: true",
|
||||
statusCode: http.StatusOK,
|
||||
slackResponse: "{\"ok\": true}",
|
||||
slackResponse: `{"ok": true}`,
|
||||
expectError: false,
|
||||
},
|
||||
{
|
||||
|
@ -218,7 +218,7 @@ var sendSlackRequest = func(request *http.Request, logger log.Logger) error {
|
||||
return fmt.Errorf("failed to read response body: %w", err)
|
||||
}
|
||||
|
||||
if resp.StatusCode < http.StatusOK || resp.StatusCode >= http.StatusMultipleChoices {
|
||||
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
|
||||
logger.Warn("Slack API request failed", "url", request.URL.String(), "statusCode", resp.Status, "body", string(body))
|
||||
return fmt.Errorf("request to Slack API failed with status code %d", resp.StatusCode)
|
||||
}
|
||||
@ -228,12 +228,16 @@ var sendSlackRequest = func(request *http.Request, logger log.Logger) error {
|
||||
Ok bool `json:"ok"`
|
||||
Err string `json:"error"`
|
||||
}{}
|
||||
if err := json.Unmarshal(body, &rslt); err == nil {
|
||||
if !rslt.Ok && rslt.Err != "" {
|
||||
logger.Warn("Sending Slack API request failed", "url", request.URL.String(), "statusCode", resp.Status,
|
||||
"err", rslt.Err)
|
||||
return fmt.Errorf("failed to make Slack API request: %s", rslt.Err)
|
||||
}
|
||||
if err := json.Unmarshal(body, &rslt); err != nil {
|
||||
logger.Warn("Failed to unmarshal Slack API response", "url", request.URL.String(), "statusCode", resp.Status,
|
||||
"body", string(body))
|
||||
return fmt.Errorf("failed to unmarshal Slack API response: %s", err)
|
||||
}
|
||||
|
||||
if !rslt.Ok && rslt.Err != "" {
|
||||
logger.Warn("Sending Slack API request failed", "url", request.URL.String(), "statusCode", resp.Status,
|
||||
"err", rslt.Err)
|
||||
return fmt.Errorf("failed to make Slack API request: %s", rslt.Err)
|
||||
}
|
||||
|
||||
logger.Debug("Sending Slack API request succeeded", "url", request.URL.String(), "statusCode", resp.Status)
|
||||
|
@ -270,20 +270,20 @@ func TestSendSlackRequest(t *testing.T) {
|
||||
expectError: false,
|
||||
},
|
||||
{
|
||||
name: "Success case, no response body",
|
||||
name: "No response body",
|
||||
statusCode: http.StatusOK,
|
||||
expectError: false,
|
||||
expectError: true,
|
||||
},
|
||||
{
|
||||
name: "Success case, unexpected response body",
|
||||
statusCode: http.StatusOK,
|
||||
slackResponse: "{}",
|
||||
slackResponse: `{"test": true}`,
|
||||
expectError: false,
|
||||
},
|
||||
{
|
||||
name: "Success case, ok: true",
|
||||
statusCode: http.StatusOK,
|
||||
slackResponse: "{\"ok\": true}",
|
||||
slackResponse: `{"ok": true}`,
|
||||
expectError: false,
|
||||
},
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user