Skip to content

Commit 79e784b

Browse files
committed
Add wrap-hiccup middleware
1 parent a3f44a4 commit 79e784b

File tree

5 files changed

+52
-0
lines changed

5 files changed

+52
-0
lines changed

project.clj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
[org.duct-framework/server.http.jetty "0.3.0"]
99
[org.duct-framework/router.reitit "0.2.0"]
1010
[integrant "0.13.1"]
11+
[hiccup "2.0.0-RC4"]
1112
[org.slf4j/slf4j-nop "2.0.16"]
1213
[org.webjars/normalize.css "5.0.0"]
1314
[ring/ring-core "1.13.0"]

src/duct/middleware/web.clj

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
(:require [clojure.java.io :as io]
33
[duct.logger :as logger]
44
[integrant.core :as ig]
5+
[hiccup2.core :as hic]
56
[ring.middleware.defaults :refer [wrap-defaults]]
67
[ring.middleware.stacktrace :refer [wrap-stacktrace]]
78
[ring.middleware.webjars :refer [wrap-webjars]]
@@ -67,6 +68,30 @@
6768
(catch Throwable _
6869
(respond (internal-error (error-handler request))))))))
6970

71+
(defn- hiccup-response [response hiccup-renderer]
72+
(let [response (if (vector? response)
73+
{:status 200, :headers {}, :body response}
74+
response)]
75+
(if (vector? (:body response))
76+
(-> response
77+
(update :body #(str "<!DOCTYPE html>\n" (hiccup-renderer %)))
78+
(assoc-in [:headers "Content-Type"] "text/html;charset=UTF-8")
79+
(update :status #(or % 200)))
80+
response)))
81+
82+
(defn wrap-hiccup
83+
"Middleware that renders vectors as HTML. The vector can either be the only
84+
response from the handler, or on the body key of the response map. Requires
85+
a function that converts Hiccup vectors into HTML."
86+
([handler]
87+
(wrap-hiccup handler #(hic/html {:mode :html} %)))
88+
([handler hiccup-renderer]
89+
(fn
90+
([request]
91+
(some-> (handler request) (hiccup-response hiccup-renderer)))
92+
([request respond raise]
93+
(handler request (comp respond hiccup-response) raise)))))
94+
7095
(defmethod ig/init-key ::log-requests
7196
[_ {:keys [logger options]}]
7297
#(wrap-log-requests % logger (dissoc options :logger)))
@@ -90,3 +115,6 @@
90115

91116
(defmethod ig/init-key ::stacktrace [_ options]
92117
#(wrap-stacktrace % options))
118+
119+
(defmethod ig/init-key ::hiccup [_ {:keys [hiccup-renderer]}]
120+
(if hiccup-renderer #(wrap-hiccup % hiccup-renderer) wrap-hiccup))

src/duct/module/web.clj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@
6161
:duct.router/reitit
6262
{:routes ~routes
6363
~@(when api? [:muuntaja {}]) ~@[]
64+
~@(when site?
65+
[:data {:middleware [(ig/ref :duct.middleware.web/hiccup)]}]) ~@[]
6466
:middleware
6567
[~@(when site? [(ig/ref :duct.middleware.web/webjars)])
6668
~(ig/ref :duct.middleware.web/defaults)
@@ -102,6 +104,7 @@
102104

103105
~@(when api? [:duct.middleware.web/format {}]) ~@[]
104106
~@(when site? [:duct.middleware.web/webjars {}]) ~@[]
107+
~@(when site? [:duct.middleware.web/hiccup {}]) ~@[]
105108

106109
~@(->> (route-data-seq routes)
107110
(mapcat find-handlers-in-route-data)

test/duct/middleware/web_test.clj

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,21 @@
9191
{:static {:files [(str tempdir)]}})
9292
(is (.exists (.toFile tempdir)))
9393
(Files/deleteIfExists tempdir)))
94+
95+
(deftest test-wrap-hiccup
96+
(is (= {:status 200
97+
:headers {"Content-Type" "text/html;charset=UTF-8"}
98+
:body "<!DOCTYPE html>\n<title>foo</title>"}
99+
((wrap-hiccup (constantly [:title "foo"])) {})))
100+
(is (= {:status 200
101+
:headers {"Content-Type" "text/html;charset=UTF-8"}
102+
:body "<!DOCTYPE html>\n<title>foo</title>"}
103+
((wrap-hiccup (constantly {:body [:title "foo"]})) {})))
104+
(is (= {:status 201
105+
:headers {"Content-Type" "text/html;charset=UTF-8"}
106+
:body "<!DOCTYPE html>\n<title>foo</title>"}
107+
((wrap-hiccup (constantly {:status 201, :body [:title "foo"]})) {})))
108+
(let [response {:status 200
109+
:headers {"Content-Type" "text/plain;charset=UTF-8"}
110+
:body "Foobar"}]
111+
(is (= response ((wrap-hiccup (constantly response)) {})))))

test/duct/module/web_test.clj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@
101101
(deftest site-module-test
102102
(is (= {:duct.router/reitit
103103
{:routes []
104+
:data {:middleware [(ig/ref :duct.middleware.web/hiccup)]}
104105
:middleware
105106
[(ig/ref :duct.middleware.web/webjars)
106107
(ig/ref :duct.middleware.web/defaults)
@@ -136,6 +137,7 @@
136137
:handler (ig/ref :duct/router)
137138
:logger (ig/refset :duct/logger)}
138139
:duct.middleware.web/webjars {}
140+
:duct.middleware.web/hiccup {}
139141
:duct.middleware.web/stacktrace {}
140142
:duct.handler.static/bad-request
141143
{:headers {"Content-Type" "text/html; charset=UTF-8"}

0 commit comments

Comments
 (0)