forked from cybrespace/mastodon
		
	Add alternate links to ActivityPub resources from HTML/HEAD variants (#4586)
This commit is contained in:
		
							parent
							
								
									b7370ac8ba
								
							
						
					
					
						commit
						a2aeacbfee
					
				
					 7 changed files with 24 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -23,6 +23,7 @@ module AccountControllerConcern
 | 
			
		|||
      [
 | 
			
		||||
        webfinger_account_link,
 | 
			
		||||
        atom_account_url_link,
 | 
			
		||||
        actor_url_link,
 | 
			
		||||
      ]
 | 
			
		||||
    )
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			@ -41,6 +42,13 @@ module AccountControllerConcern
 | 
			
		|||
    ]
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def actor_url_link
 | 
			
		||||
    [
 | 
			
		||||
      ActivityPub::TagManager.instance.uri_for(@account),
 | 
			
		||||
      [%w(rel alternate), %w(type application/activity+json)],
 | 
			
		||||
    ]
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def webfinger_account_url
 | 
			
		||||
    webfinger_url(resource: @account.to_webfinger_s)
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,7 +36,12 @@ class StatusesController < ApplicationController
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def set_link_headers
 | 
			
		||||
    response.headers['Link'] = LinkHeader.new([[account_stream_entry_url(@account, @status.stream_entry, format: 'atom'), [%w(rel alternate), %w(type application/atom+xml)]]])
 | 
			
		||||
    response.headers['Link'] = LinkHeader.new(
 | 
			
		||||
      [
 | 
			
		||||
        [account_stream_entry_url(@account, @status.stream_entry, format: 'atom'), [%w(rel alternate), %w(type application/atom+xml)]],
 | 
			
		||||
        [ActivityPub::TagManager.instance.uri_for(@status), [%w(rel alternate), %w(type application/activity+json)]],
 | 
			
		||||
      ]
 | 
			
		||||
    )
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def set_status
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,7 +38,12 @@ class StreamEntriesController < ApplicationController
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def set_link_headers
 | 
			
		||||
    response.headers['Link'] = LinkHeader.new([[account_stream_entry_url(@account, @stream_entry, format: 'atom'), [%w(rel alternate), %w(type application/atom+xml)]]])
 | 
			
		||||
    response.headers['Link'] = LinkHeader.new(
 | 
			
		||||
      [
 | 
			
		||||
        [account_stream_entry_url(@account, @stream_entry, format: 'atom'), [%w(rel alternate), %w(type application/atom+xml)]],
 | 
			
		||||
        [ActivityPub::TagManager.instance.uri_for(@stream_entry.activity), [%w(rel alternate), %w(type application/activity+json)]],
 | 
			
		||||
      ]
 | 
			
		||||
    )
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def set_stream_entry
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,6 +7,7 @@
 | 
			
		|||
 | 
			
		||||
  %link{ rel: 'salmon', href: api_salmon_url(@account.id) }/
 | 
			
		||||
  %link{ rel: 'alternate', type: 'application/atom+xml', href: account_url(@account, format: 'atom') }/
 | 
			
		||||
  %link{ rel: 'alternate', type: 'application/activity+json', href: ActivityPub::TagManager.instance.uri_for(@account) }/
 | 
			
		||||
 | 
			
		||||
  %meta{ property: 'og:type', content: 'profile' }/
 | 
			
		||||
  = render 'og', account: @account, url: short_account_url(@account, only_path: false)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@
 | 
			
		|||
 | 
			
		||||
  %link{ rel: 'alternate', type: 'application/atom+xml', href: account_stream_entry_url(@account, @stream_entry, format: 'atom') }/
 | 
			
		||||
  %link{ rel: 'alternate', type: 'application/json+oembed', href: api_oembed_url(url: account_stream_entry_url(@account, @stream_entry), format: 'json') }/
 | 
			
		||||
  %link{ rel: 'alternate', type: 'application/activity+json', href: ActivityPub::TagManager.instance.uri_for(@stream_entry.activity) }/
 | 
			
		||||
 | 
			
		||||
  %meta{ property: 'og:site_name', content: site_title }/
 | 
			
		||||
  %meta{ property: 'og:type', content: 'article' }/
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ describe ApplicationController, type: :controller do
 | 
			
		|||
    it 'sets link headers' do
 | 
			
		||||
      account = Fabricate(:account, username: 'username')
 | 
			
		||||
      get 'success', params: { account_username: 'username' }
 | 
			
		||||
      expect(response.headers['Link'].to_s).to eq '<http://test.host/.well-known/webfinger?resource=acct%3Ausername%40cb6e6126.ngrok.io>; rel="lrdd"; type="application/xrd+xml", <http://test.host/users/username.atom>; rel="alternate"; type="application/atom+xml"'
 | 
			
		||||
      expect(response.headers['Link'].to_s).to eq '<http://test.host/.well-known/webfinger?resource=acct%3Ausername%40cb6e6126.ngrok.io>; rel="lrdd"; type="application/xrd+xml", <http://test.host/users/username.atom>; rel="alternate"; type="application/atom+xml", <https://cb6e6126.ngrok.io/users/username>; rel="alternate"; type="application/activity+json"'
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'returns http success' do
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,7 @@ RSpec.describe StreamEntriesController, type: :controller do
 | 
			
		|||
 | 
			
		||||
        get route, params: { account_username: alice.username, id: status.stream_entry.id }
 | 
			
		||||
 | 
			
		||||
        expect(response.headers['Link'].to_s).to eq "<http://test.host/users/alice/updates/#{status.stream_entry.id}.atom>; rel=\"alternate\"; type=\"application/atom+xml\""
 | 
			
		||||
        expect(response.headers['Link'].to_s).to eq "<http://test.host/users/alice/updates/#{status.stream_entry.id}.atom>; rel=\"alternate\"; type=\"application/atom+xml\", <https://cb6e6126.ngrok.io/users/alice/statuses/#{status.id}>; rel=\"alternate\"; type=\"application/activity+json\""
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue