diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index c0f7866bf5..e7bb0743d0 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -11,6 +11,8 @@ class HTMLRenderer < Redcarpet::Render::HTML def autolink(link, link_type) return link if link_type == :email Formatter.instance.link_url(link) + rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError + encode(link) end private diff --git a/spec/lib/formatter_spec.rb b/spec/lib/formatter_spec.rb index 633d59c2ab..efefb8f000 100644 --- a/spec/lib/formatter_spec.rb +++ b/spec/lib/formatter_spec.rb @@ -336,11 +336,22 @@ RSpec.describe Formatter do end context do + let(:content_type) { 'text/plain' } + subject do - status = Fabricate(:status, text: text, uri: nil) + status = Fabricate(:status, text: text, content_type: content_type, uri: nil) Formatter.instance.format(status) end + context 'given an invalid URL (invalid port)' do + let(:text) { 'https://foo.bar:X/' } + let(:content_type) { 'text/markdown' } + + it 'outputs the raw URL' do + is_expected.to eq '

https://foo.bar:X/

' + end + end + include_examples 'encode and link URLs' end @@ -464,7 +475,8 @@ RSpec.describe Formatter do subject { Formatter.instance.plaintext(status) } context 'given a post with local status' do - let(:status) { Fabricate(:status, text: '

a text by a nerd who uses an HTML tag in text

', uri: nil) } + let(:status) { Fabricate(:status, text: '

a text by a nerd who uses an HTML tag in text

', content_type: content_type, uri: nil) } + let(:content_type) { 'text/plain' } it 'returns the raw text' do is_expected.to eq '

a text by a nerd who uses an HTML tag in text

'