Hi,

I'm working on a piece of code that connects to a RESTful webservice
and authenticates via HTTP basic. This works great, I get the
- (void)connection:(NSURLConnection *)connection
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge
*)challenge
message, provide my credentials and get a successful response from the
server. So far so good.
BUT...
I want to be able to change the credentials while the app is running.
But when after the first successful didReceiveAuthenticationChallenge
call, my delegate never receives that message again.
This is my code:

- (void)connection:(NSURLConnection *)connection
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge
*)challenge {
#ifdef DEBUG
        NSLog(@"got auth challange");
#endif
        if ([challenge previousFailureCount] == 0) {
                [[challenge sender]  useCredential:[NSURLCredential
credentialWithUser:[usernameTextField text]
password:[passwordTextField text]
persistence:NSURLCredentialPersistenceNone]
forAuthenticationChallenge:challenge];
        } else {
                // this indicates that the connection failed because of bad 
credentials
                authFailed = YES;
        [[challenge sender] cancelAuthenticationChallenge:challenge];
    }
}

I've even tried setting persistence to
NSURLCredentialPersistenceForSession and programmatically reset the
stored NSURLCredentials before each request:

// reset the credentials cache...
                NSDictionary *credentialsDict = [[NSURLCredentialStorage
sharedCredentialStorage] allCredentials];
                
                if ([credentialsDict count] > 0) {
                        // the credentialsDict has NSURLProtectionSpace objs as 
keys and
dicts of userName => NSURLCredential
                        NSEnumerator *protectionSpaceEnumerator = 
[credentialsDict keyEnumerator];
                        id urlProtectionSpace;
                        
                        // iterate over all NSURLProtectionSpaces
                        while (urlProtectionSpace = [protectionSpaceEnumerator 
nextObject]) {
                                NSEnumerator *userNameEnumerator = 
[[credentialsDict
objectForKey:urlProtectionSpace] keyEnumerator];
                                id userName;
                                
                                // iterate over all usernames for this 
protectionspace, which are
the keys for the actual NSURLCredentials
                                while (userName = [userNameEnumerator 
nextObject]) {
                                        NSURLCredential *cred = 
[[credentialsDict
objectForKey:urlProtectionSpace] objectForKey:userName];
                                        NSLog(@"cred to be removed: %@", cred);
                                        [[NSURLCredentialStorage 
sharedCredentialStorage]
removeCredential:cred forProtectionSpace:urlProtectionSpace];
                                }
                        }
                }


But that didn't help either.

SO: my question is: how do I force an NSURLConnection to send my
delegate the didReceiveAuthenticationChallenge message so I can change
my credentials?

Thanks!

- Johannes

-- 
http://blog.springenwerk.com
_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to