+ символ в значении cookie заменяется пробелом - PullRequest
1 голос
/ 16 мая 2019

У меня есть печенье с символом +. Значение cookie - что-то вроде +33123456789. С моего контроллера, если я сделаю cookies[:phoneNumber], он вернет 33123456789 (обратите внимание на пробел перед 3).

Я мог бы заменить пробел на +, но в куки-файле правильное значение, поэтому я предпочитаю найти способ прямого восстановления правильной стоимости куки-файла.

Почему рельсы убирают символ + и как этого избежать?

Спасибо

1 Ответ

2 голосов
/ 16 мая 2019

У меня есть файл cookie с символом + […], в нем указано правильное значение

В HTTP-запросе / ответе + в значении файла cookieимеет специальное значение: он представляет собой пробел.

Сервер устанавливает файлы cookie через заголовок HTTP:

Set-Cookie: NAME=VALUE

Клиент отправляет их обратно аналогичным образом:

Cookie: NAME=VALUE

Согласно spec последовательность NAME=VALUE не должна содержать точку с запятой, запятую и пробел.Чтобы добавить эти символы, они должны быть закодированы.Кодирование обычно будет процентное кодирование , которое отображает 3 исключенных символа в:

require 'rack/utils'

Rack::Utils.escape(';') #=> "%3B"
Rack::Utils.escape(',') #=> "%2C"
Rack::Utils.escape(' ') #=> "+"

Так что, если ваш контроллер превращает литерал + в пробел, он работает должным образом:

Rack::Utils.unescape('+33123456789')
#=> " 33123456789"

Чтобы правильно представить +, его нужно отправить как %2B:

Rack::Utils.escape('+33123456789')
#=> "%2B33123456789"

Расшифровка такого значения даст ожидаемый результат:

Rack::Utils.unescape('%2B33123456789')
#=> "+33123456789"

Обратите внимание, что Rails обрабатывает выход / удаление автоматически при доступе к файлам cookie через ActionController#cookies.

Возможно, вы установили файл cookie вручную или вне помощника cookies.Или (весьма маловероятно), что клиент неправильно кодирует cookie.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...