Skip to content

Commit

Permalink
ETagManager: don't send validation time if not present (#2490)
Browse files Browse the repository at this point in the history
  • Loading branch information
NachoSoto committed May 16, 2023
1 parent 332c1a8 commit 2a4cd13
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 8 deletions.
13 changes: 7 additions & 6 deletions Sources/Networking/HTTPClient/ETagManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class ETagManager {
withSignatureVerification: Bool,
refreshETag: Bool = false
) -> [String: String] {
func eTag() -> (tag: String, date: String)? {
func eTag() -> (tag: String, date: String?)? {
if refreshETag { return nil }
guard let storedETagAndResponse = self.storedETagAndResponse(for: urlRequest) else { return nil }

Expand All @@ -56,18 +56,19 @@ class ETagManager {

if shouldUseETag {
return (tag: storedETagAndResponse.eTag,
date: storedETagAndResponse.validationTime.millisecondsSince1970.description)
date: storedETagAndResponse.validationTime?.millisecondsSince1970.description)
} else {
return nil
}
}

let (etag, date) = eTag() ?? ("", "")
let (etag, date) = eTag() ?? ("", nil)

return [
HTTPClient.RequestHeader.eTag.rawValue: etag,
HTTPClient.RequestHeader.eTagValidationTime.rawValue: date
]
.compactMapValues { $0 }
}

func httpResultFromCacheOrBackend(with response: HTTPResponse<Data?>,
Expand Down Expand Up @@ -194,16 +195,16 @@ extension ETagManager {
var statusCode: HTTPStatusCode
var data: Data
/// Used by the backend for advanced load shedding techniques.
@DefaultDecodable.Now
var validationTime: Date
@DefaultValue<Date?>
var validationTime: Date?
@DefaultValue<VerificationResult>
var verificationResult: VerificationResult

init(
eTag: String,
statusCode: HTTPStatusCode,
data: Data,
validationTime: Date = Date(),
validationTime: Date? = nil,
verificationResult: VerificationResult
) {
self.eTag = eTag
Expand Down
52 changes: 50 additions & 2 deletions Tests/UnitTests/Networking/ETagManagerTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -541,7 +541,7 @@ class ETagManagerTests: TestCase {
expect(response[ETagManager.eTagResponseHeaderName]) == eTag
}

func testETagHeaderContainsCreationTime() {
func testETagHeaderContainsValidationTime() {
let eTag = "the_etag"
let request = URLRequest(url: Self.testURL)
let cacheKey = Self.testURL.absoluteString
Expand All @@ -564,6 +564,27 @@ class ETagManagerTests: TestCase {
]
}

func testETagHeaderDoesNotContainValidationTimeIfNotPresent() {
let eTag = "the_etag"
let request = URLRequest(url: Self.testURL)
let cacheKey = Self.testURL.absoluteString

let actualResponse = "response".asData

self.mockUserDefaults.mockValues[cacheKey] = ETagManager.Response(
eTag: eTag,
statusCode: .success,
data: actualResponse,
validationTime: nil,
verificationResult: .notRequested
).asData()

let response = self.eTagManager.eTagHeader(for: request, withSignatureVerification: false)
expect(response) == [
ETagManager.eTagRequestHeaderName: eTag
]
}

func testResponseReturnsRequestDateFromServer() {
let eTag = "the_etag"
let request = URLRequest(url: Self.testURL)
Expand Down Expand Up @@ -619,6 +640,33 @@ class ETagManagerTests: TestCase {
expect(response?.body) == actualResponse
}

func testCachedResponseWithNoValidationTimeIsNotIgnored() {
let eTag = "the_etag"
let request = URLRequest(url: Self.testURL)
let cacheKey = Self.testURL.absoluteString

let actualResponse = "response".asData

self.mockUserDefaults.mockValues[cacheKey] = """
{
"e_tag": "\(eTag)",
"status_code": 200,
"data": "\(actualResponse.asFetchToken)"
}
""".asData

let response = self.eTagManager.httpResultFromCacheOrBackend(
with: self.responseForTest(url: Self.testURL,
body: nil,
eTag: eTag,
statusCode: .notModified),
request: request,
retried: false
)
expect(response?.requestDate).to(beNil())
expect(response?.body) == actualResponse
}

func testCachedResponseIsFoundIfVerificationWasNotRequested() {
let eTag = "the_etag"
let request = URLRequest(url: Self.testURL)
Expand Down Expand Up @@ -759,7 +807,7 @@ private extension ETagManagerTests {
func mockStoredETagResponse(for url: URL,
statusCode: HTTPStatusCode = .success,
eTag: String = "an_etag",
validationTime: Date = Date(),
validationTime: Date? = nil,
verificationResult: RevenueCat.VerificationResult = .defaultValue) -> Data {
// swiftlint:disable:next force_try
let data = try! JSONSerialization.data(withJSONObject: ["arg": "value"])
Expand Down

0 comments on commit 2a4cd13

Please sign in to comment.