OK, this is close to good. We're serving the right stuff.

This commit is contained in:
Simon Brooke 2020-02-26 18:06:45 +00:00
parent 80bc1e071b
commit 1a0d338c34
No known key found for this signature in database
GPG key ID: A7A4F18D1D4DF987
3 changed files with 80 additions and 48 deletions

View file

@ -5,9 +5,10 @@
(:require [clojure.string :as cs] (:require [clojure.string :as cs]
[me.raynes.fs :as fs] [me.raynes.fs :as fs]
[noir.io :as io] [noir.io :as io]
[noir.response :as response] [ring.util.mime-type :refer [ext-mime-type]]
[ring.util.response :as response]
[smeagol.configuration :refer [config]] [smeagol.configuration :refer [config]]
[smeagol.util :refer [local-url-base content-dir]] [smeagol.util :refer [local-url-base content-dir upload-dir]]
[taoensso.timbre :as log])) [taoensso.timbre :as log]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -85,25 +86,41 @@
paths)))) paths))))
(defn find-image-url (defn with-mime-type-for-file
"Return a 302 redirect to [response file]
1. The requested file, if available; (assoc-in
2. This default URL otherwise." response
[request requested-name default-url paths] [:headers "Content-Type"]
(let [url (to-url (ext-mime-type (str file))))
(find-file-on-paths requested-name paths
[".gif" ".png" ".jpg" ".jpeg" ".svg"]))]
(if url
(log/info "Found image" requested-name "at" url)
(log/warn "Failed to find image matching" requested-name))
(response/redirect
;; (str "/" (:servlet-context request) url) ;; TODO: >>> Nasty
(if url
(str (name (:scheme request)) "://" (:host request) ":" (:server-port request) "/" url)
default-url)
:found )))
(defn find-image
"Return the first image file found on these `paths` with this
`requested-name`, if available; this `default-file` otherwise."
[requested-name default-file paths]
(let [file (find-file-on-paths requested-name paths
[".gif" ".png" ".jpg" ".jpeg" ".svg"])
s (if file (str file) default-file)]
(if file
(log/info "Found image" requested-name "at" s)
(log/warn "Failed to find image matching" requested-name))
(with-mime-type-for-file
(response/file-response s)
s)))
(find-image "froboz.jpg" "resources/public/img/Unknown-pin.png"
[;; TODO: should map over the configured
;; thumbnail paths in ascending order
;; by size - for map pins, smaller images are
;; better.
(fs/file upload-dir "map-pin")
(fs/file upload-dir "small")
(fs/file upload-dir "med")])
;; (response/file-response "resources/public/img/smeagol.png")
;; (def r {:ssl-client-cert nil, ;; (def r {:ssl-client-cert nil,
;; :access-rules [{:redirect "/auth", ;; :access-rules [{:redirect "/auth",
;; :rule #object[smeagol.handler$user_access 0x7ee9346 "smeagol.handler$user_access@7ee9346"]}], ;; :rule #object[smeagol.handler$user_access 0x7ee9346 "smeagol.handler$user_access@7ee9346"]}],

View file

@ -48,12 +48,29 @@
wrap-exceptions]) wrap-exceptions])
(defn smeagol-wrap-content-type
"Ring's `wrap-content-type` infers the content type from the *requested* file
name. But because we fuzzy-match images, the file we return may not be the
same type as the file that was requested, in which case we've already set
a content type from the filename extension on the file actually served. Do not
overwrite this!"
[response]
(if-not
(and (map? (:headers response))((:headers response) "Content-Type"))
(wrap-content-type response)
(do
(log/info "Content-type already set as"
((:headers response) "Content-Type")
"; not overriding")
response)))
(def production-middleware (def production-middleware
[#(wrap-internal-error % :log (fn [e] (log/error e))) [#(wrap-internal-error % :log (fn [e] (log/error e)))
#(wrap-resource % "public") #(wrap-resource % "public")
smeagol-wrap-content-type
#(wrap-file % util/content-dir #(wrap-file % util/content-dir
{:index-files? false :prefer-handler? true}) {:index-files? false :prefer-handler? true})
wrap-content-type
wrap-not-modified]) wrap-not-modified])

View file

@ -18,7 +18,7 @@
[smeagol.authenticate :as auth] [smeagol.authenticate :as auth]
[smeagol.configuration :refer [config]] [smeagol.configuration :refer [config]]
[smeagol.diff2html :as d2h] [smeagol.diff2html :as d2h]
[smeagol.finder :refer [find-image-url]] [smeagol.finder :refer [find-image]]
[smeagol.formatting :refer [md->html]] [smeagol.formatting :refer [md->html]]
[smeagol.history :as hist] [smeagol.history :as hist]
[smeagol.layout :as layout] [smeagol.layout :as layout]
@ -467,35 +467,33 @@
(GET "/edit-user" request (route/restricted (admin/edit-user request))) (GET "/edit-user" request (route/restricted (admin/edit-user request)))
(POST "/edit-user" request (route/restricted (admin/edit-user request))) (POST "/edit-user" request (route/restricted (admin/edit-user request)))
(GET "/history" request (history-page request)) (GET "/history" request (history-page request))
(GET "/image/:n" request (find-image-url (GET "/image/:n" [n] (find-image
request n
(-> request :route-params :n) "resources/public/img/smeagol.png"
"http://localhost:3000/img/smeagol.png" [(fs/file local-url-base "img")
[(fs/file local-url-base "img") upload-dir
upload-dir ;; TODO: should map over the configured
;; TODO: should map over the configured ;; thumbnail paths in descending order
;; thumbnail paths in descending order ;; by size - generally, bigger images are
;; by size - generally, bigger images are ;; better.
;; better. (fs/file upload-dir "med")
(fs/file upload-dir "med") (fs/file upload-dir "small")
(fs/file upload-dir "small") (fs/file upload-dir "map-pin")]))
(fs/file upload-dir "map-pin")]))
(GET "/list-uploads" request (route/restricted (list-uploads-page request))) (GET "/list-uploads" request (route/restricted (list-uploads-page request)))
(POST "/list-uploads" request (route/restricted (list-uploads-page request))) (POST "/list-uploads" request (route/restricted (list-uploads-page request)))
(GET "/map-pin/:n" request (find-image-url (GET "/map-pin/:n" [n] (find-image
request n
(-> request :route-params :n) "resources/public/img/Unknown-pin.png"
"http://localhost:3000/img/Unknown-pin.png" [;; TODO: should map over the configured
[(fs/file local-url-base "img") ;; thumbnail paths in ascending order
;; TODO: should map over the configured ;; by size - for map pins, smaller images are
;; thumbnail paths in ascending order ;; better.
;; by size - for map pins, smaller images are (fs/file upload-dir "map-pin")
;; better. (fs/file upload-dir "small")
(fs/file upload-dir "map-pin") (fs/file upload-dir "med")
(fs/file upload-dir "small") (fs/file local-url-base "img")
(fs/file upload-dir "med") upload-dir
upload-dir local-url-base]))
local-url-base]))
(GET "/passwd" request (passwd-page request)) (GET "/passwd" request (passwd-page request))
(POST "/passwd" request (passwd-page request)) (POST "/passwd" request (passwd-page request))
(GET "/upload" request (route/restricted (upload-page request))) (GET "/upload" request (route/restricted (upload-page request)))