test/test_http11.rb in mongrel-0.3.12 vs test/test_http11.rb in mongrel-0.3.12.1
- old
+ new
@@ -1,9 +1,10 @@
require 'test/unit'
require 'http11'
require 'mongrel'
require 'benchmark'
+require 'digest/sha1'
include Mongrel
class HttpParserTest < Test::Unit::TestCase
@@ -36,19 +37,87 @@
assert error, "failed to throw exception"
assert !parser.finished?, "Parser shouldn't be finished"
assert parser.error?, "Parser SHOULD have error"
end
- def test_query_parse
- puts HttpRequest.query_parse("zed=1&frank=2").inspect
- puts HttpRequest.query_parse("zed=1&zed=2&zed=3&frank=11;zed=45").inspect
+ # lame random garbage maker
+ def rand_data(min, max, readable=true)
+ count = min + ((rand(max)+1) *10).to_i
+ res = count.to_s + "/"
+
+ if readable
+ res << Digest::SHA1.hexdigest(rand(count * 1000).to_s) * (count / 40)
+ else
+ res << Digest::SHA1.digest(rand(count * 1000).to_s) * (count / 20)
+ end
- puts Benchmark.measure {
- 10000.times do |i|
- g = HttpRequest.query_parse("zed=1&zed=2&zed=3&frank=11").inspect
+ return res
+ end
+
+
+ def test_horrible_queries
+ parser = HttpParser.new
+
+ # first verify that large random get requests fail
+ 100.times do |c|
+ get = "GET /#{rand_data(1024, 1024+(c*1024))} HTTP/1.1\r\n"
+ assert_raises Mongrel::HttpParserError do
+ parser.execute({}, get)
+ parser.reset
end
- }
+ end
+
+ # then that large header names are caught
+ 100.times do |c|
+ get = "GET /#{rand_data(10,120)} HTTP/1.1\r\nX-#{rand_data(1024, 1024+(c*1024))}: Test\r\n\r\n"
+ assert_raises Mongrel::HttpParserError do
+ parser.execute({}, get)
+ parser.reset
+ end
+ end
+
+ # then that large mangled field values are caught
+ 100.times do |c|
+ get = "GET /#{rand_data(10,120)} HTTP/1.1\r\nX-Test: #{rand_data(1024, 1024+(c*1024), false)}\r\n\r\n"
+ assert_raises Mongrel::HttpParserError do
+ parser.execute({}, get)
+ parser.reset
+ end
+ end
+
+ # then large headers are rejected too
+ get = "GET /#{rand_data(10,120)} HTTP/1.1\r\n"
+ get << "X-Test: test\r\n" * (80 * 1024)
+ assert_raises Mongrel::HttpParserError do
+ parser.execute({}, get)
+ parser.reset
+ end
+
+ # finally just that random garbage gets blocked all the time
+ 10.times do |c|
+ get = "GET #{rand_data(1024, 1024+(c*1024), false)} #{rand_data(1024, 1024+(c*1024), false)}\r\n\r\n"
+ assert_raises Mongrel::HttpParserError do
+ parser.execute({}, get)
+ parser.reset
+ end
+ end
+
end
+
+ def test_query_parse
+ res = HttpRequest.query_parse("zed=1&frank=2")
+ assert res["zed"], "didn't get the request right"
+ assert res["frank"], "no frank"
+ assert_equal "1", res["zed"], "wrong result"
+ assert_equal "2", res["frank"], "wrong result"
+
+ res = HttpRequest.query_parse("zed=1&zed=2&zed=3&frank=11;zed=45")
+ assert res["zed"], "didn't get the request right"
+ assert res["frank"], "no frank"
+ assert_equal 4,res["zed"].length, "wrong number for zed"
+ assert_equal "11",res["frank"], "wrong number for frank"
+ end
+
end