用于验证 http header 值的正则表达式

RegExp to validate a http header value

我正在向我的 back-end 发送自定义 header:

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

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

SyntaxError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': 'é - December 3rd, 2015.pdf' is not a valid HTTP header field value.

我很难理解 doc...

编辑:

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

它的行为很奇怪(ascii 代码 769),它混淆了我的浏览器控制台甚至 phpStorm。它位于下一个字符的 顶部 上,无论如何,即使粘贴时也是如此(试试看)。问题是这个 header 值的内容是用户从文件选择器中选择的文件名,并且这个文件名包含这个字符。过滤此类事件的最佳方法是什么?

只应按 RFC7230 - 3.2.4. Field Parsing 中指定的方式使用 US-ASCII :

Historically, HTTP has allowed field content with text in the ISO-8859-1 charset [ISO-8859-1], supporting other charsets only through use of [RFC2047] encoding. In practice, most HTTP header field values use only a subset of the US-ASCII charset [USASCII]. Newly defined header fields SHOULD limit their field values to US-ASCII octets. A recipient SHOULD treat other octets in field content (obs-text) as opaque data.

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

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

然后你得到

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

关键是规范说的地方

... supporting other charsets only through use of [RFC2047] encoding.

因此您需要像这样对值“Φ”进行编码

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

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

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

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