mirror of
https://github.com/lunaisnotaboy/mastodon.git
synced 2024-09-12 13:16:55 +00:00
to_s method of HTTP::Response keeps blocking while it receives the whole content, no matter how it is big. This means it may waste time to receive unacceptably large files. It may also consume memory and disk in the process. This solves the inefficency by checking response length while receiving.
48 lines
1.4 KiB
Ruby
48 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class ProviderDiscovery < OEmbed::ProviderDiscovery
|
|
class << self
|
|
def get(url, **options)
|
|
provider = discover_provider(url, options)
|
|
|
|
options.delete(:html)
|
|
|
|
provider.get(url, options)
|
|
end
|
|
|
|
def discover_provider(url, **options)
|
|
format = options[:format]
|
|
|
|
html = if options[:html]
|
|
Nokogiri::HTML(options[:html])
|
|
else
|
|
Request.new(:get, url).perform do |res|
|
|
raise OEmbed::NotFound, url if res.code != 200 || res.mime_type != 'text/html'
|
|
Nokogiri::HTML(res.body_with_limit)
|
|
end
|
|
end
|
|
|
|
if format.nil? || format == :json
|
|
provider_endpoint ||= html.at_xpath('//link[@type="application/json+oembed"]')&.attribute('href')&.value
|
|
format ||= :json if provider_endpoint
|
|
end
|
|
|
|
if format.nil? || format == :xml
|
|
provider_endpoint ||= html.at_xpath('//link[@type="text/xml+oembed"]')&.attribute('href')&.value
|
|
format ||= :xml if provider_endpoint
|
|
end
|
|
|
|
raise OEmbed::NotFound, url if provider_endpoint.nil?
|
|
begin
|
|
provider_endpoint = Addressable::URI.parse(provider_endpoint)
|
|
provider_endpoint.query = nil
|
|
provider_endpoint = provider_endpoint.to_s
|
|
rescue Addressable::URI::InvalidURIError
|
|
raise OEmbed::NotFound, url
|
|
end
|
|
|
|
OEmbed::Provider.new(provider_endpoint, format)
|
|
end
|
|
end
|
|
end
|