[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]