El equipo del lenguaje de programación Go ha actualizado la biblioteca estándar `net/http` en la versión 1.27 para mejorar la forma en que se reutilizan las conexiones HTTP/1. Anteriormente, si un desarrollador cerraba un cuerpo de respuesta HTTP sin leerlo por completo, la conexión TCP subyacente podía ser descartada porque el servidor aún tenía datos no consumidos en su búfer. Para evitar esto, el entorno de ejecución de Go ahora intentará automáticamente vaciar los datos restantes del cuerpo de forma asíncrona cuando se cierre un cuerpo, hasta un límite de tiempo conservador.
Este cambio tiene como objetivo simplificar la experiencia del desarrollador al reducir la necesidad de código repetitivo manual. Antes de esta actualización, los desarrolladores a menudo tenían que implementar una lógica compleja —como `drainAsyncAndCloseBodyWithTimer`— para asegurar que las conexiones no se filtraran o se cerraran prematuramente. Al manejar esto internamente, Go 1.27 permite un almacenamiento en reserva de conexiones más eficiente. Por ejemplo, un usuario informó que realizar 100 solicitudes contra un objetivo usando HTTP/1 mostró una mejora de rendimiento de aproximadamente 710 milisegundos en Go 1.26 a 150 milisegundos en Go 1.27, lo que sugiere una reducción significativa en la sobrecarga de establecer nuevas conexiones.
Sin embargo, esta automatización introduce compensaciones y casos específicos. Debido a que el entorno de ejecución ahora intenta vaciar el cuerpo, el comportamiento de `Close()` ya no garantiza que la descarga se detenga inmediatamente; en su lugar, el sistema esperará un período corto (hasta 50ms) para limpiar el búfer. Esto puede afectar a escenarios donde un desarrollador desea intencionalmente omitir un cuerpo grande para ahorrar ancho de banda. Además, algunos usuarios señalaron que ciertas herramientas, como los decodificadores JSON, podrían seguir dejando saltos de línea finales que impiden la reutilización de la conexión si no se manejan correctamente. Si bien el cambio mejora el rendimiento general, requiere que los desarrolladores sean conscientes de que la operación 'Close' es ahora más una señal del ciclo de vida de alto nivel que un comando de socket de bajo nivel.
