RDF :: Reader> Проблемы с URI :: InvalidError - PullRequest
0 голосов
/ 24 июня 2011

У меня проблемы с этим кодом:

require 'rubygems'
require 'rdf'
require 'rdf/raptor'

RDF::Reader.open("http://reegle.info/countries/IN.rdf") do |reader|
  reader.each_statement do |statement|
    puts statement.inspect
  end
end

При попытке открыть вышеупомянутый URL я перенаправляюсь на URL, который URI.parse явно не нравится:

http://sparql.reegle.info?query=CONSTRUCT+{+%3Chttp://reegle.info/countries/IN%3E+?p+?o.+%3Chttp://reegle.info/countries/IN.rdf%3E+foaf:primaryTopic+%3Chttp://reegle.info/countries/IN%3E;+cc:license+%3Chttp://www.nationalarchives.gov.uk/doc/open-government-licence%3E;+cc:attributionName+"REEEP";+cc:attributionURL+%3Chttp://reegle.info/countries/IN%3E.+}+WHERE+{+%3Chttp://reegle.info/countries/IN%3E+?p+?o.}&format=application/rdf%2Bxml

Итак, я получаю следующую ошибку:

URI::InvalidURIError: bad URI(is not URI?)

Любые идеи, как обойти эту проблему?

Спасибо

PS Делать что-то вроде URI.parse(URI.encode ([url]))) здесь не имеет никаких эффектов.

1 Ответ

1 голос
/ 24 июня 2011

URI не нравятся двойные кавычки или фигурные скобки в этом URL.Вы можете исправить URI вручную следующим образом:

# This auto-populating cache isn't necessary but...
replacements = Hash.new { |h,k| h[k] = URI.encode(k) }
broken_uri.gsub!(/[{}"]/) { replacements[$&] }

From RFC 1738: унифицированные указатели ресурсов (URL) :

Таким образом, толькобуквенно-цифровые символы, специальные символы "$-_.+!*'()," и зарезервированные символы, используемые для их зарезервированных целей, могут использоваться без кодировки в URL-адресе.

Так что я бы сказал, что reegle.info должен быть кодированием URLбольше вещей, чем они есть.OTOH, класс URI в Ruby может быть немного более щадящим (например, класс URI в Perl примет этот URI как входной, но он преобразует двойные кавычки и фигурные скобки в их кодированную в процентах форму на выходе).

...