diff --git a/src/cemerick/url.cljx b/src/cemerick/url.cljx index 75ff53d..3a4915a 100644 --- a/src/cemerick/url.cljx +++ b/src/cemerick/url.cljx @@ -5,14 +5,17 @@ [clojure.string :as string] #+cljs [goog.Uri :as uri])) +(defmulti url-encode + (fn ([_ encoding] encoding))) + #+clj -(defn url-encode - [string] +(defmethod url-encode :default + [string _] (some-> string str (URLEncoder/encode "UTF-8") (.replace "+" "%20"))) #+cljs -(defn url-encode - [string] +(defmethod url-encode :default + [string _] (some-> string str (js/encodeURIComponent) (.replace "+" "%20"))) #+clj @@ -27,16 +30,18 @@ (some-> string str (js/decodeURIComponent))) (defn map->query - [m] - (some->> (seq m) - sort ; sorting makes testing a lot easier :-) - (map (fn [[k v]] - [(url-encode (name k)) - "=" - (url-encode (str v))])) - (interpose "&") - flatten - (apply str))) + ([m] + (map->query m nil)) + ([m encoding] + (some->> (seq m) + sort; sorting makes testing a lot easier :-) + (map (fn [[k v]] + [(url-encode (name k) encoding) + "=" + (url-encode (str v) encoding)])) + (interpose "&") + flatten + (apply str)))) (defn split-param [param] (-> diff --git a/test/cemerick/test_url.cljx b/test/cemerick/test_url.cljx index fe2e6d1..07a5c00 100644 --- a/test/cemerick/test_url.cljx +++ b/test/cemerick/test_url.cljx @@ -15,6 +15,14 @@ "a=1&b=2" {"a" "1" "b" "2"} "a=" {"a" ""})) +(defmethod url-encode :append-foobar + [string _] + (str string "foobar")) + +(deftest test-map-to-query-str-extention + (is (= "afoobar=custom-encodingfoobar" + (map->query {:a "custom-encoding"} :append-foobar)))) + (deftest url-roundtripping (let [aurl (url "https://username:password@some.host.com/database?query=string")] (is (= "https://username:password@some.host.com/database?query=string" (str aurl)))