From 0719c5a7ac09078c810507244a86ba44623757c4 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 17 Oct 2009 22:42:56 -0700 Subject: rev: avoid stack overflow through pipelining Handling HTTP pipelining through recursion is not good since several hundred kilobytes worth of GET/HEAD requests can be a LOT of GET/HEAD requests... --- lib/rainbows/rev.rb | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) (limited to 'lib/rainbows/rev.rb') diff --git a/lib/rainbows/rev.rb b/lib/rainbows/rev.rb index cb0dd31..19e721a 100644 --- a/lib/rainbows/rev.rb +++ b/lib/rainbows/rev.rb @@ -66,21 +66,25 @@ module Rainbows end def app_call - @input.rewind - @env[RACK_INPUT] = @input - @env[REMOTE_ADDR] = @remote_addr - response = G.app.call(@env.update(RACK_DEFAULTS)) - alive = @hp.keepalive? && G.alive - out = [ alive ? CONN_ALIVE : CONN_CLOSE ] if @hp.headers? - HttpResponse.write(self, response, out) - if alive - @env.clear - @hp.reset - @state = :headers - on_read("") # in case next request was fully-buffered - else - @state = :close - end + begin + (@env[RACK_INPUT] = @input).rewind + alive = @hp.keepalive? + @env[REMOTE_ADDR] = @remote_addr + response = G.app.call(@env.update(RACK_DEFAULTS)) + alive &&= G.alive + out = [ alive ? CONN_ALIVE : CONN_CLOSE ] if @hp.headers? + HttpResponse.write(self, response, out) + if alive + @env.clear + @hp.reset + @state = :headers + # keepalive requests are always body-less, so @input is unchanged + @hp.headers(@env, @buf) and next + else + @state = :close + end + return + end while true end def on_write_complete -- cgit v1.2.3-24-ge0c7