Search code examples
objective-ccookiesnsurlrequestnshttpurlresponse

Get cookies from NSHTTPURLResponse


I've an extremely weird problem, I'm requesting a URL and I want to get the cookies from it, I've used this way to get the cookies:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse *)response;
    NSDictionary *fields = [HTTPResponse allHeaderFields];
    NSString *cookie = [fields valueForKey:"Set-Cookie"];
}

BUT the cookies is not complete, there is some field is missing, I've checked it on PostMan, all the cookies is there.

I've used also this method when initiating the NSURLRequest.

[request setHTTPShouldHandleCookies:YES];

Where is the problem?

NOTE: This problem is on iOS, I've an android version and it's working fine and all the cookies is there.


Solution

  • @biloshkurskyi.ss answer is spot on.

    I spent half a day trying to find out why some of my cookies were not appearing in my response.allHeaderFields on iOS but it was there on Android (using the same service).

    The reason is because some cookies are extracted in advance and stored in the shared cookie store. They will not appear in allHeaderFields.

    Here's the swift 3 version of the answer if anyone needs it:

    let request = URLRequest(url: myWebServiceUrl)
    let session = URLSession.shared
    let task = session.dataTask(with: request, completionHandler: {
        (data, response, error) in
        if let error = error {
            print("ERROR: \(error)")
        } else {
            print("RESPONSE: \(response)")
            if let data = data, let dataString = String(data: data, encoding: .utf8) {
                print("DATA: " + dataString)
            }
            for cookie in HTTPCookieStorage.shared.cookies! {
                print("EXTRACTED COOKIE: \(cookie)") //find your cookie here instead of httpUrlResponse.allHeaderFields
            }
        }
    })
    task.resume()