diff --git a/pkg/html/dynamic/document.go b/pkg/html/dynamic/document.go index c248ebc3..34264e80 100644 --- a/pkg/html/dynamic/document.go +++ b/pkg/html/dynamic/document.go @@ -50,6 +50,14 @@ const ( ScreenshotFormatJPEG ScreenshotFormat = "jpeg" ) +func handleLoadError(logger *zerolog.Logger, client *cdp.Client) { + err := client.Page.Close(context.Background()) + + if err != nil { + logger.Warn().Timestamp().Err(err).Msg("unabled to close document on load error") + } +} + func IsScreenshotFormatValid(format string) bool { value := ScreenshotFormat(format) @@ -62,6 +70,8 @@ func LoadHTMLDocument( client *cdp.Client, url string, ) (*HTMLDocument, error) { + logger := logging.FromContext(ctx) + if conn == nil { return nil, core.Error(core.ErrMissedArgument, "connection") } @@ -76,6 +86,8 @@ func LoadHTMLDocument( err = waitForLoadEvent(ctx, client) if err != nil { + handleLoadError(logger, client) + return nil, err } } @@ -83,17 +95,17 @@ func LoadHTMLDocument( node, err := getRootElement(ctx, client) if err != nil { + handleLoadError(logger, client) return nil, errors.Wrap(err, "failed to get root element") } broker, err := createEventBroker(client) if err != nil { + handleLoadError(logger, client) return nil, errors.Wrap(err, "failed to create event events") } - logger := logging.FromContext(ctx) - rootElement, err := LoadElement( ctx, logger, @@ -104,6 +116,10 @@ func LoadHTMLDocument( ) if err != nil { + broker.Stop() + broker.Close() + handleLoadError(logger, client) + return nil, errors.Wrap(err, "failed to load root element") } diff --git a/pkg/html/dynamic/driver.go b/pkg/html/dynamic/driver.go index 8cb61991..a93cb7fd 100644 --- a/pkg/html/dynamic/driver.go +++ b/pkg/html/dynamic/driver.go @@ -129,6 +129,10 @@ func (drv *Driver) GetDocument(ctx context.Context, targetURL values.String) (va }, ) + if err != nil { + return nil, err + } + return LoadHTMLDocument(ctx, conn, client, url) }