     /// - returns: The created `DataRequest`.
     open func request(_ urlRequest: URLRequestConvertible) -> DataRequest {
         let originalRequest = urlRequest.urlRequest
-        let adaptedRequest = originalRequest.adapt(using: adapter)
-
-        var task: URLSessionDataTask!
-        queue.sync { task = self.session.dataTask(with: adaptedRequest) }
-
         let originalTask = DataRequest.Requestable(urlRequest: originalRequest)
+
+        let task = originalTask.task(session: session, adapter: adapter, queue: queue)
         let request = DataRequest(session: session, task: task, originalTask: originalTask)
 
         delegate[request.delegate.task] = request

        to destination: DownloadRequest.DownloadFileDestination)
        -> DownloadRequest
    {
        var task: URLSessionDownloadTask!

        switch downloadable {
        case let .request(urlRequest):
            let urlRequest = urlRequest.adapt(using: adapter)
            queue.sync { task = self.session.downloadTask(with: urlRequest) }
        case let .resumeData(resumeData):
            queue.sync { task = self.session.downloadTask(withResumeData: resumeData) }
        }

        let request = DownloadRequest(session: session, task: task, originalTask: downloadable)

        request.downloadDelegate.downloadTaskDidFinishDownloadingToURL = { session, task, URL in

    // MARK: Private - Upload Implementation

    private func upload(_ uploadable: UploadRequest.Uploadable) -> UploadRequest {
        let task = uploadable.task(session: session, adapter: adapter, queue: queue)
        let request = UploadRequest(session: session, task: task, originalTask: uploadable)

        if case let .stream(inputStream, _) = uploadable {
            request.delegate.taskNeedNewBodyStream = { _, _ in inputStream }
        }

        delegate[request.delegate.task] = request
