"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > O json.NewDecoder().Decode() respeita os prazos de contexto quando os corpos de resposta são armazenados em buffer?

O json.NewDecoder().Decode() respeita os prazos de contexto quando os corpos de resposta são armazenados em buffer?

Publicado em 2024-11-02
Navegar:534

 Does json.NewDecoder().Decode() Respect Context Deadlines When Response Bodies are Buffered?

Go json.NewDecoder().Decode() Problema de prazo de contexto

Em programas Go, os prazos de contexto fornecem um meio de definir tempos limite para determinadas operações. No entanto, um usuário relatou um comportamento inesperado ao usar json.NewDecoder().Decode().

Preocupações do usuário

O usuário esperava o json.NewDecoder(). Decode() para respeitar o prazo de contexto definido para o programa. Eles observaram que a leitura do corpo da resposta usando ioutil.ReadAll() acionou um erro de prazo de contexto excedido, conforme previsto. No entanto, quando eles mudaram para json.NewDecoder().Decode(), nenhum erro foi relatado, apesar do tempo decorrido ter excedido o prazo.

Exemplo 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")

Resposta

A discrepância de comportamento decorre do uso de buffers dentro do pacote net/http. Dependendo do tamanho e da configuração da resposta, o corpo pode ser parcialmente ou totalmente armazenado em buffer antes de ser lido. Isso significa que quando json.NewDecoder().Decode() é usado, o contexto expirado pode não impedir que os dados armazenados em buffer sejam acessados.

Para ilustrar isso, foi criado um servidor de teste que atrasou intencionalmente o corpo da resposta . Ele simulou o comportamento de buffer parcial do pacote net/http. Quando readDoesntFail() foi executado com este servidor de teste, o erro de prazo de contexto esperado excedido foi realmente acionado.

Conclusão

O comportamento observado no código do usuário destaca o potencial advertências sobre o uso de json.NewDecoder().Decode() com prazos de contexto. É importante estar ciente de que se o corpo da resposta for grande e tiver sido completamente armazenado em buffer, o prazo do contexto poderá não ser aplicado conforme o esperado.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3