Skip to content

Commit 2d7b251

Browse files
author
erichmzhang
committed
# 5.4.7
- 增加自定义解析 Hosts 的功能
1 parent caa77bb commit 2d7b251

File tree

11 files changed

+91
-59
lines changed

11 files changed

+91
-59
lines changed

CHANGELOG.md

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,41 @@
1-
#5.4.6
1+
# 5.4.7
2+
- 增加自定义解析 Hosts 的功能
3+
4+
# 5.4.6
25
- Get Object Request 增加 versionID 支持
3-
-static_frameworks支持
4-
5-
#5.4.5
6+
- static_frameworks支持
7+
- Region 和 Bucket 增加非法字符校验,增加安全系数
8+
- 修复一处参数缺失会导致的 Crash
9+
10+
# 5.4.5
611
- 修复一些 Crash
7-
12+
813
# 5.4.4
914
- QCloudCOSXMLService 中封装了一些常用接口
1015
- 修复了对于中文路径,并且路径中带/结尾时签名不正确的问题
1116
- 修复了多版本相关接口里的问题
1217
- 修复了分片上传 Resume 时,如果路径不在沙盒中会失败的问题
1318
- 修复了与 FCUUID 冲突的问题
14-
15-
#5.4.3
19+
20+
# 5.4.3
1621
- 修复Copy接口中,source为中文时会导致403的问题
17-
22+
1823
# 5.4.2
1924
- 修复了返回数组类型的属性,如果数组内容只有一个时候会解析失败的问题。
20-
25+
2126
# 5.4.1
2227
- 修复了 XML 中以 / 结尾的 Object 会403的的问题。
23-
28+
2429
# 5.4.0
25-
- 修复了iOS8上面首次上传失败的问题
30+
- 修复了iOS8上面首次上传失败的问题
2631
- 修复了反复多次调用分块复制接口会Crash的问题
27-
32+
2833
# 5.3.4
2934
- 修复了 GetBucket 时,无法正确获得 Common Prefix 的 BUG。
30-
35+
3136
# 5.3.2
3237
- 修复了签名时取到的某些头部可能会变更的问题
33-
38+
3439
# 5.3.0
3540
- 增加了生成预签名 URL 的接口。
3641
- 增加列出指定前缀 Object 所有版本的接口。
@@ -41,24 +46,25 @@
4146
- 针对弱网络情况进行优化,大幅度提高弱网络情况下上传成功率。
4247
- 修复分块 Copy 大文件的问题。
4348
- 签名计算时支持自定义开始和结束时间。
44-
49+
4550
# 5.2.0
4651
- 增加了精简版的SDK,只支持上传下载功能。
4752
- BucketName概念统一。
4853
- 支持查看Response中原始的HTTP Response内容。
4954
- 其它一些BUG修复与性能优化。
50-
55+
5156
# 5.1.3
5257
- BucketName概念统一。
53-
58+
5459
# 5.1.2
5560
- 修复C++混编情况下的问题
56-
61+
5762
# 5.1.1
5863
- 修复了一些问题
59-
64+
6065
# 5.1.0
6166
- 增加了LifeCycle相关接口。
6267
- 增加了Copy Object的接口。
6368
- 分块上传初始化时,返回resumeData,方便异常情况中断后的续传。
6469
- 其它一些优化。
70+

QCloudCOSXML.podspec

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = "QCloudCOSXML"
3-
s.version = "5.4.6"
3+
s.version = "5.4.7"
44
s.summary = "QCloudCOSXML 腾讯云iOS-SDK组件"
55

66
s.homepage = "https://cloud.tencent.com/"
@@ -9,12 +9,12 @@ s.version = "5.4.6"
99
s.source = { :git => "https://github.com/tencentyun/qcloud-sdk-ios.git", :tag => s.version.to_s }
1010
s.ios.deployment_target = '8.0'
1111
s.source_files = 'QCloudCOSXML/Classes/**/*'
12-
s.dependency "QCloudCore",'5.4.6'
12+
s.dependency "QCloudCore",'5.4.7'
1313
s.static_framework = true
1414

1515
s.subspec 'Transfer' do |sbt|
1616
sbt.source_files = 'QCloudCOSXML/Classes/Transfer/*','QCloudCOSXML/Classes/Base/*'
17-
sbt.dependency "QCloudCore",'5.4.6'
17+
sbt.dependency "QCloudCore",'5.4.7'
1818
# sbt.static_framework=true
1919
end
2020
end

QCloudCOSXML/Classes/QCloudCOSXMLVersion.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66

77
#ifndef QCloudCOSXMLModuleVersion_h
88
#define QCloudCOSXMLModuleVersion_h
9-
#define QCloudCOSXMLModuleVersionNumber 504006
9+
#define QCloudCOSXMLModuleVersionNumber 504007
1010

