NSURLRequestUseProtocolCachePolicy never Загрузка из кэша - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь использовать NSURLRequestUseProtocolCachePolicy, чтобы приложение загружало ответ из кэша при выполнении второго запроса POST к серверу. Но он никогда не загружает ответ из кэша.

Простой тест, который я использую:

- (void) main {
    [[NSURLCache sharedCache] removeAllCachedResponses];
    for(int i=0; i<2; i++) {
        [self runTest];
    }
}

- (void) runTest {
    NSURLSession *session = [NSURLSession sharedSession];
    NSURL *url = [NSURL URLWithString:@"http://localhost:9000/test-server/api/testforpost"];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    request.cachePolicy = NSURLRequestUseProtocolCachePolicy;
    request.HTTPMethod = @"POST";

    dispatch_semaphore_t sessionRequestLock = dispatch_semaphore_create(0);
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
       NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
       NSLog(@"Status: %i", httpResponse.statusCode);
       NSLog([[httpResponse allHeaderFields] description]);
       NSString *dataString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
       NSLog(@"data: %@", dataString);
       dispatch_semaphore_signal(sessionRequestLock);
    }];

   [task resume];
   dispatch_semaphore_wait(sessionRequestLock, DISPATCH_TIME_FOREVER);
}

Я также управляю сервером, который устанавливает заголовок Cache-Control. Я также вижу на сервере, что API вызывается дважды в этом примере (показывая, что локальный iOS кэш приложения не используется).

В этом примере печатаются заголовки:

"Cache-Control" = "max-age=2000,public";
"Content-Disposition" = "inline; filename=\"testFile.html\"";
"Content-Length" = 138;
"Content-Type" = "text/html";
"Referrer-Policy" = "origin-when-cross-origin, strict-origin-when-cross-origin";
"X-Frame-Options" = DENY;
"X-Permitted-Cross-Domain-Policies" = "master-only";
"X-XSS-Protection" = "1; mode=block";

Если я установлю cachePolicy следующим образом:

request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;

, тогда ответ на второй запрос будет правильно извлечен из кэша.

Есть идеи о том, что мне не хватает, чтобы NSURLRequestUseProtocolCachePolicy работал правильно?

...