Skip to content

Commit 26316f7

Browse files
committed
Merge pull request #38 from longbai/url_conv
url converter
2 parents e4eb862 + 287261d commit 26316f7

File tree

11 files changed

+146
-22
lines changed

11 files changed

+146
-22
lines changed

QiniuSDK/Http/QNHttpManager.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,12 @@
99
#import <Foundation/Foundation.h>
1010
#import "QNhttpDelegate.h"
1111

12+
#import "QNConfiguration.h"
13+
1214
@interface QNHttpManager : NSObject <QNHttpDelegate>
1315

14-
- (instancetype)initWithTimeout:(UInt32)timeout;
16+
- (instancetype)initWithTimeout:(UInt32)timeout
17+
urlConverter:(QNUrlConvert)converter;
1518

1619
- (void)multipartPost:(NSString *)url
1720
withData:(NSData *)data

QiniuSDK/Http/QNHttpManager.m

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,25 @@
1616
@interface QNHttpManager ()
1717
@property (nonatomic) AFHTTPRequestOperationManager *httpManager;
1818
@property UInt32 timeout;
19+
@property (nonatomic, strong) QNUrlConvert converter;
1920
@end
2021

2122
@implementation QNHttpManager
2223

23-
- (instancetype)initWithTimeout:(UInt32)timeout {
24+
- (instancetype)initWithTimeout:(UInt32)timeout
25+
urlConverter:(QNUrlConvert)converter {
2426
if (self = [super init]) {
2527
_httpManager = [[AFHTTPRequestOperationManager alloc] init];
2628
_httpManager.responseSerializer = [AFJSONResponseSerializer serializer];
2729
_timeout = timeout;
30+
_converter = converter;
2831
}
2932

3033
return self;
3134
}
3235

3336
- (instancetype)init {
34-
return [self initWithTimeout:60];
37+
return [self initWithTimeout:60 urlConverter:nil];
3538
}
3639

3740
+ (QNResponseInfo *)buildResponseInfo:(AFHTTPRequestOperation *)operation
@@ -102,6 +105,9 @@ - (void)multipartPost:(NSString *)url
102105
withCompleteBlock:(QNCompleteBlock)completeBlock
103106
withProgressBlock:(QNInternalProgressBlock)progressBlock
104107
withCancelBlock:(QNCancelBlock)cancelBlock {
108+
if (_converter != nil) {
109+
url = _converter(url);
110+
}
105111
NSMutableURLRequest *request = [_httpManager.requestSerializer
106112
multipartFormRequestWithMethod:@"POST"
107113
URLString:url
@@ -123,6 +129,10 @@ - (void) post:(NSString *)url
123129
withCompleteBlock:(QNCompleteBlock)completeBlock
124130
withProgressBlock:(QNInternalProgressBlock)progressBlock
125131
withCancelBlock:(QNCancelBlock)cancelBlock {
132+
if (_converter != nil) {
133+
url = _converter(url);
134+
}
135+
126136
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:url]];
127137
if (headers) {
128138
[request setAllHTTPHeaderFields:headers];

QiniuSDK/Http/QNSessionManager.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
#import <Foundation/Foundation.h>
22
#import "QNHttpDelegate.h"
33

4+
#import "QNConfiguration.h"
5+
46
#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090)
57

68
@interface QNSessionManager : NSObject <QNHttpDelegate>
79

810
- (instancetype)initWithProxy:(NSDictionary *)proxyDict
9-
timeout:(UInt32)timeout;
11+
timeout:(UInt32)timeout
12+
urlConverter:(QNUrlConvert)converter;
1013

1114
- (void)multipartPost:(NSString *)url
1215
withData:(NSData *)data

QiniuSDK/Http/QNSessionManager.m

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,18 +54,14 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N
5454
@interface QNSessionManager ()
5555
@property (nonatomic) AFHTTPSessionManager *httpManager;
5656
@property UInt32 timeout;
57+
@property (nonatomic, strong) QNUrlConvert converter;
5758
@end
5859

59-
static NSString *userAgent = nil;
60-
6160
@implementation QNSessionManager
6261

63-
+ (void)initialize {
64-
userAgent = QNUserAgent();
65-
}
66-
6762
- (instancetype)initWithProxy:(NSDictionary *)proxyDict
68-
timeout:(UInt32)timeout {
63+
timeout:(UInt32)timeout
64+
urlConverter:(QNUrlConvert)converter {
6965
if (self = [super init]) {
7066
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
7167
if (proxyDict != nil) {
@@ -74,13 +70,14 @@ - (instancetype)initWithProxy:(NSDictionary *)proxyDict
7470
_httpManager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:configuration];
7571
_httpManager.responseSerializer = [AFHTTPResponseSerializer serializer];
7672
_timeout = timeout;
73+
_converter = converter;
7774
}
7875

7976
return self;
8077
}
8178

8279
- (instancetype)init {
83-
return [self initWithProxy:nil timeout:60];
80+
return [self initWithProxy:nil timeout:60 urlConverter:nil];
8481
}
8582

8683
+ (QNResponseInfo *)buildResponseInfo:(NSHTTPURLResponse *)response
@@ -153,7 +150,7 @@ - (void) sendRequest:(NSMutableURLRequest *)request
153150

154151
[request setTimeoutInterval:_timeout];
155152

156-
[request setValue:userAgent forHTTPHeaderField:@"User-Agent"];
153+
[request setValue:QNUserAgent() forHTTPHeaderField:@"User-Agent"];
157154
[request setValue:nil forHTTPHeaderField:@"Accept-Language"];
158155
[uploadTask resume];
159156
}
@@ -166,6 +163,10 @@ - (void)multipartPost:(NSString *)url
166163
withCompleteBlock:(QNCompleteBlock)completeBlock
167164
withProgressBlock:(QNInternalProgressBlock)progressBlock
168165
withCancelBlock:(QNCancelBlock)cancelBlock {
166+
if (_converter != nil) {
167+
url = _converter(url);
168+
}
169+
169170
NSMutableURLRequest *request = [_httpManager.requestSerializer
170171
multipartFormRequestWithMethod:@"POST"
171172
URLString:url
@@ -187,6 +188,10 @@ - (void) post:(NSString *)url
187188
withCompleteBlock:(QNCompleteBlock)completeBlock
188189
withProgressBlock:(QNInternalProgressBlock)progressBlock
189190
withCancelBlock:(QNCancelBlock)cancelBlock {
191+
if (_converter != nil) {
192+
url = _converter(url);
193+
}
194+
190195
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:url]];
191196
if (headers) {
192197
[request setAllHTTPHeaderFields:headers];

QiniuSDK/Http/QNUserAgent.m

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,14 @@
2424
}
2525

2626
NSString *QNUserAgent(void) {
27+
static NSString *ua = nil;
28+
static dispatch_once_t onceToken;
29+
dispatch_once(&onceToken, ^{
2730
#if __IPHONE_OS_VERSION_MIN_REQUIRED
28-
return [NSString stringWithFormat:@"QiniuObject-C/%@ (%@; iOS %@; %@)", kQiniuVersion, [[UIDevice currentDevice] model], [[UIDevice currentDevice] systemVersion], clientId()];
31+
ua = [NSString stringWithFormat:@"QiniuObject-C/%@ (%@; iOS %@; %@)", kQiniuVersion, [[UIDevice currentDevice] model], [[UIDevice currentDevice] systemVersion], clientId()];
2932
#else
30-
return [NSString stringWithFormat:@"QiniuObject-C/%@ (Mac OS X %@; %@)", kQiniuVersion, [[NSProcessInfo processInfo] operatingSystemVersionString], clientId()];
33+
ua = [NSString stringWithFormat:@"QiniuObject-C/%@ (Mac OS X %@; %@)", kQiniuVersion, [[NSProcessInfo processInfo] operatingSystemVersionString], clientId()];
3134
#endif
35+
});
36+
return ua;
3237
}

QiniuSDK/Storage/QNConfiguration.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@
1515
*/
1616
extern const UInt32 kQNBlockSize;
1717

18+
/**
19+
* 转换为用户需要的url
20+
*
21+
* @param url 上传url
22+
*
23+
* @return 根据上传url算出代理url
24+
*/
25+
typedef NSString *(^QNUrlConvert)(NSString *url);
1826

1927
@class QNConfigurationBuilder;
2028

@@ -63,13 +71,14 @@ typedef void (^QNConfigurationBuilderBlock)(QNConfigurationBuilder *builder);
6371
*/
6472
@property (readonly) UInt32 timeoutInterval;
6573

66-
6774
@property (nonatomic, readonly) id <QNRecorderDelegate> recorder;
6875

6976
@property (nonatomic, readonly) QNRecorderKeyGenerator recorderKeyGen;
7077

7178
@property (nonatomic, readonly) NSDictionary *proxy;
7279

80+
@property (nonatomic, readonly) QNUrlConvert converter;
81+
7382
+ (instancetype)build:(QNConfigurationBuilderBlock)block;
7483

7584
@end
@@ -155,5 +164,6 @@ typedef void (^QNConfigurationBuilderBlock)(QNConfigurationBuilder *builder);
155164

156165
@property (nonatomic, assign) NSDictionary *proxy;
157166

167+
@property (nonatomic, assign) QNUrlConvert converter;
158168

159169
@end

QiniuSDK/Storage/QNConfiguration.m

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ - (instancetype)initWithBuilder:(QNConfigurationBuilder *)builder {
3232
_recorderKeyGen = builder.recorderKeyGen;
3333

3434
_proxy = builder.proxy;
35+
36+
_converter = builder.converter;
3537
}
3638
return self;
3739
}
@@ -47,6 +49,12 @@ - (instancetype)init {
4749
_putThreshold = 512 * 1024;
4850
_retryMax = 5;
4951
_timeoutInterval = 60;
52+
53+
_recorder = nil;
54+
_recorderKeyGen = nil;
55+
56+
_proxy = nil;
57+
_converter = nil;
5058
}
5159
return self;
5260
}

QiniuSDK/Storage/QNUploadManager.m

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ - (instancetype)initWithConfiguration:(QNConfiguration *)config {
5858
config = [QNConfiguration build: ^(QNConfigurationBuilder *builder) {
5959
}];
6060
}
61+
_config = config;
6162
#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090)
6263
BOOL lowVersion = NO;
6364
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED)
@@ -73,15 +74,15 @@ - (instancetype)initWithConfiguration:(QNConfiguration *)config {
7374
}
7475
#endif
7576
if (lowVersion) {
76-
_httpManager = [[QNHttpManager alloc] initWithTimeout:_config.timeoutInterval];
77+
_httpManager = [[QNHttpManager alloc] initWithTimeout:config.timeoutInterval urlConverter:config.converter];
7778
}
7879
else {
79-
_httpManager = [[QNSessionManager alloc] initWithProxy:config.proxy timeout:_config.timeoutInterval];
80+
_httpManager = [[QNSessionManager alloc] initWithProxy:config.proxy timeout:config.timeoutInterval
81+
urlConverter:config.converter];
8082
}
8183
#else
82-
_httpManager = [[QNHttpManager alloc] initWithTimeout:_config.timeoutInterval];
84+
_httpManager = [[QNHttpManager alloc] initWithTimeout:config.timeoutInterval urlConverter:config.converter];
8385
#endif
84-
_config = config;
8586
}
8687
return self;
8788
}

