path.extname方法判断失准
Closed this issue · 10 comments
问题重现
有童鞋反馈在 KISSY@1.4.2 下使用jsonp
请求时会返回出错。经排查是由于发出的jsonp请求的url中的querystring段带有.css
这样的字符,导致发出的请求其实是css
类型,而不是javascript
类型。
重现demo
问题根本
进一步排查可发现是path
模块的extname
方法返回的文件后缀名有误导致的,如下:
//path.extname源码
extname: function (path) {
return (path.match(splitPathRe) || [])[4] || '';
//其中的splitPathRe是 /^(\/?)([\s\S]+\/(?!$)|\/)?((?:\.{1,2}$|[\s\S]+?)?(\.[^.\/]*)?)$/
}
//example
var str = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=apple&_ksTS=1427335444993_15&callback=jsonp16&test.css';
var result = Path.extname(str); //.css
这个正则判断方式确实有失严谨,考虑一下怎么做到更加完善
因为接口也有理由返回 .css 文件内容,所以其实无法给一个明确定义哪种 url 是 css,哪种是 json / jsonp
有个办法是,再加一个条件,如果 url 中有 callback=xxx,则不判定为 css
@pushiming 这个跟jsonp没太大关系吧,是path.extname这个方法的问题,像 http://www.test.com/haha.js?param1=22¶m2=guest.css
这样不应该返回后缀名为.css
吧
我觉得即使请求的是.css,也应该触发回调,只是回调中的数据可以为空。
@flyinhigh io
模块的回调是触发的了,只是因为是css
类型,jsonp函数无法正常执行而已
上次乔福断点了一下,好像回调函数直接是null了,没有触发,如果触发最起码会报错。。
你看我上面提供的demo,有触发回调的
跑到error里面了。。。这个还是没办法解决.css的问题啊,建议不要判断hash了。。
恩,是啊,这个根本问题是path
模块里面的extname
方法的问题,需要修复完善
@weekeight 我内个的意思是,在语义上,这样的格式返回 css 是有可能的:
http://api.example.com/getMyStyle.do?param=foo.css
此前对path.extname
的语义理解有误,先更正为: 参照 node 的 path.extname
,对类似这样的字符串getMyStyle.do?param=foo.css
返回.css
,从语义上理解也仅是返回路径后缀,并非文件名后缀。故这个问题还是应该在 io
模块里面解决,不能通过这么粗暴的方式来加载 jsonp
请求的资源文件