ruby-changes:50771
From: normal <ko1@a...>
Date: Wed, 28 Mar 2018 17:06:02 +0900 (JST)
Subject: [ruby-changes:50771] normal:r62955 (trunk): webrick: use IO.copy_stream for single range response
normal 2018-03-28 17:05:57 +0900 (Wed, 28 Mar 2018) New Revision: 62955 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=62955 Log: webrick: use IO.copy_stream for single range response This is also compatible with range responses generated by Rack::File (tested with rack 2.0.3). * lib/webrick/httpresponse.rb (send_body_io): use Content-Range * lib/webrick/httpservlet/filehandler.rb (make_partial_content): use File object for the single range case * test/webrick/test_filehandler.rb (get_res_body): use send_body to test result Modified files: trunk/lib/webrick/httpresponse.rb trunk/lib/webrick/httpservlet/filehandler.rb trunk/test/webrick/test_filehandler.rb Index: test/webrick/test_filehandler.rb =================================================================== --- test/webrick/test_filehandler.rb (revision 62954) +++ test/webrick/test_filehandler.rb (revision 62955) @@ -20,16 +20,10 @@ class WEBrick::TestFileHandler < Test::U https://github.com/ruby/ruby/blob/trunk/test/webrick/test_filehandler.rb#L20 end def get_res_body(res) - body = res.body - if defined? body.read - begin - body.read - ensure - body.close - end - else - body - end + sio = StringIO.new + sio.binmode + res.send_body(sio) + sio.string end def make_range_request(range_spec) Index: lib/webrick/httpservlet/filehandler.rb =================================================================== --- lib/webrick/httpservlet/filehandler.rb (revision 62954) +++ lib/webrick/httpservlet/filehandler.rb (revision 62955) @@ -116,17 +116,10 @@ module WEBrick https://github.com/ruby/ruby/blob/trunk/lib/webrick/httpservlet/filehandler.rb#L116 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 Index: lib/webrick/httpresponse.rb =================================================================== --- lib/webrick/httpresponse.rb (revision 62954) +++ lib/webrick/httpresponse.rb (revision 62955) @@ -410,9 +410,15 @@ module WEBrick https://github.com/ruby/ruby/blob/trunk/lib/webrick/httpresponse.rb#L410 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 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/