From c029cb350e4ac05c88799455fd372f32a735da41 Mon Sep 17 00:00:00 2001 From: satenderDagar Date: Sun, 19 Apr 2026 14:56:37 +0530 Subject: [PATCH] Added optional urlSessionDelegate for SSL pinning authentication --- Sources/EventSource/EventSource.swift | 13 +++++++++---- Sources/EventSource/SessionDelegate.swift | 13 +++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/Sources/EventSource/EventSource.swift b/Sources/EventSource/EventSource.swift index 41ebac3..77673a8 100644 --- a/Sources/EventSource/EventSource.swift +++ b/Sources/EventSource/EventSource.swift @@ -71,12 +71,13 @@ public struct EventSource: Sendable { self.timeoutIntervalForResource = timeoutIntervalForResource } - public func dataTask(for urlRequest: URLRequest) -> DataTask { + public func dataTask(for urlRequest: URLRequest, urlSessionDelegate: URLSessionDelegate? = nil) -> DataTask { DataTask( urlRequest: urlRequest, eventParser: eventParser(), timeoutIntervalForRequest: timeoutIntervalForRequest, - timeoutIntervalForResource: timeoutIntervalForResource + timeoutIntervalForResource: timeoutIntervalForResource, + urlSessionDelegate: urlSessionDelegate ) } } @@ -116,6 +117,8 @@ public extension EventSource { /// A URLRequest of the events source. public let urlRequest: URLRequest + + public let urlSessionDelegate: URLSessionDelegate? private let _eventParser: Mutex @@ -170,12 +173,14 @@ public extension EventSource { urlRequest: URLRequest, eventParser: EventParser, timeoutIntervalForRequest: TimeInterval, - timeoutIntervalForResource: TimeInterval + timeoutIntervalForResource: TimeInterval, + urlSessionDelegate: URLSessionDelegate? ) { self.urlRequest = urlRequest self._eventParser = Mutex(eventParser) self.timeoutIntervalForRequest = timeoutIntervalForRequest self.timeoutIntervalForResource = timeoutIntervalForResource + self.urlSessionDelegate = urlSessionDelegate } /// Creates and returns event stream. @@ -188,7 +193,7 @@ public extension EventSource { } return AsyncStream { continuation in - let sessionDelegate = SessionDelegate() + let sessionDelegate = SessionDelegate(urlSessionDelegate: urlSessionDelegate) let urlSession = URLSession( configuration: urlSessionConfiguration, delegate: sessionDelegate, diff --git a/Sources/EventSource/SessionDelegate.swift b/Sources/EventSource/SessionDelegate.swift index be55a5a..dae7925 100644 --- a/Sources/EventSource/SessionDelegate.swift +++ b/Sources/EventSource/SessionDelegate.swift @@ -19,8 +19,14 @@ final class SessionDelegate: NSObject, URLSessionDataDelegate { } private let internalStream = AsyncStream.makeStream() + + private let urlSessionDelegate: URLSessionDelegate? var eventStream: AsyncStream { internalStream.stream } + + init(urlSessionDelegate: URLSessionDelegate?) { + self.urlSessionDelegate = urlSessionDelegate + } func urlSession( _ session: URLSession, @@ -47,3 +53,10 @@ final class SessionDelegate: NSObject, URLSessionDataDelegate { internalStream.continuation.yield(.didReceiveData(data)) } } + +extension SessionDelegate: URLSessionDelegate { + + func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @Sendable @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { + urlSessionDelegate?.urlSession?(session, didReceive: challenge, completionHandler: completionHandler) + } +}