[swift5] URLSession: Fix memory leak of SessionDelegate (#8558)

* Remove unused stored reference of delegate. URLSession keeps a strong reference anyway.

* Fix cleanup

* Update samples
This commit is contained in:
Frank Lehmann 2021-01-29 03:52:39 +01:00 committed by GitHub
parent 2553d056dc
commit 64f5dc8077
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 44 additions and 33 deletions

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} class URLSessionRequestBuilder<T>: RequestBuilder<T> { {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/** /**
May be assigned if you want to control the authentication challenges. May be assigned if you want to control the authentication challenges.
*/ */
@ -52,6 +49,7 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} func createURLSession() -> URLSession { {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders() configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil) return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
} }
let cleanupRequest = { let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil urlSessionStore[urlSessionId] = nil
} }
@ -144,12 +143,14 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
open class URLSessionRequestBuilder<T>: RequestBuilder<T> { open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/** /**
May be assigned if you want to control the authentication challenges. May be assigned if you want to control the authentication challenges.
*/ */
@ -52,6 +49,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
open func createURLSession() -> URLSession { open func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders() configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil) return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} }
let cleanupRequest = { let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil urlSessionStore[urlSessionId] = nil
} }
@ -144,12 +143,14 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
open class URLSessionRequestBuilder<T>: RequestBuilder<T> { open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/** /**
May be assigned if you want to control the authentication challenges. May be assigned if you want to control the authentication challenges.
*/ */
@ -52,6 +49,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
open func createURLSession() -> URLSession { open func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders() configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil) return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} }
let cleanupRequest = { let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil urlSessionStore[urlSessionId] = nil
} }
@ -144,12 +143,14 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
open class URLSessionRequestBuilder<T>: RequestBuilder<T> { open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/** /**
May be assigned if you want to control the authentication challenges. May be assigned if you want to control the authentication challenges.
*/ */
@ -52,6 +49,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
open func createURLSession() -> URLSession { open func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders() configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil) return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} }
let cleanupRequest = { let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil urlSessionStore[urlSessionId] = nil
} }
@ -144,12 +143,14 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
internal class URLSessionRequestBuilder<T>: RequestBuilder<T> { internal class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/** /**
May be assigned if you want to control the authentication challenges. May be assigned if you want to control the authentication challenges.
*/ */
@ -52,6 +49,7 @@ internal class URLSessionRequestBuilder<T>: RequestBuilder<T> {
internal func createURLSession() -> URLSession { internal func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders() configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil) return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ internal class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} }
let cleanupRequest = { let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil urlSessionStore[urlSessionId] = nil
} }
@ -144,12 +143,14 @@ internal class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
open class URLSessionRequestBuilder<T>: RequestBuilder<T> { open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/** /**
May be assigned if you want to control the authentication challenges. May be assigned if you want to control the authentication challenges.
*/ */
@ -52,6 +49,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
open func createURLSession() -> URLSession { open func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders() configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil) return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} }
let cleanupRequest = { let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil urlSessionStore[urlSessionId] = nil
} }
@ -144,12 +143,14 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
open class URLSessionRequestBuilder<T>: RequestBuilder<T> { open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/** /**
May be assigned if you want to control the authentication challenges. May be assigned if you want to control the authentication challenges.
*/ */
@ -52,6 +49,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
open func createURLSession() -> URLSession { open func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders() configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil) return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} }
let cleanupRequest = { let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil urlSessionStore[urlSessionId] = nil
} }
@ -144,12 +143,14 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
open class URLSessionRequestBuilder<T>: RequestBuilder<T> { open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/** /**
May be assigned if you want to control the authentication challenges. May be assigned if you want to control the authentication challenges.
*/ */
@ -52,6 +49,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
open func createURLSession() -> URLSession { open func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders() configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil) return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} }
let cleanupRequest = { let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil urlSessionStore[urlSessionId] = nil
} }
@ -144,12 +143,14 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
open class URLSessionRequestBuilder<T>: RequestBuilder<T> { open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/** /**
May be assigned if you want to control the authentication challenges. May be assigned if you want to control the authentication challenges.
*/ */
@ -52,6 +49,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
open func createURLSession() -> URLSession { open func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders() configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil) return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} }
let cleanupRequest = { let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil urlSessionStore[urlSessionId] = nil
} }
@ -144,12 +143,14 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
open class URLSessionRequestBuilder<T>: RequestBuilder<T> { open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/** /**
May be assigned if you want to control the authentication challenges. May be assigned if you want to control the authentication challenges.
*/ */
@ -52,6 +49,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
open func createURLSession() -> URLSession { open func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders() configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil) return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} }
let cleanupRequest = { let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil urlSessionStore[urlSessionId] = nil
} }
@ -144,12 +143,14 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }

View File

@ -24,9 +24,6 @@ private var urlSessionStore = SynchronizedDictionary<String, URLSession>()
open class URLSessionRequestBuilder<T>: RequestBuilder<T> { open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
// swiftlint:disable:next weak_delegate
fileprivate let sessionDelegate = SessionDelegate()
/** /**
May be assigned if you want to control the authentication challenges. May be assigned if you want to control the authentication challenges.
*/ */
@ -52,6 +49,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
open func createURLSession() -> URLSession { open func createURLSession() -> URLSession {
let configuration = URLSessionConfiguration.default let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders() configuration.httpAdditionalHeaders = buildHeaders()
let sessionDelegate = SessionDelegate()
sessionDelegate.credential = credential sessionDelegate.credential = credential
sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge sessionDelegate.taskDidReceiveChallenge = taskDidReceiveChallenge
return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil) return URLSession(configuration: configuration, delegate: sessionDelegate, delegateQueue: nil)
@ -126,6 +124,7 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} }
let cleanupRequest = { let cleanupRequest = {
urlSessionStore[urlSessionId]?.finishTasksAndInvalidate()
urlSessionStore[urlSessionId] = nil urlSessionStore[urlSessionId] = nil
} }
@ -144,12 +143,14 @@ open class URLSessionRequestBuilder<T>: RequestBuilder<T> {
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }
} else { } else {
apiResponseQueue.async { apiResponseQueue.async {
self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
cleanupRequest()
} }
} }
} }