title: Custom NSURLProtocol with NSURLSession
body: <p>I'm trying to implement this tutorial which implements a custom NSURLProtocol with NSURLConnection.</p>
  
  <p><a href="https://www.raywenderlich.com/76735/using-nsurlprotocol-swift" rel="noreferrer">https://www.raywenderlich.com/76735/using-nsurlprotocol-swift</a></p>
  
  <p>It works as expected, but now that NSURLConnection is deprecated in iOS9, I'm trying to convert it to NSURLSession.</p>
  
  <p>Unfortunatly it didn't work.</p>
  
  <p>I'm loading a website in uiwebview, if I use NSURLConnection it loads and everything work as expected, all http requests from the webview is captured, but not when using NSURLSession.</p>
  
  <p>Any help is appreciated.</p>
  
  <p>here is my code</p>
  
  <pre><code>    import UIKit
  
      class MyProtocol: NSURLProtocol, NSURLSessionDataDelegate, NSURLSessionTaskDelegate, NSURLSessionDelegate {
  
      //var connection: NSURLConnection!
      var mutableData: NSMutableData!
      var response: NSURLResponse!
  
      var dataSession: NSURLSessionDataTask!
  
      override class func canInitWithRequest(request: NSURLRequest) -&gt; Bool {
  
          if NSURLProtocol.propertyForKey("MyURLProtocolHandledKey", inRequest: request) != nil {
              return false
          }
  
          return true
      }
  
      override class func canonicalRequestForRequest(request: NSURLRequest) -&gt; NSURLRequest {
          return request
      }
  
      override class func requestIsCacheEquivalent(aRequest: NSURLRequest,
          toRequest bRequest: NSURLRequest) -&gt; Bool {
              return super.requestIsCacheEquivalent(aRequest, toRequest:bRequest)
      }
  
      override func startLoading() {
          let newRequest = self.request.mutableCopy() as! NSMutableURLRequest
          NSURLProtocol.setProperty(true, forKey: "MyURLProtocolHandledKey", inRequest: newRequest)
  
          self.dataSession = NSURLSession.sharedSession().dataTaskWithRequest(newRequest)
  
          dataSession.resume()
          self.mutableData = NSMutableData()
      }
  
          override func stopLoading() {
  
          print("Data task stop")
          self.dataSession.cancel()
          self.mutableData = nil
  
      }
  
      func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -&gt; Void) {
          self.response = response
          self.mutableData = NSMutableData()
          print(mutableData)
      }
  
      func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
          self.client?.URLProtocol(self, didLoadData: data)
          self.mutableData.appendData(data)
      }
  
      func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
          if (error == nil)
          {
              self.client!.URLProtocolDidFinishLoading(self)
              self.saveCachedResponse()
          }
          else
          {
              self.client?.URLProtocol(self, didFailWithError: error!)
          }
      }
  
      func saveCachedResponse () {
          let timeStamp = NSDate()
          let urlString = self.request.URL?.absoluteString
          let dataString = NSString(data: self.mutableData, encoding: NSUTF8StringEncoding) as NSString?
          print("TiemStamp:\(timeStamp)\nURL: \(urlString)\n\nDATA:\(dataString)\n\n")
      }
  
  
      }
  </code></pre>