From a8f5604718c812668cdd23c2409bcfe4df5d24dc Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 11 Mar 2022 14:54:23 +0100 Subject: [PATCH] :paperclip: Improve http server configuration --- backend/src/app/config.clj | 10 +++++-- backend/src/app/http.clj | 53 +++++++++++++++++++++----------------- 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/backend/src/app/config.clj b/backend/src/app/config.clj index 5d5f7a92b..6dfbfc7ae 100644 --- a/backend/src/app/config.clj +++ b/backend/src/app/config.clj @@ -143,7 +143,10 @@ (s/def ::host ::us/string) (s/def ::http-server-port ::us/integer) (s/def ::http-server-host ::us/string) +(s/def ::http-server-max-body-size ::us/integer) +(s/def ::http-server-max-multipart-body-size ::us/integer) (s/def ::http-server-io-threads ::us/integer) +(s/def ::http-server-worker-threads ::us/integer) (s/def ::http-session-idle-max-age ::dt/duration) (s/def ::http-session-updater-batch-max-age ::dt/duration) (s/def ::http-session-updater-batch-max-size ::us/integer) @@ -246,7 +249,10 @@ ::host ::http-server-host ::http-server-port + ::http-server-max-body-size + ::http-server-max-multipart-body-size ::http-server-io-threads + ::http-server-worker-threads ::http-session-idle-max-age ::http-session-updater-batch-max-age ::http-session-updater-batch-max-size @@ -341,8 +347,8 @@ (when (ex/ex-info? e) (println ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;") (println "Error on validating configuration:") - (println (:explain (ex-data e)) - (println ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"))) + (println (us/pretty-explain (ex-data e))) + (println ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;")) (throw e)))) (def version diff --git a/backend/src/app/http.clj b/backend/src/app/http.clj index 2b59de492..15b9c2dcf 100644 --- a/backend/src/app/http.clj +++ b/backend/src/app/http.clj @@ -32,41 +32,46 @@ (s/def ::handler fn?) (s/def ::router some?) -(s/def ::port ::us/integer) -(s/def ::host ::us/string) -(s/def ::name ::us/string) -(s/def ::io-threads ::cf/http-server-io-threads) +(s/def ::port integer?) +(s/def ::host string?) +(s/def ::name string?) + +(s/def ::max-body-size integer?) +(s/def ::max-multipart-body-size integer?) +(s/def ::io-threads integer?) (s/def ::worker-threads integer?) (defmethod ig/prep-key ::server [_ cfg] (merge {:name "http" :port 6060 - :host "0.0.0.0"} + :host "0.0.0.0" + :max-body-size (* 1024 1024 24) ; 24 MiB + :max-multipart-body-size (* 1024 1024 120)} ; 120 MiB (d/without-nils cfg))) (defmethod ig/pre-init-spec ::server [_] - (s/keys :req-un [::port ::host ::name] - :opt-un [::router ::handler ::io-threads ::worker-threads ::wrk/executor])) + (s/and + (s/keys :req-un [::port ::host ::name ::max-body-size ::max-multipart-body-size] + :opt-un [::router ::handler ::io-threads ::worker-threads ::wrk/executor]) + (fn [cfg] + (or (contains? cfg :router) + (contains? cfg :handler))))) (defmethod ig/init-key ::server - [_ {:keys [handler router port name host executor io-threads worker-threads] :as cfg}] - (l/info :hint "starting http server" - :port port :host host :name name) - - (let [options (d/without-nils - {:http/port port - :http/host host - :ring/async true - :xnio/io-threads io-threads - :xnio/worker-threads worker-threads - :xnio/dispatch executor}) - handler (cond - (fn? handler) handler - (some? router) (wrap-router cfg router) - :else (ex/raise :type :internal - :code :invalid-argument - :hint "Missing `handler` or `router` option.")) + [_ {:keys [handler router port name host] :as cfg}] + (l/info :hint "starting http server" :port port :host host :name name) + (let [options {:http/port port + :http/host host + :http/max-body-size (:max-body-size cfg) + :http/max-multipart-body-size (:max-multipart-body-size cfg) + :xnio/io-threads (:io-threads cfg) + :xnio/worker-threads (:worker-threads cfg) + :xnio/dispatch (:executor cfg) + :ring/async true} + handler (if (some? router) + (wrap-router cfg router) + handler) server (yt/server handler (d/without-nils options))] (assoc cfg :server (yt/start! server))))