首页 > 解决方案 > 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 数据吗?

标签: node.jstypescriptazureexpressazure-functions

解决方案


我刚得到 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}'"
            }
        }
    }
}

推荐阅读