This commit is contained in:
@@ -0,0 +1,155 @@
|
||||
require 'em_test_helper'
|
||||
|
||||
class TestHeaderAndContentProtocol < Test::Unit::TestCase
|
||||
|
||||
class SimpleTest < EM::P::HeaderAndContentProtocol
|
||||
attr_reader :first_header, :my_headers, :request
|
||||
|
||||
def receive_first_header_line hdr
|
||||
@first_header ||= []
|
||||
@first_header << hdr
|
||||
end
|
||||
def receive_headers hdrs
|
||||
@my_headers ||= []
|
||||
@my_headers << hdrs
|
||||
end
|
||||
def receive_request hdrs, content
|
||||
@request ||= []
|
||||
@request << [hdrs, content]
|
||||
end
|
||||
end
|
||||
|
||||
class StopOnUnbind < EM::Connection
|
||||
def unbind
|
||||
EM.add_timer(0.01) { EM.stop }
|
||||
end
|
||||
end
|
||||
|
||||
def setup
|
||||
@port = next_port
|
||||
end
|
||||
|
||||
def test_no_content
|
||||
the_connection = nil
|
||||
EM.run {
|
||||
EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
|
||||
the_connection = conn
|
||||
end
|
||||
setup_timeout
|
||||
|
||||
EM.connect "127.0.0.1", @port, StopOnUnbind do |c|
|
||||
c.send_data [ "aaa\n", "bbb\r\n", "ccc\n", "\n" ].join
|
||||
c.close_connection_after_writing
|
||||
end
|
||||
}
|
||||
assert_equal( ["aaa"], the_connection.first_header )
|
||||
assert_equal( [%w(aaa bbb ccc)], the_connection.my_headers )
|
||||
assert_equal( [[%w(aaa bbb ccc), ""]], the_connection.request )
|
||||
end
|
||||
|
||||
def test_content
|
||||
the_connection = nil
|
||||
content = "A" * 50
|
||||
headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
|
||||
EM.run {
|
||||
EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
|
||||
the_connection = conn
|
||||
end
|
||||
setup_timeout
|
||||
|
||||
EM.connect "127.0.0.1", @port, StopOnUnbind do |c|
|
||||
headers.each { |h| c.send_data "#{h}\r\n" }
|
||||
c.send_data "\n"
|
||||
c.send_data content
|
||||
c.close_connection_after_writing
|
||||
end
|
||||
}
|
||||
assert_equal( ["aaa"], the_connection.first_header )
|
||||
assert_equal( [headers], the_connection.my_headers )
|
||||
assert_equal( [[headers, content]], the_connection.request )
|
||||
end
|
||||
|
||||
def test_several_requests
|
||||
the_connection = nil
|
||||
content = "A" * 50
|
||||
headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
|
||||
EM.run {
|
||||
EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
|
||||
the_connection = conn
|
||||
end
|
||||
setup_timeout
|
||||
|
||||
EM.connect( "127.0.0.1", @port, StopOnUnbind ) do |c|
|
||||
5.times do
|
||||
headers.each { |h| c.send_data "#{h}\r\n" }
|
||||
c.send_data "\n"
|
||||
c.send_data content
|
||||
end
|
||||
c.close_connection_after_writing
|
||||
end
|
||||
}
|
||||
assert_equal( ["aaa"] * 5, the_connection.first_header )
|
||||
assert_equal( [headers] * 5, the_connection.my_headers )
|
||||
assert_equal( [[headers, content]] * 5, the_connection.request )
|
||||
end
|
||||
|
||||
|
||||
# def x_test_multiple_content_length_headers
|
||||
# # This is supposed to throw a RuntimeError but it throws a C++ exception instead.
|
||||
# the_connection = nil
|
||||
# content = "A" * 50
|
||||
# headers = ["aaa", "bbb", ["Content-length: #{content.length}"]*2, "ccc"].flatten
|
||||
# EM.run {
|
||||
# EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
|
||||
# the_connection = conn
|
||||
# end
|
||||
# EM.add_timer(4) {raise "test timed out"}
|
||||
# test_proc = proc {
|
||||
# t = TCPSocket.new "127.0.0.1", @port
|
||||
# headers.each {|h| t.write "#{h}\r\n" }
|
||||
# t.write "\n"
|
||||
# t.write content
|
||||
# t.close
|
||||
# }
|
||||
# EM.defer test_proc, proc {
|
||||
# EM.stop
|
||||
# }
|
||||
# }
|
||||
# end
|
||||
|
||||
def test_interpret_headers
|
||||
the_connection = nil
|
||||
content = "A" * 50
|
||||
headers = [
|
||||
"GET / HTTP/1.0",
|
||||
"Accept: aaa",
|
||||
"User-Agent: bbb",
|
||||
"Host: ccc",
|
||||
"x-tempest-header:ddd"
|
||||
]
|
||||
|
||||
EM.run {
|
||||
EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
|
||||
the_connection = conn
|
||||
end
|
||||
setup_timeout
|
||||
|
||||
EM.connect( "127.0.0.1", @port, StopOnUnbind ) do |c|
|
||||
headers.each { |h| c.send_data "#{h}\r\n" }
|
||||
c.send_data "\n"
|
||||
c.send_data content
|
||||
c.close_connection_after_writing
|
||||
end
|
||||
}
|
||||
|
||||
hsh = the_connection.headers_2_hash( the_connection.my_headers.shift )
|
||||
expect = {
|
||||
:accept => "aaa",
|
||||
:user_agent => "bbb",
|
||||
:host => "ccc",
|
||||
:x_tempest_header => "ddd"
|
||||
}
|
||||
assert_equal(expect, hsh)
|
||||
end
|
||||
|
||||
end
|
||||
Reference in New Issue
Block a user