Redirect handling using custom NSURLProtocol and HTTP proxies

I have my own URLProtocol where I want to redirect all traffic through a proxy server.

My current working code is as follows:

+(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]; } 

It works great so far. The problem is that there is a URL that uses redirection - and I want the redirection to be done also by the proxy server, not the device. I tried to add the following code, but this did not 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 a new request is not sent to the proxy server, but is redirected by the device itself.

Thanks.

+3
source share
1 answer

It turned out that the problem is with redirection for the HTTPS server, while there is no HTTPS proxy. To use the HTTPS proxy, the code should look like this:

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

Source: How to programmatically add proxies to NSURLSession

+2
source

All Articles