mirror of
https://github.com/journeyman-cc/smeagol.git
synced 2026-04-12 18:05:06 +00:00
OK, this is close to good. We're serving the right stuff.
This commit is contained in:
parent
80bc1e071b
commit
1a0d338c34
3 changed files with 80 additions and 48 deletions
|
|
@ -5,9 +5,10 @@
|
|||
(:require [clojure.string :as cs]
|
||||
[me.raynes.fs :as fs]
|
||||
[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.util :refer [local-url-base content-dir]]
|
||||
[smeagol.util :refer [local-url-base content-dir upload-dir]]
|
||||
[taoensso.timbre :as log]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
|
@ -85,25 +86,41 @@
|
|||
paths))))
|
||||
|
||||
|
||||
(defn find-image-url
|
||||
"Return a 302 redirect to
|
||||
1. The requested file, if available;
|
||||
2. This default URL otherwise."
|
||||
[request requested-name default-url paths]
|
||||
(let [url (to-url
|
||||
(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 with-mime-type-for-file
|
||||
[response file]
|
||||
(assoc-in
|
||||
response
|
||||
[:headers "Content-Type"]
|
||||
(ext-mime-type (str file))))
|
||||
|
||||
|
||||
(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,
|
||||
;; :access-rules [{:redirect "/auth",
|
||||
;; :rule #object[smeagol.handler$user_access 0x7ee9346 "smeagol.handler$user_access@7ee9346"]}],
|
||||
|
|
|
|||
|
|
@ -48,12 +48,29 @@
|
|||
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
|
||||
[#(wrap-internal-error % :log (fn [e] (log/error e)))
|
||||
#(wrap-resource % "public")
|
||||
smeagol-wrap-content-type
|
||||
#(wrap-file % util/content-dir
|
||||
{:index-files? false :prefer-handler? true})
|
||||
wrap-content-type
|
||||
wrap-not-modified])
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
[smeagol.authenticate :as auth]
|
||||
[smeagol.configuration :refer [config]]
|
||||
[smeagol.diff2html :as d2h]
|
||||
[smeagol.finder :refer [find-image-url]]
|
||||
[smeagol.finder :refer [find-image]]
|
||||
[smeagol.formatting :refer [md->html]]
|
||||
[smeagol.history :as hist]
|
||||
[smeagol.layout :as layout]
|
||||
|
|
@ -467,35 +467,33 @@
|
|||
(GET "/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 "/image/:n" request (find-image-url
|
||||
request
|
||||
(-> request :route-params :n)
|
||||
"http://localhost:3000/img/smeagol.png"
|
||||
[(fs/file local-url-base "img")
|
||||
upload-dir
|
||||
;; TODO: should map over the configured
|
||||
;; thumbnail paths in descending order
|
||||
;; by size - generally, bigger images are
|
||||
;; better.
|
||||
(fs/file upload-dir "med")
|
||||
(fs/file upload-dir "small")
|
||||
(fs/file upload-dir "map-pin")]))
|
||||
(GET "/image/:n" [n] (find-image
|
||||
n
|
||||
"resources/public/img/smeagol.png"
|
||||
[(fs/file local-url-base "img")
|
||||
upload-dir
|
||||
;; TODO: should map over the configured
|
||||
;; thumbnail paths in descending order
|
||||
;; by size - generally, bigger images are
|
||||
;; better.
|
||||
(fs/file upload-dir "med")
|
||||
(fs/file upload-dir "small")
|
||||
(fs/file upload-dir "map-pin")]))
|
||||
(GET "/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
|
||||
request
|
||||
(-> request :route-params :n)
|
||||
"http://localhost:3000/img/Unknown-pin.png"
|
||||
[(fs/file local-url-base "img")
|
||||
;; 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")
|
||||
upload-dir
|
||||
local-url-base]))
|
||||
(GET "/map-pin/:n" [n] (find-image
|
||||
n
|
||||
"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")
|
||||
(fs/file local-url-base "img")
|
||||
upload-dir
|
||||
local-url-base]))
|
||||
(GET "/passwd" request (passwd-page request))
|
||||
(POST "/passwd" request (passwd-page request))
|
||||
(GET "/upload" request (route/restricted (upload-page request)))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue