URL кодирует каждый возможный символ - PullRequest
1 голос
/ 15 октября 2019

Обычно я делаю запрос в Ruby, который не выполняется, потому что серверу не нравится кодировка. Типичным примером является наличие пробелов +, когда сервер понимает только %20. Сегодня я наткнулся на сервер, который не любит дешифрованные без кода (-), требуя %2D.

Я пробовал CGI.escape, URI.escape, ERB::Util.url_encode, WEBrick::HTTPUtils.escape, и ни один из них не кодирует дефисы.

В прошлом я прибегал к gsub по мере необходимости для символов-нарушителей, но, поскольку я нахожу больше серверов с большим количеством идиосинкразий, я бы предпочел более стабильное решение.

Существует ли стандартный (то есть без внешних зависимостей) подход, который в процентах кодирует все, что возможно?

Я не ищу только дефисное кодирование или gsub все по одному.

1 Ответ

3 голосов
/ 15 октября 2019

URI.escape устарел и заменен на CGI::escape, который соответствует RFC, захватывая не алфавитные символы и преобразуя их. Это модуль, который делает это:

# https://ruby-doc.org/stdlib-2.4.3/libdoc/cgi/rdoc/CGI/Util.html

# File cgi/util.rb, line 11
def escape(string)
  encoding = string.encoding
  string.b.gsub(/([^ a-zA-Z0-9_.-]+)/) do |m|
    '%' + m.unpack('H2' * m.bytesize).join('%').upcase
  end.tr(' ', '+').force_encoding(encoding)
end      

В конце концов, это сервер, который нуждается в исправлении, а не ваш код. Вы можете сделать monkeypatch или fork CGI и удалить - из регулярного выражения или gsub() символ.

...