用于验证 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, '')
我正在向我的 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, '')