78 lines
2.1 KiB
Clojure
78 lines
2.1 KiB
Clojure
(ns cljs-http.util
|
|
(:refer-clojure :exclude [uri?])
|
|
(:import goog.Uri)
|
|
(:require [clojure.string :refer [blank? capitalize join split lower-case]]
|
|
[cognitect.transit :as t]
|
|
[goog.userAgent :as agent]
|
|
[no.en.core :refer [base64-encode]]))
|
|
|
|
(defn basic-auth
|
|
"Returns the value of the HTTP basic authentication header for
|
|
`credentials`."
|
|
[credentials]
|
|
(if credentials
|
|
(let [[username password]
|
|
(if (map? credentials)
|
|
(map credentials [:username :password])
|
|
credentials)]
|
|
(str "Basic " (base64-encode (str username ":" password))))))
|
|
|
|
(defn build-url
|
|
"Build the url from the request map."
|
|
[{:keys [scheme server-name server-port uri query-string]}]
|
|
(str (doto (Uri.)
|
|
(.setScheme (name (or scheme :http)))
|
|
(.setDomain server-name)
|
|
(.setPort server-port)
|
|
(.setPath uri)
|
|
(.setQuery query-string true))))
|
|
|
|
(defn camelize
|
|
"Returns dash separated string `s` in camel case."
|
|
[s]
|
|
(->> (split (str s) #"-")
|
|
(map capitalize)
|
|
(join "-")))
|
|
|
|
(defn build-headers
|
|
"Build the headers from the map."
|
|
[m] (clj->js (zipmap (map camelize (keys m)) (vals m))))
|
|
|
|
(defn user-agent
|
|
"Returns the user agent."
|
|
[] (agent/getUserAgentString))
|
|
|
|
(defn android?
|
|
"Returns true if the user agent is an Android client."
|
|
[] (re-matches #"(?i).*android.*" (user-agent)))
|
|
|
|
(defn transit-decode
|
|
"Transit decode an object from `s`."
|
|
[s type opts]
|
|
(let [rdr (t/reader type opts)]
|
|
(t/read rdr s)))
|
|
|
|
(defn transit-encode
|
|
"Transit encode `x` into a String."
|
|
[x type opts]
|
|
(let [wrtr (t/writer type opts)]
|
|
(t/write wrtr x)))
|
|
|
|
(defn json-decode
|
|
"JSON decode an object from `s`."
|
|
[s]
|
|
(let [v (if-not (clojure.string/blank? s) (js/JSON.parse s))]
|
|
(when (some? v)
|
|
(js->clj v :keywordize-keys true))))
|
|
|
|
(defn json-encode
|
|
"JSON encode `x` into a String."
|
|
[x] (js/JSON.stringify (clj->js x)))
|
|
|
|
(defn parse-headers [headers]
|
|
(reduce
|
|
#(let [[k v] (split %2 #":\s+")]
|
|
(if (or (blank? k) (blank? v))
|
|
%1 (assoc %1 (lower-case k) v)))
|
|
{} (split (or headers "") #"(\n)|(\r)|(\r\n)|(\n\r)")))
|