Как разобрать URL с косой чертой в части userinfo

У меня есть URL этого формата:

https://clientjiberish:[email protected]/users?username=tralala

когда я делаю:

url = 'https://clientjiberish:[email protected]/users?username=tralala'
uri = URI(url)

Я получаю все, что мне нужно.

uri.host => "api.example.com"
uri.userinfo => "clientjiberish:clientsecretjiberish"
uri.path => '/users'
uri.scheme => 'https'

Проблема возникает, когда часть userinfo содержит косую черту. У меня нет возможности изменить API, который обслуживает ключи API, поэтому мне нужно найти способ извлечь упомянутые части URI.

Вот пример того, что вы можете проверить URI:

url = 'https://clientjiberish:client/[email protected]/users?username=tralala'
uri = URI(url)

Ошибка:

URI::InvalidURIError: неверный URI (это не URI?)

Я узнал, что вы можете создать свой собственный парсер следующим образом:

parser = URI::Parser.new(:RESERVED => ";/?:@&=+$,\\[\\]")
uri = parser.parse(url)

но я недостаточно знаю регулярное выражение, чтобы заставить его работать.


person Marko Ćilimković    schedule 28.09.2016    source источник
comment
Не можете ли вы просто избежать косой черты в client/secretjiberish с помощью %2F?.   -  person Rashmirathi    schedule 28.09.2016
comment
@Rashmirathi Как я могу получить к нему доступ? Если я сделаю что-то вроде: escaped_url = URI.escape(url, '/') и затем URI(url), я не смогу использовать ни один из методов URI, так как все они возвращают nil.   -  person Marko Ćilimković    schedule 28.09.2016
comment
Я имею в виду только избежать его в части clientjiberish:client/secretjiberish , поэтому URL становится https://clientjiberish:client%[email protected]/users?username=tralala.   -  person Rashmirathi    schedule 28.09.2016
comment
Я получаю строку 'https://clientjiberish:[email protected]/users?username=tralala'. Как мне просто избежать этой части строки?   -  person Marko Ćilimković    schedule 29.09.2016


Ответы (1)


url = 'https://clientjiberish:client/[email protected]/users?username=tralala'
USER_INFO_REGEX = /\Ahttp[s]+:\/\/(.*)@.*\z/i
user_info = USER_INFO_REGEX.match(url)[1]
parsed_user_info = user_info.gsub(/\//, '%2F')
url = url.gsub(Regexp.new(user_info), parsed_user_info)
uri = URI(url)

USER_INFO_REGEX соответствует строке между https:// и @api.example.com.... Просто экранируйте строку с информацией о пользователе и замените ее в URL-адресе.

person Kapitol    schedule 01.02.2017