 
 // Use the default implementation from extension of `ImageDownloaderDelegate`.
 extension ImageDownloader: ImageDownloaderDelegate {}
+
+extension ImageDownloader {
+    struct DownloadingContext {
+        let url: URL
+        let request: URLRequest
+        let options: KingfisherParsedOptionsInfo
+    }
+}

            return nil
        }

        // Ready to start download. Add it to session task manager (`sessionHandler`)
        let downloadTask = addDownloadTask(
            for: url,
            with: request,
            options: options,
            callback: createTaskCallback(completionHandler, options: options)
        )

        startDownloadTask(downloadTask, url: url, request: request, options: options)
        return downloadTask
    }


            // Download finished. Now process the data to an image.
            case .success(let (data, response)):
                let processor = ImageDataProcessor(
                    data: data, callbacks: callbacks, processingQueue: context.options.processingQueue)
                processor.onImageProcessed.delegate(on: self) { (self, result) in
                    // `onImageProcessed` will be called for `callbacks.count` times, with each
                    // `SessionDataTask.TaskCallback` as the input parameter.
