mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
webrick: support Proc objects as body responses * lib/webrick/httpresponse.rb (send_body): call send_body_proc (send_body_proc): new method (class ChunkedWrapper): new class * test/webrick/test_httpresponse.rb (test_send_body_proc): new test (test_send_body_proc_chunked): ditto [Feature #855] webrick: favor .write over << method This will make the next change to use IO.copy_stream easier-to-read. When we can drop Ruby 2.4 support in a few years, this will allow us to use writev(2) with multiple arguments for headers and chunked responses. * lib/webrick/cgi.rb (write): new wrapper method lib/webrick/httpresponse.rb: (send_header): use socket.write (send_body_io): ditto (send_body_string): ditto (send_body_proc): ditto (_write_data): ditto (ChunkedWrapper#write): ditto (_send_file): ditto ------------------------------------------------------------------------ r62954 | normal | 2018-03-28 17:05:52 +0900 (水, 28 3 2018) | 14 lines webrick/httpresponse: IO.copy_stream for regular files Remove the redundant _send_file method since its functionality is unnecessary with IO.copy_stream. IO.copy_stream also allows the use of sendfile under some OSes to speed up copies to non-TLS sockets. Testing with "curl >/dev/null" and "ruby -run -e httpd" to read a 1G file over Linux loopback reveals a reduction from around ~0.770 to ~0.490 seconds on the client side. * lib/webrick/httpresponse.rb (send_body_io): use IO.copy_stream (_send_file): remove [Feature #14237] ------------------------------------------------------------------------ r62955 | normal | 2018-03-28 17:05:57 +0900 (水, 28 3 2018) | 10 lines 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 ------------------------------------------------------------------------ r62956 | normal | 2018-03-28 17:06:02 +0900 (水, 28 3 2018) | 7 lines test/webrick/test_filehandler.rb: stricter multipart range test We need to ensure we generate compatibile output in the face of future changes * test/webrick/test_filehandler.rb (test_make_partial_content): check response body ------------------------------------------------------------------------ r62957 | normal | 2018-03-28 17:06:08 +0900 (水, 28 3 2018) | 8 lines webrick: quiet warning for multi-part ranges Content-Length is ignored by WEBrick::HTTPResponse even if we calculate it, so instead we chunk responses to HTTP/1.1 clients and terminate HTTP/1.0 connections. * lib/webrick/httpservlet/filehandler.rb (make_partial_content): quiet warning ------------------------------------------------------------------------ r62958 | normal | 2018-03-28 17:06:13 +0900 (水, 28 3 2018) | 7 lines webrick/httpresponse: make ChunkedWrapper copy_stream-compatible The .write method needs to return the number of bytes written to avoid confusing IO.copy_stream. * lib/webrick/httpresponse.rb (ChunkedWrapper#write): return bytes written (ChunkedWrapper#<<): return self ------------------------------------------------------------------------ r62959 | normal | 2018-03-28 17:06:18 +0900 (水, 28 3 2018) | 9 lines webrick: use IO.copy_stream for multipart response Use the new Proc response body feature to generate a multipart range response dynamically. We use a flat array to minimize object overhead as much as possible; as many ranges may fit into an HTTP request header. * lib/webrick/httpservlet/filehandler.rb (multipart_body): new method (make_partial_content): use multipart_body get rid of test error/failure on Windows introduced at r62955 * lib/webrick/httpresponse.rb (send_body_io): use seek if NotImplementedError is raised in IO.copy_stream with offset. * lib/webrick/httpservlet/filehandler.rb (multipart_body): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_3@63014 b2dd03c8-39d4-4d8f-98ff-823fe69b080e |
||
|---|---|---|
| .. | ||
| cgi | ||
| drb | ||
| irb | ||
| matrix | ||
| net | ||
| optparse | ||
| racc | ||
| rbconfig | ||
| rdoc | ||
| rexml | ||
| rinda | ||
| rss | ||
| rubygems | ||
| shell | ||
| unicode_normalize | ||
| uri | ||
| webrick | ||
| xmlrpc | ||
| yaml | ||
| abbrev.rb | ||
| base64.rb | ||
| benchmark.rb | ||
| cgi.rb | ||
| cmath.rb | ||
| csv.rb | ||
| debug.rb | ||
| delegate.rb | ||
| drb.rb | ||
| e2mmap.rb | ||
| English.rb | ||
| erb.rb | ||
| fileutils.rb | ||
| find.rb | ||
| forwardable.rb | ||
| getoptlong.rb | ||
| ipaddr.rb | ||
| irb.rb | ||
| logger.rb | ||
| mathn.rb | ||
| matrix.rb | ||
| mkmf.rb | ||
| monitor.rb | ||
| mutex_m.rb | ||
| observer.rb | ||
| open-uri.rb | ||
| open3.rb | ||
| optionparser.rb | ||
| optparse.rb | ||
| ostruct.rb | ||
| pp.rb | ||
| prettyprint.rb | ||
| prime.rb | ||
| profile.rb | ||
| profiler.rb | ||
| pstore.rb | ||
| rdoc.rb | ||
| resolv-replace.rb | ||
| resolv.rb | ||
| rss.rb | ||
| rubygems.rb | ||
| scanf.rb | ||
| securerandom.rb | ||
| set.rb | ||
| shell.rb | ||
| shellwords.rb | ||
| singleton.rb | ||
| sync.rb | ||
| tempfile.rb | ||
| thwait.rb | ||
| time.rb | ||
| timeout.rb | ||
| tmpdir.rb | ||
| tracer.rb | ||
| tsort.rb | ||
| ubygems.rb | ||
| un.rb | ||
| unicode_normalize.rb | ||
| uri.rb | ||
| weakref.rb | ||
| webrick.rb | ||
| xmlrpc.rb | ||
| yaml.rb | ||