Pular para o conteúdo

Solução de problemas

A bridge lança três tipos de exceção. A exceção que você captura indica o que falhou e se vale repetir a operação ou usar um fallback. Cada fragmento de mensagem abaixo vem do código-fonte.

ExceçãoEstendeSignificado
CloudflareNotAvailableExceptionNextPDF\Exception\NextPdfExceptionA bridge não consegue alcançar a edge, ou a configuração está incompleta, e não há fallback utilizável.
CloudflareRenderExceptionNextPDF\Exception\NextPdfExceptionO Worker respondeu, mas a renderização falhou (erro de Hypertext Transfer Protocol (HTTP) ou corpo malformado). Nunca recorre ao fallback.
InvalidSpkiPinExceptionInvalidArgumentExceptionUma string de pin de Subject Public Key Info (SPKI) configurada está malformada.

CloudflareSecurityPolicy também lança RuntimeException diretamente para violações de política de entrada e de Uniform Resource Locator (URL). A exceção é lançada antes do envio de qualquer requisição.

Fragmento da mensagemLançada porCausaCorreção
incomplete (missing worker_url or api_token)Renderer (via caminho de fallback)Tanto workerUrl quanto apiToken estão vaziosDefina ambos e, em seguida, verifique com isValid().
HTML input exceeds maximum sizeCloudflareSecurityPolicy::validate()A entrada em Hypertext Markup Language (HTML) é maior do que maxHtmlSizeReduza a entrada ou aumente maxHtmlSize deliberadamente.
Base64 data URI exceeds safety limitCloudflareSecurityPolicy::validate()Estima-se que um Uniform Resource Identifier (URI) data:;base64, esteja acima de 13631488 bytesExternalize o recurso; não incorpore binários grandes inline.
meta-refresh redirect which could cause SSRFCloudflareSecurityPolicy::validate()Uma tag <meta http-equiv="refresh"> poderia disparar server-side request forgery (SSRF)Remova a tag; use um redirecionamento do lado do servidor fora do HTML renderizado.
Invalid Worker URLvalidateWorkerUrl()A URL não pode ser analisada ou não tem scheme/hostForneça uma URL absoluta completa que use Hypertext Transfer Protocol Secure (HTTPS).
Worker URL must use HTTPSvalidateWorkerUrl()O scheme não é HTTPSUse https://.
private or reserved IP addressesvalidateWorkerUrl()Literal de Internet Protocol (IP) na faixa Request for Comments (RFC) 1918 / loopback / RFC 3927Aponte para um endpoint público.
hostname resolves to a private or reserved IPvalidateWorkerUrl()Um registro A/AAAA de Domain Name System (DNS) resolvido é privado ou reservadoCorrija o DNS; investigue um possível rebinding.
DNS answer changed since validationassertPinsStillValid()O host resolveu para um novo endereço IP entre a verificação e o envioResolva novamente; trate como uma possível tentativa de rebinding.

Estas são falhas de CloudflareRenderException. O Worker respondeu, mas a renderização em si falhou. Elas nunca acionam o fallback local porque a edge estava acessível.

Fragmento da mensagemCausa
Cloudflare Worker returned HTTP <code>: <detail>Status diferente de 200. O detalhe vem do campo error em JavaScript Object Notation (JSON) ou dos primeiros 200 bytes do corpo.
Worker returned empty or invalid PDF dataA resposta binária não começa com %PDF.
Worker error: <message>Resposta JSON que carrega um campo error.
JSON response missing "pdf" fieldResposta JSON sem um campo pdf.
Invalid base64-encoded PDF in JSON responseO campo pdf não foi decodificado de base64 para bytes que começam com %PDF.
Invalid JSON response from WorkerO corpo usa Content-Type: application/json, mas não é decodificado em um array.
Unexpected Content-Type from Worker: <type>Uma resposta 200 cujo Content-Type não é nem application/pdf nem application/json.

Quando você captura uma dessas, inspecione os logs do Worker. A falha está do lado do Worker, não nesta bridge.

Estas são falhas de CloudflareNotAvailableException. A bridge não conseguiu usar a edge, e nenhum fallback produziu um arquivo em Portable Document Format (PDF).

Fragmento da mensagemCausaCorreção
Cloudflare Worker unavailable: <reason>Erro de transporte com o fallback desabilitadoHabilite fallbackToLocal e conecte uma factory, ou corrija a conectividade.
Artisan is installed but no LocalRendererFactoryInterface was providednextpdf/artisan está presente, mas nenhuma factory foi passadaPasse uma LocalRendererFactoryInterface para o construtor.
local Chrome fallback (nextpdf/artisan) is not installedO fallback está habilitado, nenhuma factory está configurada e o Artisan está ausenteExecute composer require nextpdf/artisan e, em seguida, conecte uma factory.

Quando você fornece um logger PHP Standards Recommendation (PSR)-3 e o caminho de fallback é executado, a bridge registra um warning (Cloudflare render failed, attempting fallback) e, depois, um info (Falling back to local renderer).

SintomaCausaCorreção
InvalidSpkiPinException: Invalid SPKI pin formatUm pin não está no formato sha256/<base64> (ou sha256//<base64>)Corrija a string do pin.
cURL transport error (<n>): <msg>Falha no nível do cURL (Transport Layer Security (TLS), DNS, timeout)Inspecione o número do erro do cURL; se houver pins definidos, confirme que o SPKI servido ainda está pinado.
As renderizações falham imediatamente após a rotação do certificadoO SPKI do novo certificado não está no conjunto de pinsAdicione o novo SPKI como pin de backup antes de rotacionar.
O transporte pinado não é usado apesar dos pins configuradosNenhuma ResponseFactory PSR-17 foi fornecidaPasse uma ResponseFactory; o transporte pinado a exige.

isAvailable() nunca lança exceção. Ele retorna false quando a configuração é inválida ou quando a sonda HEAD falha ou lança uma exceção. Ele retorna true somente quando a sonda responde com um status abaixo de 500. Um resultado true é apenas um indicativo: o POST subsequente ainda pode falhar com qualquer um dos erros do lado do Worker acima. Não trate uma sonda aprovada como garantia.

ApiProtection mantém os limites em memória por processo. As contagens não sobrevivem a uma reinicialização e não são compartilhadas entre workers ou nós. Se um nó permite um cliente e outro o nega, isso é esperado. Coloque um store compartilhado à frente do limitador para ter um limite válido em todo o cluster.

  • /integrations/cloudflare/security-and-operations/ — o runbook operacional e os controles por trás dessas mensagens.
  • /integrations/cloudflare/quickstart/ — o padrão canônico de try/catch.
  • /integrations/cloudflare/production-usage/ — detalhes sobre a conexão do fallback.