You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by cx...@apache.org on 2017/03/09 10:08:57 UTC
[3/5] incubator-weex git commit: * [ios] refactor stream module
* [ios] refactor stream module
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/89ebdc13
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/89ebdc13
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/89ebdc13
Branch: refs/heads/0.11-dev
Commit: 89ebdc13cf5514f0f3243951adaeece77eb38593
Parents: 22b9477
Author: acton393 <zh...@gmail.com>
Authored: Thu Mar 9 18:05:31 2017 +0800
Committer: acton393 <zh...@gmail.com>
Committed: Thu Mar 9 18:05:31 2017 +0800
----------------------------------------------------------------------
ios/sdk/WeexSDK/Sources/Module/WXStreamModule.m | 239 +++++++++++--------
1 file changed, 142 insertions(+), 97 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/89ebdc13/ios/sdk/WeexSDK/Sources/Module/WXStreamModule.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXStreamModule.m b/ios/sdk/WeexSDK/Sources/Module/WXStreamModule.m
index f318df6..b100e20 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXStreamModule.m
+++ b/ios/sdk/WeexSDK/Sources/Module/WXStreamModule.m
@@ -28,43 +28,116 @@ WX_EXPORT_METHOD(@selector(fetch:callback:progressCallback:))
__block NSMutableDictionary * callbackRsp =[[NSMutableDictionary alloc] init];
__block NSString *statusText = @"ERR_CONNECT_FAILED";
- NSString *method = [options objectForKey:@"method"];
- if ([WXUtility isBlankString:method]) {
- // default HTTP method is GET
- method = @"GET";
+ //build stream request
+ WXResourceRequest * request = [self _buildRequestWithOptions:options callbackRsp:callbackRsp];
+ if (!request) {
+ if (callback) {
+ callback(callbackRsp);
+ }
+ // failed with some invaild inputs
+ return ;
}
+
+ // notify to start request state
+ if (progressCallback) {
+ progressCallback(callbackRsp, TRUE);
+ }
+
+ WXResourceLoader *loader = [[WXResourceLoader alloc] initWithRequest:request];
+ __weak typeof(self) weakSelf = self;
+ loader.onResponseReceived = ^(const WXResourceResponse *response) {
+ httpResponse = (NSHTTPURLResponse*)response;
+ if (weakSelf) {
+ [callbackRsp setObject:@{ @"HEADERS_RECEIVED" : @2 } forKey:@"readyState"];
+ [callbackRsp setObject:[NSNumber numberWithInteger:httpResponse.statusCode] forKey:@"status"];
+ [callbackRsp setObject:httpResponse.allHeaderFields forKey:@"headers"];
+ statusText = [WXStreamModule _getStatusText:httpResponse.statusCode];
+ [callbackRsp setObject:statusText forKey:@"statusText"];
+ [callbackRsp setObject:[NSNumber numberWithInteger:received] forKey:@"length"];
+ if (progressCallback) {
+ progressCallback(callbackRsp, TRUE);
+ }
+ }
+ };
+
+ loader.onDataReceived = ^(NSData *data) {
+ if (weakSelf) {
+ [callbackRsp setObject:@{ @"LOADING" : @3 } forKey:@"readyState"];
+ received += [data length];
+ [callbackRsp setObject:[NSNumber numberWithInteger:received] forKey:@"length"];
+ if (progressCallback) {
+ progressCallback(callbackRsp, TRUE);
+ }
+ }
+ };
+
+ loader.onFinished = ^(const WXResourceResponse * response, NSData *data) {
+ if (weakSelf) {
+ [weakSelf _loadFinishWithResponse:response data:data callbackRsp:callbackRsp];
+ if (callback) {
+ callback(callbackRsp);
+ }
+ }
+ };
+
+ loader.onFailed = ^(NSError *error) {
+ if (weakSelf) {
+ [weakSelf _loadFailedWithError:error callbackRsp:callbackRsp];
+ if (callback) {
+ callback(callbackRsp);
+ }
+ }
+ };
+
+ [loader start];
+}
+
+- (WXResourceRequest*)_buildRequestWithOptions:(NSDictionary*)options callbackRsp:(NSMutableDictionary*)callbackRsp
+{
+ // parse request url
NSString *urlStr = [options objectForKey:@"url"];
NSMutableString *newUrlStr = [urlStr mutableCopy];
WX_REWRITE_URL(urlStr, WXResourceTypeLink, self.weexInstance, &newUrlStr)
+ urlStr = newUrlStr;
if (!options || [WXUtility isBlankString:urlStr]) {
[callbackRsp setObject:@(-1) forKey:@"status"];
[callbackRsp setObject:@NO forKey:@"ok"];
- if (callback) {
- callback(callbackRsp);
- }
- return;
+ return nil;
}
- urlStr = newUrlStr;
- NSDictionary *headers = [options objectForKey:@"headers"];
- NSString *type = [options objectForKey:@"type"];
- NSURL *url = [NSURL URLWithString:urlStr];
- //TODO:referrer
- WXResourceRequest *request = [WXResourceRequest requestWithURL:url resourceType:WXResourceTypeOthers referrer:nil cachePolicy:NSURLRequestUseProtocolCachePolicy];
+ WXResourceRequest *request = [WXResourceRequest requestWithURL:[NSURL URLWithString:urlStr] resourceType:WXResourceTypeOthers referrer:nil cachePolicy:NSURLRequestUseProtocolCachePolicy];
+
+ // parse http method
+ NSString *method = [options objectForKey:@"method"];
+ if ([WXUtility isBlankString:method]) {
+ // default HTTP method is GET
+ method = @"GET";
+ }
request.HTTPMethod = method;
+
+ //parse responseType
+ NSString *responseType = [options objectForKey:@"type"];
+ [callbackRsp setObject:responseType?:@"JSON" forKey:@"responseType"];
+
+ //parse timeout
if ([options valueForKey:@"timeout"]){
- //ms
+ //the time unit is ms
[request setTimeoutInterval:([[options valueForKey:@"timeout"] floatValue])/1000];
}
+
+ //install client userAgent
request.userAgent = [WXUtility userAgent];
+ // parse custom http headers
+ NSDictionary *headers = [options objectForKey:@"headers"];
for (NSString *header in headers) {
NSString *value = [headers objectForKey:header];
[request setValue:value forHTTPHeaderField:header];
}
-
+
+ //parse custom body
if ([options objectForKey:@"body"]) {
NSData * body = nil;
if ([[options objectForKey:@"body"] isKindOfClass:[NSString class]]) {
@@ -77,102 +150,74 @@ WX_EXPORT_METHOD(@selector(fetch:callback:progressCallback:))
if (!body) {
[callbackRsp setObject:@(-1) forKey:@"status"];
[callbackRsp setObject:@NO forKey:@"ok"];
- if (callback) {
- callback(callbackRsp);
- }
- return;
+ return nil;
}
[request setHTTPBody:body];
}
[callbackRsp setObject:@{ @"OPENED": @1 } forKey:@"readyState"];
- if (progressCallback) {
- progressCallback(callbackRsp, TRUE);
- }
- WXResourceLoader *loader = [[WXResourceLoader alloc] initWithRequest:request];
- __weak typeof(self) weakSelf = self;
- loader.onResponseReceived = ^(const WXResourceResponse *response) {
- httpResponse = (NSHTTPURLResponse*)response;
- if (weakSelf) {
- [callbackRsp setObject:@{ @"HEADERS_RECEIVED" : @2 } forKey:@"readyState"];
- [callbackRsp setObject:[NSNumber numberWithInteger:httpResponse.statusCode] forKey:@"status"];
- [callbackRsp setObject:httpResponse.allHeaderFields forKey:@"headers"];
- statusText = [WXStreamModule getStatusText:httpResponse.statusCode];
- [callbackRsp setObject:statusText forKey:@"statusText"];
- [callbackRsp setObject:[NSNumber numberWithInteger:received] forKey:@"length"];
- if (progressCallback) {
- progressCallback(callbackRsp, TRUE);
- }
- }
- };
+ return request;
+}
+
+- (void)_loadFailedWithError:(NSError*)error callbackRsp:(NSMutableDictionary*)callbackRsp
+{
+ [callbackRsp removeObjectForKey:@"readyState"];
+ [callbackRsp removeObjectForKey:@"length"];
+ [callbackRsp removeObjectForKey:@"keepalive"];
+ [callbackRsp removeObjectForKey:@"responseType"];
- loader.onDataReceived = ^(NSData *data) {
- [callbackRsp setObject:@{ @"LOADING" : @3 } forKey:@"readyState"];
- received += [data length];
- [callbackRsp setObject:[NSNumber numberWithInteger:received] forKey:@"length"];
- if (progressCallback) {
- progressCallback(callbackRsp, TRUE);
- }
- };
+ [callbackRsp setObject:@(-1) forKey:@"status"];
+ [callbackRsp setObject:[NSString stringWithFormat:@"%@(%ld)",[error localizedDescription], (long)[error code]] forKey:@"data"];
+ NSString * statusText = @"";
- loader.onFinished = ^(const WXResourceResponse * response, NSData *data) {
- [callbackRsp removeObjectForKey:@"readyState"];
- [callbackRsp removeObjectForKey:@"length"];
- [callbackRsp removeObjectForKey:@"keepalive"];
- [callbackRsp setObject:httpResponse.statusCode >= 200 && httpResponse.statusCode <= 299 ? @YES : @NO forKey:@"ok"];
+ switch ([error code]) {
+ case -1000:
+ case -1002:
+ case -1003:
+ statusText = @"ERR_INVALID_REQUEST";
+ break;
+ default:
+ break;
+ }
+ [callbackRsp setObject:statusText forKey:@"statusText"];
- NSString *responseData = [self stringfromData:data encode:httpResponse.textEncodingName];
- if ([type isEqualToString:@"json"] || [type isEqualToString:@"jsonp"]) {
- if ([type isEqualToString:@"jsonp"]) {
- NSUInteger start = [responseData rangeOfString:@"("].location + 1 ;
- NSUInteger end = [responseData rangeOfString:@")" options:NSBackwardsSearch].location;
- if (end < [responseData length] && end > start) {
- responseData = [responseData substringWithRange:NSMakeRange(start, end-start)];
- }
- }
- id jsonObj = [self JSONObjFromData:[responseData dataUsingEncoding:NSUTF8StringEncoding]];
- if (jsonObj) {
- [callbackRsp setObject:jsonObj forKey:@"data"];
- }
-
- } else {
- if (responseData) {
- [callbackRsp setObject:responseData forKey:@"data"];
+}
+- (void)_loadFinishWithResponse:(WXResourceResponse*)response data:(NSData*)data callbackRsp:(NSMutableDictionary*)callbackRsp
+{
+ [callbackRsp removeObjectForKey:@"readyState"];
+ [callbackRsp removeObjectForKey:@"length"];
+ [callbackRsp removeObjectForKey:@"keepalive"];
+
+ [callbackRsp setObject:((NSHTTPURLResponse*)response).statusCode >= 200 && ((NSHTTPURLResponse*)response).statusCode <= 299 ? @YES : @NO forKey:@"ok"];
+
+ NSString *responseData = [self _stringfromData:data encode:((NSHTTPURLResponse*)response).textEncodingName];
+ NSString * responseType = [callbackRsp objectForKey:@"responseType"];
+ [callbackRsp removeObjectForKey:@"responseType"];
+ if (responseType) {
+
+ if ([responseType isEqualToString:@"jsonp"]) {
+ //TODO: to be more elegant
+ NSUInteger start = [responseData rangeOfString:@"("].location + 1 ;
+ NSUInteger end = [responseData rangeOfString:@")" options:NSBackwardsSearch].location;
+ if (end < [responseData length] && end > start) {
+ responseData = [responseData substringWithRange:NSMakeRange(start, end-start)];
}
}
- if (callback) {
- callback(callbackRsp);
+ id jsonObj = [self _JSONObjFromData:[responseData dataUsingEncoding:NSUTF8StringEncoding]];
+ if (jsonObj) {
+ [callbackRsp setObject:jsonObj forKey:@"data"];
}
- };
-
- loader.onFailed = ^(NSError *error) {
- [callbackRsp removeObjectForKey:@"readyState"];
- [callbackRsp removeObjectForKey:@"length"];
- [callbackRsp removeObjectForKey:@"keepalive"];
- [callbackRsp setObject:@(-1) forKey:@"status"];
- [callbackRsp setObject:[NSString stringWithFormat:@"%@(%ld)",[error localizedDescription], (long)[error code]] forKey:@"data"];
- switch ([error code]) {
- case -1000:
- case -1002:
- case -1003:
- statusText = @"ERR_INVALID_REQUEST";
- break;
- default:
- break;
- }
- [callbackRsp setObject:statusText forKey:@"statusText"];
- if (callback) {
- callback(callbackRsp);
+ } else {
+ if (responseData) {
+ [callbackRsp setObject:responseData forKey:@"data"];
}
- };
-
- [loader start];
+ }
}
-- (NSString*)stringfromData:(NSData *)data encode:(NSString *)encoding
+- (NSString*)_stringfromData:(NSData *)data encode:(NSString *)encoding
{
NSMutableString *responseData = nil;
if (data) {
@@ -190,7 +235,7 @@ WX_EXPORT_METHOD(@selector(fetch:callback:progressCallback:))
return responseData;
}
-- (id)JSONObjFromData:(NSData *)data
+- (id)_JSONObjFromData:(NSData *)data
{
NSError * error = nil;
id jsonObj = [WXUtility JSONObject:data error:&error];
@@ -200,7 +245,7 @@ WX_EXPORT_METHOD(@selector(fetch:callback:progressCallback:))
return jsonObj;
}
-+ (NSString*)getStatusText:(NSInteger)code
++ (NSString*)_getStatusText:(NSInteger)code
{
switch (code) {
case -1: