From 8be0b8c32272f13511bb5debeb2c53547ed30cfe Mon Sep 17 00:00:00 2001 From: matheusfrancisco Date: Sun, 4 Feb 2024 14:09:06 -0300 Subject: [PATCH] add: multihost pedestal e.g --- examples/pedestal-multi-host/.gitignore | 13 ++++ examples/pedestal-multi-host/project.clj | 8 +++ .../src/example/server.clj | 71 +++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 examples/pedestal-multi-host/.gitignore create mode 100644 examples/pedestal-multi-host/project.clj create mode 100644 examples/pedestal-multi-host/src/example/server.clj diff --git a/examples/pedestal-multi-host/.gitignore b/examples/pedestal-multi-host/.gitignore new file mode 100644 index 00000000..18ec56ec --- /dev/null +++ b/examples/pedestal-multi-host/.gitignore @@ -0,0 +1,13 @@ +/target +/classes +/checkouts +pom.xml +pom.xml.asc +*.jar +*.class +/.lein-* +/.nrepl-port +.hgignore +.hg/ +.lsp/ +.clj-kondo/ diff --git a/examples/pedestal-multi-host/project.clj b/examples/pedestal-multi-host/project.clj new file mode 100644 index 00000000..c1d79553 --- /dev/null +++ b/examples/pedestal-multi-host/project.clj @@ -0,0 +1,8 @@ +(defproject pedestal-multi-host "0.1.0-SNAPSHOT" + :description "Reitit-http with pedestal multi host example" + :dependencies [[org.clojure/clojure "1.10.0"] + [io.pedestal/pedestal.service "0.5.5"] + [io.pedestal/pedestal.jetty "0.5.5"] + [metosin/reitit-pedestal "0.7.0-alpha7"] + [metosin/reitit "0.7.0-alpha7"]] + :repl-options {:init-ns example.server}) diff --git a/examples/pedestal-multi-host/src/example/server.clj b/examples/pedestal-multi-host/src/example/server.clj new file mode 100644 index 00000000..9cb376e6 --- /dev/null +++ b/examples/pedestal-multi-host/src/example/server.clj @@ -0,0 +1,71 @@ +(ns example.server + (:require [io.pedestal.http :as server] + [clojure.core.async :as a] + [reitit.pedestal :as pedestal] + [muuntaja.interceptor] + [reitit.http :as http] + [reitit.ring :as ring])) + +(defn interceptor [x] + {:enter (fn [ctx] (update-in ctx [:request :via] (fnil conj []) {:enter x})) + :leave (fn [ctx] (update-in ctx [:response :body] conj {:leave x}))}) + +(defn handler [{:keys [via]}] + {:status 200, + :body (conj via :handler)}) + +(def async-handler + {:enter (fn [{:keys [request] :as ctx}] + (a/go (assoc ctx :response (handler request))))}) + +(def router + (pedestal/routing-interceptor + (http/router + ["" + ["/api/v2" + {:host "example.com"} + ["/sync" + {:get {:handler (fn [req] + {:status 200 + :body {:v2 "example.com"}})}}]] + ["/api" + {:host "localhost" + :interceptors [(interceptor :api)]} + + ["/sync" + {:interceptors [(interceptor :sync)] + :get {:interceptors [(interceptor :get)] + :handler handler}}] + + ["/async" + {:interceptors [(interceptor :async)] + :get {:interceptors [(interceptor :get) async-handler]}}]]] + + ;; optional interceptors for all matched routes + {:data {:interceptors [(interceptor :router)]}}) + + ;; optional default ring handlers (if no routes have matched) + (ring/routes + (ring/create-resource-handler) + (ring/create-default-handler)) + + ;; optional top-level routes for both routes & default route + {:interceptors [(muuntaja.interceptor/format-interceptor) + (interceptor :top)]})) + +(defn start [] + (-> {::server/type :jetty + ::server/port 3000 + ::server/join? false + ;; no pedestal routes + ::server/routes []} + (server/default-interceptors) + ;; use the reitit router + (pedestal/replace-last-interceptor router) + (server/dev-interceptors) + (server/create-server) + (server/start)) + (println "server running in port 3000")) + +(comment + (start))