   [opts :- schemas/UserRequestOptions]
   (select-keys opts [:ssl-context :ssl-ca-cert :ssl-cert :ssl-key]))
 
-(schema/defn create-client :- schemas/Client
-  [opts :- schemas/ClientOptions]
-  (let [opts    (configure-ssl opts)
-        client  (if (:ssl-context opts)
-                  (.. (HttpAsyncClients/custom) (setSSLContext (:ssl-context opts)) build)
-                  (HttpAsyncClients/createDefault))]
+(schema/defn create-default-client :- schemas/Client
+  [opts :- schemas/RawUserRequestOptions]
+  (let [defaults        {:headers         {}
+                         :body            nil
+                         :decompress-body true
+                         :as              :stream}
+        opts            (merge defaults opts)
+        client-opts     (extract-client-opts opts)
+        configured-opts (configure-ssl client-opts)
+        client          (if (:ssl-context configured-opts)
+                          (.. (HttpAsyncClients/custom) (setSSLContext (:ssl-context configured-opts)) build)
+                          (HttpAsyncClients/createDefault))]
     (.start client)
     client))
 

;;; 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]))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Private SSL configuration functions

   (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)]
