diff --git a/main.go b/main.go index 914d4dc..bb4792b 100644 --- a/main.go +++ b/main.go @@ -33,6 +33,7 @@ func main() { e.Use(middlewares.DenyRoutes(config)) e.Use(middlewares.Cache(config)) e.Use(middlewares.Gzip(config)) + e.Use(middlewares.Retry(config)) e.Use(middleware.ProxyWithConfig(*config.ProxyConfig)) // Start metrics server diff --git a/middlewares/retry.go b/middlewares/retry.go new file mode 100644 index 0000000..bb84f01 --- /dev/null +++ b/middlewares/retry.go @@ -0,0 +1,32 @@ +package middlewares + +import ( + "net/http" + + "github.com/labstack/echo/v4" + "github.com/marigold-dev/tzproxy/utils" +) + +func Retry(config *utils.Config) echo.MiddlewareFunc { + return func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) (err error) { + if config.ConfigFile.TezosHostRetry == "" { + return next(c) + } + + config.Logger.Debug().Msg("retry middleware") + err = next(c) + + status := c.Response().Status + if status == http.StatusNotFound || status == http.StatusForbidden { + config.Logger.Debug().Msg("retry middleware: retrying") + c.Set("retry", status) + return next(c) + } + + c.Set("retry", nil) + + return err + } + } +}