From 2d7b251eaece7de62157837dc54d76a9fe69b4f9 Mon Sep 17 00:00:00 2001 From: erichmzhang Date: Mon, 30 Jul 2018 20:19:47 +0800 Subject: [PATCH] =?UTF-8?q?#=205.4.7=20-=20=E5=A2=9E=E5=8A=A0=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E8=A7=A3=E6=9E=90=20Hosts=20=E7=9A=84?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 44 ++++++++------- QCloudCOSXML.podspec | 6 +- QCloudCOSXML/Classes/QCloudCOSXMLVersion.h | 6 +- QCloudCOSXML/Classes/QCloudCOSXMLVersion.m | 2 +- .../Transfer/QCloudUploadPartCopyRequest.h | 2 +- QCloudCore.podspec | 2 +- .../QCLOUDRestNet/DNSCache/QCloudHttpDNS.h | 25 ++++++++- .../QCLOUDRestNet/DNSCache/QCloudHttpDNS.m | 56 ++++++++++--------- .../Error/NSError+QCloudNetworking.h | 3 +- QCloudCore/Classes/QCloudCoreVersion.h | 2 +- QCloudCore/Classes/QCloudCoreVersion.m | 2 +- 11 files changed, 91 insertions(+), 59 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a89612..7e0e430 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,36 +1,41 @@ -#5.4.6 +# 5.4.7 +- 增加自定义解析 Hosts 的功能 + +# 5.4.6 - Get Object Request 增加 versionID 支持 --static_frameworks支持 - -#5.4.5 +- static_frameworks支持 +- Region 和 Bucket 增加非法字符校验,增加安全系数 +- 修复一处参数缺失会导致的 Crash + +# 5.4.5 - 修复一些 Crash - + # 5.4.4 - QCloudCOSXMLService 中封装了一些常用接口 - 修复了对于中文路径,并且路径中带/结尾时签名不正确的问题 - 修复了多版本相关接口里的问题 - 修复了分片上传 Resume 时,如果路径不在沙盒中会失败的问题 - 修复了与 FCUUID 冲突的问题 - -#5.4.3 + +# 5.4.3 - 修复Copy接口中,source为中文时会导致403的问题 - + # 5.4.2 - 修复了返回数组类型的属性,如果数组内容只有一个时候会解析失败的问题。 - + # 5.4.1 - 修复了 XML 中以 / 结尾的 Object 会403的的问题。 - + # 5.4.0 -- 修复了iOS8上面首次上传失败的问题 +- 修复了iOS8上面首次上传失败的问题 - 修复了反复多次调用分块复制接口会Crash的问题 - + # 5.3.4 - 修复了 GetBucket 时,无法正确获得 Common Prefix 的 BUG。 - + # 5.3.2 - 修复了签名时取到的某些头部可能会变更的问题 - + # 5.3.0 - 增加了生成预签名 URL 的接口。 - 增加列出指定前缀 Object 所有版本的接口。 @@ -41,24 +46,25 @@ - 针对弱网络情况进行优化,大幅度提高弱网络情况下上传成功率。 - 修复分块 Copy 大文件的问题。 - 签名计算时支持自定义开始和结束时间。 - + # 5.2.0 - 增加了精简版的SDK,只支持上传下载功能。 - BucketName概念统一。 - 支持查看Response中原始的HTTP Response内容。 - 其它一些BUG修复与性能优化。 - + # 5.1.3 - BucketName概念统一。 - + # 5.1.2 - 修复C++混编情况下的问题 - + # 5.1.1 - 修复了一些问题 - + # 5.1.0 - 增加了LifeCycle相关接口。 - 增加了Copy Object的接口。 - 分块上传初始化时,返回resumeData,方便异常情况中断后的续传。 - 其它一些优化。 + diff --git a/QCloudCOSXML.podspec b/QCloudCOSXML.podspec index c31e6c7..5513355 100644 --- a/QCloudCOSXML.podspec +++ b/QCloudCOSXML.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "QCloudCOSXML" -s.version = "5.4.6" +s.version = "5.4.7" s.summary = "QCloudCOSXML 腾讯云iOS-SDK组件" s.homepage = "https://cloud.tencent.com/" @@ -9,12 +9,12 @@ s.version = "5.4.6" s.source = { :git => "https://github.com/tencentyun/qcloud-sdk-ios.git", :tag => s.version.to_s } s.ios.deployment_target = '8.0' s.source_files = 'QCloudCOSXML/Classes/**/*' - s.dependency "QCloudCore",'5.4.6' + s.dependency "QCloudCore",'5.4.7' s.static_framework = true s.subspec 'Transfer' do |sbt| sbt.source_files = 'QCloudCOSXML/Classes/Transfer/*','QCloudCOSXML/Classes/Base/*' - sbt.dependency "QCloudCore",'5.4.6' + sbt.dependency "QCloudCore",'5.4.7' # sbt.static_framework=true end end diff --git a/QCloudCOSXML/Classes/QCloudCOSXMLVersion.h b/QCloudCOSXML/Classes/QCloudCOSXMLVersion.h index 5089680..5a7e292 100644 --- a/QCloudCOSXML/Classes/QCloudCOSXMLVersion.h +++ b/QCloudCOSXML/Classes/QCloudCOSXMLVersion.h @@ -6,11 +6,11 @@ #ifndef QCloudCOSXMLModuleVersion_h #define QCloudCOSXMLModuleVersion_h -#define QCloudCOSXMLModuleVersionNumber 504006 +#define QCloudCOSXMLModuleVersionNumber 504007 //dependency -#if QCloudCoreModuleVersionNumber != 504006 - #error "库QCloudCOSXML依赖QCloudCore最小版本号为5.4.6,当前引入的QCloudCore版本号过低,请及时升级后使用" +#if QCloudCoreModuleVersionNumber != 504007 + #error "库QCloudCOSXML依赖QCloudCore最小版本号为5.4.7,当前引入的QCloudCore版本号过低,请及时升级后使用" #endif // diff --git a/QCloudCOSXML/Classes/QCloudCOSXMLVersion.m b/QCloudCOSXML/Classes/QCloudCOSXMLVersion.m index 19c881a..d13863d 100644 --- a/QCloudCOSXML/Classes/QCloudCOSXMLVersion.m +++ b/QCloudCOSXML/Classes/QCloudCOSXMLVersion.m @@ -1,5 +1,5 @@ #import "QCloudCOSXMLVersion.h" -NSString * const QCloudCOSXMLModuleVersion = @"5.4.6"; +NSString * const QCloudCOSXMLModuleVersion = @"5.4.7"; NSString * const QCloudCOSXMLModuleName = @"QCloudCOSXML"; @interface QCloudQCloudCOSXMLLoad : NSObject @end diff --git a/QCloudCOSXML/Classes/Transfer/QCloudUploadPartCopyRequest.h b/QCloudCOSXML/Classes/Transfer/QCloudUploadPartCopyRequest.h index fd11ac0..bcc5f9b 100644 --- a/QCloudCOSXML/Classes/Transfer/QCloudUploadPartCopyRequest.h +++ b/QCloudCOSXML/Classes/Transfer/QCloudUploadPartCopyRequest.h @@ -118,7 +118,7 @@ request.partNumber = 1; // 标志当前分块的序号 */ @property (strong, nonatomic) NSString *sourceIfNoneMatch; /** - 指定源文件的版本号 + 指定 Object 的 Version ID (在开启了多版本的情况下) */ @property (strong, nonatomic) NSString *versionID; diff --git a/QCloudCore.podspec b/QCloudCore.podspec index 9da868c..3982f47 100644 --- a/QCloudCore.podspec +++ b/QCloudCore.podspec @@ -8,7 +8,7 @@ Pod::Spec.new do |s| s.name = "QCloudCore" -s.version = "5.4.6" +s.version = "5.4.7" s.summary = "QCloudCore--腾讯云iOS-SDK Foundation" # This description is used to generate tags and improve search results. diff --git a/QCloudCore/Classes/QCLOUDRestNet/DNSCache/QCloudHttpDNS.h b/QCloudCore/Classes/QCLOUDRestNet/DNSCache/QCloudHttpDNS.h index 3664fcf..ae2ff68 100644 --- a/QCloudCore/Classes/QCLOUDRestNet/DNSCache/QCloudHttpDNS.h +++ b/QCloudCore/Classes/QCLOUDRestNet/DNSCache/QCloudHttpDNS.h @@ -15,8 +15,22 @@ extern NSString* const kQCloudHttpDNSHost; @class QCloudHosts; + +@protocol QCloudHTTPDNSProtocol +@required + +/** + 解析domain,返回对应的ip地址。注意ip地址需要是有效的形式(xxx.xxx.xxx.xxx)否则会导致出错 + + @param domain 需要解析的域名 + @return ip地址 + */ +- (NSString *)resolveDomain:(NSString *)domain; +@end + @interface QCloudHttpDNS : NSObject @property (nonatomic, strong, readonly) QCloudHosts* hosts; +@property (nonatomic, weak) id delegate; + (instancetype) shareDNS; /** 对于跟定的域名进行DNS缓存操作 @@ -24,7 +38,7 @@ extern NSString* const kQCloudHttpDNSHost; @param error 如果过程出错,该字段表示错误信息 @return 是否解析DNS成功 */ -- (BOOL) resolveDomain:(NSString*)domain error:(NSError* __autoreleasing*)error; +- (BOOL) resolveDomain:(NSString*)domain error:(NSError**)error; /** 对于URLRequest进行IP重定向,如果改URLRequest原始指向的URL中的host对应的IP已经被解析了,则进行重定向操作,如果没有直接返回原始URLReqest @@ -40,5 +54,14 @@ extern NSString* const kQCloudHttpDNSHost; */ - (BOOL) isTrustIP:(NSString*)ip; + +/** + 手动添加一条hosts记录 + + @param ip ip地址 + @param domain 域名 + */ +- (void)setIp:(NSString *)ip forDomain:(NSString *)domain; + - (NSString*) queryIPForHost:(NSString*)host; @end diff --git a/QCloudCore/Classes/QCLOUDRestNet/DNSCache/QCloudHttpDNS.m b/QCloudCore/Classes/QCLOUDRestNet/DNSCache/QCloudHttpDNS.m index aa0353a..fc9e681 100644 --- a/QCloudCore/Classes/QCLOUDRestNet/DNSCache/QCloudHttpDNS.m +++ b/QCloudCore/Classes/QCLOUDRestNet/DNSCache/QCloudHttpDNS.m @@ -8,7 +8,8 @@ #import "QCloudHttpDNS.h" #import "QCloudHosts.h" - +#import "QCloudLogger.h" +#import "NSError+QCloudNetworking.h" #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" @@ -49,29 +50,20 @@ - (instancetype) init } -- (BOOL) resolveDomain:(NSString*)domain error:(NSError* __autoreleasing*)error +- (BOOL) resolveDomain:(NSString*)domain error:(NSError**)error { -#warning this host & port is not set - NSString* reqstr = [NSString stringWithFormat:@"http://**.**.**.**/?dn=%@", domain]; - NSURL* url = [NSURL URLWithString:reqstr]; - NSURLRequest* request = [NSURLRequest requestWithURL:url]; - NSHTTPURLResponse* response; - NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:error]; - if (response.statusCode != 200) { - return NO; + NSString *ip; + if (self.delegate && [self.delegate respondsToSelector:@selector(resolveDomain:)]) { + ip = [self.delegate resolveDomain:domain]; } - if (error != NULL) { - if (*error) { - return NO; - } + if (!ip) { + QCloudLogDebug(@"Cannot resolve domain %@",domain); + *error = [NSError qcloud_errorWithCode:QCloudNetworkErrorCodeCannotResloveDomain message:[NSString stringWithFormat: @"无法解析域名 %@",domain]]; + return NO; } - NSString* str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - NSArray* array = [str componentsSeparatedByString:@" "]; - for (NSString* ip in array) { - if (QCloudCheckIPVaild(ip)) { - [_hosts putDomain:domain ip:[ip stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" "]]]; - } + if (QCloudCheckIPVaild(ip)) { + [_hosts putDomain:domain ip:[ip stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" "]]]; } [[NSNotificationCenter defaultCenter] postNotificationName:kQCloudHttpDNSCacheReady object:nil userInfo:@{ kQCloudHttpDNSHost:domain @@ -83,9 +75,9 @@ - (BOOL) resolveDomain:(NSString*)domain error:(NSError* __autoreleasing*)error - (NSString*) queryIPForHost:(NSString*)host { NSArray* hosts = [_hosts queryIPForDomain:host]; - //always use the first one + //always use the last(lastest) one if (hosts.count) { - return hosts.firstObject; + return hosts.lastObject; } return nil; } @@ -94,17 +86,22 @@ - (NSMutableURLRequest*) resolveURLRequestIfCan:(NSMutableURLRequest*)request if (!request) { return request; } - - NSString* ip = [self queryIPForHost:request.URL.host]; + NSString *host = request.URL.host; + NSString* ip = [self queryIPForHost:host]; + // Give it second chance to reslove domain by itself + if (!ip) { + NSError * resolveError; + [self resolveDomain:request.URL.host error:&resolveError]; + } + ip = [self queryIPForHost:host]; if (!ip) { return request; } - NSString* url = request.URL.absoluteString; - NSRange range = [url rangeOfString:request.URL.host]; + NSRange range = [url rangeOfString:host]; NSString* originHost = request.URL.host; if (range.location != NSNotFound && range.length > 0) { - url = [url stringByReplacingOccurrencesOfString:request.URL.host withString:ip options:0 range:range]; + url = [url stringByReplacingOccurrencesOfString:host withString:ip options:0 range:range]; NSMutableURLRequest* mReq = [request mutableCopy]; mReq.URL = [NSURL URLWithString:url]; [mReq setValue:originHost forHTTPHeaderField:@"Host"] ; @@ -114,6 +111,11 @@ - (NSMutableURLRequest*) resolveURLRequestIfCan:(NSMutableURLRequest*)request } } +- (void)setIp:(NSString *)ip forDomain:(NSString *)domain { + if (QCloudCheckIPVaild(ip)) { + [_hosts putDomain:domain ip:ip]; + } +} - (BOOL) isTrustIP:(NSString*)ip { diff --git a/QCloudCore/Classes/QCLOUDRestNet/Error/NSError+QCloudNetworking.h b/QCloudCore/Classes/QCLOUDRestNet/Error/NSError+QCloudNetworking.h index 1dc0197..52c0b6f 100644 --- a/QCloudCore/Classes/QCLOUDRestNet/Error/NSError+QCloudNetworking.h +++ b/QCloudCore/Classes/QCLOUDRestNet/Error/NSError+QCloudNetworking.h @@ -28,7 +28,8 @@ typedef NS_ENUM(int,QCloudNetworkErrorCode) { QCloudNetworkErrorCodeAborted = -340010, QCloudNetworkErrorCodeAlreadyFinish = -340011, QCloudNetworkErrorCodeCredentialNotReady = -340012, - QCloudNetworkErrorCodeMD5NotMatch = -340013 + QCloudNetworkErrorCodeMD5NotMatch = -340013, + QCloudNetworkErrorCodeCannotResloveDomain = -340014 }; @protocol QCloudNetworkError diff --git a/QCloudCore/Classes/QCloudCoreVersion.h b/QCloudCore/Classes/QCloudCoreVersion.h index 469b850..33a156c 100644 --- a/QCloudCore/Classes/QCloudCoreVersion.h +++ b/QCloudCore/Classes/QCloudCoreVersion.h @@ -5,7 +5,7 @@ #ifndef QCloudCoreModuleVersion_h #define QCloudCoreModuleVersion_h -#define QCloudCoreModuleVersionNumber 504006 +#define QCloudCoreModuleVersionNumber 504007 //dependency diff --git a/QCloudCore/Classes/QCloudCoreVersion.m b/QCloudCore/Classes/QCloudCoreVersion.m index 0115c87..4058092 100644 --- a/QCloudCore/Classes/QCloudCoreVersion.m +++ b/QCloudCore/Classes/QCloudCoreVersion.m @@ -1,5 +1,5 @@ #import "QCloudCoreVersion.h" -NSString * const QCloudCoreModuleVersion = @"5.4.6"; +NSString * const QCloudCoreModuleVersion = @"5.4.7"; NSString * const QCloudCoreModuleName = @"QCloudCore"; @interface QCloudQCloudCoreLoad : NSObject @end