From 864a7e52f3343159d247bc0c6f896f4d3dba5eeb Mon Sep 17 00:00:00 2001 From: Karl Entwistle Date: Sun, 29 Mar 2020 11:48:15 +0100 Subject: [PATCH] Encode Spaces in Query Strings as '%20' Instead of '+' (#1125) --- lib/faraday/utils.rb | 10 +++++++++- spec/faraday/request/url_encoded_spec.rb | 13 +++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/faraday/utils.rb b/lib/faraday/utils.rb index efe2feb92..45545d150 100644 --- a/lib/faraday/utils.rb +++ b/lib/faraday/utils.rb @@ -16,12 +16,20 @@ def build_nested_query(params) NestedParamsEncoder.encode(params) end + def default_space_encoding + @default_space_encoding ||= '+' + end + + class << self + attr_writer :default_space_encoding + end + ESCAPE_RE = /[^a-zA-Z0-9 .~_-]/.freeze def escape(str) str.to_s.gsub(ESCAPE_RE) do |match| '%' + match.unpack('H2' * match.bytesize).join('%').upcase - end.tr(' ', '+') + end.gsub(' ', default_space_encoding) end def unescape(str) diff --git a/spec/faraday/request/url_encoded_spec.rb b/spec/faraday/request/url_encoded_spec.rb index b6380cbb2..9f89a5615 100644 --- a/spec/faraday/request/url_encoded_spec.rb +++ b/spec/faraday/request/url_encoded_spec.rb @@ -67,4 +67,17 @@ response = conn.post('/echo', 'a' => { 'b' => { 'c' => ['d'] } }) expect(response.body).to eq('a%5Bb%5D%5Bc%5D%5B%5D=d') end + + context 'customising default_space_encoding' do + around do |example| + Faraday::Utils.default_space_encoding = '%20' + example.run + Faraday::Utils.default_space_encoding = nil + end + + it 'uses the custom character to encode spaces' do + response = conn.post('/echo', str: 'apple banana') + expect(response.body).to eq('str=apple%20banana') + end + end end