mirror of
https://github.com/puma/puma.git
synced 2022-11-09 13:48:40 -05:00
bumped the release to 1.1.6
This commit is contained in:
parent
7c9d988d4d
commit
8a0b96905e
4 changed files with 314 additions and 1 deletions
|
@ -1,3 +1,4 @@
|
|||
v1.1.6 Ruby1.9 compatible
|
||||
|
||||
v1.1.5. Fix bug where num_processors is not actually set from mongrel_rails.
|
||||
|
||||
|
|
|
@ -65,7 +65,7 @@ module Mongrel
|
|||
REQUEST_URI='REQUEST_URI'.freeze
|
||||
REQUEST_PATH='REQUEST_PATH'.freeze
|
||||
|
||||
MONGREL_VERSION="1.1.5".freeze
|
||||
MONGREL_VERSION="1.1.6".freeze
|
||||
|
||||
MONGREL_TMP_BASE="mongrel".freeze
|
||||
|
||||
|
|
156
test/test_http11.rb
Normal file
156
test/test_http11.rb
Normal file
|
@ -0,0 +1,156 @@
|
|||
# Copyright (c) 2005 Zed A. Shaw
|
||||
# You can redistribute it and/or modify it under the same terms as Ruby.
|
||||
#
|
||||
# Additional work donated by contributors. See http://mongrel.rubyforge.org/attributions.html
|
||||
# for more information.
|
||||
|
||||
require 'test/testhelp'
|
||||
|
||||
include Mongrel
|
||||
|
||||
class HttpParserTest < Test::Unit::TestCase
|
||||
|
||||
def 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"
|
||||
|
||||
assert_equal 'HTTP/1.1', req['SERVER_PROTOCOL']
|
||||
assert_equal '/', req['REQUEST_PATH']
|
||||
assert_equal 'HTTP/1.1', req['HTTP_VERSION']
|
||||
assert_equal '/', req['REQUEST_URI']
|
||||
assert_equal 'CGI/1.2', req['GATEWAY_INTERFACE']
|
||||
assert_equal 'GET', req['REQUEST_METHOD']
|
||||
assert_nil req['FRAGMENT']
|
||||
assert_nil req['QUERY_STRING']
|
||||
|
||||
parser.reset
|
||||
assert parser.nread == 0, "Number read after reset should be 0"
|
||||
end
|
||||
|
||||
def test_parse_dumbfuck_headers
|
||||
parser = HttpParser.new
|
||||
req = {}
|
||||
should_be_good = "GET / HTTP/1.1\r\naaaaaaaaaaaaa:++++++++++\r\n\r\n"
|
||||
nread = parser.execute(req, should_be_good, 0)
|
||||
assert_equal should_be_good.length, nread
|
||||
assert parser.finished?
|
||||
assert !parser.error?
|
||||
|
||||
nasty_pound_header = "GET / HTTP/1.1\r\nX-SSL-Bullshit: -----BEGIN CERTIFICATE-----\r\n\tMIIFbTCCBFWgAwIBAgICH4cwDQYJKoZIhvcNAQEFBQAwcDELMAkGA1UEBhMCVUsx\r\n\tETAPBgNVBAoTCGVTY2llbmNlMRIwEAYDVQQLEwlBdXRob3JpdHkxCzAJBgNVBAMT\r\n\tAkNBMS0wKwYJKoZIhvcNAQkBFh5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMu\r\n\tdWswHhcNMDYwNzI3MTQxMzI4WhcNMDcwNzI3MTQxMzI4WjBbMQswCQYDVQQGEwJV\r\n\tSzERMA8GA1UEChMIZVNjaWVuY2UxEzARBgNVBAsTCk1hbmNoZXN0ZXIxCzAJBgNV\r\n\tBAcTmrsogriqMWLAk1DMRcwFQYDVQQDEw5taWNoYWVsIHBhcmQYJKoZIhvcNAQEB\r\n\tBQADggEPADCCAQoCggEBANPEQBgl1IaKdSS1TbhF3hEXSl72G9J+WC/1R64fAcEF\r\n\tW51rEyFYiIeZGx/BVzwXbeBoNUK41OK65sxGuflMo5gLflbwJtHBRIEKAfVVp3YR\r\n\tgW7cMA/s/XKgL1GEC7rQw8lIZT8RApukCGqOVHSi/F1SiFlPDxuDfmdiNzL31+sL\r\n\t0iwHDdNkGjy5pyBSB8Y79dsSJtCW/iaLB0/n8Sj7HgvvZJ7x0fr+RQjYOUUfrePP\r\n\tu2MSpFyf+9BbC/aXgaZuiCvSR+8Snv3xApQY+fULK/xY8h8Ua51iXoQ5jrgu2SqR\r\n\twgA7BUi3G8LFzMBl8FRCDYGUDy7M6QaHXx1ZWIPWNKsCAwEAAaOCAiQwggIgMAwG\r\n\tA1UdEwEB/wQCMAAwEQYJYIZIAYb4QgEBBAQDAgWgMA4GA1UdDwEB/wQEAwID6DAs\r\n\tBglghkgBhvhCAQ0EHxYdVUsgZS1TY2llbmNlIFVzZXIgQ2VydGlmaWNhdGUwHQYD\r\n\tVR0OBBYEFDTt/sf9PeMaZDHkUIldrDYMNTBZMIGaBgNVHSMEgZIwgY+AFAI4qxGj\r\n\tloCLDdMVKwiljjDastqooXSkcjBwMQswCQYDVQQGEwJVSzERMA8GA1UEChMIZVNj\r\n\taWVuY2UxEjAQBgNVBAsTCUF1dGhvcml0eTELMAkGA1UEAxMCQ0ExLTArBgkqhkiG\r\n\t9w0BCQEWHmNhLW9wZXJhdG9yQGdyaWQtc3VwcG9ydC5hYy51a4IBADApBgNVHRIE\r\n\tIjAggR5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMudWswGQYDVR0gBBIwEDAO\r\n\tBgwrBgEEAdkvAQEBAQYwPQYJYIZIAYb4QgEEBDAWLmh0dHA6Ly9jYS5ncmlkLXN1\r\n\tcHBvcnQuYWMudmT4sopwqlBWsvcHViL2NybC9jYWNybC5jcmwwPQYJYIZIAYb4QgEDBDAWLmh0\r\n\tdHA6Ly9jYS5ncmlkLXN1cHBvcnQuYWMudWsvcHViL2NybC9jYWNybC5jcmwwPwYD\r\n\tVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NhLmdyaWQt5hYy51ay9wdWIv\r\n\tY3JsL2NhY3JsLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAS/U4iiooBENGW/Hwmmd3\r\n\tXCy6Zrt08YjKCzGNjorT98g8uGsqYjSxv/hmi0qlnlHs+k/3Iobc3LjS5AMYr5L8\r\n\tUO7OSkgFFlLHQyC9JzPfmLCAugvzEbyv4Olnsr8hbxF1MbKZoQxUZtMVu29wjfXk\r\n\thTeApBv7eaKCWpSp7MCbvgzm74izKhu3vlDk9w6qVrxePfGgpKPqfHiOoGhFnbTK\r\n\twTC6o2xq5y0qZ03JonF7OJspEd3I5zKY3E+ov7/ZhW6DqT8UFvsAdjvQbXyhV8Eu\r\n\tYhixw1aKEPzNjNowuIseVogKOLXxWI5vAi5HgXdS0/ES5gDGsABo4fqovUKlgop3\r\n\tRA==\r\n\t-----END CERTIFICATE-----\r\n\r\n"
|
||||
parser = HttpParser.new
|
||||
req = {}
|
||||
#nread = parser.execute(req, nasty_pound_header, 0)
|
||||
#assert_equal nasty_pound_header.length, nread
|
||||
#assert parser.finished?
|
||||
#assert !parser.error?
|
||||
end
|
||||
|
||||
def 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
|
||||
|
||||
def test_fragment_in_uri
|
||||
parser = HttpParser.new
|
||||
req = {}
|
||||
get = "GET /forums/1/topics/2375?page=1#posts-17408 HTTP/1.1\r\n\r\n"
|
||||
assert_nothing_raised do
|
||||
parser.execute(req, get, 0)
|
||||
end
|
||||
assert parser.finished?
|
||||
assert_equal '/forums/1/topics/2375?page=1', req['REQUEST_URI']
|
||||
assert_equal 'posts-17408', req['FRAGMENT']
|
||||
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 * 100).to_s) * (count / 40)
|
||||
else
|
||||
res << Digest::SHA1.digest(rand(count * 100).to_s) * (count / 20)
|
||||
end
|
||||
|
||||
return res
|
||||
end
|
||||
|
||||
|
||||
def test_horrible_queries
|
||||
parser = HttpParser.new
|
||||
|
||||
# then that large header names are caught
|
||||
10.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, 0)
|
||||
parser.reset
|
||||
end
|
||||
end
|
||||
|
||||
# then that large mangled field values are caught
|
||||
10.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, 0)
|
||||
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, 0)
|
||||
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, 0)
|
||||
parser.reset
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
def test_query_parse
|
||||
res = HttpRequest.query_parse("zed=1&frank=#{HttpRequest.escape('&&& ')}")
|
||||
assert res["zed"], "didn't get the request right"
|
||||
assert res["frank"], "no frank"
|
||||
assert_equal "1", res["zed"], "wrong result"
|
||||
assert_equal "&&& ", HttpRequest.unescape(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
|
||||
|
156
test/unit/test_http_parser.rb.orig
Normal file
156
test/unit/test_http_parser.rb.orig
Normal file
|
@ -0,0 +1,156 @@
|
|||
# Copyright (c) 2005 Zed A. Shaw
|
||||
# You can redistribute it and/or modify it under the same terms as Ruby.
|
||||
#
|
||||
# Additional work donated by contributors. See http://mongrel.rubyforge.org/attributions.html
|
||||
# for more information.
|
||||
|
||||
require 'test/test_helper'
|
||||
|
||||
include Mongrel
|
||||
|
||||
class HttpParserTest < Test::Unit::TestCase
|
||||
|
||||
def 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"
|
||||
|
||||
assert_equal 'HTTP/1.1', req['SERVER_PROTOCOL']
|
||||
assert_equal '/', req['REQUEST_PATH']
|
||||
assert_equal 'HTTP/1.1', req['HTTP_VERSION']
|
||||
assert_equal '/', req['REQUEST_URI']
|
||||
assert_equal 'CGI/1.2', req['GATEWAY_INTERFACE']
|
||||
assert_equal 'GET', req['REQUEST_METHOD']
|
||||
assert_nil req['FRAGMENT']
|
||||
assert_nil req['QUERY_STRING']
|
||||
|
||||
parser.reset
|
||||
assert parser.nread == 0, "Number read after reset should be 0"
|
||||
end
|
||||
|
||||
def test_parse_strange_headers
|
||||
parser = HttpParser.new
|
||||
req = {}
|
||||
should_be_good = "GET / HTTP/1.1\r\naaaaaaaaaaaaa:++++++++++\r\n\r\n"
|
||||
nread = parser.execute(req, should_be_good, 0)
|
||||
assert_equal should_be_good.length, nread
|
||||
assert parser.finished?
|
||||
assert !parser.error?
|
||||
|
||||
nasty_pound_header = "GET / HTTP/1.1\r\nX-SSL-Bullshit: -----BEGIN CERTIFICATE-----\r\n\tMIIFbTCCBFWgAwIBAgICH4cwDQYJKoZIhvcNAQEFBQAwcDELMAkGA1UEBhMCVUsx\r\n\tETAPBgNVBAoTCGVTY2llbmNlMRIwEAYDVQQLEwlBdXRob3JpdHkxCzAJBgNVBAMT\r\n\tAkNBMS0wKwYJKoZIhvcNAQkBFh5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMu\r\n\tdWswHhcNMDYwNzI3MTQxMzI4WhcNMDcwNzI3MTQxMzI4WjBbMQswCQYDVQQGEwJV\r\n\tSzERMA8GA1UEChMIZVNjaWVuY2UxEzARBgNVBAsTCk1hbmNoZXN0ZXIxCzAJBgNV\r\n\tBAcTmrsogriqMWLAk1DMRcwFQYDVQQDEw5taWNoYWVsIHBhcmQYJKoZIhvcNAQEB\r\n\tBQADggEPADCCAQoCggEBANPEQBgl1IaKdSS1TbhF3hEXSl72G9J+WC/1R64fAcEF\r\n\tW51rEyFYiIeZGx/BVzwXbeBoNUK41OK65sxGuflMo5gLflbwJtHBRIEKAfVVp3YR\r\n\tgW7cMA/s/XKgL1GEC7rQw8lIZT8RApukCGqOVHSi/F1SiFlPDxuDfmdiNzL31+sL\r\n\t0iwHDdNkGjy5pyBSB8Y79dsSJtCW/iaLB0/n8Sj7HgvvZJ7x0fr+RQjYOUUfrePP\r\n\tu2MSpFyf+9BbC/aXgaZuiCvSR+8Snv3xApQY+fULK/xY8h8Ua51iXoQ5jrgu2SqR\r\n\twgA7BUi3G8LFzMBl8FRCDYGUDy7M6QaHXx1ZWIPWNKsCAwEAAaOCAiQwggIgMAwG\r\n\tA1UdEwEB/wQCMAAwEQYJYIZIAYb4QgEBBAQDAgWgMA4GA1UdDwEB/wQEAwID6DAs\r\n\tBglghkgBhvhCAQ0EHxYdVUsgZS1TY2llbmNlIFVzZXIgQ2VydGlmaWNhdGUwHQYD\r\n\tVR0OBBYEFDTt/sf9PeMaZDHkUIldrDYMNTBZMIGaBgNVHSMEgZIwgY+AFAI4qxGj\r\n\tloCLDdMVKwiljjDastqooXSkcjBwMQswCQYDVQQGEwJVSzERMA8GA1UEChMIZVNj\r\n\taWVuY2UxEjAQBgNVBAsTCUF1dGhvcml0eTELMAkGA1UEAxMCQ0ExLTArBgkqhkiG\r\n\t9w0BCQEWHmNhLW9wZXJhdG9yQGdyaWQtc3VwcG9ydC5hYy51a4IBADApBgNVHRIE\r\n\tIjAggR5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMudWswGQYDVR0gBBIwEDAO\r\n\tBgwrBgEEAdkvAQEBAQYwPQYJYIZIAYb4QgEEBDAWLmh0dHA6Ly9jYS5ncmlkLXN1\r\n\tcHBvcnQuYWMudmT4sopwqlBWsvcHViL2NybC9jYWNybC5jcmwwPQYJYIZIAYb4QgEDBDAWLmh0\r\n\tdHA6Ly9jYS5ncmlkLXN1cHBvcnQuYWMudWsvcHViL2NybC9jYWNybC5jcmwwPwYD\r\n\tVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NhLmdyaWQt5hYy51ay9wdWIv\r\n\tY3JsL2NhY3JsLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAS/U4iiooBENGW/Hwmmd3\r\n\tXCy6Zrt08YjKCzGNjorT98g8uGsqYjSxv/hmi0qlnlHs+k/3Iobc3LjS5AMYr5L8\r\n\tUO7OSkgFFlLHQyC9JzPfmLCAugvzEbyv4Olnsr8hbxF1MbKZoQxUZtMVu29wjfXk\r\n\thTeApBv7eaKCWpSp7MCbvgzm74izKhu3vlDk9w6qVrxePfGgpKPqfHiOoGhFnbTK\r\n\twTC6o2xq5y0qZ03JonF7OJspEd3I5zKY3E+ov7/ZhW6DqT8UFvsAdjvQbXyhV8Eu\r\n\tYhixw1aKEPzNjNowuIseVogKOLXxWI5vAi5HgXdS0/ES5gDGsABo4fqovUKlgop3\r\n\tRA==\r\n\t-----END CERTIFICATE-----\r\n\r\n"
|
||||
parser = HttpParser.new
|
||||
req = {}
|
||||
nread = parser.execute(req, nasty_pound_header, 0)
|
||||
assert_equal nasty_pound_header.length, nread
|
||||
assert parser.finished?
|
||||
assert !parser.error?
|
||||
end
|
||||
|
||||
def 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
|
||||
|
||||
def test_fragment_in_uri
|
||||
parser = HttpParser.new
|
||||
req = {}
|
||||
get = "GET /forums/1/topics/2375?page=1#posts-17408 HTTP/1.1\r\n\r\n"
|
||||
assert_nothing_raised do
|
||||
parser.execute(req, get, 0)
|
||||
end
|
||||
assert parser.finished?
|
||||
assert_equal '/forums/1/topics/2375?page=1', req['REQUEST_URI']
|
||||
assert_equal 'posts-17408', req['FRAGMENT']
|
||||
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 * 100).to_s) * (count / 40)
|
||||
else
|
||||
res << Digest::SHA1.digest(rand(count * 100).to_s) * (count / 20)
|
||||
end
|
||||
|
||||
return res
|
||||
end
|
||||
|
||||
|
||||
def test_horrible_queries
|
||||
parser = HttpParser.new
|
||||
|
||||
# then that large header names are caught
|
||||
10.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, 0)
|
||||
parser.reset
|
||||
end
|
||||
end
|
||||
|
||||
# then that large mangled field values are caught
|
||||
10.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, 0)
|
||||
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, 0)
|
||||
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, 0)
|
||||
parser.reset
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
def test_query_parse
|
||||
res = HttpRequest.query_parse("zed=1&frank=#{HttpRequest.escape('&&& ')}")
|
||||
assert res["zed"], "didn't get the request right"
|
||||
assert res["frank"], "no frank"
|
||||
assert_equal "1", res["zed"], "wrong result"
|
||||
assert_equal "&&& ", HttpRequest.unescape(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
|
||||
|
Loading…
Reference in a new issue