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

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

https://clientjiberish:clientsecretjiberish@api.example.com/users?username=tralala

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

url = 'https://clientjiberish:clientsecretjiberish@api.example.com/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/secretjiberish@api.example.com/users?username=tralala'
uri = URI(url)

Ошибка:

URI:: InvalidURIError: плохой URI(не является ли URI?)

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

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

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

1 ответ

url = 'https://clientjiberish:client/secretjiberish@api.example.com/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.

Другие вопросы по тегам