Fix some failure cases on FetchLinkCardService (#5347)

* If OEmbed response doesn't have a required property `type`, ignore it.
  e.g. `NoMethodError: undefined method 'type' for ...`
* If we failed to detect encoding, fallback to default behavior of Nokogiri.
  e.g. `KeyError: key not found: :encoding`
This commit is contained in:
unarist 2017-10-12 19:01:32 +09:00 committed by Eugen Rochko
parent 9d84b6e606
commit 35ec1c91e3

View File

@ -72,6 +72,8 @@ class FetchLinkCardService < BaseService
def attempt_oembed def attempt_oembed
response = OEmbed::Providers.get(@url) response = OEmbed::Providers.get(@url)
return false unless response.respond_to?(:type)
@card.type = response.type @card.type = response.type
@card.title = response.respond_to?(:title) ? response.title : '' @card.title = response.respond_to?(:title) ? response.title : ''
@card.author_name = response.respond_to?(:author_name) ? response.author_name : '' @card.author_name = response.respond_to?(:author_name) ? response.author_name : ''
@ -113,7 +115,7 @@ class FetchLinkCardService < BaseService
detector.strip_tags = true detector.strip_tags = true
guess = detector.detect(html, response.charset) guess = detector.detect(html, response.charset)
page = Nokogiri::HTML(html, nil, guess&.fetch(:encoding)) page = Nokogiri::HTML(html, nil, guess&.fetch(:encoding, nil))
if meta_property(page, 'twitter:player') if meta_property(page, 'twitter:player')
@card.type = :video @card.type = :video