diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/webrick/httpresponse.rb | 12 | ||||
-rw-r--r-- | lib/webrick/httpservlet/filehandler.rb | 9 |
2 files changed, 10 insertions, 11 deletions
diff --git a/lib/webrick/httpresponse.rb b/lib/webrick/httpresponse.rb index 82c53e60c7..5b71facab6 100644 --- a/lib/webrick/httpresponse.rb +++ b/lib/webrick/httpresponse.rb @@ -410,9 +410,15 @@ module WEBrick buf.clear socket.write("0#{CRLF}#{CRLF}") else - size = @header['content-length'] - size = size.to_i if size - @sent_size = IO.copy_stream(@body, socket, size) + if %r{\Abytes (\d+)-(\d+)/\d+\z} =~ @header['content-range'] + offset = $1.to_i + size = $2.to_i - offset + 1 + else + offset = nil + size = @header['content-length'] + size = size.to_i if size + end + @sent_size = IO.copy_stream(@body, socket, size, offset) end ensure @body.close diff --git a/lib/webrick/httpservlet/filehandler.rb b/lib/webrick/httpservlet/filehandler.rb index 2c02d0ffe7..c910044742 100644 --- a/lib/webrick/httpservlet/filehandler.rb +++ b/lib/webrick/httpservlet/filehandler.rb @@ -116,17 +116,10 @@ module WEBrick elsif range = ranges[0] first, last = prepare_range(range, filesize) raise HTTPStatus::RequestRangeNotSatisfiable if first < 0 - if last == filesize - 1 - content = io.dup - content.pos = first - else - io.pos = first - content = io.read(last-first+1) - end res['content-type'] = mtype res['content-range'] = "bytes #{first}-#{last}/#{filesize}" res['content-length'] = last - first + 1 - res.body = content + res.body = io.dup else raise HTTPStatus::BadRequest end |