mPaaS 框架下的 RPC 调用历程 iOS版 伪源码剖析

这是外部调用的方法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;
}

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值