2011-02-21 1 views
3

У меня есть объект URI.Объединение и удаление Ruby URI

require 'uri' 
uri = URI.parse 'http://example.com' 

Мне нужно объединить некоторый путь к этому URI.

path = URI.escape('/?foo[123]=5') 
uri.merge!(path) 

И получать исключение:

URI::InvalidURIError: bad URI(is not URI?): /?foo[123]=5 

Это происходит потому, что некоторые символы в пути считаются небезопасными ("[" и "]"), но эти символы Ware не спасся URI.escape.

Я решить эту проблему с помощью двух URI.escape вызовов:

path = URI.escape(URI.escape('/?foo[123]=5'), '[]') 
uri.merge!(path) 

Вопрос: почему URI.escape не выполняет, что избежать по умолчанию?

Или, может быть, есть лучший способ сделать это?

ответ

1

Использование CGI.escape вместо URI.escape:

require 'uri' 
require 'cgi' 
uri = URI.parse 'http://example.com'  
path = CGI.escape('/?foo[123]=5') 
uri.merge!(path) #=> #<URI::HTTP:0x00000002947918 URL:http://example.com/%2F%3Ffoo%5B123%5D%3D5> 
+2

Обратите внимание, что знак вопроса весьма вероятно, следует оставить неперекодированный. – Phrogz