@@ -354,6 +354,8 @@ private extension CachedAsyncImage {
354354 private func remoteImage( from request: URLRequest , session: URLSession ) async throws -> ( Image , URLSessionTaskMetrics ) {
355355 let ( data, _, metrics) = try await session. data ( for: request)
356356 if metrics. redirectCount > 0 , let lastResponse = metrics. transactionMetrics. last? . response {
357+ let requests = metrics. transactionMetrics. map { $0. request }
358+ requests. forEach ( session. configuration. urlCache!. removeCachedResponse)
357359 let lastCachedResponse = CachedURLResponse ( response: lastResponse, data: data)
358360 session. configuration. urlCache!. storeCachedResponse ( lastCachedResponse, for: request)
359361 }
@@ -402,3 +404,23 @@ private extension URLSession {
402404 return ( data, response, controller. metrics!)
403405 }
404406}
407+
408+ extension URLCache {
409+
410+ func cachedResponse( for request: URLRequest , followRedirects: Bool ) -> CachedURLResponse ? {
411+ if
412+ followRedirects,
413+ let response = cachedResponse ( for: request) ? . response as? HTTPURLResponse ,
414+ [ 301 , 302 , 303 , 307 , 308 ] . contains ( response. statusCode) ,
415+ let redirectedURLString = response. allHeaderFields [ " Location " ] as? String ,
416+ let redirectedURL = URL ( string: redirectedURLString)
417+ {
418+ var redirectedRequest = request
419+ redirectedRequest. url = redirectedURL
420+ let redirectedResponse = cachedResponse ( for: redirectedRequest, followRedirects: followRedirects)
421+ return redirectedResponse
422+ } else {
423+ return cachedResponse ( for: request)
424+ }
425+ }
426+ }
0 commit comments