我的应用程序是用 Perl 5.14.2 编写的。我处理多部分/表单数据
use CGI;
$query = new CGI;
几周后,此过程在特定 Apple 设备上调用 Apache 级别的超时:
(70007)指定的超时已过期:读取请求实体数据时出错
调用超时错误的苹果设备都有Applewebkit/605
共同点。这主要是 Mac 上的 Safari 浏览器版本 11。
表单数据通过以下方式发送:
var fData = new FormData($('#myForm')[0]);
jQuery.ajax({
url: '/urladdress',
data: fData,
cache: false,
dataType: 'html',
contentType: false,
processData: false,
type: 'POST'
});
我发现当表单数据包含空的“文件”类型的元素(未提供文件)时,就会出现问题。问题不依赖于 CGI 或 CGI::Simple 的使用。即使只是尝试获取 STDIN 缓冲区也会引发错误。
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
解决方法是在分配表单数据之前删除 <form> 的空文件元素,从而删除表单数据:
$('#myForm').find("input[type='file']").each(function(){
if ($(this).get(0).files.length === 0) {$(this).remove();}
});
var fData = new FormData($('#myForm')[0]);
...
自 2018 年 4 月 11 日以来,该错误似乎已为人所知
https://bugs.webkit.org/show_bug.cgi?id=184490
似乎已经在 Stackoverflow
Safari 11.1 上报告过:当 input[type=file] 为空时,ajax/XHR 表单提交失败