From 3c411489d16076c2058b904b6b3d7a674643c754 Mon Sep 17 00:00:00 2001 From: evanweaver Date: Wed, 17 Oct 2007 03:27:51 +0000 Subject: paths shuffle git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@662 19e92222-5c0b-0410-8929-a290d50e31e9 --- test/java/testParser.rb | 21 ++++++++ test/java/testParserImpl.rb | 22 ++++++++ test/java/test_http11.rb | 119 ++++++++++++++++++++++++++++++++++++++++++ test/java/test_performance.rb | 21 ++++++++ 4 files changed, 183 insertions(+) create mode 100644 test/java/testParser.rb create mode 100644 test/java/testParserImpl.rb create mode 100644 test/java/test_http11.rb create mode 100644 test/java/test_performance.rb (limited to 'test') diff --git a/test/java/testParser.rb b/test/java/testParser.rb new file mode 100644 index 0000000..476d1b3 --- /dev/null +++ b/test/java/testParser.rb @@ -0,0 +1,21 @@ + +require 'http11' + +request_data = "GET /events/show/2 HTTP/1.1\r\n\r\nfield1=value1&field2=value2&field3=value3" +request_data += ("X" * (16 * 1024 - request_data.size)) + +parser = Mongrel::HttpParser.new +parser.reset +params = {} +nread = parser.execute(params, request_data, 0) +puts "finished=#{parser.finished?}" +nread = parser.execute(params, request_data, nread) + +puts "params=" +params.each {|k,v| puts " #{k} = #{v}"} +puts "nread=#{nread}" +puts "error?=#{parser.error?}" +puts "finished=#{parser.finished?}" +puts "nread=#{parser.nread}" + +puts request_data[parser.nread..-1] diff --git a/test/java/testParserImpl.rb b/test/java/testParserImpl.rb new file mode 100644 index 0000000..58ef2c7 --- /dev/null +++ b/test/java/testParserImpl.rb @@ -0,0 +1,22 @@ +require "java" + +include_class "org.jruby.mongrel.HttpParserImpl" + +request_data = "GET /events/show/2 HTTP/1.1\r\n\r\nfield1=value1&field2=value2&field3=value3" +request_data += ("X" * (16 * 1024 - request_data.size)) + +parser = HttpParser.new +parser.reset +params = {} +nread = parser.execute(params, request_data) +puts "finished=#{parser.finished?}" +nread = parser.execute(params, request_data) + +puts "params=" +params.each {|k,v| puts " #{k} = #{v}"} +puts "nread=#{nread}" +puts "error?=#{parser.error?}" +puts "finished=#{parser.finished?}" +puts "nread=#{parser.nread}" + +puts request_data[parser.nread..-1] diff --git a/test/java/test_http11.rb b/test/java/test_http11.rb new file mode 100644 index 0000000..df4e914 --- /dev/null +++ b/test/java/test_http11.rb @@ -0,0 +1,119 @@ +# Original work by Zed A. Shaw + +require 'test/unit' +require 'http11' +require 'benchmark' +require 'digest/sha1' + +include Mongrel + +class HttpParserTest < Test::Unit::TestCase + + def test_parse_simple + $stderr.puts "test_parse_simple" + parser = HttpParser.new + req = {} + http = "GET / HTTP/1.1\r\n\r\n" + nread = parser.execute(req, http, 0) + assert nread == http.length, "Failed to parse the full HTTP request" + assert parser.finished?, "Parser didn't finish" + assert !parser.error?, "Parser had error" + assert nread == parser.nread, "Number read returned from execute does not match" + parser.reset + assert parser.nread == 0, "Number read after reset should be 0" + end + + + def test_parse_error + $stderr.puts "test_parse_error" + parser = HttpParser.new + req = {} + bad_http = "GET / SsUTF/1.1" + + error = false + begin + nread = parser.execute(req, bad_http, 0) + rescue => details + error = true + end + + assert error, "failed to throw exception" + assert !parser.finished?, "Parser shouldn't be finished" + assert parser.error?, "Parser SHOULD have error" + end + + # 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 + + return res + end + + + def test_horrible_queries + $stderr.puts "test_horrible_queries" + parser = HttpParser.new + + $stderr.puts "test_horrible_queries.first" + # first verify that large random get requests fail + 20.times do |c| + $stderr.write '.' + get = "GET /#{rand_data(1024, 1024+(c*1024))} HTTP/1.1\r\n" + assert_raises Mongrel::HttpParserError do + parser.execute({}, get, 0) + parser.reset + end + end + + $stderr.puts "test_horrible_queries.second" + # then that large header names are caught + 20.times do |c| + $stderr.write '.' + 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, 0) + parser.reset + end + end + + $stderr.puts "test_horrible_queries.third" + # then that large mangled field values are caught + 20.times do |c| + $stderr.write '.' + 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, 0) + parser.reset + end + end + + $stderr.puts "test_horrible_queries.fourth" + # 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, 0) + parser.reset + end + + $stderr.puts "test_horrible_queries.fifth" + # finally just that random garbage gets blocked all the time + 20.times do |c| + $stderr.write '.' + 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, 0) + parser.reset + end + end + + end +end + diff --git a/test/java/test_performance.rb b/test/java/test_performance.rb new file mode 100644 index 0000000..2bed6f2 --- /dev/null +++ b/test/java/test_performance.rb @@ -0,0 +1,21 @@ +require 'http11' + +include Mongrel + +def one_test(pr) + req = {} + http = "GET / HTTP/1.1\r\n\r\n" + nread = pr.execute(req, http, 0) + pr.reset +end + +parser = HttpParser.new + +before = Time.now +for n in (1..100000) + one_test(parser) +end +after = Time.now + +puts "Doing 100000 parses took #{after-before} seconds" + -- cgit v1.2.3-24-ge0c7