{"record":{"id":"783f3c7b98220487","repo":"srbhr/Resume-Matcher","slug":"str-e-message-from-pdfrendererror","errorCode":null,"errorMessage":"str(e) (message from PDFRenderError)","messagePattern":"str\\(e\\) \\(message from PDFRenderError\\)","errorType":"http","errorClass":"PDFRenderError","httpStatus":503,"severity":"error","filePath":"apps/backend/app/routers/resumes.py","lineNumber":2055,"sourceCode":"\n    cover_letter = resume.get(\"cover_letter\")\n    if not cover_letter:\n        raise HTTPException(\n            status_code=404, detail=\"No cover letter found for this resume\"\n        )\n\n    # Build print URL (same pattern as resume PDF)\n    url = f\"{settings.frontend_base_url}/print/cover-letter/{resume_id}?pageSize={pageSize}\"\n    if lang:\n        url = f\"{url}&lang={lang}\"\n\n    # Render PDF with cover letter selector\n    try:\n        pdf_bytes = await render_resume_pdf(\n            url, pageSize, selector=\".cover-letter-print\"\n        )\n    except PDFRenderError as e:\n        raise HTTPException(status_code=503, detail=str(e))\n\n    headers = {\n        \"Content-Disposition\": f'attachment; filename=\"cover_letter_{resume_id}.pdf\"'\n    }\n    return Response(content=pdf_bytes, media_type=\"application/pdf\", headers=headers)\n","sourceCodeStart":2037,"sourceCodeEnd":2061,"githubUrl":"https://github.com/srbhr/Resume-Matcher/blob/116f9cc3b00e1ac91734a6c2679bf41ea64a0edc/apps/backend/app/routers/resumes.py#L2037-L2061","documentation":"HTTP 503 raised when render_resume_pdf fails with PDFRenderError while snapshotting the cover-letter print page headlessly (e.g. Playwright/Puppeteer). The raw renderer message (str(e)) is passed through as the detail. 503 signals the rendering service is temporarily unavailable or the page failed to render.","triggerScenarios":"The headless browser fails to load {frontend_base_url}/print/cover-letter/{id} — frontend unreachable, page JS error, selector .cover-letter-print absent, navigation timeout, or browser process launch failure.","commonSituations":"frontend_base_url misconfigured (wrong host/port, http vs https); print route not deployed in the backend's target environment; browser sandbox missing dependencies in Docker (e.g. libnss3); cover-letter content causing client-side render crash; timeouts on large documents.","solutions":["Check the PDFRenderError message in the 503 response/logs — fix the specific renderer cause (timeout, navigation, selector).","Verify settings.frontend_base_url is reachable from the backend container (curl the print URL).","Ensure the print route /print/cover-letter exists in the deployed frontend and the .cover-letter-print selector is present.","In Docker, install headless-browser system dependencies and confirm the browser binary launches.","Retry — if the renderer was temporarily saturated, a retry with backoff often succeeds."],"exampleFix":"// before\nexcept PDFRenderError as e:\n    raise HTTPException(status_code=503, detail=str(e))\n// after (retry transient render failures)\nexcept PDFRenderError as e:\n    if e.is_transient:\n        pdf_bytes = await render_resume_pdf(url, pageSize, selector=\".cover-letter-print\")\n    else:\n        raise HTTPException(status_code=503, detail=str(e))","handlingStrategy":"retry","validationCode":"const printUrl = `${frontendBaseUrl}/print/cover-letter/${resumeId}`;\nconst ok = await fetch(printUrl).then(r => r.ok).catch(() => false);\nif (!ok) throw new SkipError('print page unreachable — renderer would fail');","typeGuard":null,"tryCatchPattern":"try {\n  return await withBackoff(() => downloadCoverLetterPdf(resumeId), {retries: 2});\n} catch (e) {\n  if (e.status === 503) {\n    showStatus('PDF renderer temporarily unavailable: ' + e.detail + '. Check frontend_base_url and try again.');\n    return null;\n  }\n  throw e;\n}","preventionTips":["Verify settings.frontend_base_url is reachable from the backend before rendering (health-check the print route).","Install headless-browser system dependencies in the deployment image.","Confirm the .cover-letter-print selector exists in the deployed frontend print page.","Set generous renderer timeouts for large documents and alert on PDFRenderError rates."],"tags":["http-503","pdf-rendering","headless-browser","network"],"backgroundTag":"pdf-render-failed","analyzedSha":"116f9cc3b00e1ac91734a6c2679bf41ea64a0edc","analyzedAt":"2026-08-28T22:51:40.999Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}