ClojureのCompojure(のmiddleware)でリダイレクトするときは:urlだけでなく:path-infoも変えないといけない件


誰得なのかわからないニッチネタを投下します

Clojure製のフレームワーク、CompojureでリクエストされたURLを元にリクエストマップを変更して再びリダイレクトをかけるには:urlだけでなく:path-infoも変えないと動きません。

これに気付いたのは、Clojureのトレイリングスラッシュリダイレクトのためのコードを探していた時でした。

ここに、スラッシュなしの場合にスラッシュありへリダイレクトするコードがありますが、動いていません(というような質問だった)。 :url部分以外でも間違っていた箇所はありましたが、それらはケアレスミスかと思われます。

で、他にもこの手のコードを検索することができますが、:urlを変更しているのみなので、少なくともいまのcompojureでは動きません。

ということで、下記のように変更することで動くことが確認できました。

※これはmiddlewareとして、handlerに対して使ってください。

;;; http://stackoverflow.com/questions/14507445/ring-solution-to-redirect-missing-trailing-slash-urls
;
(defn good-response? [resp]
  (and resp (not= (:status resp) 404)))
;
(defn wrap-slash [handler]
  (fn [{:keys [uri] :as req}]
    (let [resp (handler req)]
      (if (or (good-response? resp) (.endsWith uri "/"))
        resp
        (let [added-slash (str uri "/")]<br />
          (if (good-response? (handler (-> req
                                           (assoc :uri added-slash)
                                           (assoc :path-info added-slash))))
            (redirect added-slash)
            resp))))))

gistにも貼っています。

トレイリングスラッシュ関連でお困りの方どうぞ(いるのか)

compojureのコードなどを読んだり、各種middlewareの挙動を確かめたりしたので、そこそこに勉強になりました。

Comments are closed.