about summary refs log tree commit homepage
path: root/lib/unicorn/http_response.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/unicorn/http_response.rb')
-rw-r--r--lib/unicorn/http_response.rb28
1 files changed, 10 insertions, 18 deletions
diff --git a/lib/unicorn/http_response.rb b/lib/unicorn/http_response.rb
index f79e856..15df3f6 100644
--- a/lib/unicorn/http_response.rb
+++ b/lib/unicorn/http_response.rb
@@ -21,6 +21,12 @@ module Unicorn
 
   class HttpResponse
 
+    # Every standard HTTP code mapped to the appropriate message.
+    CODES = Rack::Utils::HTTP_STATUS_CODES.inject({}) { |hash,(code,msg)|
+      hash[code] = "#{code} #{msg}"
+      hash
+    }
+
     # Rack does not set/require a Date: header.  We always override the
     # Connection: and Date: headers no matter what (if anything) our
     # Rack application sent us.
@@ -31,7 +37,7 @@ module Unicorn
     # writes the rack_response to socket as an HTTP response
     def self.write(socket, rack_response)
       status, headers, body = rack_response
-      status = HTTP_STATUS_CODES[status.to_i]
+      status = CODES[status.to_i]
       OUT.clear
 
       # Don't bother enforcing duplicate supression, it's a Hash most of
@@ -49,30 +55,16 @@ module Unicorn
       # so don't worry or care about them.
       # Date is required by HTTP/1.1 as long as our clock can be trusted.
       # Some broken clients require a "Status" header so we accomodate them
-      socket_write(socket,
-                   "HTTP/1.1 #{status}\r\n" \
+      socket.write("HTTP/1.1 #{status}\r\n" \
                    "Date: #{Time.now.httpdate}\r\n" \
                    "Status: #{status}\r\n" \
                    "Connection: close\r\n" \
                    "#{OUT.join(EMPTY)}\r\n")
-      body.each { |chunk| socket_write(socket, chunk) }
-      socket.close # uncorks the socket immediately
+      body.each { |chunk| socket.write(chunk) }
+      socket.close # flushes and uncorks the socket immediately
       ensure
         body.respond_to?(:close) and body.close rescue nil
     end
 
-    private
-
-      # write(2) can return short on slow devices like sockets as well
-      # as fail with EINTR if a signal was caught.
-      def self.socket_write(socket, buffer)
-        begin
-          written = socket.syswrite(buffer)
-          return written if written == buffer.length
-          buffer = buffer[written..-1]
-        rescue Errno::EINTR
-        end while true
-      end
-
   end
 end