diff --git a/Account/Sources/Account/LocalAccount/LocalAccountRefresher.swift b/Account/Sources/Account/LocalAccount/LocalAccountRefresher.swift index 3e61bf7d0..3654d8e5d 100644 --- a/Account/Sources/Account/LocalAccount/LocalAccountRefresher.swift +++ b/Account/Sources/Account/LocalAccount/LocalAccountRefresher.swift @@ -180,7 +180,7 @@ private extension LocalAccountRefresher { func feedShouldBeSkipped(_ feed: WebFeed) -> Bool { - if let cacheControlInfo = feed.cacheControlInfo, !cacheControlInfo.isExpired { + if let cacheControlInfo = feed.cacheControlInfo, !cacheControlInfo.canResume { os_log(.debug, "Dropping request for Cache-Control reasons: \(feed.url)") return true } diff --git a/RSWeb/Sources/RSWeb/CacheControlInfo.swift b/RSWeb/Sources/RSWeb/CacheControlInfo.swift index 4b26ca922..e77dd39ff 100644 --- a/RSWeb/Sources/RSWeb/CacheControlInfo.swift +++ b/RSWeb/Sources/RSWeb/CacheControlInfo.swift @@ -15,13 +15,13 @@ public struct CacheControlInfo: Codable, Equatable { let dateCreated: Date let maxAge: TimeInterval - public var isExpired: Bool { - Date() > dateExpired - } - var dateExpired: Date { + var resumeDate: Date { dateCreated + maxAge } - + public var canResume: Bool { + Date() >= resumeDate + } + public init?(urlResponse: HTTPURLResponse) { guard let cacheControlValue = urlResponse.valueForHTTPHeaderField(HTTPResponseHeader.cacheControl) else { return nil diff --git a/RSWeb/Sources/RSWeb/DownloadSession.swift b/RSWeb/Sources/RSWeb/DownloadSession.swift index e2e654d2a..2ea52567e 100755 --- a/RSWeb/Sources/RSWeb/DownloadSession.swift +++ b/RSWeb/Sources/RSWeb/DownloadSession.swift @@ -322,11 +322,11 @@ private extension DownloadSession { guard let retryAfterValue = httpResponse.value(forHTTPHeaderField: HTTPResponseHeader.retryAfter) else { return nil } - guard let retryAfterSeconds = Int(retryAfterValue), retryAfterSeconds > 0 else { + guard let retryAfter = TimeInterval(retryAfterValue), retryAfter > 0 else { return nil } - return HTTPResponse429(url: url, retryAfterSeconds: retryAfterSeconds) + return HTTPResponse429(url: url, retryAfter: retryAfter) } func cancelAndRemoveTasksWithHost(_ host: String) { diff --git a/RSWeb/Sources/RSWeb/HTTPResponse429.swift b/RSWeb/Sources/RSWeb/HTTPResponse429.swift index dc13164e4..488af8a07 100644 --- a/RSWeb/Sources/RSWeb/HTTPResponse429.swift +++ b/RSWeb/Sources/RSWeb/HTTPResponse429.swift @@ -13,11 +13,17 @@ final class HTTPResponse429 { let url: URL let host: String // lowercased - let retryAfterSeconds: Int - let dateMessageReceived: Date - let resumeDate: Date // dateMessageReceived + retryAfterSeconds + let dateCreated: Date + let retryAfter: TimeInterval - init?(url: URL, retryAfterSeconds: Int) { + var resumeDate: Date { + dateCreated + TimeInterval(retryAfter) + } + var canResume: Bool { + Date() >= resumeDate + } + + init?(url: URL, retryAfter: TimeInterval) { guard let host = url.host() else { return nil @@ -25,10 +31,7 @@ final class HTTPResponse429 { self.url = url self.host = host.lowercased() - self.retryAfterSeconds = retryAfterSeconds - - let currentDate = Date() - self.dateMessageReceived = currentDate - self.resumeDate = currentDate + TimeInterval(retryAfterSeconds) + self.retryAfter = retryAfter + self.dateCreated = Date() } }