Actualmente estoy trabajando en un sitio web, lo que provoca un net::ERR_HTTP2_PROTOCOL_ERROR 200
error en Google Chrome. No estoy seguro exactamente qué puede provocar este error, solo noté que aparece solo cuando accedo al sitio web en HTTPS. No puedo estar 100% seguro de que esté relacionado, pero parece que impide que JavaScript se ejecute correctamente.
Por ejemplo, ocurre el siguiente escenario:
Estoy accediendo al sitio web en HTTPS
Mi feed de Twitter integrado a través de https://publish.twitter.com no está cargado en absoluto
Puedo notar en la consola el ERR_HTTP2_PROTOCOL_ERROR
Si elimino el código para cargar el feed de Twitter, el error permanece
Si accedo al sitio web en HTTP, aparece el feed de Twitter y desaparece el error
Google Chrome es el único navegador web que activa el error: funciona bien tanto en Edge como en Firefox. (Nota: lo intenté con Safari y tengo un kcferrordomaincfnetwork 303
error similar )
Me preguntaba si podría estar relacionado con el encabezado devuelto por el servidor ya que hay esta mención '200' en el error, y una página 404/500 no está activando nada.
La cosa es que el error no está documentado en absoluto. La búsqueda de Google me da muy pocos resultados. Además, noté que aparece en versiones muy recientes de Google Chrome; el error no aparece en v.64.X, pero sí en v.75 + (independientemente del sistema operativo; estoy trabajando en Mac).
¡Cualquier pista en este punto para investigar sería gratamente apreciada!
Gracias por adelantado.
Tristan
Edición 1: Puede estar relacionado con el sitio web OK en Firefox pero no en Safari (kCFErrorDomainCFNetwork error 303) ni Chrome (net :: ERR_SPDY_PROTOCOL_ERROR)
Edición 2: Los resultados de futuras investigaciones son los siguientes:
- el error no aparece exactamente en la misma página si el servidor devuelve 404 en lugar de 2XX
- el error no aparece en local con un certificado HTTPS
- aparece un error en un servidor diferente (ambos son OVH), que usa un certificado diferente
- aparece el error sin importar qué versión de PHP se use, de 5.6 a 7.3 (marco utilizado: Cakephp 2.10)
Edición 3: según lo solicitado, a continuación se muestra el encabezado devuelto para el recurso que falla, que es la página web completa. Incluso si el error se activa en cada página que tiene un encabezado HTTP 200, esas páginas siempre se están cargando en el navegador del cliente, pero a veces falta un elemento (en mi ejemplo, el feed externo de Twitter). Todos los demás activos en la pestaña Red tienen un retorno exitoso, excepto el documento completo en sí.
Encabezado de Google Chrome (con error):
Encabezado de Firefox (sin error):
Una curl --head --http2
solicitud en la consola devuelve el siguiente éxito:
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
Edición 4: Intentar profundizar con las herramientas chrome: // net-export / y https://netlog-viewer.appspot.com me dice que la solicitud termina con un RST_STREAM:
t=123354 [st=5170] HTTP2_SESSION_RECV_RST_STREAM
--> error_code = "2 (INTERNAL_ERROR)"
--> stream_id = 1
Por lo que leí en esta otra publicación , " En HTTP / 2, si el cliente desea cancelar la solicitud, envía un RST_STREAM. Cuando el servidor recibe un RST_STREAM, dejará de enviar tramas DATA al cliente, deteniendo así la respuesta (o la descarga). La conexión todavía se puede utilizar para otras solicitudes, y las solicitudes / respuestas que coincidieron con la que se ha cancelado pueden continuar progresando. [...] Es posible que para cuando RST_STREAM viaje desde el cliente al servidor, todo el contenido de la solicitud está en tránsito y llegará al cliente, que lo descartará. Sin embargo, para grandes contenidos de respuesta, el envío de un RST_STREAM puede tener una buena oportunidad de llegar al servidor antes de todo se envía contenido de respuesta y, por lo tanto, ahorrará ancho de banda " .
El comportamiento descrito es el mismo que puedo observar. Pero eso significaría que el navegador es el culpable, y entonces no entendería por qué sucede en dos páginas idénticas, una con un encabezado 200 y la otra un 404 (lo mismo ocurre si desactivo JS).