Class: Collavre::LinkPreviewFetcher

Inherits:
Object
  • Object
show all
Defined in:
app/services/collavre/link_preview_fetcher.rb

Constant Summary collapse

USER_AGENT =
"Plan42LinkPreview/1.0".freeze
OPEN_TIMEOUT =
5
READ_TIMEOUT =
5
MAX_BYTES =
200_000
MAX_REDIRECTS =
3
HTML_CONTENT_TYPES =
[ "text/html", "application/xhtml+xml" ].freeze
REQUEST_OPTIONS =
{
  "User-Agent" => USER_AGENT,
  "Accept" => "text/html,application/xhtml+xml"
}.freeze
DISALLOWED_IPV4_RANGES =
[
  IPAddr.new("0.0.0.0/8"),
  IPAddr.new("100.64.0.0/10"),
  IPAddr.new("192.0.0.0/24"),
  IPAddr.new("198.18.0.0/15"),
  IPAddr.new("224.0.0.0/4"),
  IPAddr.new("240.0.0.0/4")
].freeze
DISALLOWED_IPV6_RANGES =
[
  IPAddr.new("::/128"),
  IPAddr.new("ff00::/8")
].freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(url, io_opener: URI, logger: Rails.logger) ⇒ LinkPreviewFetcher

Returns a new instance of LinkPreviewFetcher.



36
37
38
39
40
# File 'app/services/collavre/link_preview_fetcher.rb', line 36

def initialize(url, io_opener: URI, logger: Rails.logger)
  @url = url
  @io_opener = io_opener
  @logger = logger
end

Class Method Details

.fetch(url) ⇒ Object



32
33
34
# File 'app/services/collavre/link_preview_fetcher.rb', line 32

def self.fetch(url)
  new(url).fetch
end

Instance Method Details

#fetchObject



42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'app/services/collavre/link_preview_fetcher.rb', line 42

def fetch
  uri = safe_http_uri
  return {} unless uri

  html, base_uri = read_html(uri)
  return {} if html.blank?

  document = Nokogiri::HTML(html)
  (document, base_uri)
rescue StandardError => e
  @logger&.warn("Link preview fetch failed for #{@url}: #{e.class} #{e.message}")
  {}
end