Does it make sense to additionally use http.TimeoutHandler if I already set the server's ReadTimeout and WriteTimeout? It seems as if this scenario is mutually exclusive?
These two deal with different aspects of http request/response lifecycle.
http.TimeoutHandler
is used to limit execution time of the http.Handler. it will return 503
status code to the client, if http.Handler
doesn't finish in stipulated time.
While, ReadTimeout
and WriteTimeout
deals with network I/O timeout, i.e time required to read/write request/response body to your client respectively.
So, http.TimeoutHandler
handles the case where your handler (code block that handles http request) need to be complete in set amount of time, by wrapping your original handler. while http.WriteTimeout
or http.ReadTimeout
is used when you dont want to wait for network read/write of request/response indefinitely.
This blog article does a good job of explaining, but essentially they fulfil slightly different roles, as demonstrated here:
Link to blog article
You've not included what your usecase is, but hopefully this is enough information to be able to make a decision.
If you are going to expose your app naked (directly) no HAproxy/Nginx in front, changing the defaults may help, for example (fine-tune them based on your requirements):
// configure server
srv := &http.Server{
Addr: ":8080",
Handler: router,
ReadTimeout: 5 * time.Second,
WriteTimeout: 7 * time.Second,
MaxHeaderBytes: 1 << 20,
}
log.Fatal(srv.ListenAndServe())
Here is a very nice article explaining more about the topic: https://blog.cloudflare.com/the-complete-guide-to-golang-net-http-timeouts/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With