Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

file 99 lines (84 sloc) 2.831 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
# -*- encoding: binary -*-

# Copyright (c) 2005 Zed A. Shaw
# You can redistribute it and/or modify it under the same terms as Ruby 1.8 or
# the GPLv3
#
# Additional work donated by contributors. See http://mongrel.rubyforge.org/attributions.html
# for more information.

require 'test/test_helper'
require 'time'

include Unicorn

class ResponseTest < Test::Unit::TestCase
  include Unicorn::HttpResponse

  def test_httpdate
    before = Time.now.to_i - 1
    str = httpdate
    assert_kind_of(String, str)
    middle = Time.parse(str).to_i
    after = Time.now.to_i
    assert before <= middle
    assert middle <= after
  end

  def test_response_headers
    out = StringIO.new
    http_response_write(out, 200, {"X-Whatever" => "stuff"}, ["cool"])
    assert ! out.closed?

    assert out.length > 0, "output didn't have data"
  end

  def test_response_string_status
    out = StringIO.new
    http_response_write(out,'200', {}, [])
    assert ! out.closed?
    assert out.length > 0, "output didn't have data"
    assert_equal 1, out.string.split(/\r\n/).grep(/^Status: 200 OK/).size
  end

  def test_response_200
    io = StringIO.new
    http_response_write(io, 200, {}, [])
    assert ! io.closed?
    assert io.length > 0, "output didn't have data"
  end

  def test_response_with_default_reason
    code = 400
    io = StringIO.new
    http_response_write(io, code, {}, [])
    assert ! io.closed?
    lines = io.string.split(/\r\n/)
    assert_match(/.* Bad Request$/, lines.first,
                 "wrong default reason phrase")
  end

  def test_rack_multivalue_headers
    out = StringIO.new
    http_response_write(out,200, {"X-Whatever" => "stuff\nbleh"}, [])
    assert ! out.closed?
    assert_match(/^X-Whatever: stuff\r\nX-Whatever: bleh\r\n/, out.string)
  end

  # Even though Rack explicitly forbids "Status" in the header hash,
  # some broken clients still rely on it
  def test_status_header_added
    out = StringIO.new
    http_response_write(out,200, {"X-Whatever" => "stuff"}, [])
    assert ! out.closed?
    assert_equal 1, out.string.split(/\r\n/).grep(/^Status: 200 OK/i).size
  end

  def test_body_closed
    expect_body = %w(1 2 3 4).join("\n")
    body = StringIO.new(expect_body)
    body.rewind
    out = StringIO.new
    http_response_write(out,200, {}, body)
    assert ! out.closed?
    assert body.closed?
    assert_match(expect_body, out.string.split(/\r\n/).last)
  end

  def test_unknown_status_pass_through
    out = StringIO.new
    http_response_write(out,"666 I AM THE BEAST", {}, [] )
    assert ! out.closed?
    headers = out.string.split(/\r\n\r\n/).first.split(/\r\n/)
    assert %r{\AHTTP/\d\.\d 666 I AM THE BEAST\z}.match(headers[0])
    status = headers.grep(/\AStatus:/i).first
    assert status
    assert_equal "Status: 666 I AM THE BEAST", status
  end

end
Something went wrong with that request. Please try again.