mirror of
https://github.com/puma/puma.git
synced 2022-11-09 13:48:40 -05:00
Ignore the body on a HEAD request. Fixes #278
This commit is contained in:
parent
d996daa15a
commit
831f09d5d9
2 changed files with 47 additions and 3 deletions
|
@ -354,6 +354,8 @@ module Puma
|
||||||
|
|
||||||
body = req.body
|
body = req.body
|
||||||
|
|
||||||
|
head = env[REQUEST_METHOD] == HEAD
|
||||||
|
|
||||||
env[RACK_INPUT] = body
|
env[RACK_INPUT] = body
|
||||||
env[RACK_URL_SCHEME] = env[HTTPS_KEY] ? HTTPS : HTTP
|
env[RACK_URL_SCHEME] = env[HTTPS_KEY] ? HTTPS : HTTP
|
||||||
|
|
||||||
|
@ -384,7 +386,7 @@ module Puma
|
||||||
end
|
end
|
||||||
|
|
||||||
content_length = nil
|
content_length = nil
|
||||||
no_body = false
|
no_body = head
|
||||||
|
|
||||||
if res_body.kind_of? Array and res_body.size == 1
|
if res_body.kind_of? Array and res_body.size == 1
|
||||||
content_length = res_body[0].bytesize
|
content_length = res_body[0].bytesize
|
||||||
|
@ -410,7 +412,7 @@ module Puma
|
||||||
lines.append "HTTP/1.1 ", status.to_s, " ",
|
lines.append "HTTP/1.1 ", status.to_s, " ",
|
||||||
HTTP_STATUS_CODES[status], line_ending
|
HTTP_STATUS_CODES[status], line_ending
|
||||||
|
|
||||||
no_body = status < 200 || STATUS_WITH_NO_ENTITY_BODY[status]
|
no_body ||= status < 200 || STATUS_WITH_NO_ENTITY_BODY[status]
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
allow_chunked = false
|
allow_chunked = false
|
||||||
|
@ -425,7 +427,7 @@ module Puma
|
||||||
lines.append "HTTP/1.0 ", status.to_s, " ",
|
lines.append "HTTP/1.0 ", status.to_s, " ",
|
||||||
HTTP_STATUS_CODES[status], line_ending
|
HTTP_STATUS_CODES[status], line_ending
|
||||||
|
|
||||||
no_body = status < 200 || STATUS_WITH_NO_ENTITY_BODY[status]
|
no_body ||= status < 200 || STATUS_WITH_NO_ENTITY_BODY[status]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -162,4 +162,46 @@ class TestPumaServer < Test::Unit::TestCase
|
||||||
|
|
||||||
assert_equal "80", res.body
|
assert_equal "80", res.body
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_HEAD_has_no_body
|
||||||
|
@server.app = proc { |env| [200, {"Foo" => "Bar"}, ["hello"]] }
|
||||||
|
|
||||||
|
@server.add_tcp_listener @host, @port
|
||||||
|
@server.run
|
||||||
|
|
||||||
|
sock = TCPSocket.new @host, @port
|
||||||
|
sock << "HEAD / HTTP/1.0\r\n\r\n"
|
||||||
|
|
||||||
|
data = sock.read
|
||||||
|
|
||||||
|
assert_equal "HTTP/1.0 200 OK\r\nFoo: Bar\r\n\r\n", data
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_GET_with_empty_body_has_sane_chunking
|
||||||
|
@server.app = proc { |env| [200, {}, [""]] }
|
||||||
|
|
||||||
|
@server.add_tcp_listener @host, @port
|
||||||
|
@server.run
|
||||||
|
|
||||||
|
sock = TCPSocket.new @host, @port
|
||||||
|
sock << "HEAD / HTTP/1.0\r\n\r\n"
|
||||||
|
|
||||||
|
data = sock.read
|
||||||
|
|
||||||
|
assert_equal "HTTP/1.0 200 OK\r\n\r\n", data
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_GET_with_no_body_has_sane_chunking
|
||||||
|
@server.app = proc { |env| [200, {}, [""]] }
|
||||||
|
|
||||||
|
@server.add_tcp_listener @host, @port
|
||||||
|
@server.run
|
||||||
|
|
||||||
|
sock = TCPSocket.new @host, @port
|
||||||
|
sock << "HEAD / HTTP/1.0\r\n\r\n"
|
||||||
|
|
||||||
|
data = sock.read
|
||||||
|
|
||||||
|
assert_equal "HTTP/1.0 200 OK\r\n\r\n", data
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue