From 47d7bd55b710edc9eb2da95c79c911e0d43179f8 Mon Sep 17 00:00:00 2001 From: Bart ten Brinke Date: Wed, 11 Mar 2009 00:33:24 +0100 Subject: [PATCH] ActiveResource Deflate support --- activeresource/lib/active_resource/base.rb | 5 +++++ activeresource/lib/active_resource/connection.rb | 3 +++ activeresource/test/base_test.rb | 7 +++++++ activeresource/test/connection_test.rb | 13 +++++++++++++ .../lib/active_support/core_ext/http_response.rb | 8 ++++++++ activesupport/test/core_ext/http_response_test.rb | 11 +++++++++++ 6 files changed, 47 insertions(+), 0 deletions(-) create mode 100644 activesupport/lib/active_support/core_ext/http_response.rb create mode 100644 activesupport/test/core_ext/http_response_test.rb diff --git a/activeresource/lib/active_resource/base.rb b/activeresource/lib/active_resource/base.rb index a8c0da3..5e0ec93 100644 --- a/activeresource/lib/active_resource/base.rb +++ b/activeresource/lib/active_resource/base.rb @@ -333,6 +333,11 @@ module ActiveResource def headers @headers ||= {} end + + # Set headers to accept deflate encoding + def enable_deflate + @headers['Accept-Encoding'] = 'deflate' + end # Do not include any modules in the default element name. This makes it easier to seclude ARes objects # in a separate namespace without having to set element_name repeatedly. diff --git a/activeresource/lib/active_resource/connection.rb b/activeresource/lib/active_resource/connection.rb index 85103b5..574c898 100644 --- a/activeresource/lib/active_resource/connection.rb +++ b/activeresource/lib/active_resource/connection.rb @@ -155,6 +155,9 @@ module ActiveResource # Handles response and error codes from remote service. def handle_response(response) + + response.inflate! if response.respond_to?(:header) && response.header["content-encoding"] == "deflate" + case response.code.to_i when 301,302 raise(Redirection.new(response)) diff --git a/activeresource/test/base_test.rb b/activeresource/test/base_test.rb index 69bb324..726475f 100644 --- a/activeresource/test/base_test.rb +++ b/activeresource/test/base_test.rb @@ -568,6 +568,13 @@ class BaseTest < Test::Unit::TestCase ensure Person.headers.delete('key') end + + def test_deflate_header + Person.enable_deflate + assert_equal Person.headers['Accept-Encoding'], 'deflate' + ensure + Person.headers.delete('Accept-Encoding') + end def test_find_by_id_not_found assert_raise(ActiveResource::ResourceNotFound) { Person.find(99) } diff --git a/activeresource/test/connection_test.rb b/activeresource/test/connection_test.rb index 831fbc4..faba7d5 100644 --- a/activeresource/test/connection_test.rb +++ b/activeresource/test/connection_test.rb @@ -74,6 +74,17 @@ class ConnectionTest < Test::Unit::TestCase assert_response_raises ActiveResource::ConnectionError, code end end + + def test_handle_deflated_response + mock_response = mock('Net::HTTPResponse') + mock_response.expects(:header).returns("content-encoding" => "deflate") + mock_response.expects(:inflate!) + mock_response.stubs( :code => '200', :message => "OK", + :content_type => "text/html", + :body => '') + + handle_response(mock_response) + end ResponseHeaderStub = Struct.new(:code, :message, 'Allow') def test_should_return_allowed_methods_for_method_no_allowed_exception @@ -182,6 +193,8 @@ class ConnectionTest < Test::Unit::TestCase @http.expects(:get).with(path, {'Accept' => 'application/xhtml+xml'}).returns(ActiveResource::Response.new(@matz, 200, {'Content-Type' => 'text/xhtml'})) assert_nothing_raised(Mocha::ExpectationError) { @conn.get(path, {'Accept' => 'application/xhtml+xml'}) } end + + protected def assert_response_raises(klass, code) diff --git a/activesupport/lib/active_support/core_ext/http_response.rb b/activesupport/lib/active_support/core_ext/http_response.rb new file mode 100644 index 0000000..17ef52d --- /dev/null +++ b/activesupport/lib/active_support/core_ext/http_response.rb @@ -0,0 +1,8 @@ +# Adds the 'inflate!' method to HTTPResponse. +module Net + class HTTPResponse + def inflate! + @body = Zlib::Inflate.inflate(@body) + end + end +end diff --git a/activesupport/test/core_ext/http_response_test.rb b/activesupport/test/core_ext/http_response_test.rb new file mode 100644 index 0000000..0c0c9ca --- /dev/null +++ b/activesupport/test/core_ext/http_response_test.rb @@ -0,0 +1,11 @@ +class HTTPResponseTests < Test::Unit::TestCase + def test_inflate_method + response = Net::HTTPResponse.new + test_string = 'bacon!' + + response.instance_variable_set('@body', Zlib::Deflate.deflate(test_string)) + response.inflate! + + assert_equal test_string, response.instance_variable_get('@body') + end +end -- 1.6.0.6