diff --git a/app/models/link.rb b/app/models/link.rb index 4a8e451..88e8563 100644 --- a/app/models/link.rb +++ b/app/models/link.rb @@ -1,3 +1,5 @@ +require 'net/http' + class Link < ApplicationRecord belongs_to :link_category has_rich_text :description_html @@ -5,7 +7,7 @@ class Link < ApplicationRecord validates :url, :text, presence: true validate :check_url validate :valid_url - + before_validation :ensure_absolute_url def ok? @@ -14,21 +16,21 @@ class Link < ApplicationRecord private - USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0" + USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0' def check_url(input = url, add_error = true) response = begin - Net::HTTP.get_response(URI.parse(input), "User-Agent": USER_AGENT) + Net::HTTP.get_response(URI.parse(input), 'User-Agent': USER_AGENT) rescue Socket::ResolutionError errors.add(:url, :invalid) if add_error return false end - + case response when Net::HTTPSuccess self.last_check_at = Time.zone.now self.fail_count = 0 - + true when Net::HTTPRedirection check_url(response[:location]) @@ -42,10 +44,10 @@ class Link < ApplicationRecord end def ensure_absolute_url - self.url = "https://#{self.url}" unless self.url.match?(%r{https{0,1}://.*}) + self.url = "https://#{url}" unless url.match?(%r{https{0,1}://.*}) end def valid_url - errors.add(:url, :invalid) unless url.match /\A#{URI::regexp(['http', 'https'])}\z/ + errors.add(:url, :invalid) unless url.match(/\A#{URI::DEFAULT_PARSER.make_regexp(%w[http https])}\z/) end end