-
Notifications
You must be signed in to change notification settings - Fork 0
/
headers.clj
48 lines (43 loc) · 1.43 KB
/
headers.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
(ns iny.http1.headers
(:require [iny.meta :refer [version]]
[iny.http.date :refer [date-header-value]])
(:import [java.util
Map$Entry]
[clojure.lang
PersistentArrayMap]
[io.netty.handler.codec.http
HttpHeaderNames
DefaultHttpHeaders]))
(defprotocol Headers
(^io.netty.handler.codec.http.DefaultHttpHeaders ->headers [_]))
(let [base-headers (doto (DefaultHttpHeaders. false)
(.add HttpHeaderNames/SERVER (str "iny/" version))
(.add HttpHeaderNames/CONTENT_TYPE "text/plain"))]
(defn ^DefaultHttpHeaders headers-with-date
[]
(doto (.copy ^DefaultHttpHeaders base-headers)
(.add HttpHeaderNames/DATE (date-header-value))))
(extend-protocol Headers
nil
(->headers [_]
(headers-with-date))
PersistentArrayMap
(->headers [^Iterable header-map]
(let [headers ^DefaultHttpHeaders (headers-with-date)
i (.iterator header-map)]
(loop []
(if (.hasNext i)
(let [elem ^Map$Entry (.next i)]
(.set headers
(-> elem .getKey .toString .toLowerCase)
(.getValue elem))
(recur))))
headers))))
(defn headers->map
[headers]
(persistent!
(reduce-kv
(fn [aggr ^String k v]
(assoc! aggr (-> k (.toLowerCase)) v))
(transient {})
(into {} headers))))