kissyteam/path

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

见下正则语法图:
image

这个正则判断方式确实有失严谨,考虑一下怎么做到更加完善

因为接口也有理由返回 .css 文件内容,所以其实无法给一个明确定义哪种 url 是 css,哪种是 json / jsonp

有个办法是,再加一个条件,如果 url 中有 callback=xxx,则不判定为 css

@pushiming 这个跟jsonp没太大关系吧,是path.extname这个方法的问题,像 http://www.test.com/haha.js?param1=22&param2=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 请求的资源文件