diff --git a/internal/app/xhttp/handler.go b/internal/app/xhttp/handler.go index 454676a7..dbf0e7b6 100644 --- a/internal/app/xhttp/handler.go +++ b/internal/app/xhttp/handler.go @@ -8,6 +8,7 @@ import ( "github.com/labstack/echo/v4" "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/context" "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/resource" + "github.com/thecodingmachine/gotenberg/internal/pkg/chrome" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" "github.com/thecodingmachine/gotenberg/internal/pkg/printer" "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" @@ -69,7 +70,17 @@ func pingHandler(c echo.Context) error { const op string = "xhttp.pingHandler" ctx := context.MustCastFromEchoContext(c) logger := ctx.XLogger() + config := ctx.Config() + logger.DebugOp(op, "handling ping request...") + + if !config.DisableGoogleChrome() { + _, err := chrome.IsViable(logger) + if err != nil { + return xerror.New(op, err) + } + } + return nil } diff --git a/internal/pkg/chrome/chrome.go b/internal/pkg/chrome/chrome.go index 07a3df1b..ffbe30c1 100644 --- a/internal/pkg/chrome/chrome.go +++ b/internal/pkg/chrome/chrome.go @@ -31,7 +31,8 @@ func Start(logger xlog.Logger, ignoreCertificateErrors bool) error { } // if the process failed to start correctly, // we have to restart it. - if !isViable(logger) { + isViable, _ := IsViable(logger) + if !isViable { return restart(logger, cmd.Process, ignoreCertificateErrors) } return nil @@ -117,7 +118,8 @@ func restart(logger xlog.Logger, proc *os.Process, ignoreCertificateErrors bool) } // if the process failed to restart correctly, // we have to restart it again. - if !isViable(logger) { + isViable, _ := IsViable(logger) + if !isViable { return restart(logger, cmd.Process, ignoreCertificateErrors) } return nil @@ -128,12 +130,13 @@ func restart(logger xlog.Logger, proc *os.Process, ignoreCertificateErrors bool) return nil } -func isViable(logger xlog.Logger) bool { +// IsViable checks if Google Chrome is healthy. +func IsViable(logger xlog.Logger) (bool, error) { const ( - op string = "chrome.isViable" + op string = "chrome.IsViable" maxViabilityTests int = 20 ) - viable := func() bool { + viable := func() (bool, error) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() endpoint := "http://localhost:9222" @@ -149,21 +152,23 @@ func isViable(logger xlog.Logger) bool { "Google Chrome headless is not viable as endpoint returned '%v'", err.Error(), ) - return false + return false, err } logger.DebugOpf( op, "Google Chrome headless is viable as endpoint returned '%v'", v, ) - return true + return true, nil } result := false + var err error + for i := 0; i < maxViabilityTests && !result; i++ { warmup(logger) - result = viable() + result, err = viable() } - return result + return result, err } func warmup(logger xlog.Logger) {