diff --git a/pkg/modules/chromium/browser.go b/pkg/modules/chromium/browser.go index 4f41e832..b096a30e 100644 --- a/pkg/modules/chromium/browser.go +++ b/pkg/modules/chromium/browser.go @@ -405,6 +405,10 @@ func (b *chromiumBrowser) do(ctx context.Context, logger *zap.Logger, url string if err != nil { errMessage := err.Error() + if strings.Contains(errMessage, "Printing failed (-32000)") { + return ErrPrintingFailed + } + if strings.Contains(errMessage, "Show invalid printer settings error (-32000)") || strings.Contains(errMessage, "content area is empty (-32602)") { return ErrInvalidPrinterSettings } @@ -413,6 +417,10 @@ func (b *chromiumBrowser) do(ctx context.Context, logger *zap.Logger, url string return ErrPageRangesSyntaxError } + if strings.Contains(errMessage, "Page range exceeds page count (-32000)") { + return ErrPageRangesExceedsPageCount + } + if strings.Contains(errMessage, "rpcc: message too large") { return ErrRpccMessageTooLarge } diff --git a/pkg/modules/chromium/chromium.go b/pkg/modules/chromium/chromium.go index e5a433d4..2b32174d 100644 --- a/pkg/modules/chromium/chromium.go +++ b/pkg/modules/chromium/chromium.go @@ -63,13 +63,20 @@ var ( // PdfOptions.OmitBackground is set to true but not PdfOptions.PrintBackground. ErrOmitBackgroundWithoutPrintBackground = errors.New("omit background without print background") + // ErrPrintingFailed happens if the printing failed for an unknown reason. + ErrPrintingFailed = errors.New("printing failed") + // ErrInvalidPrinterSettings happens if the PdfOptions have one or more // aberrant values. ErrInvalidPrinterSettings = errors.New("invalid printer settings") - // ErrPageRangesSyntaxError happens if the PdfOptions have an invalid page - // range. + // ErrPageRangesSyntaxError happens if the PdfOptions page + // range syntax is invalid. ErrPageRangesSyntaxError = errors.New("page ranges syntax error") + + // ErrPageRangesExceedsPageCount happens if the PdfOptions have an invalid + // page range. + ErrPageRangesExceedsPageCount = errors.New("page ranges exceeds page count") ) // Chromium is a module that provides both an [Api] and routes for converting diff --git a/pkg/modules/chromium/routes.go b/pkg/modules/chromium/routes.go index 17f3a6c0..8af92307 100644 --- a/pkg/modules/chromium/routes.go +++ b/pkg/modules/chromium/routes.go @@ -652,6 +652,16 @@ func convertUrl(ctx *api.Context, chromium Api, engine gotenberg.PdfEngine, url ) } + if errors.Is(err, ErrPrintingFailed) { + return api.WrapError( + fmt.Errorf("convert to PDF: %w", err), + api.NewSentinelHttpError( + http.StatusBadRequest, + "Chromium failed to print the PDF; this usually happens when the page is too large", + ), + ) + } + if errors.Is(err, ErrInvalidPrinterSettings) { return api.WrapError( fmt.Errorf("convert to PDF: %w", err), @@ -662,12 +672,22 @@ func convertUrl(ctx *api.Context, chromium Api, engine gotenberg.PdfEngine, url ) } + if errors.Is(err, ErrPageRangesExceedsPageCount) { + return api.WrapError( + fmt.Errorf("convert to PDF: %w", err), + api.NewSentinelHttpError( + http.StatusBadRequest, + fmt.Sprintf("The page ranges '%s' (nativePageRanges) exceeds the page count", options.PageRanges), + ), + ) + } + if errors.Is(err, ErrPageRangesSyntaxError) { return api.WrapError( fmt.Errorf("convert to PDF: %w", err), api.NewSentinelHttpError( http.StatusBadRequest, - fmt.Sprintf("Chromium does not handle the page ranges '%s' (nativePageRanges)", options.PageRanges), + fmt.Sprintf("Chromium does not handle the page ranges '%s' (nativePageRanges) syntax", options.PageRanges), ), ) } diff --git a/test/integration/features/chromium_convert_html.feature b/test/integration/features/chromium_convert_html.feature index 4655b241..d9306fd7 100644 --- a/test/integration/features/chromium_convert_html.feature +++ b/test/integration/features/chromium_convert_html.feature @@ -2,7 +2,7 @@ # 1. JavaScript disabled on some feature. @chromium -@chromium-pdf-html +@chromium-convert-html Feature: /forms/chromium/convert/html Scenario: POST /forms/chromium/convert/html (Default) @@ -445,7 +445,16 @@ Feature: /forms/chromium/convert/html Then the response header "Content-Type" should be "text/plain; charset=UTF-8" Then the response body should match string: """ - Chromium does not handle the page ranges 'foo' (nativePageRanges) + Chromium does not handle the page ranges 'foo' (nativePageRanges) syntax + """ + When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/html" endpoint with the following form data and header(s): + | files | testdata/page-1-html/index.html | file | + | nativePageRanges | 2-3 | field | + Then the response status code should be 400 + Then the response header "Content-Type" should be "text/plain; charset=UTF-8" + Then the response body should match string: + """ + The page ranges '2-3' (nativePageRanges) exceeds the page count """ When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/html" endpoint with the following form data and header(s): | files | testdata/page-1-html/index.html | file | diff --git a/test/integration/features/chromium_convert_markdown.feature b/test/integration/features/chromium_convert_markdown.feature index ca2ae42d..8afa1c79 100644 --- a/test/integration/features/chromium_convert_markdown.feature +++ b/test/integration/features/chromium_convert_markdown.feature @@ -524,7 +524,17 @@ Feature: /forms/chromium/convert/markdown Then the response header "Content-Type" should be "text/plain; charset=UTF-8" Then the response body should match string: """ - Chromium does not handle the page ranges 'foo' (nativePageRanges) + Chromium does not handle the page ranges 'foo' (nativePageRanges) syntax + """ + When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/markdown" endpoint with the following form data and header(s): + | files | testdata/page-1-markdown/index.html | file | + | files | testdata/page-1-markdown/page_1.md | file | + | nativePageRanges | 2-3 | field | + Then the response status code should be 400 + Then the response header "Content-Type" should be "text/plain; charset=UTF-8" + Then the response body should match string: + """ + The page ranges '2-3' (nativePageRanges) exceeds the page count """ When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/markdown" endpoint with the following form data and header(s): | files | testdata/page-1-markdown/index.html | file | diff --git a/test/integration/features/chromium_convert_url.feature b/test/integration/features/chromium_convert_url.feature index bcb7013f..d352ccc2 100644 --- a/test/integration/features/chromium_convert_url.feature +++ b/test/integration/features/chromium_convert_url.feature @@ -522,7 +522,17 @@ Feature: /forms/chromium/convert/url Then the response header "Content-Type" should be "text/plain; charset=UTF-8" Then the response body should match string: """ - Chromium does not handle the page ranges 'foo' (nativePageRanges) + Chromium does not handle the page ranges 'foo' (nativePageRanges) syntax + """ + Given I have a static server + When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/url" endpoint with the following form data and header(s): + | url | http://host.docker.internal:%d/html/testdata/page-1-html/index.html | field | + | nativePageRanges | 2-3 | field | + Then the response status code should be 400 + Then the response header "Content-Type" should be "text/plain; charset=UTF-8" + Then the response body should match string: + """ + The page ranges '2-3' (nativePageRanges) exceeds the page count """ Given I have a static server When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/url" endpoint with the following form data and header(s):