I was observirng some strange behaviour of my app sometime caching responses and sometime not caching them (all the responses have Cache-Control: max-age=600).
The test is simple: I did a test.php script that was just setting the headers and returning a simple JSON:
<?php header('Content-Type: application/json'); header('Cache-Control: max-age=600'); ?> { "result": { "employeeId": "<?php echo $_GET['eId']; ?>", "dateTime": "<?php echo date('Y-m-d H:i:s'); ?>'" } } This is the response I get from the PHP page:
HTTP/1.1 200 OK Date: Thu, 28 Nov 2013 11:41:55 GMT Server: Apache X-Powered-By: PHP/5.3.17 Cache-Control: max-age=600 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: application/json { "result": { "employeeId": "", "dateTime": "2013-11-28 11:41:55'" } } Then I've created a simple app and added AFNetworking library.
When I call the script with few parameters, the cache works properly:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; NSDictionary *params = @{ @"oId": @"4011", @"eId": self.firstTest ? @"1" : @"0", @"status": @"2031", }; [manager GET:@"http://www.mydomain.co.uk/test.php" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", responseObject); NSLog(@"Cache current memory usage (after call): %d", [cache currentMemoryUsage]); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; But when I increase the number of parameters, like:
NSDictionary *params = @{ @"organizationId": @"4011", @"organizationId2": @"4012", @"organizationId3": @"4013", @"organizationId4": @"4014", @"organizationId5": @"4015", @"organizationId6": @"4016", @"eId": self.firstTest ? @"1" : @"0", @"status": @"2031", }; it doesn't work anymore and it execute a new request each time it is called.
I've done many tests and it seems to me that it is related to the length of the URL, because if I includes this set of params:
NSDictionary *params = @{ @"oId": @"4011", @"oId2": @"4012", @"oId3": @"4013", @"oId4": @"4014", @"oId5": @"4015", @"oId6": @"4016", @"eId": self.firstTest ? @"1" : @"0", @"status": @"2031", }; It works!!
I've done many tests and that's the only pattern I've found...
To exclude AFNetworking from the equation, I've created another test program that uses NSURLConnection only and I can see the same behaviour so it's not AFNetworking and definitely NSURLCache. This is the other test:
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.mydomain.co.uk/test.php?eId=%@&organizationId=4011&organizationId2=4012&organizationId3=4013&organizationId4=4014&organizationId5=4015&organizationId6=4016", self.firstTest ? @"1" : @"0"]]; // doesn't work //NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.mydomain.co.uk/test.php?eId=%@&oId=4011&oId2=4012&oId3=4013&oId4=4014&oId5=4015&oId6=4016", self.firstTest ? @"1" : @"0"]]; // work //NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.mydomain.co.uk/test.php?eId=%@", self.firstTest ? @"1" : @"0"]]; // work NSURLRequest *request = [NSURLRequest requestWithURL:url]; NSURLResponse *response = nil; NSError *error = nil; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; if (error == nil) { // Parse data here NSString *responseDataStr = [NSString stringWithUTF8String:[data bytes]]; NSLog(@"Response data: %@", responseDataStr); } I've also tried to establish how many characters in the URL will trigger the problem but even in this case I've got strange results:
This one is 112 characters long and it doesn't work:
This one is 111 characters long and it works:
Ive renamed the PHP script to see if the first part of the URL would matter and I've got a strange behaviour again:
This one is 106 characters long and it doesn't work:
This one is 105 characters long and it works:
So I've removed 3 characters from the page name and I've got a working threshold 6 characters lower.
Any suggestion?
Thanks, Dem