Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug] Getting Error while uploading file "Unexpected end of form at Multipart._final" #5135

Closed
MissNanLan opened this issue Jan 29, 2023 · 10 comments

Comments

@MissNanLan
Copy link

MissNanLan commented Jan 29, 2023

问题描述

  • 问题:busboy 抛出 "Unexpected end of form at Multipart._final" 错误, 我看了下依赖关系 egg-muitipart ->co-busboy->busboy,点击issue,根据作者回应

image

  • 解决办法: 只要将req.pipe 换成 bb.end 即可

  • 报错截图:
    image

可复现问题的仓库地址(Reproduction Repo)

Node 版本号:

v16.14.2

Eggjs 版本号:

3.3.3

相关插件名称与版本号(PlugIn and Name):

egg-multipart@^3.1.0 co-busboy "^2.0.0" busboy "^1.6.0"

操作平台与版本号(Platform and Version):

macOS Monterey 12.3.1

@fengmk2
Copy link
Member

fengmk2 commented Jan 29, 2023

@MissNanLan 能否提供一下可复现的代码库,这样可以快速修复。

@MissNanLan
Copy link
Author

MissNanLan commented Jan 29, 2023

@fengmk2 很抱歉,无法复现。我们生产日志的告警,另外又发现

image,点击issue

看上去,是egg的间接依赖busboy导致的问题

@fengmk2
Copy link
Member

fengmk2 commented Jan 29, 2023

这种是 multipart 上传数据不正确,你的代码应该要做异常捕获处理。

@WinfredWang
Copy link

WinfredWang commented May 4, 2023

同样问题

构造一个非法文件上传http请求,就会报Unexpected end of form 错误,然后worker重启。

复现方式:构造一个非法的文件上传请求(比如,将http协议中换行符修改下),请求代码如下:

var http = require('follow-redirects').http;


var options = {
   'method': 'POST',
   'hostname': '127.0.0.1',
   'port': 7001,
   'path': '/test/fileupload'
};

var req = http.request(options, function (res) {
   var chunks = [];

   res.on("data", function (chunk) {
      chunks.push(chunk);
   });

   res.on("end", function (chunk) {
      var body = Buffer.concat(chunks);
      console.log(body.toString());
   });

   res.on("error", function (error) {
      console.error(error);
   });
});

// http协议中换行符是\r\n,为了构造异常场景,可以去掉\r
var postData = "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"files\"; filename=\"test.txt\"\r\nContent-Type: \"text/plain\"\r\n\r\n123456789\n------WebKitFormBoundary7MA4YWxkTrZu0gW--";

req.setHeader('content-type', 'multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW');

req.write(postData);

req.end();

尝试以下方法均无法捕获

1、主动监听异常:process.on('uncaughtException', (err) => {}) 可以捕获到异常但是worker仍然会重启
2、使用egg内置异常监听,均无法捕获

这种如何处理,才能防止worker重启?@fengmk2

@fengmk2
Copy link
Member

fengmk2 commented May 4, 2023

@WinfredWang 我明天重现一下

@fengmk2
Copy link
Member

fengmk2 commented May 6, 2023

复现成功了,我们会尽快修复。

@fengmk2
Copy link
Member

fengmk2 commented May 6, 2023

cojs/busboy#49

@fengmk2
Copy link
Member

fengmk2 commented May 6, 2023

will close by cojs/busboy#31

@fengmk2
Copy link
Member

fengmk2 commented May 6, 2023

@WinfredWang @MissNanLan 重新安装依赖,已经修复。

@fengmk2
Copy link
Member

fengmk2 commented May 7, 2023

@atian25 stream 超难得一个真实案例。

@fengmk2 fengmk2 closed this as completed May 7, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants