 ;;; Async Client protocol
 
 (defprotocol async-client
-  (get [url] [url opts])
-  (head [url] [url opts])
-  (post [url] [url opts])
-  (put [url] [url opts])
-  (delete [url] [url opts])
-  (trace [url] [url opts])
-  (options [url] [url opts])
-  (patch [url] [url opts]))
+  (get [this url] [this url opts])
+  (head [this url] [this url opts])
+  (post [this url] [this url opts])
+  (put [this url] [this url opts])
+  (delete [this url] [this url opts])
+  (trace [this url] [this url opts])
+  (options [this url] [this url opts])
+  (patch [this url] [this url opts])
+  (close [this]))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Private SSL configuration functions

               (future-callback client result opts callback))
     result)))

(defn get
  "Issue an asynchronous HTTP GET request. This will raise an exception if an
  error is returned."

   (request opts nil))
  ([opts :- schemas/RawUserRequestOptions
    callback :- schemas/ResponseCallbackFn]
   (let [client (create-default-client opts)]
     (request opts callback client)))
  ([opts :- schemas/RawUserRequestOptions
    callback :- schemas/ResponseCallbackFn
    client :- schemas/Client]
   (let [defaults {:headers         {}
                   :body            nil
                   :decompress-body true
                   :as              :stream}
         opts (merge defaults opts)
         {:keys [method url body] :as coerced-opts} (coerce-opts opts)
         request (construct-request method url)
         result (promise)]
