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