Как разобрать 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.