Add support for Range
HTTP Header and 206 partial content
response.
#29
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.
What and Why?
To support
Range
HTTP header and206 partial content
responses.This is most useful for streaming large files like videos without blocking page loads.
Previous behavior
Before this PR, a frontend would make multiple
Range
requests expecting partials but resulting in the entire file being downloaded multiple times, all while blocking page load completion.New behavior
After this PR, the large file gets loaded progressively, as needed by the page, and the
Range
requests gets a206
response until the content is completed.Implementation details
I yanked and adapted the code from
http.ServeContent()
. It would be preferable to usehttp.ServeContent()
directly, butServeContent
expects aReadSeeker
.Might be worth it to create an adapter.
ServeContent
usesReadSeeker
to determine file size and to verify if ranges become out of bounds. However, there's no default code that communicates how many bytes are intended to be read for the current partial content, meaning we'd always have to callobjHandler.NewRangeReader(context.Background(), ra.start, attrs.Size)
which I suspect pulls the full object from the bucket.The ServeContent function I pulled from has it's own error response handling which now usurps your
handleError()
. I left it in, but we can modify it to be consistent.Thanks for the cool project. We're finding it super useful. :)