У меня есть файл 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.