RegExp验证http标头值

时间:2016-01-08 05:56:41

标签: javascript http header xmlhttprequest

我正在向我的后端发送自定义标题:

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

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

  

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

我很难理解doc ...

修改

我意识到即使它确实看起来像一个口音,它也有所不同。这是角色:

它表现得很奇怪(ascii代码769),它混淆了我的浏览器控制台甚至phpStorm。无论如何,即使粘贴(尝试),它也会出现在下一个角色的顶层上。问题是此标头值的内容是用户从文件选择器中选择的文件名,并且此文件名包含此字符。过滤此类事件的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

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

  

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

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

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?=");

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

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

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