Skip to content

Commit 7d88965

Browse files
authored
ref: Convert SentryRetryAfterHeaderParser to Swift (#6281)
* ref: Convert SentryHTTPDateParser to Swift * ref: Convert SentryRetryAfterHeaderParser to Swift * Fallback to NSString.integerValue
1 parent 119ab1c commit 7d88965

File tree

9 files changed

+51
-89
lines changed

9 files changed

+51
-89
lines changed

Sentry.xcodeproj/project.pbxproj

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,6 @@
344344
7B0002342477F52D0035FEF1 /* SentrySessionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B0002332477F52D0035FEF1 /* SentrySessionTests.swift */; };
345345
7B01CE3D271993AC00B5AF31 /* SentryTransportFactoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B01CE3C271993AB00B5AF31 /* SentryTransportFactoryTests.swift */; };
346346
7B04A9AB24EA5F8D00E710B1 /* SentryUserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B04A9AA24EA5F8D00E710B1 /* SentryUserTests.swift */; };
347-
7B04A9AF24EAC02C00E710B1 /* SentryRetryAfterHeaderParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BBD189C244EC71A00427C76 /* SentryRetryAfterHeaderParser.h */; };
348347
7B05A61824A4D14A00EF211D /* SentrySessionGeneratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B05A61724A4D14A00EF211D /* SentrySessionGeneratorTests.swift */; };
349348
7B08A3452924CF6C0059603A /* SentryMetricKitIntegration.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B08A3442924CF6C0059603A /* SentryMetricKitIntegration.h */; };
350349
7B08A3472924CF9C0059603A /* SentryMetricKitIntegration.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B08A3462924CF9C0059603A /* SentryMetricKitIntegration.m */; };
@@ -497,7 +496,6 @@
497496
7BBD18932449BEDD00427C76 /* SentryDefaultRateLimits.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BBD18922449BEDD00427C76 /* SentryDefaultRateLimits.m */; };
498497
7BBD18972449DC1D00427C76 /* SentryRateLimits.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BBD18962449DC1D00427C76 /* SentryRateLimits.h */; };
499498
7BBD18992449DE9D00427C76 /* TestRateLimits.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BBD18982449DE9D00427C76 /* TestRateLimits.swift */; };
500-
7BBD189E244EC8D200427C76 /* SentryRetryAfterHeaderParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BBD189D244EC8D200427C76 /* SentryRetryAfterHeaderParser.m */; };
501499
7BBD18A2244EE2FD00427C76 /* TestResponseFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BBD18A1244EE2FD00427C76 /* TestResponseFactory.swift */; };
502500
7BBD18B22451804C00427C76 /* SentryRetryAfterHeaderParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BBD189F244ED1A200427C76 /* SentryRetryAfterHeaderParserTests.swift */; };
503501
7BBD18B32451805500427C76 /* SentryRateLimitsParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BE3C77E2446116400A38442 /* SentryRateLimitsParserTests.swift */; };
@@ -990,6 +988,7 @@
990988
F41362152E1C568400B84443 /* SentryScopePersistentStore+Context.swift in Sources */ = {isa = PBXBuildFile; fileRef = F41362142E1C568400B84443 /* SentryScopePersistentStore+Context.swift */; };
991989
F429D3AA2E8562EF00DBF387 /* RateLimitParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = F429D3A82E8562EF00DBF387 /* RateLimitParser.swift */; };
992990
F429D37F2E8532A300DBF387 /* HttpDateParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = F429D37D2E8532A300DBF387 /* HttpDateParser.swift */; };
991+
F429D39A2E85360F00DBF387 /* RetryAfterHeaderParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = F429D3992E85360F00DBF387 /* RetryAfterHeaderParser.swift */; };
993992
F443DB272E09BE8C009A9045 /* LoadValidatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F443DB262E09BE8C009A9045 /* LoadValidatorTests.swift */; };
994993
F44858132E03579D0013E63B /* SentryCrashDynamicLinker+Test.h in Headers */ = {isa = PBXBuildFile; fileRef = F44858122E0357940013E63B /* SentryCrashDynamicLinker+Test.h */; };
995994
F451FAA62E0B304E0050ACF2 /* LoadValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F451FAA52E0B304E0050ACF2 /* LoadValidator.swift */; };
@@ -1770,8 +1769,6 @@
17701769
7BBD18942449D3E200427C76 /* SentryDefaultRateLimitsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryDefaultRateLimitsTests.swift; sourceTree = "<group>"; };
17711770
7BBD18962449DC1D00427C76 /* SentryRateLimits.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SentryRateLimits.h; path = include/SentryRateLimits.h; sourceTree = "<group>"; };
17721771
7BBD18982449DE9D00427C76 /* TestRateLimits.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestRateLimits.swift; sourceTree = "<group>"; };
1773-
7BBD189C244EC71A00427C76 /* SentryRetryAfterHeaderParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SentryRetryAfterHeaderParser.h; path = include/SentryRetryAfterHeaderParser.h; sourceTree = "<group>"; };
1774-
7BBD189D244EC8D200427C76 /* SentryRetryAfterHeaderParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SentryRetryAfterHeaderParser.m; sourceTree = "<group>"; };
17751772
7BBD189F244ED1A200427C76 /* SentryRetryAfterHeaderParserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryRetryAfterHeaderParserTests.swift; sourceTree = "<group>"; };
17761773
7BBD18A1244EE2FD00427C76 /* TestResponseFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestResponseFactory.swift; sourceTree = "<group>"; };
17771774
7BBD18BA24530D2600427C76 /* SentryFileManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryFileManagerTests.swift; sourceTree = "<group>"; };
@@ -2334,6 +2331,7 @@
23342331
F41362142E1C568400B84443 /* SentryScopePersistentStore+Context.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SentryScopePersistentStore+Context.swift"; sourceTree = "<group>"; };
23352332
F429D3A82E8562EF00DBF387 /* RateLimitParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RateLimitParser.swift; sourceTree = "<group>"; };
23362333
F429D37D2E8532A300DBF387 /* HttpDateParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HttpDateParser.swift; sourceTree = "<group>"; };
2334+
F429D3992E85360F00DBF387 /* RetryAfterHeaderParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RetryAfterHeaderParser.swift; sourceTree = "<group>"; };
23372335
F443DB262E09BE8C009A9045 /* LoadValidatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadValidatorTests.swift; sourceTree = "<group>"; };
23382336
F44858122E0357940013E63B /* SentryCrashDynamicLinker+Test.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SentryCrashDynamicLinker+Test.h"; sourceTree = "<group>"; };
23392337
F451FAA52E0B304E0050ACF2 /* LoadValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadValidator.swift; sourceTree = "<group>"; };
@@ -3503,8 +3501,6 @@
35033501
7BBD18922449BEDD00427C76 /* SentryDefaultRateLimits.m */,
35043502
7B56D73024616CCD00B842DA /* SentryConcurrentRateLimitsDictionary.h */,
35053503
7B56D73224616D9500B842DA /* SentryConcurrentRateLimitsDictionary.m */,
3506-
7BBD189C244EC71A00427C76 /* SentryRetryAfterHeaderParser.h */,
3507-
7BBD189D244EC8D200427C76 /* SentryRetryAfterHeaderParser.m */,
35083504
7B3398622459C14000BD9C96 /* SentryEnvelopeRateLimit.h */,
35093505
7B3398642459C15200BD9C96 /* SentryEnvelopeRateLimit.m */,
35103506
);
@@ -4721,6 +4717,7 @@
47214717
F429D37E2E8532A300DBF387 /* Networking */ = {
47224718
isa = PBXGroup;
47234719
children = (
4720+
F429D3992E85360F00DBF387 /* RetryAfterHeaderParser.swift */,
47244721
F429D37D2E8532A300DBF387 /* HttpDateParser.swift */,
47254722
F429D3A82E8562EF00DBF387 /* RateLimitParser.swift */,
47264723
);
@@ -5175,7 +5172,6 @@
51755172
63FE714F20DA4C1100CDBAE8 /* SentryCrashNSErrorUtil.h in Headers */,
51765173
84A7890A2C0E9F6400FF0803 /* SentrySpan+Private.h in Headers */,
51775174
7BC5B6FA290BCDE500D99477 /* SentryHttpStatusCodeRange+Private.h in Headers */,
5178-
7B04A9AF24EAC02C00E710B1 /* SentryRetryAfterHeaderParser.h in Headers */,
51795175
9286059529A5096600F96038 /* SentryGeo.h in Headers */,
51805176
7B98D7BC25FB607300C5A389 /* SentryWatchdogTerminationTracker.h in Headers */,
51815177
7BA61CB9247BC57B00C130A8 /* SentryCrashDefaultBinaryImageProvider.h in Headers */,
@@ -5742,6 +5738,7 @@
57425738
D8CAC02E2BA0663E00E38F34 /* SentryReplayOptions.swift in Sources */,
57435739
7BECF42826145CD900D9826E /* SentryMechanismMeta.m in Sources */,
57445740
8E7C982F2693D56000E6336C /* SentryTraceHeader.m in Sources */,
5741+
F429D39A2E85360F00DBF387 /* RetryAfterHeaderParser.swift in Sources */,
57455742
63FE715F20DA4C1100CDBAE8 /* SentryCrashID.c in Sources */,
57465743
84B0E0072CD963FD007FB332 /* SentryIconography.swift in Sources */,
57475744
7DB3A687238EA75E00A2D442 /* SentryHttpTransport.m in Sources */,
@@ -5907,7 +5904,6 @@
59075904
7B42C48227E08F4B009B58C2 /* SentryDependencyContainer.m in Sources */,
59085905
639FCFAD1EBC811400778193 /* SentryUser.m in Sources */,
59095906
FA94E7242E6F339400576666 /* SentryEnvelopeItemType.swift in Sources */,
5910-
7BBD189E244EC8D200427C76 /* SentryRetryAfterHeaderParser.m in Sources */,
59115907
F41362152E1C568400B84443 /* SentryScopePersistentStore+Context.swift in Sources */,
59125908
F46DA6C32E1DBCA000DF6E3B /* SentryScopePersistentStore+Helper.swift in Sources */,
59135909
63FE711920DA4C1000CDBAE8 /* SentryCrashMachineContext.c in Sources */,

Sources/Sentry/SentryDefaultRateLimits.m

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#import "SentryDateUtil.h"
55
#import "SentryInternalDefines.h"
66
#import "SentryLogC.h"
7-
#import "SentryRetryAfterHeaderParser.h"
87
#import "SentrySwift.h"
98

109
NS_ASSUME_NONNULL_BEGIN

Sources/Sentry/SentryDependencyContainer.m

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
#import <SentryDefaultRateLimits.h>
1919
#import <SentryDependencyContainer.h>
2020
#import <SentryPerformanceTracker.h>
21-
#import <SentryRetryAfterHeaderParser.h>
2221
#import <SentrySDK+Private.h>
2322
#import <SentrySwift.h>
2423
#import <SentrySwizzleWrapper.h>

Sources/Sentry/SentryRetryAfterHeaderParser.m

Lines changed: 0 additions & 46 deletions
This file was deleted.

Sources/Sentry/SentryTransportFactory.m

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@
88
#import "SentryOptions.h"
99
#import "SentryQueueableRequestManager.h"
1010
#import "SentryRateLimits.h"
11-
#import "SentrySwift.h"
12-
13-
#import "SentryRetryAfterHeaderParser.h"
1411
#import "SentrySpotlightTransport.h"
12+
#import "SentrySwift.h"
1513
#import "SentryTransport.h"
1614

1715
NS_ASSUME_NONNULL_BEGIN

Sources/Sentry/include/SentryRetryAfterHeaderParser.h

Lines changed: 0 additions & 29 deletions
This file was deleted.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import Foundation
2+
3+
/// Parses value of HTTP header "Retry-After" which in most cases is sent in
4+
/// combination with HTTP status 429 Too Many Requests.
5+
///
6+
/// For more details see: https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.37
7+
@objc(SentryRetryAfterHeaderParser) @_spi(Private)
8+
public final class RetryAfterHeaderParser: NSObject {
9+
10+
private let httpDateParser: HttpDateParser
11+
private let currentDateProvider: SentryCurrentDateProvider
12+
13+
@objc
14+
public init(httpDateParser: HttpDateParser, currentDateProvider: SentryCurrentDateProvider) {
15+
self.httpDateParser = httpDateParser
16+
self.currentDateProvider = currentDateProvider
17+
super.init()
18+
}
19+
20+
/// Parses the HTTP header into a NSDate.
21+
/// - Parameter retryAfterHeader: The header value.
22+
/// - Returns: NSDate representation of Retry-After. If the date can't be parsed nil is returned.
23+
@objc
24+
public func parse(_ retryAfterHeader: String?) -> Date? {
25+
guard let retryAfterHeader = retryAfterHeader, !retryAfterHeader.isEmpty else {
26+
return nil
27+
}
28+
29+
// Casting to NSString allows us to obtain an integer value even if the string is invalid, contains decimals
30+
// or random text
31+
let retryAfterSeconds = NSString(string: retryAfterHeader).integerValue
32+
if retryAfterSeconds != 0 {
33+
return currentDateProvider.date().addingTimeInterval(TimeInterval(retryAfterSeconds))
34+
}
35+
36+
// parsing as double/seconds failed, try to parse as date
37+
let retryAfterDate = httpDateParser.date(from: retryAfterHeader)
38+
39+
return retryAfterDate
40+
}
41+
}

Tests/SentryTests/Networking/RateLimits/SentryRetryAfterHeaderParserTests.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ class SentryRetryAfterHeaderParserTests: XCTestCase {
4646
testWith(header: httpDateAsString, expected: expected)
4747
}
4848

49+
func testMalformedWithText() {
50+
let date = currentDateProvider.date().addingTimeInterval(10)
51+
testWith(header: "10 Seconds", expected: date)
52+
}
53+
4954
private func testWith(header: String?, expected: Date?) {
5055
let actual = sut.parse(header)
5156
XCTAssertEqual(expected, actual)

Tests/SentryTests/SentryTests-Bridging-Header.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,6 @@
158158
#import "SentryQueueableRequestManager.h"
159159
#import "SentryRateLimits.h"
160160
#import "SentryReachability.h"
161-
#import "SentryRetryAfterHeaderParser.h"
162161
#import "SentrySDK+Private.h"
163162
#import "SentrySDKInternal+Tests.h"
164163
#import "SentrySampleDecision+Private.h"

0 commit comments

Comments
 (0)