Compare commits

...

2 Commits

Author SHA1 Message Date
Thomas Quinot 6039e04724 Link upstream WEBrick PRs in range-fix comment
ci/woodpecker/push/woodpecker Pipeline was successful Details
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
1 month ago
Thomas Quinot 25fa5f3c2c Fix WEBrick range requests for local video playback
WEBrick's not_modified? treats a Range request's If-Range header like
If-None-Match, replying 304 with no body instead of 206 with the
requested bytes. Browsers rely on this to fetch a video's trailing
moov atom, so jekyll serve was breaking playback for videos recorded
with metadata at the end of the file. Dev-server-only; production is
unaffected since it isn't served by WEBrick.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
1 month ago

@ -0,0 +1,20 @@
# Dev-server-only fix: WEBrick's FileHandler#not_modified? treats a Range
# request's If-Range header the same as If-None-Match, replying 304 (no body)
# instead of 206 with the requested bytes. Browsers rely on ranged requests
# (with If-Range) to fetch a video's trailing moov atom when seeking/loading
# metadata, so this breaks video playback under `jekyll serve`.
# See https://github.com/ruby/webrick/blob/master/lib/webrick/httpservlet/filehandler.rb
#
# Upstream bug, not yet fixed as of writing:
# https://github.com/ruby/webrick/pull/173 (fix if-range returning 304 instead of 206/200)
# https://github.com/ruby/webrick/pull/169 (do not cache range requests)
# Drop this plugin once one of those lands in a released webrick version.
require 'webrick'
module WebrickRangeFix
def not_modified?(req, res, mtime, etag)
req['Range'] ? false : super
end
end
WEBrick::HTTPServlet::DefaultFileHandler.prepend(WebrickRangeFix)
Loading…
Cancel
Save