diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 6bf427c24..a6c69a6b9 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -13,7 +13,7 @@ Metrics/AbcSize: # Offense count: 4 # Configuration parameters: CountComments. Metrics/ClassLength: - Max: 234 + Max: 235 # Offense count: 17 Metrics/CyclomaticComplexity: diff --git a/lib/faraday/connection.rb b/lib/faraday/connection.rb index 3776253ee..6318de585 100644 --- a/lib/faraday/connection.rb +++ b/lib/faraday/connection.rb @@ -522,6 +522,7 @@ def build_exclusive_url(url = nil, params = nil, params_encoder = nil) base = base.dup base.path = "#{base.path}/" # ensure trailing slash end + url = url && URI.parse(url.to_s).opaque ? url.to_s.gsub(':', '%3A') : url uri = url ? base + url : base if params uri.query = params.to_query(params_encoder || options.params_encoder) diff --git a/spec/faraday/connection_spec.rb b/spec/faraday/connection_spec.rb index 4f51f5682..5c7e3b60c 100644 --- a/spec/faraday/connection_spec.rb +++ b/spec/faraday/connection_spec.rb @@ -270,6 +270,29 @@ expect(uri.to_s).to eq('http://sushi.com/sake/') end end + + context 'with colon in path' do + let(:url) { 'http://service.com' } + + it 'joins url to base when used absolute path' do + conn = Faraday.new(url: url) + uri = conn.build_exclusive_url('/service:search?limit=400') + expect(uri.to_s).to eq('http://service.com/service:search?limit=400') + end + + it 'joins url to base when used relative path' do + conn = Faraday.new(url: url) + uri = conn.build_exclusive_url('service:search?limit=400') + expect(uri.to_s).to eq('http://service.com/service%3Asearch?limit=400') + end + + it 'joins url to base when used with path prefix' do + conn = Faraday.new(url: url) + conn.path_prefix = '/api' + uri = conn.build_exclusive_url('service:search?limit=400') + expect(uri.to_s).to eq('http://service.com/api/service%3Asearch?limit=400') + end + end end describe '#build_url' do