1111
//dependency
12-
#if QCloudCoreModuleVersionNumber != 504006
13-
#error "库QCloudCOSXML依赖QCloudCore最小版本号为5.4.6,当前引入的QCloudCore版本号过低,请及时升级后使用"
12+
#if QCloudCoreModuleVersionNumber != 504007
13+
#error "库QCloudCOSXML依赖QCloudCore最小版本号为5.4.7,当前引入的QCloudCore版本号过低,请及时升级后使用"
1414
#endif
1515

1616
//

QCloudCOSXML/Classes/QCloudCOSXMLVersion.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#import "QCloudCOSXMLVersion.h"
2-
NSString * const QCloudCOSXMLModuleVersion = @"5.4.6";
2+
NSString * const QCloudCOSXMLModuleVersion = @"5.4.7";
33
NSString * const QCloudCOSXMLModuleName = @"QCloudCOSXML";
44
@interface QCloudQCloudCOSXMLLoad : NSObject
55
@end

QCloudCOSXML/Classes/Transfer/QCloudUploadPartCopyRequest.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ request.partNumber = 1; // 标志当前分块的序号
118118
*/
119119
@property (strong, nonatomic) NSString *sourceIfNoneMatch;
120120
/**
121-
指定源文件的版本号
121+
指定 Object 的 Version ID (在开启了多版本的情况下)
122122
*/
123123
@property (strong, nonatomic) NSString *versionID;
124124

QCloudCore.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
Pod::Spec.new do |s|
1010
s.name = "QCloudCore"
11-
s.version = "5.4.6"
11+
s.version = "5.4.7"
1212
s.summary = "QCloudCore--腾讯云iOS-SDK Foundation"
1313

1414
# This description is used to generate tags and improve search results.

QCloudCore/Classes/QCLOUDRestNet/DNSCache/QCloudHttpDNS.h

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,30 @@ extern NSString* const kQCloudHttpDNSHost;
1515

1616

1717
@class QCloudHosts;
18+
19+
@protocol QCloudHTTPDNSProtocol <NSObject>
20+
@required
21+
22+
/**
23+
解析domain,返回对应的ip地址。注意ip地址需要是有效的形式(xxx.xxx.xxx.xxx)否则会导致出错
24+
25+
@param domain 需要解析的域名
26+
@return ip地址
27+
*/
28+
- (NSString *)resolveDomain:(NSString *)domain;
29+
@end
30+
1831
@interface QCloudHttpDNS : NSObject
1932
@property (nonatomic, strong, readonly) QCloudHosts* hosts;
33+
@property (nonatomic, weak) id<QCloudHTTPDNSProtocol> delegate;
2034
+ (instancetype) shareDNS;
2135
/**
2236
对于跟定的域名进行DNS缓存操作
2337
@param domain 需要缓存IP的域名
2438
@param error 如果过程出错,该字段表示错误信息
2539
@return 是否解析DNS成功
2640
*/
27-
- (BOOL) resolveDomain:(NSString*)domain error:(NSError* __autoreleasing*)error;
41+
- (BOOL) resolveDomain:(NSString*)domain error:(NSError**)error;
2842

2943
/**
3044
对于URLRequest进行IP重定向,如果改URLRequest原始指向的URL中的host对应的IP已经被解析了,则进行重定向操作,如果没有直接返回原始URLReqest
@@ -40,5 +54,14 @@ extern NSString* const kQCloudHttpDNSHost;
4054
*/
4155
- (BOOL) isTrustIP:(NSString*)ip;
4256

57+
58+
/**
59+
手动添加一条hosts记录
60+
61+
@param ip ip地址
62+
@param domain 域名
63+
*/
64+
- (void)setIp:(NSString *)ip forDomain:(NSString *)domain;
65+
4366
- (NSString*) queryIPForHost:(NSString*)host;
4467
@end

QCloudCore/Classes/QCLOUDRestNet/DNSCache/QCloudHttpDNS.m

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88

99
#import "QCloudHttpDNS.h"
1010
#import "QCloudHosts.h"
11-
11+
#import "QCloudLogger.h"
12+
#import "NSError+QCloudNetworking.h"
1213
#pragma GCC diagnostic push
1314
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
1415

@@ -49,29 +50,20 @@ - (instancetype) init
4950

5051
}
5152

