replace with-auth and with-headers with the new with-options macro

this combines the functionality in each and allows for a convenient
place for other options to be added in the future. as well as furthering
this semi-crappy 'with-' / dynamic var binding design. *sigh*
This commit is contained in:
Gered 2014-10-07 08:23:34 -04:00
parent 690098b1c6
commit 26dd44c37e

View file

@ -9,32 +9,36 @@
; HACK: using this dynamic/"with"-wrapping type of API design is arguably a "lazy" design.
; in the future I intend to explore reworking the API so as to not require this if
; authentication support is needed, but I didn't want to get too held up on it right
; now. the problem at the moment is that passing authentication info to the main
; FHIR operation functions is that it only works well in the simple cases. usage
; of functions like fetch-next-page, fetch-all and get-relative-resource becomes
; a little bit messy (have to pass in server/auth info where before none of it
; was necessary... kind of gross in my opinion, would rather come up with
; something cleaner if at all possible)
; authentication/http header support is needed, but I didn't want to get too held
; up on it right now. the problem at the moment is that passing extra HTTP request
; info to the main FHIR operation functions is that it only works well in the simple
; cases. usage of functions like fetch-next-page, fetch-all and
; get-relative-resource becomes a little bit messy (have to pass in all this info
; where before none of it was necessary... kind of gross in my opinion, would rather
; come up with something cleaner if at all possible)
(def ^:dynamic *server-auth* nil)
(def ^:dynamic *options* nil)
(defmacro with-auth
"wraps code that performs FHIR operations such that each will have authentication info
added to the HTTP requests made. auth should be a map containing one entry where the
key is one of :basic-auth, :digest-auth or :oauth-token (authentication headers that
clj-http supports)"
[auth & body]
`(binding [*server-auth* (select-keys ~auth [:basic-auth :digest-auth :oauth-token])]
~@body))
(defmacro with-options
"wraps code that performs FHIR operations so that each FHIR operation runs with some
extra options, such as HTTP authentication information, extra HTTP headers, etc.
(def ^:dynamic *extra-headers* nil)
HTTP Authentication:
specify one of :basic-auth, :digest-auth, :oauth. these should be specified
in the same manner as clj-http expects (see the clj-http docs for more info).
this authentication info will be added to all FHIR HTTP requests inside this
block
(defmacro with-headers
"wraps code that performs FHIR operations such that each FHIR HTTP request will have
any extra HTTP headers specified in the given headers map."
[headers & body]
`(binding [*extra-headers* ~headers]
HTTP Headers:
specify a map of headers under :headers. any headers specified in this way
will be added as-is to any FHIR HTTP requests inside this with block
Untrusted / Self-signed SSL Certificates
if you need to send FHIR requests to a server that is not using a trusted
SSL cert, you can specify ':insecure? true' in the options
"
[options & body]
`(binding [*options* (select-keys ~options [:basic-auth :digest-auth :oauth-token :headers :insecure?])]
~@body))
(defn- ->fhir-resource-name [x]
@ -50,8 +54,9 @@
body (if params-as-body? query body)
follow-location? (if (nil? follow-location?) true follow-location?)
http-req-params (merge
(if (map? *server-auth*) *server-auth*)
(if (map? *extra-headers*) {:headers *extra-headers*}))]
(if (:insecure? *options*) {:insecure? true})
(select-keys *options* [:basic-auth :digest-auth :oauth-token])
(:headers *options*))]
(try
(let [response (case type
:get (http-get-json url http-req-params)