Feature #855


HTTP/1.1 fixes and other enhancements to webrick

Added by candlerb (Brian Candler) about 14 years ago. Updated over 5 years ago.

Target version:


I raised the following issues on ruby-core:

  1. When returning an open IO object (without Content-Length or chunking), Webrick fails to close the HTTP/1.1 connection, and hence the client waits forever for the end of the data.

  2. Webrick makes it very difficult to send a '100 continue' response when a HTTP/1.1 client requests one, and yet the RFC2616 says it must do so.

  3. It would be convenient to be able to stream not just real IO objects, but other objects which duck-type like them (such as an open zip file entry from rubyzip)

  4. It would be convenient to be able to provide a proc object to generate a streamed response:
    proc { |out| out << "data"; out << "more data"; etc }

  5. The default block size of 4K is too small to be efficient when serving large files. This was already fixed for 1.9 in
    (default now 64K and tunable). Please consider this for 1.8, especially since a similar improvement has been backported for Net::HTTP in

The attached file contains small monkey-patches to address these issues. If there is interest these could be rewritten as actual patches against webrick.


webrick-patches.rb (2.69 KB) webrick-patches.rb Monkey patches to webrick candlerb (Brian Candler), 12/11/2008 07:08 PM
Actions #1

Updated by shyouhei (Shyouhei Urabe) about 14 years ago

  • Assignee set to gotoyuzo (GOTOU Yuuzou)



Actions #2

Updated by candlerb (Brian Candler) almost 14 years ago

There is an additional problem in setup_header, which prevents use of send_body_proc to stream bodies to HTTP/1.0 clients where no Content-Length has been set.

   elsif @header['content-length'].nil?
     unless @body.is_a?(IO)  # <<<<< PROBLEM: Proc is not an IO!
       @header['content-length'] = @body ? @body.size : 0

I suggest something like this:

   elsif @header['content-length'].nil?
     if @body.nil?
       @header['content-length'] = 0
     elsif @body.respond_to?(:size)
       @header['content-length'] = @body.size
       @header['connection'] = 'close'


Actions #3

Updated by candlerb (Brian Candler) almost 14 years ago

I have made individual patches for all these issues and posted them onto github. There are three separate branches:

Most of my testing has been on the ruby186 branch, although I have checked that the test suites still pass for ruby18 (with 1.8.7p72) and master (with 1.9.1p0)

The main difference between these branches is that the master branch uses 'bytesize' instead of 'size'

I hope this work will make it easier for people to test the changes, and/or for them to be committed into subversion.


Actions #4

Updated by nahi (Hiroshi Nakamura) over 12 years ago

  • Category set to lib
  • Assignee changed from gotoyuzo (GOTOU Yuuzou) to nahi (Hiroshi Nakamura)



Actions #5

Updated by nahi (Hiroshi Nakamura) over 12 years ago

Sorry for late response.
Applied the patch No. 2 for '100-continue' to ruby_1_9:
Thank you!

I'll give a look to other changes later. For now, No.3 sounds good and No.1 and No.4 could be OK.

Actions #6

Updated by shyouhei (Shyouhei Urabe) over 12 years ago

  • Status changed from Open to Assigned



Actions #7

Updated by nahi (Hiroshi Nakamura) over 11 years ago

  • Project changed from Ruby 1.8 to Ruby master
  • Category changed from lib to lib

Updated by nahi (Hiroshi Nakamura) over 11 years ago

  • Target version set to 2.0.0

r32192 is a fix for No.1. User can set HTTPResponse#chunked = true but it might not be a choice (Some client does not support chunked encoding for example.)

No.3 and No.4 should be discussed in the future...

Updated by mame (Yusuke Endoh) almost 11 years ago

NaHi, are you still willing to discuss about No.3 and 4?
If not, could you please close this?

Yusuke Endoh

Updated by nahi (Hiroshi Nakamura) almost 11 years ago

  • Priority changed from 3 to Normal

Sorry that I kept this open long time.

Yes, the feature request for streaming (No.3 and No.4) is reasonable. I'll re-evaluate the patch before 2.0.0

I keep the assignee to me and raise the priority.

Updated by mame (Yusuke Endoh) about 10 years ago

  • Target version changed from 2.0.0 to 2.6

Updated by mame (Yusuke Endoh) over 5 years ago

  • Assignee changed from nahi (Hiroshi Nakamura) to normalperson (Eric Wong)

Eric Wong,

Could you handle this very old ticket about webrick?

Updated by normalperson (Eric Wong) over 5 years ago


Could you handle this very old ticket about webrick?

Sure; it looks like a lot are already done except 4. Will take
a closer look tomorrow or next week. Thanks for the ping.

Actions #14

Updated by Anonymous over 5 years ago

  • Status changed from Assigned to Closed

Applied in changeset trunk|r60584.

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]


Also available in: Atom PDF