diff --git a/lib/mongrel.rb b/lib/mongrel.rb index 5ed1e660..3569e071 100644 --- a/lib/mongrel.rb +++ b/lib/mongrel.rb @@ -406,6 +406,7 @@ module Mongrel @socket = socket @body = StringIO.new @status = 404 + @reason = HTTP_STATUS_CODES[@status] @header = HeaderOut.new(StringIO.new) @header[Const::DATE] = Time.now.httpdate @body_sent = false @@ -421,8 +422,9 @@ module Mongrel # by simple passing "finalize=true" to the start method. By default # all handlers run and then mongrel finalizes the request when they're # all done. - def start(status=200, finalize=false) + def start(status=200, finalize=false, reason=HTTP_STATUS_CODES[status]) @status = status.to_i + @reason = reason yield @header, @body finished if finalize end @@ -445,7 +447,7 @@ module Mongrel def send_status(content_length=@body.length) if not @status_sent @header['Content-Length'] = content_length if content_length and @status != 304 - write(Const::STATUS_FORMAT % [@status, HTTP_STATUS_CODES[@status]]) + write(Const::STATUS_FORMAT % [@status, @reason]) @status_sent = true end end diff --git a/test/test_response.rb b/test/test_response.rb index 584b28fe..90953b14 100644 --- a/test/test_response.rb +++ b/test/test_response.rb @@ -102,5 +102,28 @@ class ResponseTest < Test::Unit::TestCase assert io.length > 0, "output didn't have data" assert io.read[-contents.length..-1] == contents, "output doesn't end with file payload" end + + def test_response_with_custom_reason + reason = "You made a bad request" + io = StringIO.new + resp = HttpResponse.new(io) + resp.start(400, false, reason) { |head,out| } + resp.finished + + io.rewind + assert_match(/.* #{reason}$/, io.readline.chomp, "wrong custom reason phrase") + end + + def test_response_with_default_reason + code = 400 + io = StringIO.new + resp = HttpResponse.new(io) + resp.start(code) { |head,out| } + resp.finished + + io.rewind + assert_match(/.* #{HTTP_STATUS_CODES[code]}$/, io.readline.chomp, "wrong default reason phrase") + end + end