Clojure/Noir: Force HTTPS, перенаправление, если запрос был с http:// на https://

Я пытаюсь принудительно использовать SSL на своем сайте. Я хочу иметь промежуточное ПО в стиле кольца для перенаправления сайта на тот же URL-адрес с https, если это только http

Я написал следующий код, но на самом деле он ничего не делает, кроме проверки схемы запроса и печати URL-адреса, на который он должен перенаправляться.

(defn https-url [request-url]
  (str (str (str (str "https://" (:server-name request-url) ":") (:server-port request-url))) (:uri request-url)))

(defn require-https
  [handler]
  (fn [request]
    (let [page-request (handler request)]
      (if (= (:scheme page-request) :http)
        (println (https-url page-request))))))

(server/add-middleware require-https)

Как мне реализовать это в реальном приложении?

Я использую clojure 1.2 с Noir.

Боковое примечание: как объединить несколько строк в одну строку без использования нескольких вложенных строк?


person dMix    schedule 15.02.2012    source источник


Ответы (1)


Вы можете использовать ring.util.response/redirect:

(fn handler [request]
  (if need-to-redirect?
    ;; NB. target-url should be a string
    (ring.util.response/redirect target-url)
    ...))

Что касается примечания, str является вариативным:

(str "foo" 'bar "baz")
; => "foobarbaz"
person Michał Marczyk    schedule 15.02.2012
comment
Хм, это вызывает функцию перенаправления. Но почему-то не перенаправляет. Где я должен разместить это? В настоящее время у меня есть это в server.clj перед определением -main - person dMix; 16.02.2012
comment
Вам нужно сделать возвращаемое значение ring.util.response/redirect возвращаемым значением вашего обработчика, возможно, для изменения внешним промежуточным программным обеспечением (которое, конечно, должно оставить только статус HTTP и заголовок Location для прямого успеха). Пример: refheap.com/paste/758 - person Michał Marczyk; 16.02.2012
comment
С noir обработчик сервера находится на более высоком уровне абстракции, чем в вашем примере. Так что мне непонятно, куда его поместить, вот мой server.clj gist.github.com/1840261 Я, наверное, запутался с этим :) - person dMix; 16.02.2012
comment
Ваш обработчик всегда возвращает request; вот исправленная версия с перемещенной скобкой и обернутым handler, примененным к request в ветке без перенаправления, которая, я думаю, должна работать: refheap.com/paste/760 - person Michał Marczyk; 16.02.2012