From 5d1e2f0ada7d63ad539bac7597d27ef2c4de2cdd Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 14 Nov 2015 02:47:21 +0000 Subject: http_parser: handle keepalive_requests internally unicorn 5 dropped support for this, essentially allowing unlimited persistent connections if we used the parser as-is. Since most of our concurrency models cannot handle infinite persistent connections without being vulnerable to DoS, we must support keepalive_requests like nginx does. --- lib/rainbows/http_parser.rb | 15 +++++++++++++++ lib/rainbows/http_server.rb | 4 ++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/rainbows/http_parser.rb b/lib/rainbows/http_parser.rb index ec55fe9..30a67cb 100644 --- a/lib/rainbows/http_parser.rb +++ b/lib/rainbows/http_parser.rb @@ -2,6 +2,21 @@ # :enddoc: # avoid modifying Unicorn::HttpParser class Rainbows::HttpParser < Unicorn::HttpParser + @keepalive_requests = 100 + class << self + attr_accessor :keepalive_requests + end + + def initialize(*args) + @keepalive_requests = self.class.keepalive_requests + super + end + + def next? + return false if (@keepalive_requests -= 1) <= 0 + super + end + def self.quit alias_method :next?, :never! end diff --git a/lib/rainbows/http_server.rb b/lib/rainbows/http_server.rb index 637710d..09f2589 100644 --- a/lib/rainbows/http_server.rb +++ b/lib/rainbows/http_server.rb @@ -92,11 +92,11 @@ class Rainbows::HttpServer < Unicorn::HttpServer end def keepalive_requests=(nr) - Unicorn::HttpRequest.keepalive_requests = nr + Rainbows::HttpParser.keepalive_requests = nr end def keepalive_requests - Unicorn::HttpRequest.keepalive_requests + Rainbows::HttpParser.keepalive_requests end def client_max_header_size=(bytes) -- cgit v1.2.3-24-ge0c7