def link_back_present?
return false if @body.empty?
- Nokogiri::HTML(@body).xpath('//a[contains(concat(" ", normalize-space(@rel), " "), " me ")]|//link[contains(concat(" ", normalize-space(@rel), " "), " me ")]').any? { |link| link['href'] == @link_back }
+ links = Nokogiri::HTML(@body).xpath('//a[contains(concat(" ", normalize-space(@rel), " "), " me ")]|//link[contains(concat(" ", normalize-space(@rel), " "), " me ")]')
+
+ if links.any? { |link| link['href'] == @link_back }
+ true
+ elsif links.empty?
+ false
+ else
+ link_redirects_back?(links.first['href'])
+ end
+ end
+
+ def link_redirects_back?(test_url)
+ redirect_to_url = Request.new(:head, test_url, follow: false).perform do |res|
+ res.headers['Location']
+ end
+
+ redirect_to_url == @link_back
end
end
let(:field) { Account::Field.new(account, 'name' => 'Website', 'value' => 'http://example.com') }
before do
+ stub_request(:head, 'https://redirect.me/abc').to_return(status: 301, headers: { 'Location' => ActivityPub::TagManager.instance.url_for(account) })
stub_request(:get, 'http://example.com').to_return(status: 200, body: html)
subject.call(field)
end
end
end
+ context 'when a link goes through a redirect back' do
+ let(:html) do
+ <<-HTML
+ <!doctype html>
+ <head>
+ <link type="text/html" href="https://redirect.me/abc" rel="me" />
+ </head>
+ HTML
+ end
+
+ it 'marks the field as verified' do
+ expect(field.verified?).to be true
+ end
+ end
+
context 'when a link does not contain a link back' do
let(:html) { '' }