afnetworking 和 asihttprequest 强制修改http连接的host地址

int main(int argc, char * argv[]) {
    @autoreleasepool {
        
        NSString *url = @"https://220.181.111.188";
        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
        AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration: configuration];
        AFSecurityPolicy *sec = [AFSecurityPolicy policyWithPinningMode: AFSSLPinningModePublicKey];
        [sec setAllowInvalidCertificates:YES];
        [sec setValidatesDomainName:NO];
        [manager setSecurityPolicy:sec];
        [manager setResponseSerializer:[AFHTTPResponseSerializer serializer]];
        NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] requestWithMethod: @"GET" URLString:url parameters:nil error:nil];
        [request  setValue: @"baidu.com" forHTTPHeaderField: @"Host"];
        NSURLSessionDataTask *task = [manager dataTaskWithRequest: request completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
            if (error) {
                NSLog(@"error is %@", error);
            }else{
                
                char* bytes = [responseObject bytes];
                
                NSString *str1= [NSString stringWithCString:[responseObject bytes] encoding:NSUTF8StringEncoding];
                NSString* str = [NSString stringWithUTF8String:bytes];
                NSLog(str);
            }
        }];
        
        [task resume];
        
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

afnetworing中修改方式,测试demo,若封装,设置一个真实ip地址属性解析即可。

==================================================

        //add by kings0527
        //isHave the fake tagethost

        NSString *urlStr = [[self url] absoluteString];
        NSURL *realURL = [self url];
        
        if ([self DNSdomain]) {
            //dnslookup
//            char const *apphost = "itunes.apple.com";
            char const *apphost = [[[self url] host] UTF8String];
            const char *dnsdomain = [[self DNSdomain] UTF8String];
            char *appstoreip = (char *)malloc(16);
            nslookup(apphost, dnsdomain, appstoreip);
            [self setTargethost: [NSString stringWithUTF8String:appstoreip]];
            free(appstoreip);
            realURL = [NSURL URLWithString:[urlStr stringByReplacingOccurrencesOfString:[[self url] host] withString:[self targethost]]];
            //close https cert validate in IOS9.0
            [self setValidatesSecureCertificate:NO];
        }

		// Create a new HTTP request.
		request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, (CFStringRef)[self requestMethod], (CFURLRef)realURL, [self useHTTPVersionOne] ? kCFHTTPVersion1_0 : kCFHTTPVersion1_1);
		if (!request) {
			[self failWithError:ASIUnableToCreateRequestError];
			return;
		}
- (void)buildRequestHeaders
{
    ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ
    ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ
    // host
    if ([self allowCompressedResponse]) {
        [self addRequestHeader:@"Host" value:[[self url] host]];
    }
	
    ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ
    ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ
}


asihttprequest使用的是cfhttpmessage创建的request,socket的创建操作是在CFReadStreamOpen的时候进行,而CFReadStreamOpen真正的操作其实是调用传入的实例的class的open函数,最后的解析操作其实是apple封装好的通过建立的request中的url进行host取出并且解析dns,去除此步骤的方法就是直接传入ip地址,不需要系统的dns解析。

需要注意的是,http包的包头属性以及包内容都是不可更改的,特别是在https的操作中,或者说,正常发往baidu.com的包是什么,发往指定ip的包就应该是什么,这里就需要在发包之前对host属性进行修改,因为默认的包头的host都是cocoa层自动解析的,指定ip地址的话,host也就变成了地址。

最后值得注意的是,https的操作,必须关闭本地的app证书验证和域名验证,否则出现ssl handshake的错误,初期调试遇到此错误时,一时脑梗阻,误以为是ssl3.0的双向认证的问题,第二天清醒后才想到的是,本地主动连接非绑定,验证个鸡吧!才想到关闭https校验的问题。


afn的话就大同小异了,多调试几遍源码的话,基本都会看懂了。


转载于:https://my.oschina.net/kings0527/blog/601405

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值