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

后端 未结 3 1320
忘了有多久
忘了有多久 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.

    0 讨论(0)
  • 2020-12-24 10:37

    You cannot add a proxy to NSURLRequest. You will need to use a 3rd party library like ASIHTTPRequest.

    // Configure a proxy server manually
    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/ignore"];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setProxyHost:@"192.168.0.1"];
    [request setProxyPort:3128];
    
    0 讨论(0)
  • 2020-12-24 10:38

    I have used the below code for Http proxy.

    let sessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration();
    sessionConfiguration.connectionProxyDictionary = [
        kCFNetworkProxiesHTTPEnable: true,
        kCFNetworkProxiesHTTPPort: myPortInt,
        kCFNetworkProxiesHTTPProxy: myProxyUrlString,
    ]
    let url = NSURL(string: endPointUrl)
    let postRequest = NSMutableURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 10.0)
    
    
    let jsonString =  bodyString
    postRequest.HTTPBody = jsonString 
    postRequest.HTTPMethod = "POST"
    postRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
    
    let session = NSURLSession(configuration: sessionConfiguration)       
    let task = session.dataTaskWithRequest(postRequest){}
    
    0 讨论(0)
提交回复
热议问题