RegExp以验证http标头值
RegExp to validate a http header value
我正在向后端发送一个自定义标头:
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, '')
相关文章:
- AJAX HTTP基本身份验证解决方案
- 验证HTTP请求来自NFC标签上的点击
- 添加@javascript标记时,Cucumber中的HTTP身份验证失败
- javascript regexp,用于验证一开始没有http的url
- 使用$http.get()-OAuth身份验证下载带有Angular的远程文件
- postmates api的AJAX中的HTTP身份验证失败
- 安全 HTTP 基本身份验证
- 返回重定向到具有 HTTP 基本身份验证的 URL
- PHP 的 HTTP 基本身份验证的password_hash编码
- 在不使用任何http、https或ftp的情况下验证URL
- 如何在带有JQuery的Neo4j 2.2.x中使用事务Cypher HTTP端点和新的REST API身份验证和授权
- 无法连接到网络服务器.验证 Web 服务器是否正在运行,并且传入的 http 请求未被防火墙阻止
- 使用 NodeJS 的请求模块进行 HTTP 身份验证,返回未定义的正文
- 后台 PHP/JS 中的 HTTP 身份验证
- 是否可以通过 http 请求验证验证码?(阿迪达斯)
- jQuery 验证插件 - 删除 URL 的“http://”要求
- Chrome 的 HTTP BASIC 身份验证注销问题
- 使用 Node 和 hapijs/joi 验证多值 HTTP 标头
- 无法使用节点请求模块进行基本的 HTTP 身份验证
- URL验证REGEX-URL仅对http://有效