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 |
||
|---|---|---|
| .. | ||
| -ext- | ||
| base64 | ||
| benchmark | ||
| bigdecimal | ||
| cgi | ||
| coverage | ||
| csv | ||
| date | ||
| dbm | ||
| digest | ||
| drb | ||
| dtrace | ||
| erb | ||
| etc | ||
| excludes | ||
| fiddle | ||
| fileutils | ||
| gdbm | ||
| io | ||
| irb | ||
| json | ||
| lib | ||
| logger | ||
| matrix | ||
| minitest | ||
| misc | ||
| mkmf | ||
| monitor | ||
| net | ||
| nkf | ||
| objspace | ||
| open-uri | ||
| openssl | ||
| optparse | ||
| ostruct | ||
| pathname | ||
| psych | ||
| rdoc | ||
| readline | ||
| resolv | ||
| rexml | ||
| rinda | ||
| ripper | ||
| rss | ||
| ruby | ||
| rubygems | ||
| scanf | ||
| sdbm | ||
| shell | ||
| socket | ||
| stringio | ||
| strscan | ||
| syslog | ||
| testunit | ||
| thread | ||
| uri | ||
| webrick | ||
| win32ole | ||
| xmlrpc | ||
| zlib | ||
| colors | ||
| runner.rb | ||
| test_abbrev.rb | ||
| test_cmath.rb | ||
| test_delegate.rb | ||
| test_find.rb | ||
| test_forwardable.rb | ||
| test_ipaddr.rb | ||
| test_mathn.rb | ||
| test_mutex_m.rb | ||
| test_observer.rb | ||
| test_open3.rb | ||
| test_pp.rb | ||
| test_prettyprint.rb | ||
| test_prime.rb | ||
| test_pstore.rb | ||
| test_pty.rb | ||
| test_rbconfig.rb | ||
| test_securerandom.rb | ||
| test_set.rb | ||
| test_shellwords.rb | ||
| test_singleton.rb | ||
| test_syslog.rb | ||
| test_tempfile.rb | ||
| test_time.rb | ||
| test_timeout.rb | ||
| test_tmpdir.rb | ||
| test_tracer.rb | ||
| test_tsort.rb | ||
| test_unicode_normalize.rb | ||
| test_weakref.rb | ||
| test_win32api.rb | ||