cgialt 0.0.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES.txt +21 -2
- data/README.txt +22 -9
- data/bench.rb +3 -3
- data/lib/cgialt.rb +1 -1
- data/lib/cgialt/cookie.rb +7 -5
- data/lib/cgialt/core.rb +92 -70
- data/lib/cgialt/fcgi.rb +3 -3
- data/lib/cgialt/fcgi/cgi_helper.rb +4 -4
- data/lib/cgialt/fcgi/core.rb +50 -50
- data/lib/cgialt/util.rb +71 -27
- data/setup.rb +861 -607
- data/test/test_cgi_cookie.rb +1 -1
- data/test/test_cgi_core.rb +21 -2
- data/test/test_cgi_header.rb +1 -1
- data/test/test_cgi_modruby.rb +1 -1
- data/test/test_cgi_multipart.rb +29 -4
- data/test/test_cgi_util.rb +240 -0
- metadata +41 -33
    
        data/test/test_cgi_cookie.rb
    CHANGED
    
    
    
        data/test/test_cgi_core.rb
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            require 'test/unit'
         | 
| 2 2 | 
             
            #require 'cgi'
         | 
| 3 | 
            -
            require(ENV['CGI'] || ' | 
| 3 | 
            +
            require(ENV['CGI'] || 'cgialt')
         | 
| 4 4 | 
             
            require 'stringio'
         | 
| 5 5 |  | 
| 6 6 |  | 
| @@ -18,11 +18,19 @@ class CGICoreTest < Test::Unit::TestCase | |
| 18 18 |  | 
| 19 19 |  | 
| 20 20 | 
             
              def teardown
         | 
| 21 | 
            -
                @environ.each do |key, val| ENV.delete(key) end
         | 
| 21 | 
            +
                @environ and @environ.each do |key, val| ENV.delete(key) end
         | 
| 22 22 | 
             
                $stdout = STDOUT
         | 
| 23 23 | 
             
              end
         | 
| 24 24 |  | 
| 25 25 |  | 
| 26 | 
            +
              def test_cgi_core_parse
         | 
| 27 | 
            +
                assert_equal({'foo'=>['bar']}, CGI.parse('foo=bar'))
         | 
| 28 | 
            +
                assert_equal({'a'=>['10'], 'b'=>['20']}, CGI.parse('a=10&b=20'))
         | 
| 29 | 
            +
                assert_equal({'noval'=>['']}, CGI.parse('noval='))
         | 
| 30 | 
            +
                assert_equal({'noeq'=>[nil]}, CGI.parse('noeq'))   # same spec as cgi.rb
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
             | 
| 26 34 | 
             
              def test_cgi_core_params_GET
         | 
| 27 35 | 
             
                @environ = {
         | 
| 28 36 | 
             
                  'REQUEST_METHOD'  => 'GET',
         | 
| @@ -174,6 +182,8 @@ class CGICoreTest < Test::Unit::TestCase | |
| 174 182 | 
             
                           "Content-Language: ja\r\n" +
         | 
| 175 183 | 
             
                           "\r\n" +
         | 
| 176 184 | 
             
                           euc_str
         | 
| 185 | 
            +
                # actual.encoding => US-ASCII, expected.encoding => ASCII-8BIT
         | 
| 186 | 
            +
                expected = _convert_encoding(expected, actual)
         | 
| 177 187 | 
             
                assert_equal(expected, actual)
         | 
| 178 188 | 
             
                ## shift_jis
         | 
| 179 189 | 
             
                options = { 'charset'=>'Shift_JIS' }
         | 
| @@ -186,6 +196,8 @@ class CGICoreTest < Test::Unit::TestCase | |
| 186 196 | 
             
                           "Content-Language: ja\r\n" +
         | 
| 187 197 | 
             
                           "\r\n" +
         | 
| 188 198 | 
             
                           sjis_str
         | 
| 199 | 
            +
                # actual.encoding => US-ASCII, expected.encoding => ASCII-8BIT
         | 
| 200 | 
            +
                expected = _convert_encoding(expected, actual)
         | 
| 189 201 | 
             
                assert_equal(expected, actual)
         | 
| 190 202 | 
             
                ## utf8 (not converted)
         | 
| 191 203 | 
             
                options = { 'charset'=>'utf8' }
         | 
| @@ -197,6 +209,8 @@ class CGICoreTest < Test::Unit::TestCase | |
| 197 209 | 
             
                           "Content-Length: 22\r\n" +
         | 
| 198 210 | 
             
                           "\r\n" +
         | 
| 199 211 | 
             
                           euc_str
         | 
| 212 | 
            +
                # actual.encoding => US-ASCII, expected.encoding => ASCII-8BIT
         | 
| 213 | 
            +
                expected = _convert_encoding(expected, actual)
         | 
| 200 214 | 
             
                assert_equal(expected, actual)
         | 
| 201 215 | 
             
                ## language is keeped
         | 
| 202 216 | 
             
                options = { 'charset'=>'Shift_JIS', 'language'=>'en' }
         | 
| @@ -215,6 +229,11 @@ class CGICoreTest < Test::Unit::TestCase | |
| 215 229 | 
             
                assert_equal(expected, actual)
         | 
| 216 230 | 
             
              end
         | 
| 217 231 |  | 
| 232 | 
            +
              def _convert_encoding(expected, actual)
         | 
| 233 | 
            +
                "".respond_to?(:encoding) && actual.encoding != expected.encoding \
         | 
| 234 | 
            +
                ? expected.force_encoding(actual.encoding) \
         | 
| 235 | 
            +
                : expected
         | 
| 236 | 
            +
              end
         | 
| 218 237 |  | 
| 219 238 | 
             
              def test_cgi_core_print
         | 
| 220 239 | 
             
                @environ = {
         | 
    
        data/test/test_cgi_header.rb
    CHANGED
    
    
    
        data/test/test_cgi_modruby.rb
    CHANGED
    
    
    
        data/test/test_cgi_multipart.rb
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            require 'test/unit'
         | 
| 2 2 | 
             
            #require 'cgi'
         | 
| 3 | 
            -
            require(ENV['CGI'] || ' | 
| 3 | 
            +
            require(ENV['CGI'] || 'cgialt')
         | 
| 4 4 | 
             
            require 'tempfile'
         | 
| 5 5 | 
             
            require 'stringio'
         | 
| 6 6 |  | 
| @@ -36,6 +36,16 @@ class MultiPart | |
| 36 36 | 
             
              end
         | 
| 37 37 | 
             
              attr_reader :boundary
         | 
| 38 38 |  | 
| 39 | 
            +
              if "".respond_to?(:encoding) && "".respond_to?(:force_encoding)   # Ruby1.9
         | 
| 40 | 
            +
                def _convert_encoding(str, str2)
         | 
| 41 | 
            +
                  str.force_encoding(str2.encoding)
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
              else
         | 
| 44 | 
            +
                def _convert_encoding(str, str2)
         | 
| 45 | 
            +
                  str
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
             | 
| 39 49 | 
             
              def append(name, value, filename=nil, content_type=nil)
         | 
| 40 50 | 
             
                content_type = detect_content_type(filename) if filename && content_type.nil?
         | 
| 41 51 | 
             
                s = filename ? "; filename=\"#{filename}\"" : ''
         | 
| @@ -44,6 +54,7 @@ class MultiPart | |
| 44 54 | 
             
                buf << "Content-Disposition: form-data: name=\"#{name}\"#{s}\r\n"
         | 
| 45 55 | 
             
                buf << "Content-Type: #{content_type}\r\n" if content_type
         | 
| 46 56 | 
             
                buf << "\r\n"
         | 
| 57 | 
            +
                buf = _convert_encoding(buf, value)
         | 
| 47 58 | 
             
                buf << value
         | 
| 48 59 | 
             
                buf << "\r\n"
         | 
| 49 60 | 
             
                return self
         | 
| @@ -109,7 +120,7 @@ class CGIMultipartTest < Test::Unit::TestCase | |
| 109 120 | 
             
              end
         | 
| 110 121 |  | 
| 111 122 | 
             
              def teardown
         | 
| 112 | 
            -
                %[REQUEST_METHOD CONTENT_TYPE CONTENT_LENGTH REQUEST_METHOD].each do |name|
         | 
| 123 | 
            +
                %w[REQUEST_METHOD CONTENT_TYPE CONTENT_LENGTH REQUEST_METHOD].each do |name|
         | 
| 113 124 | 
             
                  ENV.delete(name)
         | 
| 114 125 | 
             
                end
         | 
| 115 126 | 
             
                $stdin.close() if $stdin.is_a?(Tempfile)
         | 
| @@ -151,7 +162,11 @@ class CGIMultipartTest < Test::Unit::TestCase | |
| 151 162 | 
             
                  expected = hash[:value]
         | 
| 152 163 | 
             
                  expected_class = @expected_class || (hash[:value].length < threshold ? StringIO : Tempfile)
         | 
| 153 164 | 
             
                  assert_kind_of(expected_class, cgi[name])
         | 
| 154 | 
            -
                   | 
| 165 | 
            +
                  actual = cgi[name].read()
         | 
| 166 | 
            +
                  if "".respond_to?(:encoding)            # Ruby1.9
         | 
| 167 | 
            +
                    expected = expected.force_encoding(actual.encoding)
         | 
| 168 | 
            +
                  end
         | 
| 169 | 
            +
                  assert_equal(expected, actual)
         | 
| 155 170 | 
             
                  assert_equal(hash[:filename] || '', cgi[name].original_filename) #if hash[:filename]
         | 
| 156 171 | 
             
                  assert_equal(hash[:content_type] || '', cgi[name].content_type)  #if hash[:content_type]
         | 
| 157 172 | 
             
                end
         | 
| @@ -190,7 +205,11 @@ class CGIMultipartTest < Test::Unit::TestCase | |
| 190 205 | 
             
                  {:name=>'image1',  :value=>_read('large.png'),
         | 
| 191 206 | 
             
                   :filename=>'large.png',  :content_type=>'image/png'},  # large image
         | 
| 192 207 | 
             
                ]
         | 
| 193 | 
            -
                 | 
| 208 | 
            +
                if "".respond_to?(:encoding)         # Ruby1.9
         | 
| 209 | 
            +
                  @expected_class = File
         | 
| 210 | 
            +
                else
         | 
| 211 | 
            +
                  @expected_class = Tempfile
         | 
| 212 | 
            +
                end
         | 
| 194 213 | 
             
                _test_multipart()
         | 
| 195 214 | 
             
              end
         | 
| 196 215 |  | 
| @@ -248,6 +267,9 @@ class CGIMultipartTest < Test::Unit::TestCase | |
| 248 267 | 
             
                   :filename=>'file1.html', :content_type=>'text/html'},
         | 
| 249 268 | 
             
                ]
         | 
| 250 269 | 
             
                _prepare(@data) do |input|
         | 
| 270 | 
            +
                  if input.respond_to?(:encoding)    # Ruby1.9
         | 
| 271 | 
            +
                    input = input.force_encoding('ASCII-8BIT')
         | 
| 272 | 
            +
                  end
         | 
| 251 273 | 
             
                  input2 = input.sub(/--(\r\n)?\z/, "\r\n")
         | 
| 252 274 | 
             
                  assert input2 != input
         | 
| 253 275 | 
             
                  #p input2
         | 
| @@ -259,6 +281,9 @@ class CGIMultipartTest < Test::Unit::TestCase | |
| 259 281 | 
             
                assert_equal("bad boundary end of body part", ex.message)
         | 
| 260 282 | 
             
                #
         | 
| 261 283 | 
             
                _prepare(@data) do |input|
         | 
| 284 | 
            +
                  if input.respond_to?(:encoding)    # Ruby1.9
         | 
| 285 | 
            +
                    input = input.force_encoding('ASCII-8BIT')
         | 
| 286 | 
            +
                  end
         | 
| 262 287 | 
             
                  input2 = input.sub(/--(\r\n)?\z/, "")
         | 
| 263 288 | 
             
                  assert input2 != input
         | 
| 264 289 | 
             
                  #p input2
         | 
| @@ -0,0 +1,240 @@ | |
| 1 | 
            +
            require 'test/unit'
         | 
| 2 | 
            +
            #require 'cgi'
         | 
| 3 | 
            +
            require(ENV['CGI'] || 'cgialt')
         | 
| 4 | 
            +
             | 
| 5 | 
            +
             | 
| 6 | 
            +
            if defined?(CGIExt)
         | 
| 7 | 
            +
              def if_cgiext;  yield if block_given?; true;  end
         | 
| 8 | 
            +
              def if_cgialt;  false;  end
         | 
| 9 | 
            +
            else
         | 
| 10 | 
            +
              def if_cgiext;  false;  end
         | 
| 11 | 
            +
              def if_cgialt;  yield if block_given?; true;  end
         | 
| 12 | 
            +
            end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
             | 
| 15 | 
            +
            class CGIUtilTest < Test::Unit::TestCase
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              def test_escape_html
         | 
| 18 | 
            +
                ## escape html characters
         | 
| 19 | 
            +
                input = '<>&"\''
         | 
| 20 | 
            +
                expected = '<>&"\''
         | 
| 21 | 
            +
                actual = nil
         | 
| 22 | 
            +
                if_cgiext { actual = CGIExt.escape_html(input) }
         | 
| 23 | 
            +
                if_cgialt { actual = CGI.escapeHTML(input) }
         | 
| 24 | 
            +
                assert_equal(expected, actual)
         | 
| 25 | 
            +
                if_cgiext { assert_equal(CGI.escapeHTML(input), actual) }
         | 
| 26 | 
            +
                ## if no html characters found, return the passed argument as is
         | 
| 27 | 
            +
                input = 'foobar'
         | 
| 28 | 
            +
                expected = input
         | 
| 29 | 
            +
                if_cgiext { actual = CGIExt.escape_html(input) }
         | 
| 30 | 
            +
                if_cgialt { actual = CGI.escapeHTML(input) }
         | 
| 31 | 
            +
                assert_equal(expected, actual)
         | 
| 32 | 
            +
                #assert_same(expected, actual)
         | 
| 33 | 
            +
                ## when non-string is passed, error raised
         | 
| 34 | 
            +
                input = nil
         | 
| 35 | 
            +
                if_cgiext { assert_raise(TypeError) { CGIExt.escape_html(input) } }
         | 
| 36 | 
            +
                if_cgialt { assert_raise(NoMethodError) { CGI.escapeHTML(input) } }
         | 
| 37 | 
            +
                input = 123
         | 
| 38 | 
            +
                if_cgiext { assert_raise(TypeError) { CGIExt.escape_html(input) } }
         | 
| 39 | 
            +
                if_cgialt { assert_raise(NoMethodError) { CGI.escapeHTML(input) } }
         | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
             | 
| 43 | 
            +
            if_cgiext {
         | 
| 44 | 
            +
              def test_escape_html!
         | 
| 45 | 
            +
                ## escape html characters
         | 
| 46 | 
            +
                input = '<>&"\''
         | 
| 47 | 
            +
                expected = '<>&"\''
         | 
| 48 | 
            +
                actual = CGIExt.escape_html!(input)
         | 
| 49 | 
            +
                assert_equal(expected, actual)
         | 
| 50 | 
            +
                assert_equal(CGI.escapeHTML(input), actual)
         | 
| 51 | 
            +
                ## if no html characters found, return the string as is
         | 
| 52 | 
            +
                input = 'foobar'
         | 
| 53 | 
            +
                expected = input
         | 
| 54 | 
            +
                actual = CGIExt.escape_html!(input)
         | 
| 55 | 
            +
                assert_equal(expected, actual)
         | 
| 56 | 
            +
                assert_same(expected, actual)
         | 
| 57 | 
            +
                ## non-string value are converted into string
         | 
| 58 | 
            +
                input = nil
         | 
| 59 | 
            +
                expected = ''
         | 
| 60 | 
            +
                actual = CGIExt.escape_html!(input)
         | 
| 61 | 
            +
                assert_equal(expected, actual)
         | 
| 62 | 
            +
                input = 123
         | 
| 63 | 
            +
                expected = '123'
         | 
| 64 | 
            +
                actual = CGIExt.escape_html!(input)
         | 
| 65 | 
            +
                assert_equal(expected, actual)
         | 
| 66 | 
            +
              end
         | 
| 67 | 
            +
            }
         | 
| 68 | 
            +
             | 
| 69 | 
            +
             | 
| 70 | 
            +
              def test_unescape_html
         | 
| 71 | 
            +
                ## unescape html characters
         | 
| 72 | 
            +
                tdata = [
         | 
| 73 | 
            +
                  ## html entities ('<>&"')
         | 
| 74 | 
            +
                  ['<>&"', '<>&"'],
         | 
| 75 | 
            +
                  ## otehr html entities (ex. '©')
         | 
| 76 | 
            +
                  ['©&heart;', '©&heart;'],
         | 
| 77 | 
            +
                  ## 'c' format
         | 
| 78 | 
            +
                  ['"&'<>', '"&\'<>'],
         | 
| 79 | 
            +
                  ## '香' format
         | 
| 80 | 
            +
                  ['"&'<>', '"&\'<>'],
         | 
| 81 | 
            +
                  ## invalid format
         | 
| 82 | 
            +
                  ['&<&>"&abcdefghijklmn', '&<&>"&abcdefghijklmn'],
         | 
| 83 | 
            +
                ]
         | 
| 84 | 
            +
                actual = nil
         | 
| 85 | 
            +
                tdata.each do |input, expected|
         | 
| 86 | 
            +
                  if_cgiext { actual = CGIExt.unescape_html(input) }
         | 
| 87 | 
            +
                  if_cgialt { actual = CGI.unescapeHTML(input) }
         | 
| 88 | 
            +
                  assert_equal(expected, actual)
         | 
| 89 | 
            +
                  if_cgiext { assert_equal(CGI.unescapeHTML(input), actual) }
         | 
| 90 | 
            +
                end
         | 
| 91 | 
            +
                ## return as-is when no html entity found
         | 
| 92 | 
            +
                input = "foobar"
         | 
| 93 | 
            +
                expected = input
         | 
| 94 | 
            +
                if_cgiext { actual = CGIExt.unescape_html(input) }
         | 
| 95 | 
            +
                if_cgialt { actual = CGI.unescapeHTML(input) }
         | 
| 96 | 
            +
                assert_equal(expected, actual)
         | 
| 97 | 
            +
                if_cgiext { assert_same(expected, actual) }
         | 
| 98 | 
            +
                ## when non-string is passed, error raised
         | 
| 99 | 
            +
                input = nil
         | 
| 100 | 
            +
                if_cgiext { assert_raise(TypeError) { CGIExt.unescape_html(input) } }
         | 
| 101 | 
            +
                if_cgialt { assert_raise(NoMethodError) { CGI.unescapeHTML(input) } }
         | 
| 102 | 
            +
                input = 123
         | 
| 103 | 
            +
                if_cgiext { assert_raise(TypeError) { CGIExt.unescape_html(input) } }
         | 
| 104 | 
            +
                if_cgialt { assert_raise(NoMethodError) { CGI.unescapeHTML(input) } }
         | 
| 105 | 
            +
              end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
             | 
| 108 | 
            +
              TESTDATA_FOR_ESCAPE_URL = [
         | 
| 109 | 
            +
                  ## example data
         | 
| 110 | 
            +
                  ["'Stop!' said Fred._-+", '%27Stop%21%27+said+Fred._-%2B'],
         | 
| 111 | 
            +
                  ## characters not to be escaped
         | 
| 112 | 
            +
                  ["abcdefgxyzABCDEFGXYZ0123456789_.-",    "abcdefgxyzABCDEFGXYZ0123456789_.-"],
         | 
| 113 | 
            +
                  ## characters to be escaped
         | 
| 114 | 
            +
                  [' !"#$%&\'()*+,/:;<=>?@[\\]^`{|}~', "+%21%22%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3C%3D%3E%3F%40%5B%5C%5D%5E%60%7B%7C%7D%7E"],
         | 
| 115 | 
            +
                  ## '%' format
         | 
| 116 | 
            +
                  ["k[]", 'k%5B%5D'],
         | 
| 117 | 
            +
                  ## unicode characters
         | 
| 118 | 
            +
                  ["\244\242\244\244\244\246\244\250\244\252", "%A4%A2%A4%A4%A4%A6%A4%A8%A4%AA"],
         | 
| 119 | 
            +
              ]
         | 
| 120 | 
            +
             | 
| 121 | 
            +
             | 
| 122 | 
            +
              def test_escape_url
         | 
| 123 | 
            +
                ## encode url string
         | 
| 124 | 
            +
                testdata = TESTDATA_FOR_ESCAPE_URL + [
         | 
| 125 | 
            +
                             ## containing '%' character
         | 
| 126 | 
            +
                             ["%XX%5%%%", "%25XX%255%25%25%25"],
         | 
| 127 | 
            +
                           ]
         | 
| 128 | 
            +
                actual = nil
         | 
| 129 | 
            +
                testdata.each do |input, expected|
         | 
| 130 | 
            +
                  if_cgiext { actual = CGIExt.escape_url(input) }
         | 
| 131 | 
            +
                  if_cgialt { actual = CGI.escape(input) }
         | 
| 132 | 
            +
                  assert_equal(expected, actual)
         | 
| 133 | 
            +
                  if_cgiext { assert_equal(CGI.escape(input), actual) }
         | 
| 134 | 
            +
                  #assert_equal(expected, CGI.escape(input))
         | 
| 135 | 
            +
                end
         | 
| 136 | 
            +
                ## error when non-string
         | 
| 137 | 
            +
                if_cgiext { assert_raise(TypeError) { CGIExt.escape_url(nil) } }
         | 
| 138 | 
            +
                if_cgialt { assert_raise(NoMethodError) { CGI.escape(nil) } }
         | 
| 139 | 
            +
                if_cgiext { assert_raise(TypeError) { CGIExt.escape_url(123) } }
         | 
| 140 | 
            +
                if_cgialt { assert_raise(NoMethodError) { CGI.escape(123) } }
         | 
| 141 | 
            +
              end
         | 
| 142 | 
            +
             | 
| 143 | 
            +
             | 
| 144 | 
            +
              def test_unescape_url
         | 
| 145 | 
            +
                ## decode url string
         | 
| 146 | 
            +
                testdata = TESTDATA_FOR_ESCAPE_URL + [
         | 
| 147 | 
            +
                             ## invalid '%' format
         | 
| 148 | 
            +
                             ["%XX%5%%%", "%XX%5%%%"],
         | 
| 149 | 
            +
                             ## combination of lower case and upper case
         | 
| 150 | 
            +
                             ["\244\252", "%a4%Aa"],
         | 
| 151 | 
            +
                           ]
         | 
| 152 | 
            +
                actual = nil
         | 
| 153 | 
            +
                testdata.each do |expected, input|
         | 
| 154 | 
            +
                  if_cgiext { actual = CGIExt.unescape_url(input) }
         | 
| 155 | 
            +
                  if_cgialt { actual = CGI.unescape(input) }
         | 
| 156 | 
            +
                  assert_equal(expected, actual)
         | 
| 157 | 
            +
                  if_cgiext { assert_equal(CGI.unescape(input), actual) }
         | 
| 158 | 
            +
                  #assert_equal(expected, CGI.unescape(input))
         | 
| 159 | 
            +
                end
         | 
| 160 | 
            +
                ## error when non-string
         | 
| 161 | 
            +
                if_cgiext { assert_raise(TypeError) { CGIExt.unescape_url(nil) } }
         | 
| 162 | 
            +
                if_cgialt { assert_raise(NoMethodError) { CGI.unescape(nil) } }
         | 
| 163 | 
            +
                if_cgiext { assert_raise(TypeError) { CGIExt.unescape_url(123) } }
         | 
| 164 | 
            +
                if_cgialt { assert_raise(NoMethodError) { CGI.unescape(123) } }
         | 
| 165 | 
            +
              end
         | 
| 166 | 
            +
             | 
| 167 | 
            +
             | 
| 168 | 
            +
              def test_rfc1123_date
         | 
| 169 | 
            +
                sec = 1196524602
         | 
| 170 | 
            +
                t = Time.at(sec)
         | 
| 171 | 
            +
                expected = 'Sat, 01 Dec 2007 15:56:42 GMT'
         | 
| 172 | 
            +
                actual = nil
         | 
| 173 | 
            +
                if_cgiext { actual = CGIExt.rfc1123_date(t) }
         | 
| 174 | 
            +
                if_cgialt { actual = CGI.rfc1123_date(t) }
         | 
| 175 | 
            +
                assert_equal(expected, actual)
         | 
| 176 | 
            +
                if_cgiext { assert_equal(CGI.rfc1123_date(t), actual) }
         | 
| 177 | 
            +
                ## error when not Time object
         | 
| 178 | 
            +
                if_cgiext { assert_raise(TypeError) { CGIExt.rfc1123_date(nil) } }
         | 
| 179 | 
            +
                if_cgialt { assert_raise(TypeError) { CGI.rfc1123_date(nil) } }
         | 
| 180 | 
            +
                if_cgiext { assert_raise(TypeError) { CGIExt.rfc1123_date(123) } }
         | 
| 181 | 
            +
                if_cgialt { assert_raise(TypeError) { CGI.rfc1123_date(123) } }
         | 
| 182 | 
            +
              end
         | 
| 183 | 
            +
             | 
| 184 | 
            +
             | 
| 185 | 
            +
              def test_parse_query_string
         | 
| 186 | 
            +
                ## equal with CGI.parse()
         | 
| 187 | 
            +
                tuples = [
         | 
| 188 | 
            +
                  ## '&' separator
         | 
| 189 | 
            +
                  ['a=10&b=20&key1=val1',  {'a'=>['10'], 'b'=>['20'], 'key1'=>['val1']} ],
         | 
| 190 | 
            +
                  ## ';' separator
         | 
| 191 | 
            +
                  ['a=10;b=20;key1=val1',  {'a'=>['10'], 'b'=>['20'], 'key1'=>['val1']} ],
         | 
| 192 | 
            +
                  ## same keys
         | 
| 193 | 
            +
                  ['a=1&a=2&a=3',          {'a'=>['1', '2', '3']} ],
         | 
| 194 | 
            +
                  ## no value
         | 
| 195 | 
            +
                  ['key=&key=', {'key'=>['', '']} ],
         | 
| 196 | 
            +
                  ## unescape ascii string
         | 
| 197 | 
            +
                  ['k%5B%5D=%5B%5D%26%3B', {'k[]'=>['[]&;']} ],
         | 
| 198 | 
            +
                  ## unescape unicode string
         | 
| 199 | 
            +
                  ["%A4%A2%a4%a4=%A4%a6%A4%A8%A4%Aa", {"\244\242\244\244"=>["\244\246\244\250\244\252"]} ],
         | 
| 200 | 
            +
                  ## invalid '%' format
         | 
| 201 | 
            +
                  ['k%XX%5=%%%', {'k%XX%5'=>['%%%']} ],
         | 
| 202 | 
            +
                ]
         | 
| 203 | 
            +
                actual = nil
         | 
| 204 | 
            +
                tuples.each do |input, expected|
         | 
| 205 | 
            +
                  if_cgiext { actual = CGIExt.parse_query_string(input) }
         | 
| 206 | 
            +
                  if_cgialt { actual = CGI.parse(input) }
         | 
| 207 | 
            +
                  assert_equal(expected, actual)
         | 
| 208 | 
            +
                  if_cgiext { assert_equal(CGI.parse(input), actual) }
         | 
| 209 | 
            +
                end
         | 
| 210 | 
            +
                ## different with CGI.parse()
         | 
| 211 | 
            +
                tdata = {}
         | 
| 212 | 
            +
                ## without '=' (CGI: {"a"=>[nil], "b"=>[nil]})
         | 
| 213 | 
            +
                if_cgiext { tdata['a&b'] =  {'a'=>[''], 'b'=>['']}     }
         | 
| 214 | 
            +
                if_cgialt { tdata['a&b'] =  {"a"=>[nil], "b"=>[nil]}   }
         | 
| 215 | 
            +
                ## no key  (CGI: {""=>["a", "b"], nil=>[nil]})
         | 
| 216 | 
            +
                if_cgiext { tdata['&=a&=b'] = {''=>['', 'a', 'b']}     }
         | 
| 217 | 
            +
                if_cgialt { tdata['&=a&=b'] = {""=>["a", "b"], nil=>[nil]}  }
         | 
| 218 | 
            +
                ## invalid format  (CGI: {"a"=>[""], "b"=>[nil]})
         | 
| 219 | 
            +
                if_cgiext { tdata['a=&b&&'] = {'a'=>[''], 'b'=>[''], ''=>['', '']}  }
         | 
| 220 | 
            +
                if_cgialt { tdata['a=&b&&'] = {"a"=>[""], "b"=>[nil]}  }
         | 
| 221 | 
            +
                tdata.each do |input, expected|
         | 
| 222 | 
            +
                  if_cgiext { actual = CGIExt.parse_query_string(input) }
         | 
| 223 | 
            +
                  if_cgialt { actual = CGI.parse(input) }
         | 
| 224 | 
            +
                  assert_equal(expected, actual)
         | 
| 225 | 
            +
                  if_cgiext { assert_equal(CGI.parse(input), actual) }
         | 
| 226 | 
            +
                end
         | 
| 227 | 
            +
                ## default value is frozen empty array
         | 
| 228 | 
            +
                assert_equal(actual['unknownkey'], [])
         | 
| 229 | 
            +
                ex = nil
         | 
| 230 | 
            +
                if "".respond_to?(:encoding)      # Ruby1.9
         | 
| 231 | 
            +
                  errclass = RuntimeError
         | 
| 232 | 
            +
                else
         | 
| 233 | 
            +
                  errclass = TypeError
         | 
| 234 | 
            +
                end
         | 
| 235 | 
            +
                ex = assert_raise(errclass) { actual['unknownkey'] << 'foo' }
         | 
| 236 | 
            +
                assert_equal("can't modify frozen array", ex.message)
         | 
| 237 | 
            +
              end
         | 
| 238 | 
            +
             | 
| 239 | 
            +
             | 
| 240 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,33 +1,26 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 | 
            -
            rubygems_version: 0.9.2
         | 
| 3 | 
            -
            specification_version: 1
         | 
| 4 2 | 
             
            name: cgialt
         | 
| 5 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 6 | 
            -
              version: 0.0 | 
| 7 | 
            -
            date: 2007-12-11 00:00:00 +09:00
         | 
| 8 | 
            -
            summary: an alternative of 'cgi.rb' in pure Ruby
         | 
| 9 | 
            -
            require_paths: 
         | 
| 10 | 
            -
            - lib
         | 
| 11 | 
            -
            email: 
         | 
| 12 | 
            -
            homepage: http://cgialt.rubyforge.org/
         | 
| 13 | 
            -
            rubyforge_project: 
         | 
| 14 | 
            -
            description: CGIAlt is an alternative library of 'cgi.rb'. It is compatible with and faster than 'cgi.rb'. It is able to install with CGIExt (which is re-implementation of cgi.rb in C extension).
         | 
| 15 | 
            -
            autorequire: 
         | 
| 16 | 
            -
            default_executable: 
         | 
| 17 | 
            -
            bindir: bin
         | 
| 18 | 
            -
            has_rdoc: false
         | 
| 19 | 
            -
            required_ruby_version: !ruby/object:Gem::Version::Requirement 
         | 
| 20 | 
            -
              requirements: 
         | 
| 21 | 
            -
              - - ">"
         | 
| 22 | 
            -
                - !ruby/object:Gem::Version 
         | 
| 23 | 
            -
                  version: 0.0.0
         | 
| 24 | 
            -
              version: 
         | 
| 4 | 
            +
              version: 1.0.0
         | 
| 25 5 | 
             
            platform: ruby
         | 
| 26 | 
            -
            signing_key: 
         | 
| 27 | 
            -
            cert_chain: 
         | 
| 28 | 
            -
            post_install_message: 
         | 
| 29 6 | 
             
            authors: 
         | 
| 30 7 | 
             
            - makoto kuwata
         | 
| 8 | 
            +
            autorequire: 
         | 
| 9 | 
            +
            bindir: bin
         | 
| 10 | 
            +
            cert_chain: []
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            date: 2008-11-09 00:00:00 +09:00
         | 
| 13 | 
            +
            default_executable: 
         | 
| 14 | 
            +
            dependencies: []
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            description: CGIAlt is an alternative library of 'cgi.rb'. It is compatible with and faster than 'cgi.rb'. It is able to install with CGIExt (which is re-implementation of cgi.rb in C extension).
         | 
| 17 | 
            +
            email: 
         | 
| 18 | 
            +
            executables: []
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            extensions: []
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            extra_rdoc_files: []
         | 
| 23 | 
            +
             | 
| 31 24 | 
             
            files: 
         | 
| 32 25 | 
             
            - lib/cgialt
         | 
| 33 26 | 
             
            - lib/cgialt/cookie.rb
         | 
| @@ -44,6 +37,7 @@ files: | |
| 44 37 | 
             
            - test/test_cgi_header.rb
         | 
| 45 38 | 
             
            - test/test_cgi_modruby.rb
         | 
| 46 39 | 
             
            - test/test_cgi_multipart.rb
         | 
| 40 | 
            +
            - test/test_cgi_util.rb
         | 
| 47 41 | 
             
            - test/testdata
         | 
| 48 42 | 
             
            - test/testdata/file1.html
         | 
| 49 43 | 
             
            - test/testdata/large.png
         | 
| @@ -52,17 +46,31 @@ files: | |
| 52 46 | 
             
            - bench.rb
         | 
| 53 47 | 
             
            - setup.rb
         | 
| 54 48 | 
             
            - CHANGES.txt
         | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 49 | 
            +
            has_rdoc: false
         | 
| 50 | 
            +
            homepage: http://cgialt.rubyforge.org/
         | 
| 51 | 
            +
            post_install_message: 
         | 
| 57 52 | 
             
            rdoc_options: []
         | 
| 58 53 |  | 
| 59 | 
            -
             | 
| 60 | 
            -
             | 
| 61 | 
            -
             | 
| 62 | 
            -
             | 
| 63 | 
            -
             | 
| 64 | 
            -
             | 
| 54 | 
            +
            require_paths: 
         | 
| 55 | 
            +
            - lib
         | 
| 56 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement 
         | 
| 57 | 
            +
              requirements: 
         | 
| 58 | 
            +
              - - ">="
         | 
| 59 | 
            +
                - !ruby/object:Gem::Version 
         | 
| 60 | 
            +
                  version: "0"
         | 
| 61 | 
            +
              version: 
         | 
| 62 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement 
         | 
| 63 | 
            +
              requirements: 
         | 
| 64 | 
            +
              - - ">="
         | 
| 65 | 
            +
                - !ruby/object:Gem::Version 
         | 
| 66 | 
            +
                  version: "0"
         | 
| 67 | 
            +
              version: 
         | 
| 65 68 | 
             
            requirements: []
         | 
| 66 69 |  | 
| 67 | 
            -
             | 
| 70 | 
            +
            rubyforge_project: 
         | 
| 71 | 
            +
            rubygems_version: 1.2.0
         | 
| 72 | 
            +
            signing_key: 
         | 
| 73 | 
            +
            specification_version: 2
         | 
| 74 | 
            +
            summary: an alternative of 'cgi.rb' in pure Ruby
         | 
| 75 | 
            +
            test_files: []
         | 
| 68 76 |  |