Skip to content

Commit

Permalink
# 5.4.7
Browse files Browse the repository at this point in the history
- 增加自定义解析 Hosts 的功能
  • Loading branch information
erichmzhang committed Jul 30, 2018
1 parent caa77bb commit 2d7b251
Show file tree
Hide file tree
Showing 11 changed files with 91 additions and 59 deletions.
44 changes: 25 additions & 19 deletions 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 所有版本的接口。
Expand All @@ -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,方便异常情况中断后的续传。
- 其它一些优化。

6 changes: 3 additions & 3 deletions 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/"
Expand All @@ -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
6 changes: 3 additions & 3 deletions QCloudCOSXML/Classes/QCloudCOSXMLVersion.h
Expand Up @@ -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

//
Expand Down
2 changes: 1 addition & 1 deletion 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
Expand Down
Expand Up @@ -118,7 +118,7 @@ request.partNumber = 1; // 标志当前分块的序号
*/
@property (strong, nonatomic) NSString *sourceIfNoneMatch;
/**
指定源文件的版本号
指定 Object 的 Version ID (在开启了多版本的情况下)
*/
@property (strong, nonatomic) NSString *versionID;

Expand Down
2 changes: 1 addition & 1 deletion QCloudCore.podspec
Expand Up @@ -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.
Expand Down
25 changes: 24 additions & 1 deletion QCloudCore/Classes/QCLOUDRestNet/DNSCache/QCloudHttpDNS.h
Expand Up @@ -15,16 +15,30 @@ extern NSString* const kQCloudHttpDNSHost;


@class QCloudHosts;

@protocol QCloudHTTPDNSProtocol <NSObject>
@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<QCloudHTTPDNSProtocol> delegate;
+ (instancetype) shareDNS;
/**
对于跟定的域名进行DNS缓存操作
@param domain 需要缓存IP的域名
@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
Expand All @@ -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
56 changes: 29 additions & 27 deletions QCloudCore/Classes/QCLOUDRestNet/DNSCache/QCloudHttpDNS.m
Expand Up @@ -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"

Expand Down Expand Up @@ -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
Expand All @@ -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;
}
Expand All @@ -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"] ;
Expand All @@ -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
{
Expand Down
Expand Up @@ -28,7 +28,8 @@ typedef NS_ENUM(int,QCloudNetworkErrorCode) {
QCloudNetworkErrorCodeAborted = -340010,
QCloudNetworkErrorCodeAlreadyFinish = -340011,
QCloudNetworkErrorCodeCredentialNotReady = -340012,
QCloudNetworkErrorCodeMD5NotMatch = -340013
QCloudNetworkErrorCodeMD5NotMatch = -340013,
QCloudNetworkErrorCodeCannotResloveDomain = -340014
};

@protocol QCloudNetworkError <NSObject>
Expand Down
2 changes: 1 addition & 1 deletion QCloudCore/Classes/QCloudCoreVersion.h
Expand Up @@ -5,7 +5,7 @@

#ifndef QCloudCoreModuleVersion_h
#define QCloudCoreModuleVersion_h
#define QCloudCoreModuleVersionNumber 504006
#define QCloudCoreModuleVersionNumber 504007

//dependency

Expand Down
2 changes: 1 addition & 1 deletion 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
Expand Down

0 comments on commit 2d7b251

Please sign in to comment.