mirror of
https://github.com/puma/puma.git
synced 2022-11-09 13:48:40 -05:00
Minimize allocations in response handling
Just another friendly reminder that string constants are frozen so that when they're inserted into a Hash, they're not dup'd and are put directly in, saving allocations.
This commit is contained in:
parent
816daf7977
commit
c87d543b68
2 changed files with 77 additions and 35 deletions
|
@ -121,6 +121,7 @@ module Puma
|
||||||
|
|
||||||
SERVER_PROTOCOL = "SERVER_PROTOCOL".freeze
|
SERVER_PROTOCOL = "SERVER_PROTOCOL".freeze
|
||||||
HTTP_11 = "HTTP/1.1".freeze
|
HTTP_11 = "HTTP/1.1".freeze
|
||||||
|
HTTP_10 = "HTTP/1.0".freeze
|
||||||
|
|
||||||
SERVER_SOFTWARE = "SERVER_SOFTWARE".freeze
|
SERVER_SOFTWARE = "SERVER_SOFTWARE".freeze
|
||||||
GATEWAY_INTERFACE = "GATEWAY_INTERFACE".freeze
|
GATEWAY_INTERFACE = "GATEWAY_INTERFACE".freeze
|
||||||
|
@ -128,5 +129,36 @@ module Puma
|
||||||
|
|
||||||
STOP_COMMAND = "!".freeze
|
STOP_COMMAND = "!".freeze
|
||||||
|
|
||||||
|
RACK_INPUT = "rack.input".freeze
|
||||||
|
RACK_URL_SCHEME = "rack.url_scheme".freeze
|
||||||
|
RACK_AFTER_REPLY = "rack.after_reply".freeze
|
||||||
|
|
||||||
|
HTTP = "http".freeze
|
||||||
|
HTTPS = "https".freeze
|
||||||
|
|
||||||
|
HTTPS_KEY = "HTTPS".freeze
|
||||||
|
|
||||||
|
HTTP_VERSION = "HTTP_VERSION".freeze
|
||||||
|
HTTP_CONNECTION = "HTTP_CONNECTION".freeze
|
||||||
|
|
||||||
|
HTTP_11_200 = "HTTP/1.1 200 OK\r\n".freeze
|
||||||
|
HTTP_10_200 = "HTTP/1.0 200 OK\r\n".freeze
|
||||||
|
|
||||||
|
CLOSE = "close".freeze
|
||||||
|
KEEP_ALIVE = "Keep-Alive".freeze
|
||||||
|
|
||||||
|
CONTENT_LENGTH2 = "Content-Length".freeze
|
||||||
|
CONTENT_LENGTH_S = "Content-Length: ".freeze
|
||||||
|
TRANSFER_ENCODING = "Transfer-Encoding".freeze
|
||||||
|
|
||||||
|
CONNECTION_CLOSE = "Connection: close\r\n".freeze
|
||||||
|
CONNECTION_KEEP_ALIVE = "Connection: Keep-Alive\r\n".freeze
|
||||||
|
|
||||||
|
TRANSFER_ENCODING_CHUNKED = "Transfer-Encoding: chunked\r\n".freeze
|
||||||
|
CLOSE_CHUNKED = "0\r\n\r\n".freeze
|
||||||
|
|
||||||
|
COLON = ": ".freeze
|
||||||
|
|
||||||
|
NEWLINE = "\n".freeze
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -262,25 +262,10 @@ module Puma
|
||||||
body = StringIO.new(EmptyBinary)
|
body = StringIO.new(EmptyBinary)
|
||||||
end
|
end
|
||||||
|
|
||||||
env["rack.input"] = body
|
env[RACK_INPUT] = body
|
||||||
env["rack.url_scheme"] = env["HTTPS"] ? "https" : "http"
|
env[RACK_URL_SCHEME] = env[HTTPS_KEY] ? HTTPS : HTTP
|
||||||
|
|
||||||
allow_chunked = false
|
after_reply = env[RACK_AFTER_REPLY] = []
|
||||||
|
|
||||||
if env['HTTP_VERSION'] == 'HTTP/1.1'
|
|
||||||
allow_chunked = true
|
|
||||||
http_version = "HTTP/1.1 "
|
|
||||||
keep_alive = env["HTTP_CONNECTION"] != "close"
|
|
||||||
include_keepalive_header = false
|
|
||||||
else
|
|
||||||
http_version = "HTTP/1.0 "
|
|
||||||
keep_alive = env["HTTP_CONNECTION"] == "Keep-Alive"
|
|
||||||
include_keepalive_header = keep_alive
|
|
||||||
end
|
|
||||||
|
|
||||||
chunked = false
|
|
||||||
|
|
||||||
after_reply = env['rack.after_reply'] = []
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
begin
|
begin
|
||||||
|
@ -297,26 +282,50 @@ module Puma
|
||||||
|
|
||||||
cork_socket client
|
cork_socket client
|
||||||
|
|
||||||
client.write http_version
|
if env[HTTP_VERSION] == HTTP_11
|
||||||
|
allow_chunked = true
|
||||||
|
keep_alive = env[HTTP_CONNECTION] != CLOSE
|
||||||
|
include_keepalive_header = false
|
||||||
|
|
||||||
|
if status == 200
|
||||||
|
client.write HTTP_11_200
|
||||||
|
else
|
||||||
|
client.write "HTTP/1.1 "
|
||||||
client.write status.to_s
|
client.write status.to_s
|
||||||
client.write " "
|
client.write " "
|
||||||
client.write HTTP_STATUS_CODES[status]
|
client.write HTTP_STATUS_CODES[status]
|
||||||
client.write "\r\n"
|
client.write "\r\n"
|
||||||
|
end
|
||||||
|
else
|
||||||
|
allow_chunked = false
|
||||||
|
keep_alive = env[HTTP_CONNECTION] == KEEP_ALIVE
|
||||||
|
include_keepalive_header = keep_alive
|
||||||
|
|
||||||
colon = ": "
|
if status == 200
|
||||||
line_ending = "\r\n"
|
client.write HTTP_10_200
|
||||||
|
else
|
||||||
|
client.write "HTTP/1.1 "
|
||||||
|
client.write status.to_s
|
||||||
|
client.write " "
|
||||||
|
client.write HTTP_STATUS_CODES[status]
|
||||||
|
client.write "\r\n"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
colon = COLON
|
||||||
|
line_ending = LINE_END
|
||||||
|
|
||||||
headers.each do |k, vs|
|
headers.each do |k, vs|
|
||||||
case k
|
case k
|
||||||
when "Content-Length"
|
when CONTENT_LENGTH2
|
||||||
content_length = vs
|
content_length = vs
|
||||||
next
|
next
|
||||||
when "Transfer-Encoding"
|
when TRANSFER_ENCODING
|
||||||
allow_chunked = false
|
allow_chunked = false
|
||||||
content_length = nil
|
content_length = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
vs.split("\n").each do |v|
|
vs.split(NEWLINE).each do |v|
|
||||||
client.write k
|
client.write k
|
||||||
client.write colon
|
client.write colon
|
||||||
client.write v
|
client.write v
|
||||||
|
@ -325,15 +334,18 @@ module Puma
|
||||||
end
|
end
|
||||||
|
|
||||||
if include_keepalive_header
|
if include_keepalive_header
|
||||||
client.write "Connection: Keep-Alive\r\n"
|
client.write CONNECTION_KEEP_ALIVE
|
||||||
elsif !keep_alive
|
elsif !keep_alive
|
||||||
client.write "Connection: close\r\n"
|
client.write CONNECTION_CLOSE
|
||||||
end
|
end
|
||||||
|
|
||||||
if content_length
|
if content_length
|
||||||
client.write "Content-Length: #{content_length}\r\n"
|
client.write CONTENT_LENGTH_S
|
||||||
|
client.write content_length.to_s
|
||||||
|
client.write line_ending
|
||||||
|
chunked = false
|
||||||
elsif allow_chunked
|
elsif allow_chunked
|
||||||
client.write "Transfer-Encoding: chunked\r\n"
|
client.write TRANSFER_ENCODING_CHUNKED
|
||||||
chunked = true
|
chunked = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -353,9 +365,7 @@ module Puma
|
||||||
end
|
end
|
||||||
|
|
||||||
if chunked
|
if chunked
|
||||||
client.write "0"
|
client.write CLOSE_CHUNKED
|
||||||
client.write line_ending
|
|
||||||
client.write line_ending
|
|
||||||
client.flush
|
client.flush
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue