diff options
author | Eric Wong <normalperson@yhbt.net> | 2009-03-27 17:26:03 -0700 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2009-03-27 17:26:03 -0700 |
commit | c83b5a903a076fda67c7d062da1ad6ff9337fdd1 (patch) | |
tree | c543d22f6227be5f373274a09a05b3ce237fe869 /lib/unicorn/http_response.rb | |
parent | 9509f414a88281c93f0a1cb28123b8ae7538ee7f (diff) | |
download | unicorn-c83b5a903a076fda67c7d062da1ad6ff9337fdd1.tar.gz |
This reworks error handling throughout the entire stack to be more Ruby-ish. Exceptions are raised instead of forcing the us to check return values. If a client is sending us a bad request, we send a 400. If unicorn or app breaks in an unexpected way, we'll send a 500. Both of these last-resort error responses are sent using IO#write_nonblock to avoid tying Unicorn up longer than necessary and all exceptions raised are ignored. Sending a valid HTTP response back should reduce the chance of us from being marked as down or broken by a load balancer. Previously, some load balancers would mark us as down if we close a socket without sending back a valid response; so make a best effort to send one. If for some reason we cannot write a valid response, we're still susceptible to being marked as down. A successful HttpResponse.write() call will now close the socket immediately (instead of doing it higher up the stack). This ensures the errors will never get written to the socket on a successful response.
Diffstat (limited to 'lib/unicorn/http_response.rb')
-rw-r--r-- | lib/unicorn/http_response.rb | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/lib/unicorn/http_response.rb b/lib/unicorn/http_response.rb index f928baa..98759f1 100644 --- a/lib/unicorn/http_response.rb +++ b/lib/unicorn/http_response.rb @@ -49,6 +49,7 @@ module Unicorn "Connection: close\r\n" \ "#{out.join("\r\n")}\r\n\r\n") body.each { |chunk| socket_write(socket, chunk) } + socket.close # uncorks the socket immediately ensure body.respond_to?(:close) and body.close rescue nil end |