def is_valid_uri(value, uri_pattern = RFC2396)
scheme = value.split(':').first
scheme.downcase! if scheme
if scheme == 'tag'
if !TAG.match(value)
return false, "invalid-tag-uri"
end
elsif scheme == "urn"
if !URN.match(value)
return false, "invalid-urn"
end
elsif uri_pattern.match(value).to_a.reject{|i| i == ''}.compact.length == 0 || uri_pattern.match(value)[0] != value
urichars = Regexp.new("^[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%,#]$", Regexp::MULTILINE)
if value.length > 0
value.each_byte do |b|
if b < 128 and !urichars.match([b].pack('c*'))
return false, "invalid-uri-char"
end
end
else
begin
if uri_pattern.match(value.encode('idna'))
return false, "uri-not-iri"
end
rescue
end
return false, "invalid-uri"
end
elsif ['http','ftp'].include?(scheme)
if !value.match(%r{^\w+://[^/].*})
return false, "invalid-http-or-ftp-uri"
end
elsif value.index(':') && scheme.match(/^[a-z]+$/) && !ALLOWED_SCHEMES.include?(scheme)
return false, "invalid-scheme"
end
return true, ""
end