Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
### 增加
* 上传前 检查token
* 支持指定服务器端口
* 当发现服务器不是七牛时切换到指定IP

## 7.0.10 (2015-05-23)

Expand Down
6 changes: 4 additions & 2 deletions QiniuSDK/Http/QNHttpManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,16 @@
withMimeType:(NSString *)mime
withCompleteBlock:(QNCompleteBlock)completeBlock
withProgressBlock:(QNInternalProgressBlock)progressBlock
withCancelBlock:(QNCancelBlock)cancelBlock;
withCancelBlock:(QNCancelBlock)cancelBlock
forceIp:(BOOL)forceIp;

- (void) post:(NSString *)url
withData:(NSData *)data
withParams:(NSDictionary *)params
withHeaders:(NSDictionary *)headers
withCompleteBlock:(QNCompleteBlock)completeBlock
withProgressBlock:(QNInternalProgressBlock)progressBlock
withCancelBlock:(QNCancelBlock)cancelBlock;
withCancelBlock:(QNCancelBlock)cancelBlock
forceIp:(BOOL)forceIp;

@end
17 changes: 11 additions & 6 deletions QiniuSDK/Http/QNHttpManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,8 @@ + (QNResponseInfo *)buildResponseInfo:(AFHTTPRequestOperation *)operation
- (void) sendRequest:(NSMutableURLRequest *)request
withCompleteBlock:(QNCompleteBlock)completeBlock
withProgressBlock:(QNInternalProgressBlock)progressBlock
withCancelBlock:(QNCancelBlock)cancelBlock{
withCancelBlock:(QNCancelBlock)cancelBlock
forceIp:(BOOL) forceIp{
NSString *u = request.URL.absoluteString;
NSURL *url = request.URL;
__block NSString *ip = nil;
Expand All @@ -85,7 +86,7 @@ - (void) sendRequest:(NSMutableURLRequest *)request
if (_backupIp != nil && ![_backupIp isEqualToString:@""]) {
NSString *host = url.host;
ip = [QNDns getAddress:host];
if ([ip isEqualToString:@""]) {
if ([ip isEqualToString:@""] || forceIp) {
ip = _backupIp;
}
NSString *path = url.path;
Expand Down Expand Up @@ -149,7 +150,8 @@ - (void)multipartPost:(NSString *)url
withMimeType:(NSString *)mime
withCompleteBlock:(QNCompleteBlock)completeBlock
withProgressBlock:(QNInternalProgressBlock)progressBlock
withCancelBlock:(QNCancelBlock)cancelBlock {
withCancelBlock:(QNCancelBlock)cancelBlock
forceIp:(BOOL) forceIp{
NSMutableURLRequest *request = [_httpManager.requestSerializer
multipartFormRequestWithMethod:@"POST"
URLString:url
Expand All @@ -162,7 +164,8 @@ - (void)multipartPost:(NSString *)url
[self sendRequest:request
withCompleteBlock:completeBlock
withProgressBlock:progressBlock
withCancelBlock:cancelBlock];
withCancelBlock:cancelBlock
forceIp:forceIp];
}

- (void) post:(NSString *)url
Expand All @@ -171,7 +174,8 @@ - (void) post:(NSString *)url
withHeaders:(NSDictionary *)headers
withCompleteBlock:(QNCompleteBlock)completeBlock
withProgressBlock:(QNInternalProgressBlock)progressBlock
withCancelBlock:(QNCancelBlock)cancelBlock {
withCancelBlock:(QNCancelBlock)cancelBlock
forceIp:(BOOL) forceIp{
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:url]];
if (headers) {
[request setAllHTTPHeaderFields:headers];
Expand All @@ -186,7 +190,8 @@ - (void) post:(NSString *)url
[self sendRequest:request
withCompleteBlock:completeBlock
withProgressBlock:progressBlock
withCancelBlock:cancelBlock];
withCancelBlock:cancelBlock
forceIp:forceIp];
}

@end
4 changes: 4 additions & 0 deletions QiniuSDK/Http/QNResponseInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,10 @@ extern const int kQNFileError;
*/
@property (nonatomic, readonly) BOOL needSwitchServer;

/**
* 是否为 七牛响应
*/
@property (nonatomic, readonly, getter = isNotQiniu) BOOL notQiniu;

/**
* 工厂函数,内部使用
Expand Down
8 changes: 6 additions & 2 deletions QiniuSDK/Http/QNResponseInfo.m
Original file line number Diff line number Diff line change
Expand Up @@ -172,21 +172,25 @@ - (BOOL)isCancelled {
return _statusCode == kQNRequestCancelled || _statusCode == -999;
}

- (BOOL)isNotQiniu {
return (_statusCode >= 200 && _statusCode < 500) && _reqId == nil;
}

- (BOOL)isOK {
return _statusCode == 200 && _error == nil && _reqId != nil;
}

- (BOOL)isConnectionBroken {
// reqId is nill means the server is not qiniu
return _statusCode == kQNNetworkError;
return _statusCode == kQNNetworkError || (_statusCode < -1000 && _statusCode != -1003);
}

- (BOOL)needSwitchServer {
return _statusCode == kQNNetworkError || (_statusCode < -1000 && _statusCode != -1003) || (_statusCode / 100 == 5 && _statusCode != 579);
}

- (BOOL)couldRetry {
return (_statusCode >= 500 && _statusCode < 600 && _statusCode != 579) || _statusCode == kQNNetworkError || _statusCode == 996 || _statusCode == 406 || (_statusCode == 200 && _error != nil) || _statusCode < -1000;
return (_statusCode >= 500 && _statusCode < 600 && _statusCode != 579) || _statusCode == kQNNetworkError || _statusCode == 996 || _statusCode == 406 || (_statusCode == 200 && _error != nil) || _statusCode < -1000 || self.isNotQiniu;
}

@end
6 changes: 4 additions & 2 deletions QiniuSDK/Http/QNSessionManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,17 @@
withMimeType:(NSString *)mime
withCompleteBlock:(QNCompleteBlock)completeBlock
withProgressBlock:(QNInternalProgressBlock)progressBlock
withCancelBlock:(QNCancelBlock)cancelBlock;
withCancelBlock:(QNCancelBlock)cancelBlock
forceIp:(BOOL)forceIp;

- (void) post:(NSString *)url
withData:(NSData *)data
withParams:(NSDictionary *)params
withHeaders:(NSDictionary *)headers
withCompleteBlock:(QNCompleteBlock)completeBlock
withProgressBlock:(QNInternalProgressBlock)progressBlock
withCancelBlock:(QNCancelBlock)cancelBlock;
withCancelBlock:(QNCancelBlock)cancelBlock
forceIp:(BOOL)forceIp;

@end

Expand Down
17 changes: 11 additions & 6 deletions QiniuSDK/Http/QNSessionManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,8 @@ + (QNResponseInfo *)buildResponseInfo:(NSHTTPURLResponse *)response
- (void) sendRequest:(NSMutableURLRequest *)request
withCompleteBlock:(QNCompleteBlock)completeBlock
withProgressBlock:(QNInternalProgressBlock)progressBlock
withCancelBlock:(QNCancelBlock)cancelBlock{
withCancelBlock:(QNCancelBlock)cancelBlock
forceIp:(BOOL) forceIp{
__block NSDate *startTime = [NSDate date];
NSProgress *progress = nil;
__block NSString *host = request.URL.host;
Expand All @@ -147,7 +148,7 @@ - (void) sendRequest:(NSMutableURLRequest *)request
if (_noProxy && _backupIp != nil && ![_backupIp isEqualToString:@""]) {
NSString *host = url.host;
ip = [QNDns getAddress:host];
if ([ip isEqualToString:@""]) {
if ([ip isEqualToString:@""] || forceIp) {
ip = _backupIp;
}
NSString *path = url.path;
Expand Down Expand Up @@ -212,7 +213,8 @@ - (void)multipartPost:(NSString *)url
withMimeType:(NSString *)mime
withCompleteBlock:(QNCompleteBlock)completeBlock
withProgressBlock:(QNInternalProgressBlock)progressBlock
withCancelBlock:(QNCancelBlock)cancelBlock {
withCancelBlock:(QNCancelBlock)cancelBlock
forceIp:(BOOL) forceIp{
NSMutableURLRequest *request = [_httpManager.requestSerializer
multipartFormRequestWithMethod:@"POST"
URLString:url
Expand All @@ -225,7 +227,8 @@ - (void)multipartPost:(NSString *)url
[self sendRequest:request
withCompleteBlock:completeBlock
withProgressBlock:progressBlock
withCancelBlock:cancelBlock];
withCancelBlock:cancelBlock
forceIp:forceIp];
}

- (void) post:(NSString *)url
Expand All @@ -234,7 +237,8 @@ - (void) post:(NSString *)url
withHeaders:(NSDictionary *)headers
withCompleteBlock:(QNCompleteBlock)completeBlock
withProgressBlock:(QNInternalProgressBlock)progressBlock
withCancelBlock:(QNCancelBlock)cancelBlock {
withCancelBlock:(QNCancelBlock)cancelBlock
forceIp:(BOOL) forceIp{
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:url]];
if (headers) {
[request setAllHTTPHeaderFields:headers];
Expand All @@ -250,7 +254,8 @@ - (void) post:(NSString *)url
[self sendRequest:request
withCompleteBlock:completeBlock
withProgressBlock:progressBlock
withCancelBlock:cancelBlock];
withCancelBlock:cancelBlock
forceIp: forceIp];
});
}

Expand Down
6 changes: 4 additions & 2 deletions QiniuSDK/Http/QNhttpDelegate.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,16 @@ typedef BOOL (^QNCancelBlock)(void);
withMimeType:(NSString *)mime
withCompleteBlock:(QNCompleteBlock)completeBlock
withProgressBlock:(QNInternalProgressBlock)progressBlock
withCancelBlock:(QNCancelBlock)cancelBlock;
withCancelBlock:(QNCancelBlock)cancelBlock
forceIp:(BOOL)forceIp;

- (void) post:(NSString *)url
withData:(NSData *)data
withParams:(NSDictionary *)params
withHeaders:(NSDictionary *)headers
withCompleteBlock:(QNCompleteBlock)completeBlock
withProgressBlock:(QNInternalProgressBlock)progressBlock
withCancelBlock:(QNCancelBlock)cancelBlock;
withCancelBlock:(QNCancelBlock)cancelBlock
forceIp:(BOOL)forceIp;

@end
11 changes: 9 additions & 2 deletions QiniuSDK/Storage/QNFormUpload.m
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,11 @@ - (void)put {
nextHost = _config.upHostBackup;
}

BOOL forceIp = NO;
if (info.isNotQiniu) {
forceIp = YES;
}

QNCompleteBlock retriedComplete = ^(QNResponseInfo *info, NSDictionary *resp) {
if (info.isOK) {
_option.progressHandler(_key, 1.0);
Expand All @@ -109,7 +114,8 @@ - (void)put {
withMimeType:_option.mimeType
withCompleteBlock:retriedComplete
withProgressBlock:p
withCancelBlock:_option.cancellationSignal];
withCancelBlock:_option.cancellationSignal
forceIp:forceIp];
};

[_httpManager multipartPost:[NSString stringWithFormat:@"http://%@:%u/", _config.upHost, (unsigned int)_config.upPort]
Expand All @@ -119,7 +125,8 @@ - (void)put {
withMimeType:_option.mimeType
withCompleteBlock:complete
withProgressBlock:p
withCancelBlock:_option.cancellationSignal];
withCancelBlock:_option.cancellationSignal
forceIp:NO];
}

@end
10 changes: 9 additions & 1 deletion QiniuSDK/Storage/QNResumeUpload.m
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ @interface QNResumeUpload ()

@property UInt32 chunkCrc;

@property BOOL forceIp;

- (void)makeBlock:(NSString *)uphost
offset:(UInt32)offset
blockSize:(UInt32)blockSize
Expand Down Expand Up @@ -89,6 +91,7 @@ - (instancetype)initWithData:(NSData *)data
_config = config;

_token = token;
_forceIp = NO;
}
return self;
}
Expand Down Expand Up @@ -217,6 +220,10 @@ - (void)nextTask:(UInt32)offset retriedTimes:(int)retried host:(NSString *)host
nextHost = _config.upHostBackup;
}

if (info.isNotQiniu) {
_forceIp = YES;
}

[self nextTask:offset retriedTimes:retried + 1 host:nextHost];
return;
}
Expand Down Expand Up @@ -306,7 +313,8 @@ - (void) post:(NSString *)url
withData:(NSData *)data
withCompleteBlock:(QNCompleteBlock)completeBlock
withProgressBlock:(QNInternalProgressBlock)progressBlock {
[_httpManager post:url withData:data withParams:nil withHeaders:_headers withCompleteBlock:completeBlock withProgressBlock:progressBlock withCancelBlock:_option.cancellationSignal];
[_httpManager post:url withData:data withParams:nil withHeaders:_headers withCompleteBlock:completeBlock withProgressBlock:progressBlock withCancelBlock:_option.cancellationSignal
forceIp:_forceIp];
}

- (void)run {
Expand Down
32 changes: 30 additions & 2 deletions QiniuSDKTests/QNFormUploadTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@

#import "QNTestConfig.h"

@interface QNFormUploadTesT : XCTestCase
@interface QNFormUploadTest : XCTestCase

@property QNUploadManager *upManager;

@end

@implementation QNFormUploadTesT
@implementation QNFormUploadTest

- (void)setUp {
[super setUp];
Expand Down Expand Up @@ -229,4 +229,32 @@ - (void)testUrlConvert {
XCTAssert([@"FgoKnypncpQlV6tTVddq9EL49l4B" isEqualToString:testResp[@"key"]], @"Pass");
}

- (void)testDnsHijacking {
__block QNResponseInfo *testInfo = nil;
__block NSDictionary *testResp = nil;
__block NSString *key = nil;

QNConfiguration *config = [QNConfiguration build: ^(QNConfigurationBuilder *builder) {
builder.zone = [[QNZone alloc] initWithUpHost:@"uphijacktest.qiniu.com" upHostBackup:@"uphijacktest.qiniu.com" upIp:[QNZone zone0].upIp];
}];

QNUploadManager *upManager = [[QNUploadManager alloc] initWithConfiguration:config];

NSData *data = [@"Hello, World!" dataUsingEncoding:NSUTF8StringEncoding];
[upManager putData:data key:nil token:g_token complete: ^(QNResponseInfo *info, NSString *k, NSDictionary *resp) {
key = k;
testInfo = info;
testResp = resp;
} option:nil];

AGWW_WAIT_WHILE(testInfo == nil, 100.0);
NSLog(@"%@", testInfo);
NSLog(@"%@", testResp);
XCTAssert(key == nil, @"Pass");
XCTAssert(testInfo.isOK, @"Pass");
XCTAssert(testInfo.reqId, @"Pass");
XCTAssert([testInfo.host isEqual:@"uphijacktest.qiniu.com"], @"Pass");
XCTAssert([@"FgoKnypncpQlV6tTVddq9EL49l4B" isEqualToString:testResp[@"key"]], @"Pass");
}

@end
Loading