diff --git a/lib/stripe/file_upload.rb b/lib/stripe/file_upload.rb index fde9b9b4..97a37217 100644 --- a/lib/stripe/file_upload.rb +++ b/lib/stripe/file_upload.rb @@ -15,6 +15,13 @@ module Stripe end def self.create(params={}, opts={}) + # rest-client would accept a vanilla `File` for upload, but Faraday does + # not. Support the old API by wrapping a `File` with an `UploadIO` object + # if we're given one. + if params[:file] && params[:file].is_a?(File) + params[:file] = Faraday::UploadIO.new(params[:file], nil) + end + opts = { :content_type => 'multipart/form-data', }.merge(Util.normalize_opts(opts)) diff --git a/lib/stripe/stripe_client.rb b/lib/stripe/stripe_client.rb index bb50c975..0cd8ac9f 100644 --- a/lib/stripe/stripe_client.rb +++ b/lib/stripe/stripe_client.rb @@ -29,6 +29,7 @@ module Stripe # object per thread. Thread.current[:stripe_client_default_conn] ||= begin conn = Faraday.new do |c| + c.use Faraday::Request::Multipart c.use Faraday::Request::UrlEncoded c.use Faraday::Response::RaiseError c.adapter Faraday.default_adapter diff --git a/test/stripe/file_upload_test.rb b/test/stripe/file_upload_test.rb index 709471b2..88bf90be 100644 --- a/test/stripe/file_upload_test.rb +++ b/test/stripe/file_upload_test.rb @@ -35,7 +35,11 @@ module Stripe should "be creatable" do stub_request(:post, "#{Stripe.uploads_base}/v1/files"). - to_return(body: JSON.generate(FIXTURE)) + with(:headers => { + "Content-Type" => %r|\A#{Faraday::Request::Multipart.mime_type}| + }) { |request| + request.body =~ /FileUploadTest/ + }.to_return(body: JSON.generate(FIXTURE)) file = Stripe::FileUpload.create( purpose: "dispute_evidence", @@ -43,5 +47,20 @@ module Stripe ) assert file.kind_of?(Stripe::FileUpload) end + + should "be creatable with Faraday::UploadIO" do + stub_request(:post, "#{Stripe.uploads_base}/v1/files"). + with(:headers => { + "Content-Type" => %r|\A#{Faraday::Request::Multipart.mime_type}| + }) { |request| + request.body =~ /FileUploadTest/ + }.to_return(body: JSON.generate(FIXTURE)) + + file = Stripe::FileUpload.create( + purpose: "dispute_evidence", + file: Faraday::UploadIO.new(File.new(__FILE__), nil), + ) + assert file.kind_of?(Stripe::FileUpload) + end end end