52-
- (BOOL) resolveDomain:(NSString*)domain error:(NSError* __autoreleasing*)error
53+
- (BOOL) resolveDomain:(NSString*)domain error:(NSError**)error
5354
{
54-
#warning this host & port is not set
55-
NSString* reqstr = [NSString stringWithFormat:@"http://**.**.**.**/?dn=%@", domain];
56-
NSURL* url = [NSURL URLWithString:reqstr];
57-
NSURLRequest* request = [NSURLRequest requestWithURL:url];
58-
NSHTTPURLResponse* response;
59-
NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:error];
60-
if (response.statusCode != 200) {
61-
return NO;
55+
NSString *ip;
56+
if (self.delegate && [self.delegate respondsToSelector:@selector(resolveDomain:)]) {
57+
ip = [self.delegate resolveDomain:domain];
6258
}
63-
if (error != NULL) {
64-
if (*error) {
65-
return NO;
66-
}
59+
if (!ip) {
60+
QCloudLogDebug(@"Cannot resolve domain %@",domain);
61+
*error = [NSError qcloud_errorWithCode:QCloudNetworkErrorCodeCannotResloveDomain message:[NSString stringWithFormat: @"无法解析域名 %@",domain]];
62+
return NO;
6763
}
6864

69-
NSString* str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
70-
NSArray* array = [str componentsSeparatedByString:@" "];
71-
for (NSString* ip in array) {
72-
if (QCloudCheckIPVaild(ip)) {
73-
[_hosts putDomain:domain ip:[ip stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" "]]];
74-
}
65+
if (QCloudCheckIPVaild(ip)) {
66+
[_hosts putDomain:domain ip:[ip stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" "]]];
7567
}
7668
[[NSNotificationCenter defaultCenter] postNotificationName:kQCloudHttpDNSCacheReady object:nil userInfo:@{
7769
kQCloudHttpDNSHost:domain
@@ -83,9 +75,9 @@ - (BOOL) resolveDomain:(NSString*)domain error:(NSError* __autoreleasing*)error
8375
- (NSString*) queryIPForHost:(NSString*)host
8476
{
8577
NSArray* hosts = [_hosts queryIPForDomain:host];
86-
//always use the first one
78+
//always use the last(lastest) one
8779
if (hosts.count) {
88-
return hosts.firstObject;
80+
return hosts.lastObject;
8981
}
9082
return nil;
9183
}
@@ -94,17 +86,22 @@ - (NSMutableURLRequest*) resolveURLRequestIfCan:(NSMutableURLRequest*)request
9486
if (!request) {
9587
return request;
9688
}
97-
98-
NSString* ip = [self queryIPForHost:request.URL.host];
89+
NSString *host = request.URL.host;
90+
NSString* ip = [self queryIPForHost:host];
91+
// Give it second chance to reslove domain by itself
92+
if (!ip) {
93+
NSError * resolveError;
94+
[self resolveDomain:request.URL.host error:&resolveError];
95+
}
96+
ip = [self queryIPForHost:host];
9997
if (!ip) {
10098
return request;
10199
}
102-
103100
NSString* url = request.URL.absoluteString;
104-
NSRange range = [url rangeOfString:request.URL.host];
101+
NSRange range = [url rangeOfString:host];
105102
NSString* originHost = request.URL.host;
106103
if (range.location != NSNotFound && range.length > 0) {
107-
url = [url stringByReplacingOccurrencesOfString:request.URL.host withString:ip options:0 range:range];
104+
url = [url stringByReplacingOccurrencesOfString:host withString:ip options:0 range:range];
108105
NSMutableURLRequest* mReq = [request mutableCopy];
109106
mReq.URL = [NSURL URLWithString:url];
110107
[mReq setValue:originHost forHTTPHeaderField:@"Host"] ;
@@ -114,6 +111,11 @@ - (NSMutableURLRequest*) resolveURLRequestIfCan:(NSMutableURLRequest*)request
114111
}
115112
}
116113

114+
- (void)setIp:(NSString *)ip forDomain:(NSString *)domain {
115+
if (QCloudCheckIPVaild(ip)) {
116+
[_hosts putDomain:domain ip:ip];
117+
}
118+
}
117119

118120
- (BOOL) isTrustIP:(NSString*)ip
119121
{

QCloudCore/Classes/QCLOUDRestNet/Error/NSError+QCloudNetworking.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ typedef NS_ENUM(int,QCloudNetworkErrorCode) {
2828
QCloudNetworkErrorCodeAborted = -340010,
2929
QCloudNetworkErrorCodeAlreadyFinish = -340011,
3030
QCloudNetworkErrorCodeCredentialNotReady = -340012,
31-
QCloudNetworkErrorCodeMD5NotMatch = -340013
31+
QCloudNetworkErrorCodeMD5NotMatch = -340013,
32+
QCloudNetworkErrorCodeCannotResloveDomain = -340014
3233
};
3334

3435
@protocol QCloudNetworkError <NSObject>

QCloudCore/Classes/QCloudCoreVersion.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
#ifndef QCloudCoreModuleVersion_h
77
#define QCloudCoreModuleVersion_h
8-
#define QCloudCoreModuleVersionNumber 504006
8+
#define QCloudCoreModuleVersionNumber 504007
99

1010
//dependency
1111

0 commit comments

Comments
 (0)