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

Mary-Kate Olsen
Release: 2024-10-30 05:25:28
Original
295 people have browsed it

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

Go json.NewDecoder().Decode() Context Deadline Issue

In Go programs, context deadlines provide a means of setting timeouts for certain operations. However, a user reported an unexpected behavior when using json.NewDecoder().Decode().

User Concerns

The user expected the json.NewDecoder().Decode() to respect the context deadline set for the program. They observed that reading from the response body using ioutil.ReadAll() triggered a context deadline exceeded error, as anticipated. However, when they switched to json.NewDecoder().Decode(), no error was reported, despite the elapsed time exceeding the deadline.

Code Example

<code class="go">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")</code>
Copy after login

Answer

The discrepancy in behavior stems from the use of buffers within the net/http package. Depending on the size and configuration of the response, the body may be partially or fully buffered before it is read. This means that when json.NewDecoder().Decode() is used, the expired context may not prevent the buffered data from being accessed.

To illustrate this, a test server was created that intentionally delayed the response body. It simulated the partial buffering behavior of the net/http package. When readDoesntFail() was executed with this test server, the expected context deadline exceeded error was indeed triggered.

Conclusion

The behavior observed in the user's code highlights the potential caveats of using json.NewDecoder().Decode() with context deadlines. It is important to be aware that if the response body is large and has been completely buffered, the context deadline may not be enforced as expected.

The above is the detailed content of Does json.NewDecoder().Decode() Respect Context Deadlines When Response Bodies are Buffered?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!