QiniuSDKTests/QNFormUploadTest.m

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,4 +198,35 @@ - (void)testProxy {
198198
XCTAssert([@"FgoKnypncpQlV6tTVddq9EL49l4B" isEqualToString:testResp[@"key"]], @"Pass");
199199
}
200200

201+
- (void)testUrlConvert {
202+
__block QNResponseInfo *testInfo = nil;
203+
__block NSDictionary *testResp = nil;
204+
__block NSString *key = nil;
205+
206+
QNConfiguration *config = [QNConfiguration build: ^(QNConfigurationBuilder *builder) {
207+
builder.converter = ^NSString *(NSString *url) {
208+
return [url stringByReplacingOccurrencesOfString:@"upnono" withString:@"up"];
209+
};
210+
builder.zone = [[QNZone alloc] initWithUpHost:@"upnono.qiniu.com" upHostBackup:@"" upIp:@""];
211+
}];
212+
213+
QNUploadManager *upManager = [[QNUploadManager alloc] initWithConfiguration:config];
214+
215+
NSData *data = [@"Hello, World!" dataUsingEncoding:NSUTF8StringEncoding];
216+
[upManager putData:data key:nil token:g_token complete: ^(QNResponseInfo *info, NSString *k, NSDictionary *resp) {
217+
key = k;
218+
testInfo = info;
219+
testResp = resp;
220+
} option:nil];
221+
222+
AGWW_WAIT_WHILE(testInfo == nil, 100.0);
223+
NSLog(@"%@", testInfo);
224+
NSLog(@"%@", testResp);
225+
XCTAssert(key == nil, @"Pass");
226+
XCTAssert(testInfo.isOK, @"Pass");
227+
XCTAssert(testInfo.reqId, @"Pass");
228+
XCTAssert([testInfo.host isEqual:@"up.qiniu.com"], @"Pass");
229+
XCTAssert([@"FgoKnypncpQlV6tTVddq9EL49l4B" isEqualToString:testResp[@"key"]], @"Pass");
230+
}
231+
201232
@end

