From f821a26aecddc59baa8d1b4eb7de4562c9427cb5 Mon Sep 17 00:00:00 2001 From: Kota Kanbe Date: Fri, 10 Feb 2017 18:33:11 +0900 Subject: [PATCH] Fix infinite retry at size overrun error in Slack report --- report/slack.go | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/report/slack.go b/report/slack.go index d38e49ca..985f569f 100644 --- a/report/slack.go +++ b/report/slack.go @@ -59,6 +59,8 @@ type SlackWriter struct{} func (w SlackWriter) Write(rs ...models.ScanResult) error { conf := config.Conf.Slack channel := conf.Channel + count := 0 + retryMax := 10 for _, r := range rs { if channel == "${servername}" { @@ -75,9 +77,14 @@ func (w SlackWriter) Write(rs ...models.ScanResult) error { bytes, _ := json.Marshal(msg) jsonBody := string(bytes) + f := func() (err error) { resp, body, errs := gorequest.New().Proxy(config.Conf.HTTPProxy).Post(conf.HookURL).Send(string(jsonBody)).End() if 0 < len(errs) || resp == nil || resp.StatusCode != 200 { + count++ + if count == retryMax { + return nil + } return fmt.Errorf( "HTTP POST error: %v, url: %s, resp: %v, body: %s", errs, conf.HookURL, resp, body) @@ -85,13 +92,18 @@ func (w SlackWriter) Write(rs ...models.ScanResult) error { return nil } notify := func(err error, t time.Duration) { - log.Warn("Error %s", err) + log.Warnf("Error %s", err) log.Warn("Retrying in ", t) } - if err := backoff.RetryNotify(f, backoff.NewExponentialBackOff(), notify); err != nil { - return fmt.Errorf("HTTP Error: %s", err) + boff := backoff.NewExponentialBackOff() + if err := backoff.RetryNotify(f, boff, notify); err != nil { + return fmt.Errorf("HTTP error: %s", err) } } + + if count == retryMax { + return fmt.Errorf("Retry count exceeded") + } return nil }