Skip to content

Commit 9ce54cc

Browse files
ref: CurrentDate as dependency for rate limits (#3837)
Replace access to the DependencyContainer in the RateLimits code by passing the current date as a dependency to reduce global state and the need to call clearTestState.
1 parent b35ccd0 commit 9ce54cc

18 files changed

+110
-76
lines changed

Sources/Sentry/SentryClient.m

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,10 @@ - (instancetype)initWithOptions:(SentryOptions *)options
9696
fileManager:(SentryFileManager *)fileManager
9797
deleteOldEnvelopeItems:(BOOL)deleteOldEnvelopeItems
9898
{
99-
NSArray<id<SentryTransport>> *transports = [SentryTransportFactory initTransports:options
100-
sentryFileManager:fileManager];
99+
NSArray<id<SentryTransport>> *transports = [SentryTransportFactory
100+
initTransports:options
101+
sentryFileManager:fileManager
102+
currentDateProvider:SentryDependencyContainer.sharedInstance.dateProvider];
101103

102104
SentryTransportAdapter *transportAdapter =
103105
[[SentryTransportAdapter alloc] initWithTransports:transports options:options];

Sources/Sentry/SentryDateUtil.m

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,31 @@
11
#import "SentryDateUtil.h"
2-
#import "SentryDependencyContainer.h"
32
#import "SentrySwift.h"
43

54
NS_ASSUME_NONNULL_BEGIN
65

76
@interface
87
SentryDateUtil ()
98

9+
@property (nonatomic, strong) SentryCurrentDateProvider *currentDateProvider;
10+
1011
@end
1112

1213
@implementation SentryDateUtil
1314

14-
+ (BOOL)isInFuture:(NSDate *_Nullable)date
15+
- (instancetype)initWithCurrentDateProvider:(SentryCurrentDateProvider *)currentDateProvider
16+
{
17+
if (self = [super init]) {
18+
self.currentDateProvider = currentDateProvider;
19+
}
20+
return self;
21+
}
22+
23+
- (BOOL)isInFuture:(NSDate *_Nullable)date
1524
{
1625
if (date == nil)
1726
return NO;
1827

19-
NSComparisonResult result =
20-
[[SentryDependencyContainer.sharedInstance.dateProvider date] compare:date];
28+
NSComparisonResult result = [[self.currentDateProvider date] compare:date];
2129
return result == NSOrderedAscending;
2230
}
2331

Sources/Sentry/SentryDefaultRateLimits.m

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
#import "SentryConcurrentRateLimitsDictionary.h"
33
#import "SentryDataCategoryMapper.h"
44
#import "SentryDateUtil.h"
5-
#import "SentryDependencyContainer.h"
65
#import "SentryLog.h"
76
#import "SentryRateLimitParser.h"
87
#import "SentryRetryAfterHeaderParser.h"
@@ -17,6 +16,8 @@
1716
@property (nonatomic, strong) SentryConcurrentRateLimitsDictionary *rateLimits;
1817
@property (nonatomic, strong) SentryRetryAfterHeaderParser *retryAfterHeaderParser;
1918
@property (nonatomic, strong) SentryRateLimitParser *rateLimitParser;
19+
@property (nonatomic, strong) SentryCurrentDateProvider *currentDateProvider;
20+
@property (nonatomic, strong) SentryDateUtil *dateUtil;
2021

2122
@end
2223

@@ -25,11 +26,14 @@ @implementation SentryDefaultRateLimits
2526
- (instancetype)initWithRetryAfterHeaderParser:
2627
(SentryRetryAfterHeaderParser *)retryAfterHeaderParser
2728
andRateLimitParser:(SentryRateLimitParser *)rateLimitParser
29+
currentDateProvider:(SentryCurrentDateProvider *)currentDateProvider
2830
{
2931
if (self = [super init]) {
3032
self.rateLimits = [[SentryConcurrentRateLimitsDictionary alloc] init];
3133
self.retryAfterHeaderParser = retryAfterHeaderParser;
3234
self.rateLimitParser = rateLimitParser;
35+
self.currentDateProvider = currentDateProvider;
36+
self.dateUtil = [[SentryDateUtil alloc] initWithCurrentDateProvider:currentDateProvider];
3337
}
3438
return self;
3539
}
@@ -39,8 +43,8 @@ - (BOOL)isRateLimitActive:(SentryDataCategory)category
3943
NSDate *categoryDate = [self.rateLimits getRateLimitForCategory:category];
4044
NSDate *allCategoriesDate = [self.rateLimits getRateLimitForCategory:kSentryDataCategoryAll];
4145

42-
BOOL isActiveForCategory = [SentryDateUtil isInFuture:categoryDate];
43-
BOOL isActiveForCategories = [SentryDateUtil isInFuture:allCategoriesDate];
46+
BOOL isActiveForCategory = [self.dateUtil isInFuture:categoryDate];
47+
BOOL isActiveForCategories = [self.dateUtil isInFuture:allCategoriesDate];
4448

4549
if (isActiveForCategory || isActiveForCategories) {
4650
return YES;
@@ -67,8 +71,7 @@ - (void)update:(NSHTTPURLResponse *)response
6771

6872
if (nil == retryAfterHeaderDate) {
6973
// parsing failed use default value
70-
retryAfterHeaderDate = [[SentryDependencyContainer.sharedInstance.dateProvider date]
71-
dateByAddingTimeInterval:60];
74+
retryAfterHeaderDate = [self.currentDateProvider.date dateByAddingTimeInterval:60];
7275
}
7376

7477
[self updateRateLimit:kSentryDataCategoryAll withDate:retryAfterHeaderDate];

Sources/Sentry/SentryRateLimitParser.m

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#import "SentryRateLimitParser.h"
22
#import "SentryDataCategoryMapper.h"
33
#import "SentryDateUtil.h"
4-
#import "SentryDependencyContainer.h"
54
#import "SentrySwift.h"
65
#import <Foundation/Foundation.h>
76

@@ -10,10 +9,20 @@
109
@interface
1110
SentryRateLimitParser ()
1211

12+
@property (nonatomic, strong) SentryCurrentDateProvider *currentDateProvider;
13+
1314
@end
1415

1516
@implementation SentryRateLimitParser
1617

18+
- (instancetype)initWithCurrentDateProvider:(SentryCurrentDateProvider *)currentDateProvider
19+
{
20+
if (self = [super init]) {
21+
self.currentDateProvider = currentDateProvider;
22+
}
23+
return self;
24+
}
25+
1726
- (NSDictionary<NSNumber *, NSDate *> *)parse:(NSString *)header
1827
{
1928
if ([header length] == 0) {
@@ -80,7 +89,7 @@ - (NSNumber *)parseRateLimitSeconds:(NSString *)string
8089
- (NSDate *)getLongerRateLimit:(NSDate *)existingRateLimit
8190
andRateLimitInSeconds:(NSNumber *)newRateLimitInSeconds
8291
{
83-
NSDate *newDate = [SentryDependencyContainer.sharedInstance.dateProvider.date
92+
NSDate *newDate = [self.currentDateProvider.date
8493
dateByAddingTimeInterval:[newRateLimitInSeconds doubleValue]];
8594
return [SentryDateUtil getMaximumDate:newDate andOther:existingRateLimit];
8695
}

Sources/Sentry/SentryRetryAfterHeaderParser.m

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
#import "SentryRetryAfterHeaderParser.h"
2-
#import "SentryDependencyContainer.h"
32
#import "SentryHttpDateParser.h"
43
#import "SentrySwift.h"
54
#import <Foundation/Foundation.h>
@@ -10,15 +9,18 @@
109
SentryRetryAfterHeaderParser ()
1110

1211
@property (nonatomic, strong) SentryHttpDateParser *httpDateParser;
12+
@property (nonatomic, strong) SentryCurrentDateProvider *currentDateProvider;
1313

1414
@end
1515

1616
@implementation SentryRetryAfterHeaderParser
1717

1818
- (instancetype)initWithHttpDateParser:(SentryHttpDateParser *)httpDateParser
19+
currentDateProvider:(SentryCurrentDateProvider *)currentDateProvider
1920
{
2021
if (self = [super init]) {
2122
self.httpDateParser = httpDateParser;
23+
self.currentDateProvider = currentDateProvider;
2224
}
2325
return self;
2426
}
@@ -31,8 +33,7 @@ - (NSDate *_Nullable)parse:(NSString *_Nullable)retryAfterHeader
3133

3234
NSInteger retryAfterSeconds = [retryAfterHeader integerValue];
3335
if (0 != retryAfterSeconds) {
34-
return [[SentryDependencyContainer.sharedInstance.dateProvider date]
35-
dateByAddingTimeInterval:retryAfterSeconds];
36+
return [self.currentDateProvider.date dateByAddingTimeInterval:retryAfterSeconds];
3637
}
3738

3839
// parsing as double/seconds failed, try to parse as date

Sources/Sentry/SentryTransportFactory.m

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ @implementation SentryTransportFactory
2626

2727
+ (NSArray<id<SentryTransport>> *)initTransports:(SentryOptions *)options
2828
sentryFileManager:(SentryFileManager *)sentryFileManager
29+
currentDateProvider:(SentryCurrentDateProvider *)currentDateProvider
2930
{
3031
NSURLSessionConfiguration *configuration =
3132
[NSURLSessionConfiguration ephemeralSessionConfiguration];
@@ -37,11 +38,14 @@ @implementation SentryTransportFactory
3738

3839
SentryHttpDateParser *httpDateParser = [[SentryHttpDateParser alloc] init];
3940
SentryRetryAfterHeaderParser *retryAfterHeaderParser =
40-
[[SentryRetryAfterHeaderParser alloc] initWithHttpDateParser:httpDateParser];
41-
SentryRateLimitParser *rateLimitParser = [[SentryRateLimitParser alloc] init];
41+
[[SentryRetryAfterHeaderParser alloc] initWithHttpDateParser:httpDateParser
42+
currentDateProvider:currentDateProvider];
43+
SentryRateLimitParser *rateLimitParser =
44+
[[SentryRateLimitParser alloc] initWithCurrentDateProvider:currentDateProvider];
4245
id<SentryRateLimits> rateLimits =
4346
[[SentryDefaultRateLimits alloc] initWithRetryAfterHeaderParser:retryAfterHeaderParser
44-
andRateLimitParser:rateLimitParser];
47+
andRateLimitParser:rateLimitParser
48+
currentDateProvider:currentDateProvider];
4549

4650
SentryEnvelopeRateLimit *envelopeRateLimit =
4751
[[SentryEnvelopeRateLimit alloc] initWithRateLimits:rateLimits];

Sources/Sentry/include/SentryDateUtil.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1-
#import <Foundation/Foundation.h>
1+
#import "SentryDefines.h"
22

33
NS_ASSUME_NONNULL_BEGIN
44

5-
NS_SWIFT_NAME(DateUtil)
5+
@class SentryCurrentDateProvider;
6+
67
@interface SentryDateUtil : NSObject
8+
SENTRY_NO_INIT
9+
10+
- (instancetype)initWithCurrentDateProvider:(SentryCurrentDateProvider *)currentDateProvider;
711

8-
+ (BOOL)isInFuture:(NSDate *_Nullable)date;
12+
- (BOOL)isInFuture:(NSDate *_Nullable)date;
913

1014
+ (NSDate *_Nullable)getMaximumDate:(NSDate *_Nullable)first andOther:(NSDate *_Nullable)second;
1115

Sources/Sentry/include/SentryDefaultRateLimits.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
@class SentryRetryAfterHeaderParser;
55
@class SentryRateLimitParser;
6+
@class SentryCurrentDateProvider;
67

78
NS_ASSUME_NONNULL_BEGIN
89

@@ -17,7 +18,8 @@ NS_SWIFT_NAME(DefaultRateLimits)
1718

1819
- (instancetype)initWithRetryAfterHeaderParser:
1920
(SentryRetryAfterHeaderParser *)retryAfterHeaderParser
20-
andRateLimitParser:(SentryRateLimitParser *)rateLimitParser;
21+
andRateLimitParser:(SentryRateLimitParser *)rateLimitParser
22+
currentDateProvider:(SentryCurrentDateProvider *)currentDateProvider;
2123

2224
@end
2325

Sources/Sentry/include/SentryRateLimitParser.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
#import <Foundation/Foundation.h>
1+
#import "SentryDefines.h"
2+
3+
@class SentryCurrentDateProvider;
24

35
NS_ASSUME_NONNULL_BEGIN
46

@@ -12,6 +14,9 @@ NS_ASSUME_NONNULL_BEGIN
1214
*/
1315
NS_SWIFT_NAME(RateLimitParser)
1416
@interface SentryRateLimitParser : NSObject
17+
SENTRY_NO_INIT
18+
19+
- (instancetype)initWithCurrentDateProvider:(SentryCurrentDateProvider *)currentDateProvider;
1520

1621
- (NSDictionary<NSNumber *, NSDate *> *)parse:(NSString *)header;
1722

Sources/Sentry/include/SentryRetryAfterHeaderParser.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#import <Foundation/Foundation.h>
22

33
@class SentryHttpDateParser;
4+
@class SentryCurrentDateProvider;
45

56
NS_ASSUME_NONNULL_BEGIN
67

@@ -11,7 +12,8 @@ NS_ASSUME_NONNULL_BEGIN
1112
NS_SWIFT_NAME(RetryAfterHeaderParser)
1213
@interface SentryRetryAfterHeaderParser : NSObject
1314

14-
- (instancetype)initWithHttpDateParser:(SentryHttpDateParser *)httpDateParser;
15+
- (instancetype)initWithHttpDateParser:(SentryHttpDateParser *)httpDateParser
16+
currentDateProvider:(SentryCurrentDateProvider *)currentDateProvider;
1517

1618
/** Parses the HTTP header into a NSDate.
1719

0 commit comments

Comments
 (0)