Go json.NewDecoder().Decode() Problema de fecha límite de contexto
En los programas Go, las fechas límite de contexto proporcionan un medio para establecer tiempos de espera para determinadas operaciones. Sin embargo, un usuario informó un comportamiento inesperado al usar json.NewDecoder().Decode().
Preocupaciones del usuario
El usuario esperaba el json.NewDecoder(). Decode() para respetar la fecha límite de contexto establecida para el programa. Observaron que la lectura del cuerpo de la respuesta usando ioutil.ReadAll() desencadenó un error de fecha límite de contexto excedido, como se anticipó. Sin embargo, cuando cambiaron a json.NewDecoder().Decode(), no se informó ningún error, a pesar de que el tiempo transcurrido superó la fecha límite.
Ejemplo de código
ctx, _ := context.WithTimeout(context.Background(), time.Second*5)
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
...
time.Sleep(time.Second * 6)
fmt.Println("before reading response body, context error is:", ctx.Err())
err = json.NewDecoder(resp.Body).Decode(ipResponse)
if err != nil {
panic(err)
}
fmt.Println("Expected panic but there was none")
Respuesta
La discrepancia en el comportamiento se debe al uso de buffers dentro del paquete net/http. Dependiendo del tamaño y la configuración de la respuesta, el cuerpo puede almacenarse total o parcialmente en el búfer antes de leerse. Esto significa que cuando se utiliza json.NewDecoder().Decode(), es posible que el contexto caducado no impida que se acceda a los datos almacenados en el buffer.
Para ilustrar esto, se creó un servidor de prueba que retrasó intencionalmente el cuerpo de la respuesta. . Simuló el comportamiento de almacenamiento en búfer parcial del paquete net/http. Cuando se ejecutó readDoesntFail() con este servidor de prueba, se activó el error de fecha límite de contexto esperada excedido.
Conclusión
El comportamiento observado en el código del usuario resalta el potencial Advertencias sobre el uso de json.NewDecoder().Decode() con plazos de contexto. Es importante tener en cuenta que si el cuerpo de la respuesta es grande y se ha amortiguado por completo, es posible que la fecha límite del contexto no se aplique como se esperaba.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3