NSURLConnection успешно без ответа HTTP - PullRequest
0 голосов
/ 08 июля 2010

Загадка для меня: Я использую NSURLConnection на iPhone Simulator SDK 3.1.2 для выдачи нескольких последовательных (не одновременных) запросов https.Все работает нормально в 95% случаев, но время от времени (возможно, около 50-100 запросов) я получаю ситуацию, когда метод делегата

- (void)connectionDidFinishLoading:(NSURLConnection *)connection;

вызывается после [start connection], но без какого-либо вызова метода делегата

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

Я сократил проблему до приведенного ниже источника.Из того, что я понимаю, это нарушает контракт определенного поведения NSURLConnection.Кто-нибудь еще имел эту проблему, и это известная ошибка, или я использую NSURLConnection неправильно?

static BOOL hasSeenResponse = NO;

    //Create a NSURLConnection and start it
-(void) begin {
    NSURL* url = [NSURL URLWithString@"https://some.domain.com/some/path/?some=query"];
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyNever];
    NSURLRequest* request = [NSURLRequest requestWithURL:url];
    if ([NSURLConnection canHandleRequest:request]) {
        NSURLConnection* connection = [[NSURLConnection connectionWithRequest:request delegate:self] retain];
        hasSeenResponse = NO;
        [connection start];
    }
}     

#pragma mark NSURLConnection Delegate Methods
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    if (!hasSeenResponse) {
        NSLog(@"\n\nNo Response Recieved\n");
    }
    [connection release];
    [self begin];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    [connection release];
    [self begin];
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    hasSeenResponse = YES;
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
}

1 Ответ

0 голосов
/ 09 июля 2010

Мне удалось решить проблему, добавив делегата для перенаправления, который всегда принимает

-(NSURLRequest *)connection:(NSURLConnection *)connection
            willSendRequest:(NSURLRequest *)request
           redirectResponse:(NSURLResponse *)redirectResponse
{
    return request;
}

Насколько я понимаю, это поведение по умолчанию , поэтому я неЯ знаю, почему это решает проблему.

URL, на который я отправлял запрос, выполнил переадресацию, но это также не объясняет, почему HTTP-запрос работал в ~ 95% случаев.

Я надеюсь, что это поможет кому-то с подобной проблемой в будущем.

...