iOS any body knows how to add a proxy to NSURLRequest?

后端 未结 3 1345
忘了有多久
忘了有多久 2020-12-24 09:57

I\'m setting up a webview but I need to load the content of the webview using a proxy. Any of you knows how can I\'m implement the proxy in NSURLRequest?

for example

3条回答
  •  难免孤独
    2020-12-24 10:25

    Take a look at iOS URL Loading System as well as NSURLProtocol

    You can write a custom NSURLProtocol class for your NSURLRequest. A custom NSURLProtocol can intercept your requests and add proxy to each request. the relevant method is -(void)startLoading, inside this method you can use Core-Function which is a little low-level api in iOS to add the proxy to each request:

    //"request" is your NSURLRequest
    NSURL *url = [request URL];
    NSString *urlString = [url absoluteString];
    
    CFStringRef urlStringRef = (CFStringRef) urlString;
    CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, urlStringRef, NULL);
    CFStringRef requestMethod = CFSTR("GET");
    
    CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, myURL, kCFHTTPVersion1_1);
    
    self.httpMessageRef = CFHTTPMessageCreateCopy(kCFAllocatorDefault, myRequest);
    
    CFReadStreamRef myReadStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest);
    
    // You can add body, headers.... using core function api, CFNetwork.etc
    
    // below code is to set proxy from code if needs
    NSString *hostKey;
    NSString *portKey;
    if ([[[urlString scheme] lowercaseString] isEqualToString:@"https"]) {
        hostKey = (NSString *)kCFStreamPropertyHTTPSProxyHost;
        portKey = (NSString *)kCFStreamPropertyHTTPSProxyPort;
    } else {
        hostKey = (NSString *)kCFStreamPropertyHTTPProxyHost;
        portKey = (NSString *)kCFStreamPropertyHTTPProxyPort;
    }
    
    //set http or https proxy, change "localhost" to your proxy host, change "5566" to your proxy port 
    NSMutableDictionary *proxyToUse = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"localhost",hostKey,[NSNumber numberWithInt:5566],portKey,nil];
    
    CFReadStreamSetProperty(myReadStream, kCFStreamPropertyHTTPProxy, proxyToUse);
    CFReadStreamOpen(myReadStream);
    

    hope this can help you.

    Do forget to register your custom NSURLProtocol to your delegate.

提交回复
热议问题