1

我们的生产 Rails 服务器接收来自外部服务(sparkpost)的 post 请求(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 堆栈崩溃,我们已经使用过滤掉了它们

编码('ASCII','二进制',无效::replace,undef::replace,replace:'')

人物看起来像 在此处输入图像描述

我可能认为我们以错误的方式处理这个问题,并且可以使用一些建议来将数据提供给服务,而这反过来又不会提供 Rails API 格式错误的 unicode 文本。

4

1 回答 1

0

原因是字符串 ( https://unicode-table.com/en/00A0/ )中存在一个不间断的 unicode 字符,但未通过问题文本中的应用过滤删除。

于 2021-10-07T22:22:38.830 回答