QiniuSDKTests/QNResumeUploadTest.m

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ - (void)testProxy {
147147

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

150-
int size = 6 * 1024;
150+
int size = 600;
151151
NSURL *tempFile = [QNTempFile createTempfileWithSize:size * 1024];
152152
NSString *keyUp = [NSString stringWithFormat:@"%dkproxy", size];
153153
__block QNResponseInfo *info = nil;
@@ -165,5 +165,33 @@ - (void)testProxy {
165165
[QNTempFile removeTempfile:tempFile];
166166
}
167167

168+
- (void)testUrlConvert {
169+
QNConfiguration *config = [QNConfiguration build: ^(QNConfigurationBuilder *builder) {
170+
builder.converter = ^NSString *(NSString *url) {
171+
return [url stringByReplacingOccurrencesOfString:@"upnono" withString:@"up"];
172+
};
173+
builder.zone = [[QNZone alloc] initWithUpHost:@"upnono.qiniu.com" upHostBackup:@"" upIp:@""];
174+
}];
175+
176+
QNUploadManager *upManager = [[QNUploadManager alloc] initWithConfiguration:config];
177+
178+
int size = 600;
179+
NSURL *tempFile = [QNTempFile createTempfileWithSize:size * 1024];
180+
NSString *keyUp = [NSString stringWithFormat:@"%dkconvert", size];
181+
__block QNResponseInfo *info = nil;
182+
__block NSString *key = nil;
183+
[upManager putFile:tempFile.path key:keyUp token:g_token complete: ^(QNResponseInfo *i, NSString *k, NSDictionary *resp) {
184+
key = k;
185+
info = i;
186+
} option:nil];
187+
188+
AGWW_WAIT_WHILE(key == nil, 60 * 30);
189+
NSLog(@"info %@", info);
190+
XCTAssert(info.isOK, @"Pass");
191+
XCTAssert([keyUp isEqualToString:key], @"Pass");
192+
XCTAssert([info.host isEqual:@"up.qiniu.com"], @"Pass");
193+
[QNTempFile removeTempfile:tempFile];
194+
}
195+
168196
#endif
169197
@end

0 commit comments

Comments
 (0)