gateway: ability to set response write timeout #679
Labels
dif/easy
Someone with a little familiarity can pick up
effort/hours
Estimated to take one or several hours
help wanted
Seeking public contribution on this issue
P2
Medium: Good to have, but can wait until someone steps up
topic/gateway
Issues related to HTTP Gateway
Problem
At Shipyard we've run some A/B tests at public gateway and lowering nginx timeout from 5m to 30s.
This produced better UX and also raised the number of 200s while lowering 504s.
Right now, the
boxo/gateway
library does not have any timeout, aside from this failsafe 1h one, so we set timeout at .nginx is sitting in front of rainbow.This is extra step that most of people running gateways does not do, thus wasting resources while looking for content that is not provided correctly to certain degree (nginx default timeout is 60s, while it could be lowered).
What is really unfortunate is that IPFS Desktop users hit gateway directly, and they never hit any timeout, unless it is their user agent (browser).
Proposed feature
We should introduce feature similar to nginx's
proxy_read_timeout
directly in theboxo/gateway
library, make it configurable, but also set it to some implicit default (e.g. 30s).It should not depend on any internal gateway logic, but solely count the time between two successful writes from server to the client.
This way everyone using boxo will save resources, and Desktop users will get meaningful error page sooner, and we will not regress.
Implementation ideas
Details tbd, but broad strokes idea for the
boxo/gateway
library will be to wrap existing handler in a generic response writer timeout handler:WithResponseWriteTimeout
middleware creates a timeoutResponseWriter and starts a timer.ResponseWriter
and tracks the last successful write.Configuration-wise,
Config
struct would get time.Duration field similar to block timeout in backend here, and NewHandler(config, backend) would set implicit default if not provided in config.The text was updated successfully, but these errors were encountered: