FIX: Use URI#merge to merge base and relative URLs (#17454)
The old implementation did not handle all cases, such as the case when `src` is a relative URL that starts with `..`.
This commit is contained in:
parent
c94a011d9f
commit
e7f04a8674
|
@ -199,19 +199,12 @@ module Onebox
|
|||
end
|
||||
|
||||
def self.get_absolute_image_url(src, url)
|
||||
if src && !!(src =~ /^\/\//)
|
||||
uri = URI(url)
|
||||
src = "#{uri.scheme}:#{src}"
|
||||
elsif src && src.match(/^https?:\/\//i).nil?
|
||||
uri = URI(url)
|
||||
src = if !src.start_with?("/") && uri.path.present?
|
||||
"#{uri.scheme}://#{uri.host.sub(/\/$/, '')}#{uri.path.sub(/\/$/, '')}/#{src.sub(/^\//, '')}"
|
||||
else
|
||||
"#{uri.scheme}://#{uri.host.sub(/\/$/, '')}/#{src.sub(/^\//, '')}"
|
||||
end
|
||||
end
|
||||
begin
|
||||
URI.parse(url).merge(src).to_s
|
||||
rescue ArgumentError, URI::BadURIError, URI::InvalidURIError
|
||||
src
|
||||
end
|
||||
end
|
||||
|
||||
# Percent-encodes a URI string per RFC3986 - https://tools.ietf.org/html/rfc3986
|
||||
def self.uri_encode(url)
|
||||
|
|
|
@ -174,6 +174,15 @@ RSpec.describe Onebox::Helpers do
|
|||
it { expect(described_class.normalize_url_for_output('linear-gradient(310.77deg, #29AA9F 0%, #098EA6 100%)')).to eq("") }
|
||||
end
|
||||
|
||||
describe '.get_absolute_image_url' do
|
||||
it { expect(described_class.get_absolute_image_url('//meta.discourse.org/favicon.ico', 'https://meta.discourse.org')).to eq('https://meta.discourse.org/favicon.ico') }
|
||||
it { expect(described_class.get_absolute_image_url('http://meta.discourse.org/favicon.ico', 'https://meta.discourse.org')).to eq('http://meta.discourse.org/favicon.ico') }
|
||||
it { expect(described_class.get_absolute_image_url('https://meta.discourse.org/favicon.ico', 'https://meta.discourse.org')).to eq('https://meta.discourse.org/favicon.ico') }
|
||||
it { expect(described_class.get_absolute_image_url('/favicon.ico', 'https://meta.discourse.org')).to eq('https://meta.discourse.org/favicon.ico') }
|
||||
it { expect(described_class.get_absolute_image_url('/favicon.ico', 'https://meta.discourse.org/forum/subdir')).to eq('https://meta.discourse.org/favicon.ico') }
|
||||
it { expect(described_class.get_absolute_image_url('../favicon.ico', 'https://meta.discourse.org/forum/subdir/')).to eq('https://meta.discourse.org/forum/favicon.ico') }
|
||||
end
|
||||
|
||||
describe '.uri_encode' do
|
||||
it { expect(described_class.uri_encode('http://example.com/f"o&o?[b"ar]')).to eq("http://example.com/f%22o&o?%5Bb%22ar%5D") }
|
||||
it { expect(described_class.uri_encode("http://example.com/f.o~o;?<ba'r>")).to eq("http://example.com/f.o~o;?%3Cba%27r%3E") }
|
||||
|
|
Loading…
Reference in New Issue