 public extension URLSession {
     enum JSONSessionErrors: Error {
         case invalidQueryItem(String)
-        case badHTTPResponse(Data)
+        case badHTTPResponse(HTTPURLResponse)
+        case error(Error)
+        case unknown
     }
     
     enum HTTPHeaders:String {

     - Parameter completion: A closure to be called on success or failure.
     - returns: NSURLSessionDataTask already resumed
     */
    @discardableResult func httpPut<T:JSON>(with url:URL, bodyParameters:[URLQueryItem], headers:[String:String]? = nil, completion:@escaping (HTTPURLResponse?, T?, Error?) -> Swift.Void) -> URLSessionDataTask?
    {
        guard let body:String = URLQueryItem.REST_urlEscapedDescription(queryItems: bodyParameters) else {
            completion(nil, nil, JSONSessionErrors.invalidQueryItem(bodyParameters.description))
            return nil
        }
        

     - Parameter completion: A closure to be called on success or failure.
     - returns: NSURLSessionDataTask already resumed
     */
    @discardableResult func httpGet(with url:URL, headers:[String:String]? = nil, completion:@escaping (Result<Data, JSONSessionErrors>) -> Swift.Void) -> URLSessionDataTask?
    {
        return httpDataTask(with: url,
                            method: .get,
                            headers: headers,
                            completion: completion)
    }

    //MARK: - Put
    
    /**
