Fix static file handler for files > 2^31 bytes (#546)

This commit is contained in:
Omar Roth 2019-08-03 11:37:23 -05:00 committed by Serdar Dogruyol
parent 17bf1c7709
commit 18ddc3b4e6
1 changed files with 6 additions and 6 deletions

View File

@ -184,26 +184,26 @@ end
private def multipart(file, env : HTTP::Server::Context) private def multipart(file, env : HTTP::Server::Context)
# See http://httpwg.org/specs/rfc7233.html # See http://httpwg.org/specs/rfc7233.html
fileb = file.size fileb = file.size
startb = endb = 0 startb = endb = 0_i64
if match = env.request.headers["Range"].match /bytes=(\d{1,})-(\d{0,})/ if match = env.request.headers["Range"].match /bytes=(\d{1,})-(\d{0,})/
startb = match[1].to_i { 0 } if match.size >= 2 startb = match[1].to_i64 { 0_i64 } if match.size >= 2
endb = match[2].to_i { 0 } if match.size >= 3 endb = match[2].to_i64 { 0_i64 } if match.size >= 3
end end
endb = fileb - 1 if endb == 0 endb = fileb - 1 if endb == 0
if startb < endb < fileb if startb < endb < fileb
content_length = 1 + endb - startb content_length = 1_i64 + endb - startb
env.response.status_code = 206 env.response.status_code = 206
env.response.content_length = content_length env.response.content_length = content_length
env.response.headers["Accept-Ranges"] = "bytes" env.response.headers["Accept-Ranges"] = "bytes"
env.response.headers["Content-Range"] = "bytes #{startb}-#{endb}/#{fileb}" # MUST env.response.headers["Content-Range"] = "bytes #{startb}-#{endb}/#{fileb}" # MUST
if startb > 1024 if startb > 1024
skipped = 0 skipped = 0_i64
# file.skip only accepts values less or equal to 1024 (buffer size, undocumented) # file.skip only accepts values less or equal to 1024 (buffer size, undocumented)
until (increase_skipped = skipped + 1024) > startb until (increase_skipped = skipped + 1024_i64) > startb
file.skip(1024) file.skip(1024)
skipped = increase_skipped skipped = increase_skipped
end end