diff --git a/Package.resolved b/Package.resolved index 980069a7..17d5ee72 100644 --- a/Package.resolved +++ b/Package.resolved @@ -36,6 +36,15 @@ "version" : "1.13.0" } }, + { + "identity" : "opentracing-objc", + "kind" : "remoteSourceControl", + "location" : "https://github.com/undefinedlabs/opentracing-objc", + "state" : { + "revision" : "18c1a35ca966236cee0c5a714a51a73ff33384c1", + "version" : "0.5.2" + } + }, { "identity" : "swift-atomics", "kind" : "remoteSourceControl", @@ -143,6 +152,15 @@ "revision" : "6a9e38e7bd22a3b8ba80bddf395623cf68f57807", "version" : "1.3.1" } + }, + { + "identity" : "thrift-swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/undefinedlabs/Thrift-Swift", + "state" : { + "revision" : "18ff09e6b30e589ed38f90a1af23e193b8ecef8e", + "version" : "1.1.2" + } } ], "version" : 2 diff --git a/Sources/EmbraceCore/Capture/Network/Proxy/URLSessionDelegateProxy.swift b/Sources/EmbraceCore/Capture/Network/Proxy/URLSessionDelegateProxy.swift index 3c0fcbee..7a524959 100644 --- a/Sources/EmbraceCore/Capture/Network/Proxy/URLSessionDelegateProxy.swift +++ b/Sources/EmbraceCore/Capture/Network/Proxy/URLSessionDelegateProxy.swift @@ -65,10 +65,10 @@ class URLSessionDelegateProxy: NSObject { toSelector selector: Selector, session: URLSession ) -> DelegateRespondsResult { - - // check if the originalDelegate responds to the selector + // First check if originalDelegate is not self to prevent recursion if let originalDelegate = originalDelegate, - originalDelegate.responds(to: selector) { + !(originalDelegate is URLSessionDelegateProxy), + originalDelegate.responds(to: selector) { if let delegateAsT = originalDelegate as? T { return .respondsAndConforms(as: delegateAsT) } else if let object = originalDelegate as? NSObject { @@ -76,8 +76,10 @@ class URLSessionDelegateProxy: NSObject { } } - // guard that we are not the session.delegate to prevent infinite recursion - guard (session.delegate as? URLSessionDelegateProxy) != self else { + // Guard against self-referential delegation + guard let sessionDelegate = session.delegate, + !(sessionDelegate is URLSessionDelegateProxy), + sessionDelegate.responds(to: selector) else { return .doesNotRespond } @@ -88,13 +90,10 @@ class URLSessionDelegateProxy: NSObject { } // if session delegate also responds to selector, we must call it - if let sessionDelegate = session.delegate, - sessionDelegate.responds(to: selector) { - if let sessionDelegateAsT = sessionDelegate as? T { - return .respondsAndConforms(as: sessionDelegateAsT) - } else if let object = sessionDelegate as? NSObject { - return .respondsWithoutConformance(object: object) - } + if let sessionDelegateAsT = sessionDelegate as? T { + return .respondsAndConforms(as: sessionDelegateAsT) + } else if let object = sessionDelegate as? NSObject { + return .respondsWithoutConformance(object: object) } // If no case applies diff --git a/Sources/EmbraceCore/Capture/Network/URLSessionCaptureService.swift b/Sources/EmbraceCore/Capture/Network/URLSessionCaptureService.swift index b5f2b037..86570071 100644 --- a/Sources/EmbraceCore/Capture/Network/URLSessionCaptureService.swift +++ b/Sources/EmbraceCore/Capture/Network/URLSessionCaptureService.swift @@ -111,6 +111,11 @@ struct URLSessionInitWithDelegateSwizzler: URLSessionSwizzler { return originalImplementation(urlSession, Self.selector, configuration, delegate, queue) } + // Add protection against re-proxying our own proxy + guard !(proxiedDelegate is URLSessionDelegateProxy) else { + return originalImplementation(urlSession, Self.selector, configuration, delegate, queue) + } + let newDelegate = URLSessionDelegateProxy(originalDelegate: proxiedDelegate, handler: handler) let session = originalImplementation(urlSession, Self.selector, configuration, newDelegate, queue)