lib/flavicon/finder.rb in flavicon-0.1.1 vs lib/flavicon/finder.rb in flavicon-0.2.0
- old
+ new
@@ -1,39 +1,49 @@
+# frozen_string_literal: true
+
module Flavicon
- class Finder < Struct.new(:url)
+ class Finder
require 'uri'
require 'net/http'
require 'nokogiri'
TooManyRedirects = Class.new(StandardError)
+ attr_reader :url
+
+ def initialize(url)
+ @url = url
+ end
+
def find
response, resolved = request(url)
favicon_url = extract_from_html(response.body, resolved) || default_path(resolved)
verify_favicon_url(favicon_url)
end
def verify_favicon_url(url)
response, resolved = request(url)
return unless response.is_a?(Net::HTTPSuccess) && response.body.to_s != '' && response.content_type =~ /image/i
+
resolved
end
def extract_from_html(html, url)
- link = Nokogiri::HTML(html).css('head link').find do |link|
- link[:rel] =~ /\A(shortcut )?icon\z/i
+ link = Nokogiri::HTML(html).css('head link').find do |node|
+ node[:rel] =~ /\A(shortcut )?icon\z/i
end
URI.join(url, link[:href]).to_s if link
end
def default_path(url)
URI.join(url, '/favicon.ico').to_s
end
+ # rubocop:disable Metrics/AbcSize,MethodLength
def request(url, limit = 10)
- raise TooManyRedirects if limit < 0
+ raise TooManyRedirects if limit.negative?
uri = URI.parse(url)
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Get.new(uri.request_uri)
@@ -45,12 +55,13 @@
response = http.request(request)
if response.is_a? Net::HTTPRedirection
request(extract_location(response, url), limit - 1)
else
- return response, url
+ [response, url]
end
end
+ # rubocop:enable Metrics/AbcSize,MethodLength
# While the soon-to-be obsolete IETF standard RFC 2616 (HTTP 1.1) requires a complete absolute URI for redirection,
# the most popular web browsers tolerate the passing of a relative URL as the value for a Location header field.
# Consequently, the current revision of HTTP/1.1 makes relative URLs conforming.
def extract_location(response, url)