Enumerate collection response :body
s via reduce
.
#115
Merged
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.
In Clojure 1.5+, the
CollReduce
protocol provides a more flexible definition of a "collection" thanISeq
. In particular in the context of generating streaming chunked-encoded HTTP responses,CollReduce
implementations may have lexically-scopedfinally
-style resource clean-up code.Modiying the ring servlet adapter to use
CollReduce
instead ofISeq
when available, then process the body viareduce
instead ofdoseq
should provide these benefits in an entirely backwards-compatible fashion.This PR somewhat orthogonally fixes what I believe to be a bug in the current support for
ISeq
bodies. ApparentlyPrintWriter
instances never throw exceptions after construction, so e.g. a client closing a connection before completely recieving a chunked-encoded response would leave thedoseq
continuing to iterate until it had exhausted the body seq. The.checkError
method acts a.flush
, but also reports if an error has occurred, allowing the adapter to throw an exception.