ryoakg
2/7/2016 - 2:49 PM

URL / URI

URL / URI

(set-env! :dependencies '[[ring/ring-codec "1.0.0"]])

(require '[ring.util.codec]
         '[clojure.walk :refer [keywordize-keys]])


(keys (ns-publics 'ring.util.codec))
(comment
  (percent-encode
   url-decode
   fix-string-replace-bug
   form-encode
   form-decode-str
   form-decode
   assoc-conj
   url-encode
   FormEncodeable
   form-encode*
   base64-decode
   percent-decode
   base64-encode))


(ring.util.codec/form-decode "a=1&b=2")
;; => {"a" "1", "b" "2"}
(-> "a=1&b=2" ring.util.codec/form-decode keywordize-keys)
;; => {:a "1", :b "2"}

(ring.util.codec/form-encode {:a "1", :b "2"})
;; => "a=1&b=2"
(ring.util.codec/form-encode {"a" "1", "b" "2"})
;; => "a=1&b=2"



(ring.util.codec/url-encode "-:-,- -あ-")
;; => "-%3A-%2C-%20-%E3%81%82-"
(ring.util.codec/percent-encode "-:-,- -あ-")
;; => "%2D%3A%2D%2C%2D%20%2D%E3%81%82%2D"

(ring.util.codec/url-decode "-%3A-%2C-%20-%E3%81%82-")
;; => "-:-,- -あ-"
(require '[clojure.java.io :as io])
(import (java.net URL))

(defn relative-url
  [base-url hint]
  (URL. (io/as-url base-url) hint))

(str (relative-url "http://docs.oracle.com/javase/8/docs/api/java/net/" ".."))
;; => "http://docs.oracle.com/javase/8/docs/api/java/"

(str (relative-url "http://docs.oracle.com/javase/8/docs/api/java/net/" "URL.html"))
;; => "http://docs.oracle.com/javase/8/docs/api/java/net/URL.html"

(str (relative-url "http://docs.oracle.com/javase/8/docs/api/java/net/URL.html" "#URL-java.net.URL-java.lang.String-"))
;; => "http://docs.oracle.com/javase/8/docs/api/java/net/URL.html#URL-java.net.URL-java.lang.String-"

(str (relative-url "http://docs.oracle.com/javase/8/docs/api/java/net/URL.html#URL-java.net.URL-java.lang.String-" ".."))
;; => "http://docs.oracle.com/javase/8/docs/api/java/"

(str (relative-url "http://docs.oracle.com/javase/8/docs/api/java/net/URL.html" "?a=b"))
;; => "http://docs.oracle.com/javase/8/docs/api/java/net/?a=b"
(require '[clojure.string :as str])
(import '[java.net URL URLDecoder]))

(defn path [uri]
  (-> uri URL. .getPath))

(defn host [uri]
  (-> uri URL. .getHost))

(defn query [uri]
  (-> uri URL. .getQuery))

(defn query->map [query]
  (->> (str/split query #"&") 
       (map #(-> (str/split % #"=")
                 ((fn [[k v]] [(keyword (URLDecoder/decode k))
                               (URLDecoder/decode (or v ""))]))))
       (into {})))
;; (uri-query->map "q=foo+bar&x=14&y=hello")

(defn query-map [uri]
  (-> uri query query->map))
(set-env! :dependencies '[[com.cemerick/url "0.1.1"]])

(require '[cemerick.url])

(keys (ns-publics 'cemerick.url))
;; => (url-decode map->query split-param ->URL url-encode query->map map->URL url)


(cemerick.url/url "http://example.com")
(comment
  {:protocol "http"
   :username nil
   :password nil
   :host "example.com"
   :port -1
   :path ""
   :query nil
   :anchor nil})

(-> (cemerick.url/url "http://example.com")
    (assoc :path "/foo")
    str)
;; => "http://example.com/foo"

(str (cemerick.url/url "http://example.com" "/foo"))
;; => "http://example.com/foo"

(str (cemerick.url/url "http://example.com" "/foo"))


(cemerick.url/url-encode "あいうえお")
;; => "%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A"
(cemerick.url/url-decode "%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A")
;; => "あいうえお"



(cemerick.url/query->map "a=1&b=2")
;; => {"a" "1", "b" "2"}

(cemerick.url/map->query {"a" "1", "b" "2"})
;; => "a=1&b=2"



(cemerick.url/split-param "a=1")
;; => ("a" "1")



(-> (cemerick.url/url "https://example.com/foo?abc=123")
    (dissoc :query)
    cemerick.url/map->URL
    str)
;; => "https://example.com/foo"