* [PATCH] http_parser: handle keepalive_requests internally
@ 2015-11-10 3:55 Eric Wong
0 siblings, 0 replies; only message in thread
From: Eric Wong @ 2015-11-10 3:55 UTC (permalink / raw)
To: spew
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)
--
EW
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2015-11-10 3:55 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-11-10 3:55 [PATCH] http_parser: handle keepalive_requests internally Eric Wong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).