Skip to content

Commit b63e64f

Browse files
committed
Request manager in Swift
1 parent 95cfd20 commit b63e64f

13 files changed

+280
-95
lines changed

Sentry.xcodeproj/project.pbxproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,6 +1068,9 @@
10681068
FA67DD182DDBD4EA00896B02 /* UIImageHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA67DCED2DDBD4EA00896B02 /* UIImageHelper.swift */; };
10691069
FA67DD192DDBD4EA00896B02 /* SwizzleClassNameExclude.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA67DCD52DDBD4EA00896B02 /* SwizzleClassNameExclude.swift */; };
10701070
FA8A36182DEAA1EB0058D883 /* SentryThread+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = FA8A36172DEAA1EB0058D883 /* SentryThread+Private.h */; };
1071+
FA90FAA02E0649C6008CAAE8 /* SentrySpotlightTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA90FA9F2E0649C1008CAAE8 /* SentrySpotlightTransport.swift */; };
1072+
FA90FAA22E06503E008CAAE8 /* SentryQueueableRequestManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA90FAA12E065038008CAAE8 /* SentryQueueableRequestManager.swift */; };
1073+
FA90FAA42E0654D2008CAAE8 /* RequestManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA90FAA32E0654CB008CAAE8 /* RequestManager.swift */; };
10711074
FAEC270E2DF3526000878871 /* SentryUserFeedback.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAEC270D2DF3526000878871 /* SentryUserFeedback.swift */; };
10721075
FAEC273D2DF3933A00878871 /* NSData+Unzip.m in Sources */ = {isa = PBXBuildFile; fileRef = FAEC273C2DF3933200878871 /* NSData+Unzip.m */; };
10731076
/* End PBXBuildFile section */
@@ -2316,6 +2319,9 @@
23162319
FA67DCEF2DDBD4EA00896B02 /* URLSessionTaskHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLSessionTaskHelper.swift; sourceTree = "<group>"; };
23172320
FA67DCF22DDBD4EA00896B02 /* SwiftDescriptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftDescriptor.swift; sourceTree = "<group>"; };
23182321
FA8A36172DEAA1EB0058D883 /* SentryThread+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "SentryThread+Private.h"; path = "include/SentryThread+Private.h"; sourceTree = "<group>"; };
2322+
FA90FA9F2E0649C1008CAAE8 /* SentrySpotlightTransport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentrySpotlightTransport.swift; sourceTree = "<group>"; };
2323+
FA90FAA12E065038008CAAE8 /* SentryQueueableRequestManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryQueueableRequestManager.swift; sourceTree = "<group>"; };
2324+
FA90FAA32E0654CB008CAAE8 /* RequestManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestManager.swift; sourceTree = "<group>"; };
23192325
FAEC270D2DF3526000878871 /* SentryUserFeedback.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryUserFeedback.swift; sourceTree = "<group>"; };
23202326
FAEC273C2DF3933200878871 /* NSData+Unzip.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSData+Unzip.m"; sourceTree = "<group>"; };
23212327
FAEC273E2DF393E000878871 /* NSData+Unzip.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSData+Unzip.h"; sourceTree = "<group>"; };
@@ -4248,6 +4254,9 @@
42484254
D856272A2A374A6800FB8062 /* Tools */ = {
42494255
isa = PBXGroup;
42504256
children = (
4257+
FA90FAA12E065038008CAAE8 /* SentryQueueableRequestManager.swift */,
4258+
FA90FAA32E0654CB008CAAE8 /* RequestManager.swift */,
4259+
FA90FA9F2E0649C1008CAAE8 /* SentrySpotlightTransport.swift */,
42514260
FA67DCC02DDBD4C800896B02 /* SentryLog+Configure.swift */,
42524261
);
42534262
path = Tools;
@@ -5473,6 +5482,7 @@
54735482
7B6D1261265F784000C9BE4B /* PrivateSentrySDKOnly.mm in Sources */,
54745483
63BE85711ECEC6DE00DC44F5 /* SentryDateUtils.m in Sources */,
54755484
D451ED5D2D92ECD200C9BEA8 /* SentryOnDemandReplayError.swift in Sources */,
5485+
FA90FAA22E06503E008CAAE8 /* SentryQueueableRequestManager.swift in Sources */,
54765486
7BD4BD4927EB2A5D0071F4FF /* SentryDiscardedEvent.m in Sources */,
54775487
628308612D50ADAC00EAEF77 /* SentryRequestCodable.swift in Sources */,
54785488
03F84D3827DD4191008FE43F /* SentryBacktrace.cpp in Sources */,
@@ -5578,6 +5588,7 @@
55785588
D802994E2BA836EF000F0081 /* SentryOnDemandReplay.swift in Sources */,
55795589
D8603DD6284F8497000E1227 /* SentryBaggage.m in Sources */,
55805590
63FE711520DA4C1000CDBAE8 /* SentryCrashJSONCodec.c in Sources */,
5591+
FA90FAA02E0649C6008CAAE8 /* SentrySpotlightTransport.swift in Sources */,
55815592
03F84D3327DD4191008FE43F /* SentryMachLogging.cpp in Sources */,
55825593
D85852BA27EDDC5900C6D8AE /* SentryUIApplication.m in Sources */,
55835594
7B4E375F258231FC00059C93 /* SentryAttachment.m in Sources */,
@@ -5588,6 +5599,7 @@
55885599
7BC9A20628F41781001E7C4C /* SentryMeasurementUnit.m in Sources */,
55895600
63FE71A020DA4C1100CDBAE8 /* SentryCrashInstallation.m in Sources */,
55905601
63FE713520DA4C1100CDBAE8 /* SentryCrashMemory.c in Sources */,
5602+
FA90FAA42E0654D2008CAAE8 /* RequestManager.swift in Sources */,
55915603
629194A92D51F976000F7C6B /* SentryDebugMetaCodable.swift in Sources */,
55925604
63FE714520DA4C1100CDBAE8 /* SentryCrashObjC.c in Sources */,
55935605
63FE710520DA4C1000CDBAE8 /* SentryAsyncSafeLog.c in Sources */,
Lines changed: 65 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,65 @@
1-
#import "SentryQueueableRequestManager.h"
2-
#import "SentryLog.h"
3-
#import "SentryRequestOperation.h"
4-
5-
NS_ASSUME_NONNULL_BEGIN
6-
7-
@interface SentryQueueableRequestManager ()
8-
9-
@property (nonatomic, strong) NSOperationQueue *queue;
10-
@property (nonatomic, strong) NSURLSession *session;
11-
12-
@end
13-
14-
@implementation SentryQueueableRequestManager
15-
16-
- (instancetype)initWithSession:(NSURLSession *)session
17-
{
18-
self = [super init];
19-
if (self) {
20-
self.session = session;
21-
self.queue = [[NSOperationQueue alloc] init];
22-
self.queue.name = @"io.sentry.QueueableRequestManager.OperationQueue";
23-
self.queue.maxConcurrentOperationCount = 3;
24-
}
25-
return self;
26-
}
27-
28-
- (BOOL)isReady
29-
{
30-
#if SENTRY_TEST || SENTRY_TEST_CI
31-
// force every envelope to be cached in UI tests so we can inspect what the SDK would've sent
32-
// for a given operation
33-
if ([NSProcessInfo.processInfo.environment[@"--io.sentry.sdk-environment"]
34-
isEqualToString:@"ui-tests"]) {
35-
return NO;
36-
}
37-
#elif DEBUG
38-
if ([NSProcessInfo.processInfo.arguments
39-
containsObject:@"--io.sentry.disable-http-transport"]) {
40-
return NO;
41-
}
42-
#endif // SENTRY_TEST || SENTRY_TEST_CI
43-
44-
// We always have at least one operation in the queue when calling this
45-
return self.queue.operationCount <= 1;
46-
}
47-
48-
- (void)addRequest:(NSURLRequest *)request
49-
completionHandler:(_Nullable SentryRequestOperationFinished)completionHandler
50-
{
51-
SentryRequestOperation *operation = [[SentryRequestOperation alloc]
52-
initWithSession:self.session
53-
request:request
54-
completionHandler:^(NSHTTPURLResponse *_Nullable response, NSError *_Nullable error) {
55-
SENTRY_LOG_DEBUG(@"Queued requests: %@", @(self.queue.operationCount - 1));
56-
if (completionHandler) {
57-
completionHandler(response, error);
58-
}
59-
}];
60-
[self.queue addOperation:operation];
61-
}
62-
63-
@end
64-
65-
NS_ASSUME_NONNULL_END
1+
// #import "SentryQueueableRequestManager.h"
2+
// #import "SentryLog.h"
3+
// #import "SentryRequestOperation.h"
4+
//
5+
// NS_ASSUME_NONNULL_BEGIN
6+
//
7+
//@interface SentryQueueableRequestManager ()
8+
//
9+
//@property (nonatomic, strong) NSOperationQueue *queue;
10+
//@property (nonatomic, strong) NSURLSession *session;
11+
//
12+
//@end
13+
//
14+
//@implementation SentryQueueableRequestManager
15+
//
16+
//- (instancetype)initWithSession:(NSURLSession *)session
17+
//{
18+
// self = [super init];
19+
// if (self) {
20+
// self.session = session;
21+
// self.queue = [[NSOperationQueue alloc] init];
22+
// self.queue.name = @"io.sentry.QueueableRequestManager.OperationQueue";
23+
// self.queue.maxConcurrentOperationCount = 3;
24+
// }
25+
// return self;
26+
// }
27+
//
28+
//- (BOOL)isReady
29+
//{
30+
// #if SENTRY_TEST || SENTRY_TEST_CI
31+
// // force every envelope to be cached in UI tests so we can inspect what the SDK would've sent
32+
// // for a given operation
33+
// if ([NSProcessInfo.processInfo.environment[@"--io.sentry.sdk-environment"]
34+
// isEqualToString:@"ui-tests"]) {
35+
// return NO;
36+
// }
37+
// #elif DEBUG
38+
// if ([NSProcessInfo.processInfo.arguments
39+
// containsObject:@"--io.sentry.disable-http-transport"]) {
40+
// return NO;
41+
// }
42+
// #endif // SENTRY_TEST || SENTRY_TEST_CI
43+
//
44+
// // We always have at least one operation in the queue when calling this
45+
// return self.queue.operationCount <= 1;
46+
// }
47+
//
48+
//- (void)addRequest:(NSURLRequest *)request
49+
// completionHandler:(_Nullable SentryRequestOperationFinished)completionHandler
50+
//{
51+
// SentryRequestOperation *operation = [[SentryRequestOperation alloc]
52+
// initWithSession:self.session
53+
// request:request
54+
// completionHandler:^(NSHTTPURLResponse *_Nullable response, NSError *_Nullable error) {
55+
// SENTRY_LOG_DEBUG(@"Queued requests: %@", @(self.queue.operationCount - 1));
56+
// if (completionHandler) {
57+
// completionHandler(response, error);
58+
// }
59+
// }];
60+
// [self.queue addOperation:operation];
61+
// }
62+
//
63+
//@end
64+
//
65+
// NS_ASSUME_NONNULL_END

Sources/Sentry/include/SentryHttpTransport.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
@class SentryDispatchQueueWrapper;
99
@class SentryNSURLRequestBuilder;
1010
@class SentryOptions;
11+
@protocol SentryRequestManager;
1112

1213
NS_ASSUME_NONNULL_BEGIN
1314

Sources/Sentry/include/SentryPrivate.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#import "SentryNSDictionarySanitize.h"
2222
#import "SentryProfiler+Private.h"
2323
#import "SentryRandom.h"
24+
#import "SentryRequestManager.h"
25+
#import "SentryRequestOperation.h"
2426
#import "SentryScreenshot.h"
2527
#import "SentrySdkInfo.h"
2628
#import "SentrySerialization.h"
Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
#import "SentryDefines.h"
2-
#import "SentryRequestManager.h"
3-
4-
NS_ASSUME_NONNULL_BEGIN
5-
6-
@interface SentryQueueableRequestManager : NSObject <SentryRequestManager>
7-
8-
@end
9-
10-
NS_ASSUME_NONNULL_END
1+
// #import "SentryDefines.h"
2+
// #import "SentryRequestManager.h"
3+
//
4+
// NS_ASSUME_NONNULL_BEGIN
5+
//
6+
//@interface SentryQueueableRequestManager : NSObject <SentryRequestManager>
7+
//
8+
//@end
9+
//
10+
// NS_ASSUME_NONNULL_END
Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
#import <Foundation/Foundation.h>
2-
3-
NS_ASSUME_NONNULL_BEGIN
4-
5-
NS_SWIFT_NAME(RequestManager)
6-
@protocol SentryRequestManager <NSObject>
7-
8-
@property (nonatomic, readonly, getter=isReady) BOOL ready;
9-
10-
- (instancetype)initWithSession:(NSURLSession *)session;
11-
12-
- (void)addRequest:(NSURLRequest *)request
13-
completionHandler:(_Nullable SentryRequestOperationFinished)completionHandler;
14-
15-
@end
16-
17-
NS_ASSUME_NONNULL_END
1+
// #import <Foundation/Foundation.h>
2+
//
3+
// NS_ASSUME_NONNULL_BEGIN
4+
//
5+
// NS_SWIFT_NAME(RequestManager)
6+
//@protocol SentryRequestManager <NSObject>
7+
//
8+
//@property (nonatomic, readonly, getter=isReady) BOOL ready;
9+
//
10+
//- (instancetype)initWithSession:(NSURLSession *)session;
11+
//
12+
//- (void)addRequest:(NSURLRequest *)request
13+
// completionHandler:(SentryRequestOperationFinished)completionHandler;
14+
//
15+
//@end
16+
//
17+
// NS_ASSUME_NONNULL_END

Sources/Sentry/include/SentryRequestOperation.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#import "SentryAsynchronousOperation.h"
2-
#import "SentryQueueableRequestManager.h"
2+
#import "SentryDefines.h"
33

44
NS_ASSUME_NONNULL_BEGIN
55

Sources/Sentry/include/SentrySpotlightTransport.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
@class SentryDispatchQueueWrapper;
66
@class SentryNSURLRequestBuilder;
77
@class SentryOptions;
8+
@protocol SentryRequestManager;
89

910
NS_ASSUME_NONNULL_BEGIN
1011

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
@objc(SentryRequestManager)
2+
@_spi(Private) public protocol RequestManager {
3+
4+
var isReady: Bool { get }
5+
6+
init(session: URLSession)
7+
8+
@objc(addRequest:completionHandler:)
9+
func add(_ request: URLRequest, completionHandler: ((HTTPURLResponse?, Error?) -> Void)?)
10+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
@_implementationOnly import _SentryPrivate
2+
3+
@objc @_spi(Private) public final class SentryQueueableRequestManager: NSObject, RequestManager {
4+
private let session: URLSession
5+
private let queue: OperationQueue
6+
7+
@objc
8+
public init(session: URLSession) {
9+
self.session = session
10+
self.queue = OperationQueue()
11+
self.queue.name = "io.sentry.QueueableRequestManager.OperationQueue"
12+
self.queue.maxConcurrentOperationCount = 3
13+
}
14+
15+
public var isReady: Bool {
16+
#if SENTRY_TEST || SENTRY_TEST_CI
17+
// force every envelope to be cached in UI tests so we can inspect what the SDK would've sent
18+
// for a given operation
19+
if ProcessInfo.processInfo.environment["--io.sentry.sdk-environment"] == "ui-tests" {
20+
return false
21+
}
22+
#elseif DEBUG
23+
if ProcessInfo.processInfo.arguments.contains("--io.sentry.disable-http-transport") {
24+
return false
25+
}
26+
#endif // SENTRY_TEST || SENTRY_TEST_CI
27+
28+
// We always have at least one operation in the queue when calling this
29+
return self.queue.operationCount <= 1
30+
}
31+
32+
public func add(_ request: URLRequest, completionHandler: SentryRequestOperationFinished?) {
33+
let operation = SentryRequestOperation(session: self.session, request: request) { response, error in
34+
SentryLog.debug("Queued requests: \(self.queue.operationCount - 1)")
35+
completionHandler?(response, error)
36+
}
37+
self.queue.addOperation(operation)
38+
}
39+
}

0 commit comments

Comments
 (0)