     }
 
     private func addDownloadTask(
-        for url: URL,
-        with request: URLRequest,
-        options: KingfisherParsedOptionsInfo,
+        context: DownloadingContext,
         callback: SessionDataTask.TaskCallback
     ) -> DownloadTask
     {
         // Ready to start download. Add it to session task manager (`sessionHandler`)
         let downloadTask: DownloadTask
-        if let existingTask = sessionDelegate.task(for: url) {
-            downloadTask = sessionDelegate.append(existingTask, url: url, callback: callback)
+        if let existingTask = sessionDelegate.task(for: context.url) {
+            downloadTask = sessionDelegate.append(existingTask, url: context.url, callback: callback)
         } else {
-            let sessionDataTask = session.dataTask(with: request)
-            sessionDataTask.priority = options.downloadPriority
-            downloadTask = sessionDelegate.add(sessionDataTask, url: url, callback: callback)
+            let sessionDataTask = session.dataTask(with: context.request)
+            sessionDataTask.priority = context.options.downloadPriority
+            downloadTask = sessionDelegate.add(sessionDataTask, url: context.url, callback: callback)
         }
         return downloadTask
     }
 
-    private func startDownloadTask(_ downloadTask: DownloadTask, url: URL, request: URLRequest, options: KingfisherParsedOptionsInfo) {
+    private func startDownloadTask(_ downloadTask: DownloadTask, context: DownloadingContext) {
 
         let sessionTask = downloadTask.sessionTask
         guard !sessionTask.started else {

                let value = try result.get()
                self.delegate?.imageDownloader(
                    self,
                    didFinishDownloadingImageForURL: url,
                    with: value.1,
                    error: nil
                )
            } catch {
                self.delegate?.imageDownloader(
                    self,
                    didFinishDownloadingImageForURL: url,
                    with: nil,
                    error: error
                )

                }
            }
        }
        delegate?.imageDownloader(self, willDownloadImageForURL: context.url, with: context.request)
        sessionTask.resume()
    }

