使用自定义NSURLProtocol和HTTP代理处理重定向 [英] Handling redirects with custom NSURLProtocol and HTTP proxy

查看:80
本文介绍了使用自定义NSURLProtocol和HTTP代理处理重定向的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个自定义URLProtocol,我想在其中通过代理服务器重定向所有流量.

I have a custom URLProtocol where I want to redirect all traffic via a proxy server.

我当前的工作代码如下:

My current working code looks like that:

+(BOOL)canInitWithRequest:(NSURLRequest*)request
{
    if ([NSURLProtocol propertyForKey:protocolKey inRequest:request])
        return NO;
    NSString *scheme = request.URL.scheme.lowercaseString;
    return [scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"];
}
-(void)startLoading
{
    NSMutableURLRequest *request = self.request.mutableCopy;
    [NSURLProtocol setProperty:@YES forKey:protocolKey inRequest:request];
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
    config.connectionProxyDictionary = @
    {
        (id)kCFNetworkProxiesHTTPEnable:@YES,
        (id)kCFNetworkProxiesHTTPProxy:@"1.2.3.4",
        (id)kCFNetworkProxiesHTTPPort:@8080
    };
    m_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue currentQueue]];
    [[m_session dataTaskWithRequest:request] resume];
}

到目前为止效果很好.问题是有一些使用重定向的url-我也希望重定向也由代理服务器而不是由设备执行.我尝试添加以下代码,但没有帮助:

This works great so far. The problem is that there are some url's which use redirection - and I want the redirection to be performed by the proxy server as well, rather than by the device. I've tried to add the following code, but it didn't help:

-(void)URLSession:(NSURLSession*)session task:(NSURLSessionTask*)task willPerformHTTPRedirection:(NSHTTPURLResponse*)response newRequest:(NSURLRequest*)newRequest completionHandler:(void (^)(NSURLRequest*))completionHandler
{
    NSMutableURLRequest *request = newRequest.mutableCopy;
    [NSURLProtocol removePropertyForKey:protocolKey inRequest:request];
    [self.client URLProtocol:self wasRedirectedToRequest:request redirectResponse:response];
    [task cancel];
    [self.client URLProtocol:self didFailWithError:[NSError errorWithDomain:NSCocoaErrorDomain code:NSUserCancelledError userInfo:nil]];
}

问题是新请求没有发送到代理服务器,而是由设备本身重定向.

The problem is that the new request is not being sent to the proxy server but instead being redirected by the device itself.

谢谢.

推荐答案

原来,问题是HTTPS服务器的重定向,而没有定义HTTPS代理.要使用HTTPS代理,代码应类似于:

It turned out the problem was with the redirection for an HTTPS server, while there is no HTTPS proxy defined. To use HTTPS proxy, the code should looks like:

config.connectionProxyDictionary = @
{
    @"HTTPEnable":@YES,
    (id)kCFStreamPropertyHTTPProxyHost:@"1.2.3.4",
    (id)kCFStreamPropertyHTTPProxyPort:@8080,
    @"HTTPSEnable":@YES,
    (id)kCFStreamPropertyHTTPSProxyHost:@"1.2.3.4",
    (id)kCFStreamPropertyHTTPSProxyPort:@8080
};

来源:如何以编程方式将代理添加到NSURLSession

这篇关于使用自定义NSURLProtocol和HTTP代理处理重定向的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