• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: 'Global' NSURLCache?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: 'Global' NSURLCache?


  • Subject: Re: 'Global' NSURLCache?
  • From: "Quinn \"The Eskimo!\"" <email@hidden>
  • Date: Wed, 29 Nov 2017 08:39:53 +0000

On 29 Nov 2017, at 03:48, email@hidden wrote:

> I've set this up for our app that uses a group container, where the main app
> and a helper app both use the same custom NSURLCache, and it does work

Yay!

> Is there a way to specify what headers are significant when requesting a
> cached response from a NSURLCache?

No.

I had a complex spiel regarding workarounds (I plonked it at the end of this
email, just so it’s not lost) but I figured I should check that the
`User-Agent` string is the problem here.  And I’m not sure it is.  Consider
this code:

---------------------------------------------------------------------------
let url = URL(string: "http://example.com";)!
var req1 = URLRequest(url: url)
req1.setValue("agent1", forHTTPHeaderField: "User-Agent")

var req2 = URLRequest(url: url)
req2.setValue("agent2", forHTTPHeaderField: "User-Agent")

let res1 = HTTPURLResponse(url: url, statusCode: 200, httpVersion: "HTTP/1.1",
headerFields: [
    "Date": "Wed, 29 Nov 2017 08:33:15 GMT",
    "Server": "Apache",
    "Last-Modified": "Mon, 11 Mar 2013 21:44:16 GMT",
    "ETag": "\"606-4d7ad13106c00\"",
    "Accept-Ranges": "bytes",
    "Content-Length": "18",
    "Connection": "close",
    "Content-Type": "text/html",
])!
let cres1 = CachedURLResponse(response: res1, data: "Hello Cruel
World!".data(using: .utf8)!)

URLCache.shared.storeCachedResponse(cres1, for: req1)

let cres2 = URLCache.shared.cachedResponse(for: req2)
---------------------------------------------------------------------------

`cres2` comes back as non-nil, even though `req2` has a different `User-Agent`
header than the `req1` that was used to store the response.  So, are you sure
that the `User-Agent` string is the problem here?

Share and Enjoy
--
Quinn "The Eskimo!"                    <http://www.apple.com/developer/>
Apple Developer Relations, Developer Technical Support, Core OS/Hardware

---------------------------------------------------------------------------
The most obvious solution here is to have both the app and the helper set the
same `User-Agent` string.  That seems reasonable given that one is embedded
within the other.  Why not do that?

If you have to keep these separate then there other games you can play.  For
example, you could:

1. Implement `-URLSession:dataTask:willCacheResponse:completionHandler:` and
normalise the `User-Agent` string in the cached response.

2. Initially try to fetch the request from the cache with the normalised
`User-Agent` string and the `NSURLRequestReturnCacheDataDontLoad` cache policy.
 If it loads, you’ll then have to check the age yourself.  If it doesn’t load,
or its too old, you can issue a new load request with the default cache policy.
---------------------------------------------------------------------------

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Macnetworkprog mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Follow-Ups:
    • Re: 'Global' NSURLCache?
      • From: email@hidden
References: 
 >Re: 'Global' NSURLCache? (From: email@hidden)

  • Prev by Date: Re: 'Global' NSURLCache?
  • Next by Date: Re: 'Global' NSURLCache?
  • Previous by thread: Re: 'Global' NSURLCache?
  • Next by thread: Re: 'Global' NSURLCache?
  • Index(es):
    • Date
    • Thread