Closed ZhangKejun closed 4 years ago
嗯,你这个我要先测试下
你好,我不太清楚,你是需要ajax请求一个本地资源吗,这是什么样的场景?
你好,我不太清楚,你是需要ajax请求一个本地资源吗,这是什么样的场景?
我这边的场景是浏览器加载网页,网页可能是本地地址,也可能是网络地址;然后就遇到下面这两种情况,目前你的代码满足不了,所以我做了调整。上次的代码有缺陷,这次又做了一些调整;
NSURL *nativeURL = [NSURL URLWithString:url];
if (!nativeURL.scheme) {
/*------------兼容的代码 start------------*/
// 说明是相对路径,一般是资源文件
// 示例1
// {
// async = 1;
// host = "m.feng1.com";
// href = "https://m.feng1.com/mall/app/index.html?channel=xxx&ddsds=ewew2222";
// id = 632;
// method = GET;
// port = "";
// referer = "
// 先按照?截取,然后按照#截取
NSString* path = [href componentsSeparatedByString:@"?"][0]; // 按“?”进行分割,获取第一个字符串
path = [path componentsSeparatedByString:@"#"][0]; // 按“#”进行分割,获取第一个字符串
path = [path stringByDeletingLastPathComponent]; // 删除最后一个“/”之后的内容,获取到当前文件的相对路径
if ([scheme hasPrefix:@"file:"]) {
// 本地相对路径
if (![url hasPrefix:@"/"]){
path = [NSString stringWithFormat:@"%@/",path];
}
// 完整路径
url = [NSString stringWithFormat:@"%@%@",path,url];
}else{
// 网络相对路径
if (![url hasPrefix:@"/"]){
url = [NSString stringWithFormat:@"%@%@",path,url];
}else {
// 网络路径,拼接host
NSString *tmpPort = port.length > 0 ? [NSString stringWithFormat:@":%@", port] : @"";
url = [NSString stringWithFormat:@"%@//%@%@%@",scheme, host, tmpPort, url];
}
}
/*-----------兼容的代码 end-------------*/
/*-----------下面是你原来的代码--------*/
// NSFileManager fm = [NSFileManager defaultManager]; // // if (nativeURL.pathComponents > 0) { // if (nativeURL.host) { // url = [NSString stringWithFormat:@"%@%@",scheme, url]; // } else { // NSString tmpPath = [url hasPrefix:@"/"] ? url : [NSString stringWithFormat:@"/%@", url]; // NSString *tmpPort = port.length > 0 ? [NSString stringWithFormat:@":%@", port] : @""; // url = [NSString stringWithFormat:@"%@//%@%@%@",scheme, host, tmpPort, tmpPath]; // } // } else { // url = href; // }
}
嗯,你提一个PR吧
嗯,你提一个PR吧
已经提交,请查收。顺带提交了一些其他的内容
嗯,好的,不好意思,这么久才回复。我review了下,你的提交,也给了下建议,你看看呢。
现在没有路径问题了
解决本地资源的ajax请求漏洞: 修改原因: 如果通过ajax请求发起本地资源的获取,比如url="abc.html"; href="file://test/index.html" 按照原来的代码,最终获取的地址为url="file://abc.html"; 但实际应用获取到的url="file://test/abc.html"才对;
修改文件为:KKJSBridgeModuleXMLHttpRequestDispatcher.m 修改如下:
(void)open:(KKJSBridgeEngine )engine params:(NSDictionary )params responseCallback:(void (^)(NSDictionary responseData))responseCallback { NSNumber objectId = params[@"id"]; KKJSBridgeXMLHttpRequest xhr = [self getXHR:engine.webView objectId:objectId]; if (!xhr) { xhr = [self generateXHR:engine objectId:objectId responseCallback:responseCallback]; } NSString method = params[@"method"]; NSString url = params[@"url"]; NSString userAgent = params[@"useragent"] ? params[@"useragent"] : @"iOS"; NSString referer = params[@"referer"]; NSString scheme = params[@"scheme"]; NSString host = params[@"host"]; NSString port = params[@"port"] ? params[@"port"] : @""; NSString *href = params[@"href"];
NSURL *nativeURL = [NSURL URLWithString:url]; if (!nativeURL.scheme) {
// if (nativeURL.pathComponents > 0) { // if (nativeURL.host) { // url = [NSString stringWithFormat:@"%@%@",scheme, url]; // } else { // if ([url hasPrefix:@"/"]) {// 处理 【/】情况 // NSString tmpPath = url; // NSString tmpPort = port.length > 0 ? [NSString stringWithFormat:@":%@", port] : @""; // url = [NSString stringWithFormat:@"%@//%@%@%@",scheme, host, tmpPort, tmpPath]; // } else { // 处理 【./】 【../】 【../../】和前面没有前缀的情况 // url = [[href stringByAppendingPathComponent:url] stringByStandardizingPath]; // } // } // } else { // url = href; // } }
}