-
Notifications
You must be signed in to change notification settings - Fork 217
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
Stop sending response data if connection is closed #349
Open
janko
wants to merge
1
commit into
postrank-labs:master
Choose a base branch
from
janko:stop-sending-response-data-if-connection-is-closed
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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.
Doesn't
StopIteration
clause already catch the case you're trying to address here?stream_data
is iterating over the body of response and that will raise an error if the body is closed, which will in turn call terminate_request?Can we wire up a spec to highlight where the current logic is not sufficient?
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.
StopIteration
is raised when there are no more chunks. That would be the case only if this example Rack response body:was modified to catch the closed file and stop the iteration:
But I don't write Rack response bodies like that, because I assume that when the web server calls
#close
on the body object, it will not continue iteration anymore.In some cases it will. I thought at first that the fact that
#server_exception
also writes the error response to the socket would be a problem, but when#close
was called the connection should be closed, so that shouldn't happen. But I think the fact that an exception will be logged is not ideal.Also, in my case I'm streaming an S3 object through Goliath, and my Rack response body object doesn't do anything on
#close
, so Goliath will happily continue downloading the S3 object even if there is nowhere to send the data to (e.g. the connection to the client has been closed). That's the case I'm most concerned about, as I think that can allow DoSing.Yeah, I'll try again to come up with something.
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.
@janko-m curious, any particular reason why you don't or can't wrap your stream in
Rack::BodyProxy
? Based on above, it seems like it would give you the behavior you're after — no?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.
If
Rack::BodyProxy#each
would terminate iterating over the (enumerable) body once#close
is called on it, then it would be what I'm after. In other words, if it would behave like this:But from what I can see it doesn't.