-
Notifications
You must be signed in to change notification settings - Fork 117
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add an idle write timeout #718
Conversation
09ea501
to
c3f5630
Compare
c3f5630
to
e3155a0
Compare
assert(self.idleWriteTimeoutTimer == nil, "Expected there is no timeout timer so far.") | ||
|
||
self.idleWriteTimeoutTimer = self.eventLoop.scheduleTask(in: timeAmount) { | ||
guard self.idleWriteTimeoutTimer != nil else { return } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In HTTP1 we use a timer "ID" but here we are just setting the timer to nil. Is there a reason for these two different approaches?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, this is an inconsistency and should be changed because race conditions can happen with this current approach. It was actually fixed for HTTP1 in #455, but not in HTTP2. I just decided to keep things as they currently are in this PR (without using the timer ID) to avoid mixing multiple changes in a single PR, but I'll send a follow-up that adds a timer and changes these checks.
Motivation
We currently provide an idle read timeout to fail requests that take more than a given amount of time to produce any response data. We were missing its counterpart: to provide a timeout for when no request data is being written either.
This could happen, for example, when uploading large files: if for whatever reason (e.g. back pressure from the server, etc) the client does not write any bytes, and there is no data being sent from the server either, the connection could be idle and unused, but remain open for longer than necessary. With an idle write timeout, we can avoid this.
Modifications
Added a new idle write timeout.
Result
Users can now configure an idle write timeout in addition to an idle read timeout.