Atualmente, estou trabalhando em um site, que aciona um net::ERR_HTTP2_PROTOCOL_ERROR 200
erro no Google Chrome. Não sei exatamente o que pode provocar esse erro, só notei que ele aparece apenas ao acessar o site em HTTPS. Não tenho 100% de certeza de que esteja relacionado, mas parece que impede que o javascript seja executado corretamente.
Por exemplo, o seguinte cenário acontece:
Estou acessando o site em HTTPS
Meu feed do Twitter integrado via https://publish.twitter.com não está carregado
Percebo no console o arquivo ERR_HTTP2_PROTOCOL_ERROR
Se eu remover o código para carregar o feed do Twitter, o erro permanecerá
Se eu acessar o site em HTTP, o feed do Twitter aparece e o erro desaparece
O Google Chrome é o único navegador da Web que desencadeou o erro: funciona bem no Edge e no Firefox. (Nota: tentei com o Safari e tenho um kcferrordomaincfnetwork 303
erro semelhante )
Eu queria saber se isso poderia estar relacionado ao cabeçalho retornado pelo servidor, já que existe essa menção '200' no erro e uma página 404/500 não está acionando nada.
O problema é que o erro não está documentado. A pesquisa do Google me dá muito poucos resultados. Além disso, notei que ele aparece em lançamentos muito recentes do Google Chrome; o erro não aparece na v.64.X, mas na v.75 + (independentemente do sistema operacional; estou trabalhando no Mac).
Qualquer pista neste momento para investigar seria apreciada com prazer!
Desde já, obrigado.
Tristan
Editar 1: pode estar relacionado ao site OK no Firefox, mas não no Safari (erro 303 do kCFErrorDomainCFNetwork) nem no Chrome (net :: ERR_SPDY_PROTOCOL_ERROR)
Edit 2: Os resultados de investigações adicionais são os seguintes:
- erro não aparece exatamente na mesma página se o servidor retornar 404 em vez de 2XX
- erro não aparece no local com um certificado HTTPS
- erro aparece em um servidor diferente (ambos são OVH), que usa um certificado diferente
- o erro aparece independentemente da versão do PHP usada, de 5.6 a 7.3 (estrutura usada: Cakephp 2.10)
Edit 3: Conforme solicitado, abaixo está o cabeçalho retornado para o recurso com falha, que é a página da web inteira. Mesmo que o erro seja acionado em cada página com um cabeçalho HTTP 200, essas páginas estão sempre carregando no navegador do cliente, mas às vezes falta um elemento (no meu exemplo, o feed externo do Twitter). Todos os outros ativos na guia Rede têm um retorno bem-sucedido, exceto o documento inteiro.
Cabeçalho do Google Chrome (com erro):
Cabeçalho do Firefox (sem erro):
Uma curl --head --http2
solicitação no console retorna o seguinte sucesso:
HTTP/2 200
date: Fri, 04 Oct 2019 08:04:51 GMT
content-type: text/html; charset=UTF-8
content-length: 127089
set-cookie: SERVERID31396=2341116; path=/; max-age=900
server: Apache
x-powered-by: PHP/7.2
set-cookie: xxxxx=0919c5563fc87d601ab99e2f85d4217d; expires=Fri, 04-Oct-2019 12:04:51 GMT; Max-Age=14400; path=/; secure; HttpOnly
vary: Accept-Encoding
Edit 4: Tentando ir mais fundo com as ferramentas chrome: // net-export / e https://netlog-viewer.appspot.com está me dizendo que a solicitação termina com um RST_STREAM:
t=123354 [st=5170] HTTP2_SESSION_RECV_RST_STREAM
--> error_code = "2 (INTERNAL_ERROR)"
--> stream_id = 1
Pelo que li nesta outra postagem , " No HTTP / 2, se o cliente deseja anular a solicitação, ele envia um RST_STREAM. Quando o servidor recebe um RST_STREAM, ele pára de enviar quadros de dados para o cliente, interrompendo a resposta. (ou o download) .A conexão ainda é utilizável para outras solicitações, e as solicitações / respostas simultâneas com a que foi abortada podem continuar a progredir. [...] É possível que, quando o RST_STREAM viajar de o cliente para o servidor, todo o conteúdo da solicitação está em trânsito e chegará ao cliente, o que a descartará, mas para conteúdos de resposta grandes, o envio de um RST_STREAM pode ter uma boa chance de chegar ao servidor antes de todo o conteúdo da resposta é enviado e, portanto, economiza largura de banda " .
O comportamento descrito é o mesmo que eu posso observar. Mas isso significaria que o navegador é o culpado, e então eu não entenderia por que isso acontece em duas páginas idênticas, uma com cabeçalho 200 e a outra 404 (o mesmo ocorre se eu desativar o JS).