From 0e4a05242df0abeb4cc20b9ee3c9ee2f894035c0 Mon Sep 17 00:00:00 2001 From: kookster Date: Thu, 15 Dec 2011 18:19:05 -0500 Subject: [PATCH] Add recursive search through request to see if it is multi-part, with test. --- lib/faraday/request/multipart.rb | 11 +++++------ test/request_middleware_test.rb | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/lib/faraday/request/multipart.rb b/lib/faraday/request/multipart.rb index 0bf96c55..7b627533 100644 --- a/lib/faraday/request/multipart.rb +++ b/lib/faraday/request/multipart.rb @@ -21,12 +21,11 @@ module Faraday ) end - def has_multipart?(body) - body.values.each do |val| - if val.respond_to?(:content_type) - return true - elsif val.respond_to?(:values) - return true if has_multipart?(val) + def has_multipart?(obj) + # string is an enum in 1.8, returning list of itself + if obj.respond_to?(:each) && !obj.is_a?(String) + (obj.respond_to?(:values) ? obj.values : obj).each do |val| + return true if (val.respond_to?(:content_type) || has_multipart?(val)) end end false diff --git a/test/request_middleware_test.rb b/test/request_middleware_test.rb index a1e9348d..4439e6e2 100644 --- a/test/request_middleware_test.rb +++ b/test/request_middleware_test.rb @@ -113,4 +113,27 @@ class RequestMiddlewareTest < Faraday::TestCase end assert_equal [], regexes end + + def test_multipart_with_arrays + # assume params are out of order + regexes = [ + /name\=\"a\"/, + /name=\"b\[\]\[c\]\"\; filename\=\"request_middleware_test\.rb\"/, + /name=\"b\[\]\[d\]\"/] + + payload = {:a => 1, :b =>[{:c => Faraday::UploadIO.new(__FILE__, 'text/x-ruby'), :d => 2}]} + response = @conn.post('/echo', payload) + + assert_kind_of Faraday::CompositeReadIO, response.body + assert_equal "multipart/form-data;boundary=%s" % Faraday::Request::Multipart::DEFAULT_BOUNDARY, + response.headers['Content-Type'] + + response.body.send(:ios).map{|io| io.read}.each do |io| + if re = regexes.detect { |r| io =~ r } + regexes.delete re + end + end + assert_equal [], regexes + end + end