node.js - Azure 函数弄乱了 gzip 后的 POST 数据
问题描述
目前我正在实现一个 webhook,它指出发送到配置端点的请求将被压缩,我遇到了一个奇怪的错误。
我创建了一个中间件来处理请求数据的解压缩:
const buffer: Buffer[] = [];
request
.on("data", (chunk) => {
buffer.push(Buffer.from(chunk));
})
.on("end", () => {
const concatBuff: Buffer = Buffer.concat(buffer);
zlib.gunzip(concatBuff, (err, buff) => {
if (err) {
console.log("gunzip err", err);
return next(err);
}
request.body = buff.toString();
next();
});
});
我在所有其他正文解析器中间件之前添加了这个中间件,以避免与之不兼容。
所以我用这个 curl 命令测试它:
cat webhook.txt | gzip | curl -v -i --data-binary @- -H "Content-Encoding: gzip" http://localhost:3334
在使用 的此服务器中,azure-function-express
我收到此错误:
[1/9/2020 22:36:21] gunzip err Error: incorrect header check
[1/9/2020 22:36:21] at Zlib.zlibOnError [as onerror] (zlib.js:170:17) {
[1/9/2020 22:36:21] errno: -3,
[1/9/2020 22:36:21] code: 'Z_DATA_ERROR'
[1/9/2020 22:36:21] }
[1/9/2020 22:36:21]
似乎错误是因为标题不是gzip文件的“神奇数字”引起的:
<缓冲区1f ef bf bd 08 00 ef bf bd ef bf bd 4e 5f 00 03 ef bf bd 5d 6d 73 db b8 11 ef bf bd ef b f bd 5f ef bf bd e1 97 bb 6b 7d 16 ef bf bd 77 ef bf bd 73 ef ... 4589 更多字节>
但奇怪的是,我创建了一个新的 express 应用程序来使用完全相同的 curl 对其进行测试,并且它在那里完美地工作,所以createAzureFunctionHandler似乎有一些问题,或者我错过了一些东西。
你们在使用 Azure 函数时遇到过这些问题吗?
知道 Azure 搞砸了 gzip 数据吗?
解决方案
我刚得到 Azure 团队的答复,他们建议我在里面设置一个代理proxies.json
作为解决方法,所以如果有人遇到同样的问题,你可以设置一个新的代理来覆盖Content-Type
.
在我的情况下,我一直期待一个 gzipped json,所以如果你事先不知道这是哪种类型,这可能不适合你。
{
"$schema": "http://json.schemastore.org/proxies",
"proxies": {
"RequireContentType": {
"matchCondition": {
"route": "/api/HttpTrigger"
},
"backendUri": "https://proxy-example.azurewebsites.net/api/HttpTrigger",
"requestOverrides": {
"backend.request.headers.content-type": "application/octet-stream",
"backend.request.headers.request-content-type": "'{request.headers.content-type}'"
}
}
}
}
推荐阅读
- javascript - Froala 编辑器禁用下拉菜单中的按钮?
- java - 为什么优化的素数计数算法运行速度较慢
- html - 我在将 .css 文件中的 id 和类引用到 .html 文件时遇到问题
- networking - 网络只有登录后才能工作?
- angular - 角度如何将整数格式化为日期格式 hh/mm/ss
- node.js - 转译 .ts 源文件,无需依赖配置文件
- javascript - 您可以在 Javascript 中创建对对象数组的引用吗?
- python-3.x - 关于自动执行某些任务的问题
- swift - SwiftUI:单击按钮时如何呈现视图?
- c# - 使用属性值而不是枚举值将枚举序列化为 JSON