Improve URL validation to check for a valid host.

Parsing a URL with `URI` is not sufficient as the following cases
are considered valid:

URI.parse("http://https://google.com")
=> #<URI::HTTP http://https//google.com>
This commit is contained in:
Guo Xiang Tan
2017-12-21 12:27:17 +08:00
parent ba3bf9c7bb
commit 6ecf37c482
4 changed files with 52 additions and 15 deletions

View File

@ -1,9 +1,15 @@
class UrlValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
if value.present?
uri = URI.parse(value) rescue nil
valid =
begin
uri = URI.parse(value)
uri.is_a?(URI::HTTP) && !uri.host.nil? && uri.host.include?(".")
rescue
nil
end
unless uri
unless valid
record.errors[attribute] << (options[:message] || I18n.t('errors.messages.invalid'))
end
end