Skip to content

Commit

Permalink
Fixed an exception when using Ajax based requests from Safari because…
Browse files Browse the repository at this point in the history
… Safari appends a \000 to the post body. Symbols can't have \000 in them so indifferent access would throw an exception in the constructor. Indifferent hashes now use strings internally instead. rails#746 [Tobias Luetke]

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@827 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information
dhh committed Mar 3, 2005
1 parent e834be7 commit e4106a5
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 10 deletions.
2 changes: 2 additions & 0 deletions activesupport/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*

* Fixed an exception when using Ajax based requests from Safari because Safari appends a \000 to the post body. Symbols can't have \000 in them so indifferent access would throw an exception in the constructor. Indifferent hashes now use strings internally instead. #746 [Tobias Luetke]

* Added String#to_time and String#to_date for wrapping ParseDate


Expand Down
@@ -1,8 +1,8 @@
class HashWithIndifferentAccess < Hash
def initialize(constructor)
def initialize(constructor = {})
if constructor.is_a?(Hash)
super()
update(constructor.symbolize_keys)
update(constructor.stringify_keys)
else
super(constructor)
end
Expand All @@ -12,7 +12,7 @@ def initialize(constructor)

def [](key)
case key
when Symbol: regular_reader(key) || regular_reader(key.to_s)
when Symbol: regular_reader(key.to_s) || regular_reader(key)
when String: regular_reader(key) || regular_reader(key.to_sym)
else regular_reader(key)
end
Expand All @@ -21,7 +21,7 @@ def [](key)
alias_method :regular_writer, :[]= unless method_defined?(:regular_writer)

def []=(key, value)
regular_writer(key.is_a?(String) ? key.to_sym : key, value)
regular_writer(key.is_a?(Symbol) ? key.to_s : key, value)
end
end

Expand Down
26 changes: 20 additions & 6 deletions activesupport/test/core_ext/hash_ext_test.rb
Expand Up @@ -3,6 +3,7 @@

class HashExtTest < Test::Unit::TestCase
def setup

@strings = { 'a' => 1, 'b' => 2 }
@symbols = { :a => 1, :b => 2 }
@mixed = { :a => 1, 'b' => 2 }
Expand Down Expand Up @@ -31,7 +32,7 @@ def test_symbolize_keys!
assert_equal @symbols, @strings.dup.symbolize_keys!
assert_equal @symbols, @mixed.dup.symbolize_keys!

assert_raises(NoMethodError) { { [] => 1 }.symbolize_keys! }
assert_raises(NoMethodError) { { [] => 1 }.symbolize_keys }
end

def test_stringify_keys
Expand All @@ -50,11 +51,24 @@ def test_indifferent_access
@strings = @strings.with_indifferent_access
@symbols = @symbols.with_indifferent_access
@mixed = @mixed.with_indifferent_access

assert_equal @strings[:a], @strings["a"]
assert_equal @symbols[:a], @symbols["a"]
assert_equal @strings["b"], @mixed["b"]
assert_equal @strings[:b], @mixed["b"]

assert_equal @strings[:a], @strings['a']
assert_equal @symbols[:a], @symbols['a']
assert_equal @strings['b'], @mixed['b']
assert_equal @strings[:b], @mixed['b']
end

def test_indifferent_writing
hash = HashWithIndifferentAccess.new
hash[:a] = 1
hash['b'] = 2
hash[3] = 3

assert_equal hash['a'], 1
assert_equal hash['b'], 2
assert_equal hash[:a], 1
assert_equal hash[:b], 2
assert_equal hash[3], 3
end

def test_assert_valid_keys
Expand Down

0 comments on commit e4106a5

Please sign in to comment.