diff --git a/ring-core/src/ring/middleware/not_modified.clj b/ring-core/src/ring/middleware/not_modified.clj index be0e1fc8..47ad5d0f 100644 --- a/ring-core/src/ring/middleware/not_modified.clj +++ b/ring-core/src/ring/middleware/not_modified.clj @@ -2,14 +2,15 @@ "Middleware to return a 304 Not Modified response." (:use [ring.util.time :only (parse-date)] [ring.util.response :only (status)] - [ring.util.io :only (close!)])) + [ring.util.io :only (close!)] + [ring.util.headers :only (get-header)])) (defn- etag-match? [request response] (if-let [etag (get-in response [:headers "etag"])] (= etag (get-in request [:headers "if-none-match"])))) (defn- ^java.util.Date date-header [response header] - (if-let [http-date (get-in response [:headers header])] + (if-let [http-date (get-header response header)] (parse-date http-date))) (defn- not-modified-since? [request response] diff --git a/ring-core/src/ring/util/headers.clj b/ring-core/src/ring/util/headers.clj new file mode 100644 index 00000000..098ada63 --- /dev/null +++ b/ring-core/src/ring/util/headers.clj @@ -0,0 +1,12 @@ +(ns ring.util.headers) + +(defn get-header + "Get request or response header by name. + Lookup is case-insensitive" + [message header-name] + (let [normalized-name (.toLowerCase header-name)] + (-> (filter + #(= (-> % first .toLowerCase) normalized-name) + (:headers message)) + first + second))) \ No newline at end of file diff --git a/ring-core/test/ring/util/test/headers.clj b/ring-core/test/ring/util/test/headers.clj new file mode 100644 index 00000000..c3463aa0 --- /dev/null +++ b/ring-core/test/ring/util/test/headers.clj @@ -0,0 +1,7 @@ +(ns ring.util.test.headers + (:use ring.util.headers + clojure.test)) + +(deftest test-get-header + (is (= "a" (get-header {:headers {"Some-Header" "a"}} "some-header"))) + (is (nil? (get-header {:headers {"Same-Hero" "a"}} "some-header")))) \ No newline at end of file