From a2b5f7f3a8bebe7945388b653e33cc445854de93 Mon Sep 17 00:00:00 2001 From: Chris AtLee Date: Fri, 6 May 2022 10:49:09 -0400 Subject: [PATCH] Allow application/x-www-form-url_encoded POST requests to use file objects as the request body (#1415) --- lib/faraday/request/url_encoded.rb | 4 +++- spec/faraday/request/url_encoded_spec.rb | 13 ++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/faraday/request/url_encoded.rb b/lib/faraday/request/url_encoded.rb index 77aa44f8d..5ac7dcb35 100644 --- a/lib/faraday/request/url_encoded.rb +++ b/lib/faraday/request/url_encoded.rb @@ -31,7 +31,9 @@ def match_content_type(env) return unless process_request?(env) env.request_headers[CONTENT_TYPE] ||= self.class.mime_type - yield(env.body) unless env.body.respond_to?(:to_str) + return if env.body.respond_to?(:to_str) || env.body.respond_to?(:read) + + yield(env.body) end # @param env [Faraday::Env] diff --git a/spec/faraday/request/url_encoded_spec.rb b/spec/faraday/request/url_encoded_spec.rb index be377cdb1..bdd9e0ac0 100644 --- a/spec/faraday/request/url_encoded_spec.rb +++ b/spec/faraday/request/url_encoded_spec.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require 'stringio' + RSpec.describe Faraday::Request::UrlEncoded do let(:conn) do Faraday.new do |b| @@ -7,7 +9,11 @@ b.adapter :test do |stub| stub.post('/echo') do |env| posted_as = env[:request_headers]['Content-Type'] - [200, { 'Content-Type' => posted_as }, env[:body]] + body = env[:body] + if body.respond_to?(:read) + body = body.read + end + [200, { 'Content-Type' => posted_as }, body] end end end @@ -67,6 +73,11 @@ expect(response.body).to eq('a%5Bb%5D%5Bc%5D%5B%5D=d') end + it 'works with files' do + response = conn.post('/echo', StringIO.new('str=apple')) + expect(response.body).to eq('str=apple') + end + context 'customising default_space_encoding' do around do |example| Faraday::Utils.default_space_encoding = '%20'