aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Koziarski <michael@koziarski.com>2008-02-09 22:21:55 +0000
committerMichael Koziarski <michael@koziarski.com>2008-02-09 22:21:55 +0000
commit5396b0f3b0c2f6a2afc4ab1af114123bc410cc4d (patch)
treee6b9d665528f28830f139881ebb4119f11a0a9f6
parent9e13b966f6fa19b19c34abfe29400b6f826e00c7 (diff)
downloadrails-5396b0f3b0c2f6a2afc4ab1af114123bc410cc4d.tar.gz
rails-5396b0f3b0c2f6a2afc4ab1af114123bc410cc4d.tar.bz2
rails-5396b0f3b0c2f6a2afc4ab1af114123bc410cc4d.zip
Use HEAD instead of GET inside exists? Closes #11062 [bscofield]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8827 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r--activeresource/CHANGELOG2
-rw-r--r--activeresource/lib/active_resource/base.rb8
-rw-r--r--activeresource/lib/active_resource/connection.rb6
-rw-r--r--activeresource/lib/active_resource/http_mock.rb4
-rw-r--r--activeresource/test/base_test.rb5
-rw-r--r--activeresource/test/connection_test.rb7
6 files changed, 29 insertions, 3 deletions
diff --git a/activeresource/CHANGELOG b/activeresource/CHANGELOG
index 89878aa214..cbb56c5609 100644
--- a/activeresource/CHANGELOG
+++ b/activeresource/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Use HEAD instead of GET in exists? [bscofield]
+
* Fix small documentation typo. Closes #10670 [l.guidi]
* find_or_create_resource_for handles module nesting. #10646 [xavier]
diff --git a/activeresource/lib/active_resource/base.rb b/activeresource/lib/active_resource/base.rb
index eea6259a64..97baa46682 100644
--- a/activeresource/lib/active_resource/base.rb
+++ b/activeresource/lib/active_resource/base.rb
@@ -436,7 +436,13 @@ module ActiveResource
# Note.exists(1349)
# # => false
def exists?(id, options = {})
- id && !find_single(id, options).nil?
+ if id
+ prefix_options, query_options = split_options(options[:params])
+ path = element_path(id, prefix_options, query_options)
+ response = connection.head(path, headers)
+ response.code == 200
+ end
+ # id && !find_single(id, options).nil?
rescue ActiveResource::ResourceNotFound
false
end
diff --git a/activeresource/lib/active_resource/connection.rb b/activeresource/lib/active_resource/connection.rb
index 2bf83b1615..e4e6da50c9 100644
--- a/activeresource/lib/active_resource/connection.rb
+++ b/activeresource/lib/active_resource/connection.rb
@@ -101,6 +101,12 @@ module ActiveResource
request(:post, path, body.to_s, build_request_headers(headers))
end
+ # Execute a HEAD request.
+ # Used to ...
+ def head(path, headers= {})
+ request(:head, path, build_request_headers(headers))
+ end
+
private
# Makes request to remote service.
diff --git a/activeresource/lib/active_resource/http_mock.rb b/activeresource/lib/active_resource/http_mock.rb
index d70364c5eb..d1c1412575 100644
--- a/activeresource/lib/active_resource/http_mock.rb
+++ b/activeresource/lib/active_resource/http_mock.rb
@@ -9,7 +9,7 @@ module ActiveResource
@responses = responses
end
- for method in [ :post, :put, :get, :delete ]
+ for method in [ :post, :put, :get, :delete, :head ]
module_eval <<-EOE, __FILE__, __LINE__
def #{method}(path, request_headers = {}, body = nil, status = 200, response_headers = {})
@responses[Request.new(:#{method}, path, nil, request_headers)] = Response.new(body || "", status, response_headers)
@@ -56,7 +56,7 @@ module ActiveResource
EOE
end
- for method in [ :get, :delete ]
+ for method in [ :get, :delete, :head ]
module_eval <<-EOE, __FILE__, __LINE__
def #{method}(path, headers)
request = ActiveResource::Request.new(:#{method}, path, nil, headers)
diff --git a/activeresource/test/base_test.rb b/activeresource/test/base_test.rb
index 3808209f79..7606c56bcf 100644
--- a/activeresource/test/base_test.rb
+++ b/activeresource/test/base_test.rb
@@ -36,6 +36,11 @@ class BaseTest < Test::Unit::TestCase
mock.put "/people//addresses/1.xml", {}, nil, 404
mock.delete "/people//addresses/1.xml", {}, nil, 404
mock.post "/people//addresses.xml", {}, nil, 404
+ mock.head "/people/1.xml", {}, nil, 200
+ mock.head "/people/99.xml", {}, nil, 404
+ mock.head "/people/1/addresses/1.xml", {}, nil, 200
+ mock.head "/people/1/addresses/2.xml", {}, nil, 404
+ mock.head "/people/2/addresses/1.xml", {}, nil, 404
end
end
diff --git a/activeresource/test/connection_test.rb b/activeresource/test/connection_test.rb
index 8ffc4dfbb2..38fdbd3b2f 100644
--- a/activeresource/test/connection_test.rb
+++ b/activeresource/test/connection_test.rb
@@ -27,6 +27,7 @@ class ConnectionTest < Test::Unit::TestCase
mock.delete "/people/2.xml", @header, nil, 200
mock.post "/people.xml", {}, nil, 201, 'Location' => '/people/5.xml'
mock.post "/members.xml", {}, @header, 201, 'Location' => '/people/6.xml'
+ mock.head "/people/1.xml", {}, nil, 200
end
end
@@ -105,6 +106,12 @@ class ConnectionTest < Test::Unit::TestCase
assert_equal "Matz", matz["name"]
end
+ def test_head
+ response = @conn.head("/people/1.xml")
+ assert response.body.blank?
+ assert_equal 200, response.code
+ end
+
def test_get_with_header
david = @conn.get("/people/2.xml", @header)
assert_equal "David", david["name"]