Как мне сделать метод URI.parse?

Некоторые популярные сайты блогов обычно используют квадратные скобки в своих URL-адресах, но встроенный в ruby ​​метод URI.parse() блокирует их, вызывая неприятное исключение, согласно: http://redmine.ruby-lang.org/issues/show/1466

Я пытаюсь написать простой патч, который изящно обрабатывает URL с квадратной скобкой. Вот то, что я имею до сих пор:

require 'uri'

module URI

    def self.parse_with_safety(uri)
        safe_uri = uri.replace('[', '%5B')
        safe_uri = safe_uri.replace(']', '%5D')
        URI.parse_without_safety(safe_uri)
    end

    alias_method_chain :parse, :safety

end

Но при запуске это выдает ошибку:

/Library/Ruby/Gems/1.8/gems/activesupport-2.3.8/lib/active_support/core_ext/module/aliasing.rb:33:in alias_method: NameError: неопределенный метод 'parse' для модуля 'URI'

Как я могу успешно обезьяна-патч URI.parse?

2 ответа

Решение

alias_method_chain выполняется на уровне модуля, поэтому он влияет только на методы экземпляра.

Что вам нужно сделать, это выполнить его на уровне класса модуля:

require 'uri'

module URI
  class << self

    def parse_with_safety(uri)
      parse_without_safety uri.gsub('[', '%5B').gsub(']', '%5D')
    end

    alias parse_without_safety parse
    alias parse parse_with_safety
  end
end

@nil его комментарий очень полезен, мы получили следующее:

def parse_with_safety(uri)
  begin
    parse_without_safety uri.gsub(/([{}|\^\[\]\@`])/) {|s| URI.escape(s)}
  rescue
    parse_without_safety '/'
  end
end
Другие вопросы по тегам