ios redirect proxy nsurlprotocol

ios - Manejo de redireccionamientos con NSURLProtocol personalizado y proxy HTTP



redirect (1)

Resultó que el problema era con la redirección para un servidor HTTPS, mientras que no hay un proxy HTTPS definido. Para usar el proxy HTTPS, el código debería verse así:

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

Fuente: Cómo agregar un proxy mediante programación a una sesión NSURLSession

Tengo un URLProtocol personalizado en el que quiero redirigir todo el tráfico a través de un servidor proxy.

Mi código de trabajo actual se ve así:

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

Esto funciona bien hasta ahora. El problema es que hay algunas direcciones URL que usan la redirección, y quiero que el servidor proxy también realice la redirección, en lugar de hacerlo desde el dispositivo. Intenté agregar el siguiente código, pero no me ayudó:

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

El problema es que la nueva solicitud no se envía al servidor proxy sino que el dispositivo la redirecciona.

Gracias.