【发布时间】:2021-09-08 00:57:43
【问题描述】:
我们的生产 Rails 服务器接收来自外部服务 (sparkpost) 的发布请求 (hook),格式如下
data: {
...
"subject": "Your RedvanlyCategory: Men’s,<br>Redvanly Kent Pant, XL in Estate Blue arrived!",
...
}
请注意撇号字符“不是”。这会在以下位置破坏 rails 请求堆栈:
[4ce93af4ed8b] [28a6b892-2c45-409b-90cf-3d1b4fa9b5f7] no implicit conversion of nil into String excluded from capture: DSN not set
[4ce93af4ed8b] [28a6b892-2c45-409b-90cf-3d1b4fa9b5f7]
[4ce93af4ed8b] [28a6b892-2c45-409b-90cf-3d1b4fa9b5f7] ActionDispatch::Http::Parameters::ParseError (no implicit conversion of nil into String):
[4ce93af4ed8b] [28a6b892-2c45-409b-90cf-3d1b4fa9b5f7]
[4ce93af4ed8b] [28a6b892-2c45-409b-90cf-3d1b4fa9b5f7] actionpack (5.1.7) lib/action_dispatch/http/parameters.rb:115:in `rescue in parse_formatted_parameters'
为什么会这样? 撇号似乎是一个有效的 unicode 字符。从 ' 更改为 ' 不再破坏 rails 堆栈。
请求的头部是:
Accept application/json
Accept-Encoding gzip
Content-Length 3971
Content-Type application/json
Host 4ce93af4ed8b.ngrok.io
User-Agent SparkPost
X-Forwarded-For 52.37.3.48
X-Forwarded-Proto http
编辑:重现的卷曲
curl --location --request GET 'http://localhost:3000/receive_sparkpost_hooks' \
--header 'Content-Type: application/json' \
--data-raw '[{"subject":"Your RedvanlyCategory: Men’s,<br>Redvanly Kent Pant, XL in Estate Blue arrived!"}]'
之前我们已经看到一些 unicode 字符(sparkpost 和 JSON 应该支持 UTF-8),我们正在使 rails 堆栈崩溃,我们已经使用它们将它们过滤掉了
encode('ASCII', 'binary', 无效: :replace, undef: :replace, 替换: '')
我可能认为我们处理这个问题的方式错误,并且可以使用一些建议来将数据提供给服务,从而不会提供 Rails API 格式错误的 unicode 文本。
【问题讨论】:
-
是反引号还是撇号?
-
似乎不是反引号 (`) 而是 '(与您在本文中看到的字符相同)
-
是什么让你相信它是撇号,我没有看到它在你发布的堆栈跟踪中指向那里
-
这是一个“右撇号”或“右单引号”(compart.com/en/unicode/U+2019)
-
听起来 Rails 对请求的编码不满意
标签: ruby-on-rails json actionpack