Анализ URI, имеющих фигурные скобки, URI :: InvalidURIError: bad URI (не является ли URI?) - PullRequest
2 голосов
/ 13 января 2012

Использование ruby ​​1.9.2-p290. Я столкнулся с проблемой, пытаясь проанализировать URI, как показано ниже:

require 'uri'
my_uri = "http://www.anyserver.com/getdata?anyparameter={330C-B5A2}"
the_uri = URI.parse(my_uri)

выдает следующую ошибку:

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

Мне требуется другое решение, чем кодировка фигурных скобок каждый раз, как это:

new_uri = URI.encode("http://www.anyserver.com/getdata?anyparameter={330C-B5A2}")
=> "http://www.anyserver.com/getdata?anyparameter=%7B330C-B5A2%7D"

Теперь я могу анализировать new_uri как обычно, но приходилось делать это каждый раз, когда мне это было нужно. Какой самый простой способ достичь этого, не делая это каждый раз?

Я публикую свое собственное решение, поскольку я не видел это точно так, как решил.


# Accepts URIs when they contain curly braces
# This overrides the DEFAULT_PARSER with the UNRESERVED key, including '{' and '}'
module URI
  def self.parse(uri)
    URI::Parser.new(:UNRESERVED => URI::REGEXP::PATTERN::UNRESERVED + "\{\}").parse(uri)
  end
end

Теперь я могу использовать URI.parse (uri) с uri, содержащим фигурные скобки, и не выдается никакой ошибки.

Ответы [ 2 ]

5 голосов
/ 13 января 2012
# Need to not fail when uri contains curly braces
# This overrides the DEFAULT_PARSER with the UNRESERVED key, including '{' and '}'
# DEFAULT_PARSER is used everywhere, so its better to override it once
module URI
  remove_const :DEFAULT_PARSER
  unreserved = REGEXP::PATTERN::UNRESERVED
  DEFAULT_PARSER = Parser.new(:UNRESERVED => unreserved + "\{\}")
end

Следуя той же проблеме, поскольку DEFAULT_PARSER используется повсеместно, лучше заменить его полностью замененным только методом URI # parse Кроме того, это позволяет избежать выделения памяти для создания экземпляров нового объекта Parser каждый раз.

2 голосов
/ 13 января 2012

RFC 1738 - http://www.faqs.org/rfcs/rfc1738.html означает, что вам нужно закодировать скобки

Thus, only alphanumerics, the special characters "$-_.+!*'(),", and
reserved characters used for their reserved purposes may be used
unencoded within a URL.
...