RegExp以验证http标头值

RegExp to validate a http header value

本文关键字:http 验证 RegExp      更新时间:2023-09-26

我正在向后端发送一个自定义标头:

var oXhr = new XMLHttpRequest;
oXhr.setRequestHeader("X-File-Name", fileName);

但是,例如,如果fileName包含重音符号,我得到:

SyntaxError:无法对"XMLHttpRequest"执行"setRequestHeader":"é-2015年12月3日.pdf"不是有效的HTTP标头字段值。

我很难理解医生。。。

编辑:

我意识到,尽管它看起来确实像一种口音,但它是不同的。这是字符:́

它的行为很奇怪(ascii代码769),它混淆了我的浏览器控制台,甚至混淆了phpStorm。不管怎样,它都会出现在下一个字符的顶部,即使是粘贴时(试试看)。问题是,此标头值的内容是用户从文件选择器中选择的文件名,而此文件名包含此字符。过滤此类事件的最佳方法是什么?

按照RFC7230-3.2.4的规定,只能使用US-ASCII。字段分析:

从历史上看,HTTP允许在ISO-8859-1字符集[ISO-8859-1],仅支持其他字符集通过使用[RFC2047]编码。在实践中,大多数HTTP头字段值仅使用US-ASCII字符集[USASCI]的子集。新定义的标题字段应将其字段值限制为US-ASCII八位字节。收件人应处理字段中的其他八位字节作为不透明数据的内容(obs文本)。

如果你尝试一些不支持的字符

oXhr.setRequestHeader("X-File-Name", "Φ");

然后你得到

Uncaught DOMException: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': 
'Φ' is not a valid HTTP header field value.

关键是说明书上写着

仅通过使用[RFC2047]编码来支持其他字符集。

所以你需要像这个一样对值"Φ"进行编码

oXhr.setRequestHeader("X-File-Name", "=?UTF-8?Q?=CE=A6?=");

在您的情况下,在发送filename之前,需要使用strutil或其他库对其进行编码。

或者只需从文件名中删除任何不可打印的US-ASCII字符

filename.replace(/[^'x20-'x7E]+/g, '')