这是外部调用的方法executeMethod:params
/**
* 根据指定的 \code DTRpcMethod 执行一个 RPC 请求。
*
* @param method 一个 \code DTRpcCode 类型的实例,描述了 RPC 请求的相头信息。
* @param params RPC 请求需要的参数。
*
* @return 如果请求成功,返回指定类型的对象,否则返回 nil。
*/
- (id)executeMethod:(DTRpcMethod *)method params:(NSArray *)params;
调用 第一次见到这样的用法
[DTRpcAsyncCaller callAsyncBlock:^{
result = [[DTRpcClient defaultClient] executeMethod:method params:@[postDic]]
} completion:^{
处理 result
}];
method传入下面对象
DTRpcMethod *method = [[DTRpcMethod alloc] init];
//
// DTRpcMethod.h
// APMobileNetwork
//
// Created by WenBi on 13-4-18.
// Copyright (c) 2013年 Alipay. All rights reserved.
//
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSInteger, RpcCacheDataType)
{
RpcCacheDataTypeDefault = 0,//不存储RPC数据,不读取RPC的cache数据,普通的RPC流程
RpcCacheDataTypeCommonSave, //RPC完成后保存数据为普通数据,与userId无关
RpcCacheDataTypeUserSave, //RPC完成后保存数据为用户数据,当前userId是存数据的Key的一部分
RpcCacheDataTypeCommonRead, //不做网络请求,根据RPC参数为从cache中读取数据,无数据返回nil,与登录无关
RpcCacheDataTypeUserRead, //不做网络请求,根据RPC参数和userId为从cache中读取数据,不是登录态时或无数据返回nil
};
@protocol DTRpcPrivateEncryptProtocol <NSObject>
@optional
/**
* 加密方法
* @param data 需要加密的数据
* @return 加密后的数据
*/
-(NSData*)encryptData:(NSData*)data;
/**
* 解密方法
* @param data 需要解密的数据
* @return 解密后的数据
*/
-(NSData*)decryptData:(NSData*)data;
@end
@interface DTRpcMethod : NSObject
/** Operation type */
@property(nonatomic, copy) NSString *operationType;
/** 期望返回的对象类型。*/
@property(nonatomic, unsafe_unretained) Class resultClass;
/** 返回对象的类型。 */
@property(nonatomic, copy) NSString *returnType;
/** 如果一个 PRC 方法的返回值是一个集合类型,\code elementClass 指定集合中元素的类型。否则该属性为 nil。*/
@property(nonatomic, unsafe_unretained) Class elementClass;
/** 检查登录 */
@property(nonatomic, assign) BOOL checkLogin;
/** 签名 */
@property(nonatomic, assign) BOOL signCheck;
/** 是否是统一账户网关的请求,默认NO*/
@property(nonatomic, assign) BOOL isAliUserGWMethod;
/** 统一账户网关需要在httpHeader里加此字段*/
@property(nonatomic, strong) NSString *apdid;
/** 缓存策略 */
@property(nonatomic, assign) RpcCacheDataType cacheStrategy;
/** 是否支持网络层的重传,需要业务做好幂等性才设置为YES */
@property(nonatomic, assign) BOOL retryable;
/** rpc超时时长可设置 */
@property(nonatomic,assign) NSTimeInterval timeoutInterval;
/** 设置是否忽略网络状态 */
@property(nonatomic,assign) BOOL isIgnoreNetStatus;
/** 设置是否是特殊通道rpc 默认no */
@property(nonatomic,assign) BOOL isSpecialChannelRPC;
/** 设置是否是NSData rpc 默认no */
@property(nonatomic,assign) BOOL isNSData;
/** 设置是否是登录rpc(专为登录session串号提供仅在账号切换时使用,其他业务不可使用) 默认no */
@property(nonatomic,assign) BOOL isLoginRPC;
/**request 请求走post还是get 默认是post 当走get请求时 走RPCV1**/
@property(nonatomic,assign) BOOL httpGET;
/**rpc是否需要自加密 默认YES mpaas用**/
@property(nonatomic,assign) BOOL isCrypt;
/** 设置对发送数据的body加解密协议 inside专用*/
@property(nonatomic,strong) id<DTRpcPrivateEncryptProtocol> privateEncrypt;
@end
先看 +[DTRpcClient defaultClient]
void * +[DTRpcClient defaultClient](void * self, void * _cmd) {
if (*_defaultClient.oncePredicate != 0xffffffffffffffff) {
dispatch_once(_defaultClient.oncePredicate, ^ {/* block implemented at ___28+[DTRpcClient defaultClient]_block_invoke */ } });
}
rax = objc_retainAutoreleaseReturnValue(*_defaultClient.client);
return rax;
}
void ___28+[DTRpcClient defaultClient]_block_invoke(void * _block) {
rax = [DTRpcClient alloc];
rax = [rax init];
rdi = *_defaultClient.client;
*_defaultClient.client = rax;
[rdi release];
r12 = [[NSOperationQueue alloc] init];
[r12 setMaxConcurrentOperationCount:0xa];
[*_defaultClient.client setRequestQueue:r12];
rbx = [[NSMutableArray arrayWithCapacity:0x4] retain];
[*_defaultClient.client setLockedOperations:rbx];
[rbx release];
rbx = [[DTRpcConfigManager alloc] init];
[*_defaultClient.client setConfigManager:rbx];
[rbx release];
rbx = [[DTRpcInterface sharedInstance] retain];
[rbx readPrivateHeadersFromPlist];
[rbx release];
rbx = [dispatch_get_global_queue(0x0, 0x0) retain];
dispatch_async(rbx, ^ {/* block implemented at ___28+[DTRpcClient defaultClient]_block_invoke_2 */ } });
[rbx release];
[r12 release];
return;
}
主要的方法 -[DTRpcClient executeMethod:params:]
void * -[DTRpcClient executeMethod:params:](void * self, void * _cmd, void * arg2, void * arg3) {
r15 = self;
r14 = [arg2 retain];
r12 = [arg3 retain];
r13 = [[DTRpcContext getRpcHeader] retain];
if ((r13 != 0x0) && ([r13 isKindOfClass:[NSDictionary class]] != 0x0)) {
[DTRpcContext removeRpcHeader];
}
r15 = [[r15 executeMethod:r14 params:r12 requestHeaderField:r13 responseHeaderFields:0x0] retain];
[r13 release];
[r12 release];
[r14 release];
rax = [r15 autorelease];
return rax;
}
它是获取了rpc的请求头[DTRpcContext getRpcHeader] 然后调用 [[r15 executeMethod:r14 params:r12 requestHeaderField:r13 responseHeaderFields:0x0] retain];
void * +[DTRpcContext getRpcHeader](void * self, void * _cmd) {
r14 = [[NSThread currentThread] retain];
rbx = [[r14 threadDictionary] retain];
r15 = [[rbx objectForKey:@"rpc-header"] retain];
[rbx release];
[r14 release];
rax = [r15 autorelease];
return rax;
}
正常情况是没有rpc-header的,这是在下面添加的
void +[DTRpcContext setRpcHeader:](void * self, void * _cmd, void * arg2) {
rbx = [arg2 retain];
if (rbx != 0x0) {
rdx = [NSDictionary class];
if ([rbx isKindOfClass:rdx] != 0x0) {
r14 = [[NSThread currentThread] retain];
r15 = [[r14 threadDictionary] retain];
[r15 setObject:rbx forKey:@"rpc-header"];
[r15 release];
[r14 release];
}
}
[rbx release];
return;
}
第二步 :继续看-[DTRpcClient executeMethod:params:requestHeaderField:responseHeaderFields:]
void * -[DTRpcClient executeMethod:params:requestHeaderField:responseHeaderFields:](void * self, void * _cmd, void * arg2, void * arg3, void * arg4, void * arg5) {
var_60 = self;
r14 = [arg2 retain];
r15 = [arg3 retain];
r12 = [arg4 retain];
var_48 = [arg5 retain];
var_58 = r12;
rbx = [[DTRpcInterface sharedInstance] retain];
r8 = r12;
r12 = r15;
[rbx willExecuteMethod:r14 params:r15 requestHeaderField:r8];
[rbx release];
r15 = r14;
r14 = [DTRpcContext isForegroundRPC];
if (([r15 cacheStrategy] != 0x3) && ([r15 cacheStrategy] != 0x4)) {
var_29 = r14;
var_40 = r12;
r14 = [[r15 operationType] retain];
rbx = [[var_60 preferredConfig:r14] retain];
[r14 release];
var_38 = rbx;
r14 = [rbx isAMRPC];
r12 = [DTRpcUtils amrpcSwitch];
rbx = [var_38 isCDN];
if ([r15 httpGET] != 0x0) {
rbx = 0x0;
[var_38 setIsCDN:0x0];
}
else {
rbx = (rbx ^ 0x1) & r14 & r12;
}
var_50 = rbx;
r12 = [[DTRpcInterface sharedInstance] retain];
rbx = [[r12 mPaaSPrivateHeaders] retain];
r14 = [rbx count];
[rbx release];
[r12 release];
if (r14 != 0x0) {
var_98 = 0x0;
*(&var_98 + 0x8) = &var_98;
*(&var_98 + 0x10) = 0x3032000000;
*(int128_t *)(&var_98 + 0x18) = intrinsic_movdqu(*(int128_t *)(&var_98 + 0x18), intrinsic_punpcklqdq(zero_extend_64(___Block_byref_object_copy_), zero_extend_64(___Block_byref_object_dispose_)));
[[NSMutableDictionary dictionaryWithDictionary:var_58] retain];
r13 = [[DTRpcInterface sharedInstance] retain];
rax = [r13 mPaaSPrivateHeaders];
rax = [rax retain];
var_C0 = __NSConcreteStackBlock;
*(&var_C0 + 0x8) = 0xc2000000;
*(&var_C0 + 0x10) = ___76-[DTRpcClient executeMethod:params:requestHeaderField:responseHeaderFields:]_block_invoke;
*(&var_C0 + 0x18) = ___block_descriptor_tmp.536;
*(&var_C0 + 0x20) = &var_98;
[rax enumerateKeysAndObjectsUsingBlock:var_58];
[rax release];
[r13 release];
r12 = [DTRpcOperation alloc];
rbx = [[var_38 gatewayURL] retain];
r12 = [r12 initWithURL:rbx method:r15 params:var_40 headerFields:*(var_90 + 0x28) amrpc:var_50 & 0xff cdn:[var_38 isCDN] & 0xff];
[rbx release];
_Block_object_dispose(&var_98, 0x8);
[*(&var_98 + 0x28) release];
}
else {
r13 = [DTRpcOperation alloc];
rbx = [[var_38 gatewayURL] retain];
r12 = [r13 initWithURL:rbx method:r15 params:var_40 headerFields:var_58 amrpc:var_50 & 0xff cdn:[var_38 isCDN] & 0xff];
[rbx release];
}
[r12 setShouldAppendCTUExtraParams:[var_38 shouldAppendCTUExtraParams] & 0xff];
[r12 setNetworkActivityIndicatorVisible:[var_38 networkActivityIndicatorVisible] & 0xff];
[r12 setRequestBodyGZip:[var_38 requestGZip] & 0xff];
[r12 setIgnoreInterceptor:[var_38 ignoreInterceptor] & 0xff];
[r12 setResponseBlock:var_48];
[r12 setCanResend:[r15 retryable] & 0xff];
[r12 setIsIgnoreNetStatus:[r15 isIgnoreNetStatus] & 0xff];
if ([r12 canResend] == 0x0) {
[r12 setCanResend:[var_38 canResend] & 0xff];
}
[r12 setIsForegroundRPC:var_29 & 0xff];
rbx = [[var_60 configManager] retain];
r13 = [[r15 operationType] retain];
r14 = [[rbx retryableValueOfOperationType:r13] retain];
[r12 setNetRetryable:r14];
[r14 release];
[r13 release];
[rbx release];
r14 = [[var_60 executeOperation:r12 responseHeaderFields:var_48] retain];
[r12 release];
[var_38 release];
r12 = var_40;
}
else {
r14 = [[var_60 readCacheMethod:r15 params:r12] retain];
}
[var_48 release];
[var_58 release];
[r12 release];
[r15 release];
rax = [r14 autorelease];
return rax;
}
看[DTRpcContext isForegroundRPC]; 又是这样存数据。 疑问?
bool +[DTRpcContext isForegroundRPC](void * self, void * _cmd) {
rbx = [[NSThread currentThread] retain];
r14 = [[rbx threadDictionary] retain];
r13 = [[r14 objectForKey:@"is_foreground_rpc"] retain];
[r14 release];
[rbx release];
r14 = [[NSThread currentThread] retain];
rbx = [[r14 threadDictionary] retain];
[rbx removeObjectForKey:@"is_foreground_rpc"];
[rbx release];
[r14 release];
rbx = 0x1;
if ([r13 isKindOfClass:[NSNumber class]] != 0x0) {
rbx = [r13 boolValue];
}
[r13 release];
rax = rbx;
return rax;
}
这里的 rbx = [[var_-96 preferredConfig:r14] retain]; var_-96应该是个类全局变量 DTRpcClient类型
void * -[DTRpcConfigManager preferredConfig:](void * self, void * _cmd, void * arg2) {
rbx = self;
r14 = [arg2 retain];
r15 = [[NSThread currentThread] retain];
if ((r14 == 0x0) || ([r14 length] == 0x0)) goto loc_100c17f31;
loc_100c17ea5:
var_38 = r15;
var_30 = rbx;
r13 = [rbx retain];
objc_sync_enter(r13);
r15 = [[r13 operationTypeConfigs] retain];
r12 = [[r15 objectForKey:r14] retain];
[r15 release];
objc_sync_exit(r13);
[r13 release];
r14 = r14;
r15 = var_38;
if (r12 != 0x0) goto loc_100c17faf;
loc_100c17f28:
r13 = r12;
rbx = var_30;
goto loc_100c17f34;
loc_100c17f34:
r12 = [[r15 temporaryRpcConfig] retain];
[r13 release];
if (r12 == 0x0) goto loc_100c17f71;
loc_100c17f5d:
rsi = @selector(setTemporaryRpcConfig:);
rdi = r15;
goto loc_100c17f69;
loc_100c17f69:
_objc_msgSend(rdi, rsi);
goto loc_100c17faf;
loc_100c17faf:
[r15 release];
[r14 release];
rax = [r12 autorelease];
return rax;
loc_100c17f71:
r13 = [[r15 localRpcConfig] retain];
[r12 release];
if (r13 == 0x0) goto loc_100c17fd6;
loc_100c17f9a:
[r15 setLocalRpcConfig:0x0];
r12 = r13;
goto loc_100c17faf;
loc_100c17fd6:
r12 = [[rbx globalOnceConfig] retain];
[r13 release];
if (r12 == 0x0) goto loc_100c18010;
loc_100c17fff:
rsi = @selector(setGlobalOnceConfig:);
rdi = rbx;
goto loc_100c17f69;
loc_100c18010:
rax = [rbx globalConfig];
rbx = r15;
r15 = [rax retain];
[r12 release];
r12 = r15;
r15 = rbx;
goto loc_100c17faf;
loc_100c17f31:
r13 = 0x0;
goto loc_100c17f34;
}
第三个 继续往下 每次hopper vvar_D8都会变的-[DTRpcOperation initWithURL:method:params:headerFields:amrpc:cdn:]
void * -[DTRpcOperation initWithURL:method:params:headerFields:amrpc:cdn:](void * self, void * _cmd, void * arg2, void * arg3, void * arg4, void * arg5, bool arg6, bool arg7) {
r14 = [arg2 retain];
r15 = [arg3 retain];
rbx = [arg4 retain];
r13 = r14;
var_D8 = [arg5 retain];
var_F8 = r15;
rcx = r15;
var_F0 = rbx;
r12 = [self initWithURL:r13 method:rcx params:rbx amrpc:arg6 & 0xff cdn:arg7 & 0xff];
if (r12 != 0x0) {
[r12 setAddHeaders:var_D8];
var_B8 = [[r12 request] retain];
var_C0 = r12;
if ((var_D8 != 0x0) && ([var_B8 isKindOfClass:[NSMutableURLRequest class]] != 0x0)) {
rax = [var_B8 allHTTPHeaderFields];
var_C8 = r13;
r15 = [rax retain];
xmm0 = intrinsic_xorpd(xmm0, xmm0);
*(int128_t *)(&var_150 + 0x30) = intrinsic_movapd(*(int128_t *)(&var_150 + 0x30), xmm0);
*(int128_t *)(&var_150 + 0x20) = intrinsic_movapd(*(int128_t *)(&var_150 + 0x20), xmm0);
*(int128_t *)(&var_150 + 0x10) = intrinsic_movapd(*(int128_t *)(&var_150 + 0x10), xmm0);
var_150 = intrinsic_movapd(var_150, xmm0);
rax = [var_D8 retain];
rcx = &var_B0;
var_D0 = rax;
var_E8 = r15;
r13 = [rax countByEnumeratingWithState:&var_150 objects:rcx count:0x10];
if (r13 != 0x0) {
var_110 = **(&var_150 + 0x10);
do {
r14 = 0x0;
do {
if (*var_140 != var_110) {
objc_enumerationMutation(var_D0);
}
r12 = *(var_148 + r14 * 0x8);
rbx = [[r15 objectForKey:r12] retain];
[rbx release];
if (rbx == 0x0) {
r15 = [[var_D0 objectForKeyedSubscript:r12] retain];
[var_B8 setValue:r15 forHTTPHeaderField:r12];
[r15 release];
r15 = var_E8;
}
r14 = r14 + 0x1;
} while (r14 < r13);
rcx = &var_B0;
r13 = [var_D0 countByEnumeratingWithState:&var_150 objects:rcx count:0x10];
r12 = var_C0;
} while (r13 != 0x0);
}
[var_D0 release];
[r15 release];
r13 = var_C8;
}
rbx = [[DTRpcInterface sharedInstance] retain];
r14 = [rbx isAddAppVisibleFlag];
[rbx release];
if (r14 != 0x0) {
r14 = [[DTRpcInterface sharedInstance] retain];
rbx = [[r14 appVisibleFlag] retain];
rcx = @"visibleflag";
[var_B8 setValue:rbx forHTTPHeaderField:rcx];
[rbx release];
[r14 release];
r12 = var_C0;
}
rbx = [[DTRpcInterface sharedInstance] retain];
r14 = [rbx isAddWua];
[rbx release];
if (r14 != 0x0) {
rbx = NSClassFromString(@"APSecRDS");
if (rbx != 0x0) {
rax = [NSDate date];
var_C8 = r13;
var_D0 = [rax retain];
r12 = [[rbx getMiniWuaData] retain];
rbx = [[NSDate date] retain];
[rbx timeIntervalSinceDate:var_D0];
var_E0 = intrinsic_movsd(@selector(objectForKey:), xmm0);
[rbx release];
r14 = *ivar_offset(_userInfo);
intrinsic_mulsd(intrinsic_movsd(xmm0, var_E0), *0x101f03938);
rbx = [[NSString stringWithFormat:@"%f", rcx] retain];
rcx = @"wua_t";
[*(var_C0 + r14) setObject:rbx forKey:rcx];
[rbx release];
rax = r12;
r13 = var_C8;
if (rax != 0x0) {
[var_B8 setValue:rax forHTTPHeaderField:@"miniwua"];
rbx = [[NSString stringWithFormat:@"%ld", [r12 length]] retain];
rcx = @"wua_len";
[*(var_C0 + r14) setObject:rbx forKey:rcx];
[rbx release];
r13 = var_C8;
rax = r12;
}
[rax release];
[var_D0 release];
r12 = var_C0;
}
}
rbx = [[DTRpcInterface sharedInstance] retain];
r14 = [rbx isFetchFilter];
[rbx release];
if (r14 != 0x0) {
rbx = [[r12 userInfo] retain];
rcx = @"FETCH";
[rbx setValue:@"T" forKey:rcx];
[rbx release];
}
r14 = [[DTRpcInterface sharedInstance] retain];
rbx = [[r13 absoluteString] retain];
rsi = @selector(groupName:);
rdx = rbx;
r15 = [_objc_msgSend(r14, rsi) retain];
[rbx release];
[r14 release];
if (r15 != 0x0) {
rsi = @selector(setValue:forHTTPHeaderField:);
rcx = @"sofa-group-name";
rbx = var_B8;
rdx = r15;
_objc_msgSend(rbx, rsi);
}
else {
rbx = var_B8;
}
[r15 release];
[rbx release];
r12 = var_C0;
}
[var_D8 release];
[var_F0 release];
[var_F8 release];
[r13 release];
if (*___stack_chk_guard == *___stack_chk_guard) {
rax = r12;
}
else {
rax = __stack_chk_fail();
}
return rax;
}
调用
void * -[DTRpcOperation initWithURL:method:params:amrpc:cdn:](void * self, void * _cmd, void * arg2, void * arg3, void * arg4, bool arg5, bool arg6) {
var_30 = [arg2 retain];
var_48 = [arg3 retain];
var_38 = [arg4 retain];
self->_cookieLock = [[NSLock alloc] init];
[self->_cookieLock release];
r15 = arg6 & 0xff;
r13 = arg5 & 0xff;
rbx = var_48;
rax = [self requestWithURL:var_30 method:rbx params:var_38 amrpc:r13 cdn:r15];
rax = [rax retain];
var_58 = self;
*(&var_58 + 0x8) = _OBJC_CLASS_$_DTRpcOperation;
var_40 = rax;
r14 = [[&var_58 super] initWithRequest:rax];
if (r14 != 0x0) {
[r14 setIsAMRPC:r13];
[r14 setIsCDN:r15];
[r14 setMethod:rbx];
[r14 setParams:var_38];
r13 = [[NSMutableDictionary alloc] init];
[r14 setUserInfo:r13];
[r13 release];
[r14 setRequestBodySign:[rbx signCheck] & 0xff];
[r14 setIsSpecialChannelRPC:[rbx isSpecialChannelRPC] & 0xff];
[r14 setHasCanceled:0x0];
[r14 setIsNSData:[rbx isNSData] & 0xff];
[r14 setIsLoginRPC:[rbx isLoginRPC] & 0xff];
[r14 setIsH2RPC:0x1];
[r14 setGatewayURL:var_30];
[r14 setHttpGET:[rbx httpGET] & 0xff];
[r14 setIsCrypt:[rbx isCrypt] & 0xff];
}
[var_40 release];
[var_38 release];
[rbx release];
[var_30 release];
rax = r14;
return rax;
}
调用 这里面的就是最初的方法了 竟然没有afnet -[DTRpcOperation requestWithURL:method:params:amrpc:cdn:]
void * -[DTRpcOperation requestWithURL:method:params:amrpc:cdn:](void * self, void * _cmd, void * arg2, void * arg3, void * arg4, bool arg5, bool arg6) {
r13 = arg5;
r12 = self;
var_40 = arg6;
var_50 = [arg2 retain];
rbx = [arg3 retain];
var_60 = rbx;
var_58 = [arg4 retain];
[rbx timeoutInterval];
xmm1 = intrinsic_movsd(xmm1, *0x101f037b0);
xmm1 = intrinsic_ucomisd(xmm1, xmm0);
if (xmm1 > 0x0) {
[DTRpcUtils requestTimeout];
}
var_38 = intrinsic_movsd(var_38, xmm0);
NSLog(cfstring_r);
var_64 = r13;
var_30 = r12;
r14 = [[var_50 host] retain];
rbx = [[DTRpcUtils getIpByHost:r14] retain];
[var_30 setHttpDnsIp:rbx];
[rbx release];
[r14 release];
rbx = [[var_30 httpDnsIp] retain];
[rbx release];
if (rbx != 0x0) {
r14 = [NSURL alloc];
r12 = [[var_50 scheme] retain];
r13 = [[var_30 httpDnsIp] retain];
rbx = [[var_50 path] retain];
r14 = [r14 initWithScheme:r12 host:r13 path:rbx];
[rbx release];
[r13 release];
[r12 release];
var_48 = r14;
intrinsic_movsd(xmm0, var_38, r14, 0x0);
rbx = [_objc_msgSend(@class(NSMutableURLRequest), @selector(requestWithURL:cachePolicy:timeoutInterval:)) retain];
r12 = [[var_50 host] retain];
r14 = var_60;
[rbx setValue:r12 forHTTPHeaderField:@"host"];
[r12 release];
[var_48 release];
rbx = rbx;
}
else {
intrinsic_movsd(xmm0, var_38, var_50, 0x0);
rbx = [_objc_msgSend(@class(NSMutableURLRequest), @selector(requestWithURL:cachePolicy:timeoutInterval:)) retain];
r14 = var_60;
}
if ([r14 httpGET] != 0x0) {
[rbx setHTTPMethod:@"GET"];
}
else {
[rbx setHTTPMethod:@"POST"];
}
var_38 = rbx;
r14 = [_getAPLanguageSetting() retain];
rbx = [[r14 currentLanguage] retain];
r15 = [[rbx name] retain];
[rbx release];
[r14 release];
r13 = var_60;
r14 = var_38;
var_70 = r15;
if (r15 != 0x0) {
[r14 setValue:r15 forHTTPHeaderField:@"Accept-Language"];
}
[DTRpcUtils addProductVersion:r14];
[DTRpcUtils adduserId:r14];
if ([var_58 count] != 0x0) {
rax = [var_58 objectAtIndex:0x0];
rax = [rax retain];
}
else {
rax = 0x0;
}
var_48 = rax;
r15 = [NSClassFromString(@"PBGeneratedMessage") class];
if ((var_48 != 0x0) && ([var_48 isKindOfClass:[NSNull class]] == 0x0)) {
if ((r15 != 0x0) && ([var_48 isKindOfClass:r15] != 0x0)) {
[var_30 setIsProtocolBuffers:0x1];
}
else {
if ([r13 isNSData] != 0x0) {
[var_30 setIsProtocolBuffers:0x1];
}
else {
[var_30 setIsProtocolBuffers:0x0];
}
}
}
else {
r13 = [[r13 returnType] retain];
r14 = [[r13 stringByReplacingOccurrencesOfString:@"@" withString:@""] retain];
[r13 release];
r13 = var_60;
rbx = r14;
r14 = [[r14 stringByReplacingOccurrencesOfString:@"\"" withString:@""] retain];
[rbx release];
if ((r14 != 0x0) && ([[NSClassFromString(r14) class] isSubclassOfClass:r15] != 0x0)) {
[var_30 setIsProtocolBuffers:0x1];
}
else {
if ([r13 isNSData] != 0x0) {
[var_30 setIsProtocolBuffers:0x1];
}
else {
[var_30 setIsProtocolBuffers:0x0];
}
}
[r14 release];
r14 = var_38;
}
if ([var_30 isProtocolBuffers] != 0x0) {
[var_30 toCDN:r14 cdn:var_40 & 0xff reqURL:var_50];
[var_30 filRequestlValue:r14 contentType:@"application/protobuf" method:r13 params:var_58];
}
else {
if (var_40 != 0x0) {
[var_30 toCDN:r14 cdn:0x1 reqURL:var_50];
[var_30 filRequestlValue:r14 contentType:@"application/json" method:r13 params:var_58];
}
else {
if (var_64 != 0x0) {
[var_30 filRequestlValue:r14 contentType:@"application/json" method:r13 params:var_58];
}
else {
[r14 setValue:@"application/x-www-form-urlencoded;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
r14 = [_getAPMobileIdentifier() retain];
r12 = [[r14 shareIdentifier] retain];
rbx = [[r12 UTDID] retain];
[var_38 setValue:rbx forHTTPHeaderField:@"did"];
[rbx release];
[r12 release];
[r14 release];
rbx = [[DTRpcUtils productID] retain];
[var_38 setValue:rbx forHTTPHeaderField:@"AppId"];
[rbx release];
rax = [NSUUID UUID];
rax = [rax retain];
r12 = [[rax UUIDString] retain];
r15 = [[r12 lowercaseString] retain];
[var_38 setValue:r15 forHTTPHeaderField:@"uuid"];
[r15 release];
[r12 release];
[rax release];
[var_38 setValue:@"Keep-Alive" forHTTPHeaderField:@"Connection"];
[var_38 setValue:@"timeout=180, max=100" forHTTPHeaderField:@"Keep-Alive"];
if ([r13 isAliUserGWMethod] != 0x0) {
r14 = [[r13 apdid] retain];
if (r14 != 0x0) {
rbx = [[r13 apdid] retain];
r12 = 0x1;
}
else {
rbx = @"";
r12 = 0x0;
}
[var_38 setValue:rbx forHTTPHeaderField:@"apdid"];
if (r12 != 0x0) {
[rbx release];
}
[r14 release];
[var_38 setValue:@"1" forHTTPHeaderField:@"aliusergw"];
}
[var_30 buildRequestDataWithMethod:r13 params:var_58];
r12 = [[DTURLCache sharedCache] retain];
rbx = [[var_30 etagRequest] retain];
r14 = [[r12 ETagForRequest:rbx] retain];
[rbx release];
[r12 release];
if ((r14 != 0x0) && ([r14 length] != 0x0)) {
[var_38 setValue:r14 forHTTPHeaderField:@"If-None-Match"];
rax = [DTURLCache sharedCache];
var_40 = r14;
r14 = [rax retain];
r12 = [[var_30 etagRequest] retain];
var_30->_cachedResponse = [[r14 cachedResponseForRequest:r12] retain];
[var_30->_cachedResponse release];
[r12 release];
[r14 release];
r14 = var_40;
}
if ([r13 signCheck] == 0x0) {
rbx = [[DTRpcUtils timestampLogger] retain];
[var_38 setValue:rbx forHTTPHeaderField:@"Ts"];
[rbx release];
}
[r14 release];
r14 = var_38;
}
}
}
rbx = [[var_30 httpBodyParameters] retain];
r12 = [[rbx objectForKey:@"requestData"] retain];
[rbx release];
if (r12 != 0x0) {
r14 = [[DTRpcInterface sharedInstance] retain];
[[[r14 rpcSizeControl:r13 size:[r12 length] isReq:0x1] retain] release];
[r14 release];
r14 = var_38;
}
[r12 release];
[var_48 release];
[var_70 release];
[var_58 release];
[r13 release];
[var_50 release];
rax = [r14 autorelease];
return rax;
}
这里有-[DTRpcOperation buildRequestDataWithMethod:params:]
void -[DTRpcOperation buildRequestDataWithMethod:params:](void * self, void * _cmd, void * arg2, void * arg3) {
r15 = [arg2 retain];
r12 = [arg3 retain];
var_-72 = r15;
var_-64 = r12;
rbx = [[r15 operationType] retain];
[self addHTTPBodyParameter:rbx forKey:@"operationType"];
[rbx release];
rax = [DTJsonEncoder encoder];
var_-48 = self;
rbx = [rax retain];
r12 = [[rbx encodeObject:r12] retain];
[rbx release];
r13 = @"[]";
[r13 retain];
var_-56 = r12;
if (r12 != 0x0) {
if ([r12 length] != 0x0) {
r13 = [r12 retain];
[@"[]" release];
}
else {
r13 = @"[]";
}
}
[var_-48 addHTTPBodyParameter:r13 forKey:@"requestData"];
r14 = [[r15 operationType] retain];
r12 = [[NSString stringWithFormat:@"%@&%@", r14, r13] retain];
r15 = [[r12 dataUsingEncoding:0x4] retain];
[r12 release];
[r14 release];
rbx = [[DTURLCache etagRequest:r15] retain];
[var_-48 setEtagRequest:rbx];
[rbx release];
[r15 release];
[r13 release];
[var_-56 release];
[var_-64 release];
[var_-72 release];
return;
}
然后就是nsurlcontion的代理方法
通过层层父类找到 确实是从上到下执行的? 但为啥?
void -[DTRpcOperation URLProtocolDidFinishLoading:](void * self, void * _cmd, void * arg2) {
rbx = [[self runningThread] retain];
[self performSelector:@selector(didURLProtocolFinishLoading) onThread:rbx withObject:0x0 waitUntilDone:0x0];
[rbx release];
return;
}
void -[DTRpcOperation didURLProtocolFinishLoading](void * self, void * _cmd) {
[self setHasCanceled:0x1];
r14 = [[self connection] retain];
[self performSelector:@selector(connectionDidFinishLoading:) withObject:r14];
[r14 release];
[self stopSendRPC];
return;
}
void -[DTURLRequestOperation connectionDidFinishLoading:](void * self, void * _cmd, void * arg2) {
r12 = self;
rbx = [[self httpDnsIp] retain];
[rbx release];
if (rbx != 0x0) {
r15 = [[r12 request] retain];
r13 = [[r15 URL] retain];
rbx = [[r13 host] retain];
[DTRpcUtils updateIpIndex:rbx succ:0x1];
[rbx release];
[r13 release];
[r15 release];
}
r15 = [[r12 outputStream] retain];
rbx = [[r15 propertyForKey:*_NSStreamDataWrittenToMemoryStreamKey] retain];
[r12 setResponseData:rbx];
[rbx release];
[r15 release];
rbx = [[r12 outputStream] retain];
[rbx close];
[rbx release];
[r12 finish];
[r12 setConnection:0x0];
return
}
[[[[[[[[[[[和AF真像
void -[AFURLConnectionOperation connectionDidFinishLoading:](void * self, void * _cmd, void * arg2) {
rax = &var_18;
var_18 = 0x0;
objc_storeStrong(rax, arg2);
rax = [self outputStream];
rax = [rax retain];
var_20 = rax;
rax = [rax propertyForKey:*_NSStreamDataWrittenToMemoryStreamKey];
rax = [rax retain];
[self setResponseData:rax];
[rax release];
[var_20 release];
rax = [self outputStream];
rax = [rax retain];
[rax close];
[rax release];
[self finish];
[self setConnection:0x0];
objc_storeStrong(&var_18, 0x0);
return;
}
[[[[[[[[[[[[[[[[
void -[DTURLRequestOperation finish](void * self, void * _cmd) {
[self didFinish];
[self setState:0x3];
return;
}
void -[DTURLRequestOperation didFinish](void * self, void * _cmd) {
if ([self networkActivityIndicatorVisible] != 0x0) {
_ExMainACall_APMobileNetwork("-[DTURLRequestOperation didFinish]", 0x0, ^ {/* block implemented at ___34-[DTURLRequestOperation didFinish]_block_invoke */ } });
*(int8_t *)_networkActivity = 0x0;
}
return;
}
void ___34-[DTURLRequestOperation didFinish]_block_invoke(void * _block) {
[MPUnification showNetworkActivityIndicator:0x0 tag:@"APMobileNetwork"];
return;
}
第四个 执行 操作 传入DTRpcOperation 调用 [r15 waitUntilFinished];
void * -[DTRpcClient executeOperation:responseHeaderFields:](void * self, void * _cmd, void * arg2, void * arg3) {
rcx = arg3;
rdx = arg2;
r14 = self;
r15 = [rdx retain];
var_30 = [rcx retain];
while ([r14 interceptorsInstalled] == 0x0) {
usleep(0x3e8);
}
rbx = [[r14 interceptor] retain];
[rbx release];
if (rbx != 0x0) {
r12 = [[r14 interceptor] retain];
[[[r12 beforeRpcOperation:r15] retain] release];
[r12 release];
}
rbx = [[r15 error] retain];
r12 = [rbx code];
[rbx release];
if (r12 == 0xfffffffffffffc19) {
r14 = 0x0;
}
else {
rbx = [[[r14 class] RPCRequestThread] retain];
[r15 setRunningThread:rbx];
[rbx release];
CFAbsoluteTimeGetCurrent();
[r15 setStartTime:rbx];
rbx = [[r14 requestQueue] retain];
[rbx addOperation:r15];
[rbx release];
[r15 waitUntilFinished];
if (var_30 != 0x0) {
r12 = [[r15 response] retain];
rbx = [r12 isKindOfClass:[NSHTTPURLResponse class]];
[r12 release];
if (rbx != 0x0) {
r12 = [[r15 response] retain];
rbx = [[r12 allHeaderFields] retain];
(*(var_30 + 0x10))(var_30, rbx);
[rbx release];
[r12 release];
}
}
r12 = [[r15 response] retain];
rbx = [r12 isKindOfClass:[NSHTTPURLResponse class]];
[r12 release];
if (rbx != 0x0) {
r12 = [[r15 response] retain];
rbx = [[r12 allHeaderFields] retain];
[DTRpcContext setRpcRespHeader:rbx];
[rbx release];
[r12 release];
}
rbx = [[r14 interceptor] retain];
[rbx release];
if (rbx != 0x0) {
r12 = [[r14 interceptor] retain];
rbx = [[r12 afterRpcOperation:r15] retain];
[r15 release];
[r12 release];
r15 = rbx;
}
[r14 raiseExceptionWithOperation:r15];
[r15 setResponseToPBIntoClass];
r14 = [[r15 resultObject] retain];
}
[var_30 release];
[r15 release];
rax = [r14 autorelease];
return rax;
}