Tengo una aplicación Quart con la que transmito una respuesta al cliente. Estoy usando asyncio.sleep para retrasar la finalización de la respuesta, si configuro el retraso en 59 segundos, todo funciona bien. La transmisión se completa sin ningún problema. Si aumento el tiempo a 120 segundos, la respuesta parece agotarse. Esa es la primera parte de la transmisión que recibe el cliente, pero después de unos 60 segundos, el navegador arroja un error en Chrome: net::ERR_HTTP2_PROTOCOL_ERROR 200. Firefox arroja un TypeError.
Estoy usando Hypercorn con Nginx.
el archivo hypercorn config.py dice:
Shutdown_timeout = 123.0 ssl_handshake_timeout = 123.0 startup_timeout = 123.0la configuración relevante en nginx.conf:
location @proxy_to_app { proxy_read_timout = 600s }No sé cómo resolver esto.
Descubrí el origen del problema. No tiene nada que ver con Quart, Hypercorn o Nginx. El problema es con Cloudflare y http2, es causado por WriteTimeout. Vea esta respuesta: ¿De qué se trata net::ERR_HTTP2_PROTOCOL_ERROR?
La pregunta entonces es cómo cambiar esto en Cloudlfare.
No tengo Quart configurado para trabajar en http2, ¿eso ayudaría?
La única solución que encontré fue romper el sueño y enviar datos provisionales al cliente para mantener viva la conexión.
async def async_generator(): content_arr = [ json.dumps({'first':'some data'}), json.dumps({'alive':''}), #required to http2 connection alive json.dumps({'final' : 'final data'}) ] for i,html in enumerate(content_arr): print(i) if i > 0: await asyncio.sleep(59) #this delays sending the final data 118 seconds yield html.encode()