diff --git a/ring-bench/project.clj b/ring-bench/project.clj index 4f5463c25..e8437451b 100644 --- a/ring-bench/project.clj +++ b/ring-bench/project.clj @@ -9,4 +9,5 @@ [ring/ring-jetty-adapter "1.15.2"] [ring/ring-servlet "1.15.2"]] :jvm-opts {} - :main ring.bench.servlet) + :main ring.bench.servlet + :global-vars {*warn-on-reflection* true}) diff --git a/ring-core-protocols/project.clj b/ring-core-protocols/project.clj index 4a6b89482..1ab49d987 100644 --- a/ring-core-protocols/project.clj +++ b/ring-core-protocols/project.clj @@ -6,4 +6,5 @@ :url "http://opensource.org/licenses/MIT"} :dependencies [] :profiles - {:dev {:dependencies [[org.clojure/clojure "1.9.0"]]}}) + {:dev {:dependencies [[org.clojure/clojure "1.9.0"]]}} + :global-vars {*warn-on-reflection* true}) diff --git a/ring-core/project.clj b/ring-core/project.clj index d5a67095d..0b68be293 100644 --- a/ring-core/project.clj +++ b/ring-core/project.clj @@ -17,4 +17,5 @@ {:dev {:dependencies [[clj-time "0.15.2"]]} :1.10 {:dependencies [[org.clojure/clojure "1.10.3"]]} :1.11 {:dependencies [[org.clojure/clojure "1.11.4"]]} - :1.12 {:dependencies [[org.clojure/clojure "1.12.1"]]}}) + :1.12 {:dependencies [[org.clojure/clojure "1.12.1"]]}} + :global-vars {*warn-on-reflection* true}) diff --git a/ring-core/test/ring/middleware/multipart_params/test/byte_array.clj b/ring-core/test/ring/middleware/multipart_params/test/byte_array.clj index 64cc59732..31525fc67 100644 --- a/ring-core/test/ring/middleware/multipart_params/test/byte_array.clj +++ b/ring-core/test/ring/middleware/multipart_params/test/byte_array.clj @@ -11,4 +11,4 @@ :stream (string-input-stream "foo")})] (is (= (:filename result) "foo.txt")) (is (= (:content-type result) "text/plain")) - (is (= (String. (:bytes result)) "foo")))) + (is (= (String. ^bytes (:bytes result)) "foo")))) diff --git a/ring-core/test/ring/middleware/multipart_params/test/request_context.clj b/ring-core/test/ring/middleware/multipart_params/test/request_context.clj index 489a8c486..42d614ef1 100644 --- a/ring-core/test/ring/middleware/multipart_params/test/request_context.clj +++ b/ring-core/test/ring/middleware/multipart_params/test/request_context.clj @@ -1,7 +1,8 @@ (ns ring.middleware.multipart-params.test.request-context (:require [clojure.test :refer :all] - [ring.middleware.multipart-params :as mp])) + [ring.middleware.multipart-params :as mp]) + (:import [org.apache.commons.fileupload2.core RequestContext])) (deftest test-default-content-length (is (= -1 - (.getContentLength (#'mp/request-context {} nil))))) + (.getContentLength ^RequestContext (#'mp/request-context {} nil))))) diff --git a/ring-core/test/ring/middleware/multipart_params/test/temp_file.clj b/ring-core/test/ring/middleware/multipart_params/test/temp_file.clj index 25797e8ab..73b08565b 100644 --- a/ring-core/test/ring/middleware/multipart_params/test/temp_file.clj +++ b/ring-core/test/ring/middleware/multipart_params/test/temp_file.clj @@ -1,7 +1,8 @@ (ns ring.middleware.multipart-params.test.temp-file (:require [clojure.test :refer :all] [ring.middleware.multipart-params.temp-file :refer :all] - [ring.util.io :refer [string-input-stream]])) + [ring.util.io :refer [string-input-stream]]) + (:import [java.io File])) (deftest test-temp-file-store (let [store (temp-file-store) @@ -12,11 +13,11 @@ (is (= (:filename result) "foo.txt")) (is (= (:content-type result) "text/plain")) (is (= (:size result) 3)) - (is (instance? java.io.File (:tempfile result))) - (is (.exists (:tempfile result))) + (is (instance? File (:tempfile result))) + (is (.exists ^File (:tempfile result))) (is (= (slurp (:tempfile result)) "foo")))) -(defn eventually [check n d] +(defn eventually [check n ^long d] (loop [i n] (if (check) true @@ -30,9 +31,9 @@ {:filename "foo.txt" :content-type "text/plain" :stream (string-input-stream "foo")})] - (is (.exists (:tempfile result))) + (is (.exists ^File (:tempfile result))) (Thread/sleep 2000) - (let [deleted? (eventually #(not (.exists (:tempfile result))) 120 250)] + (let [deleted? (eventually #(not (.exists ^File (:tempfile result))) 120 250)] (is deleted?)))) (defn all-threads [] diff --git a/ring-core/test/ring/middleware/session/test/cookie.clj b/ring-core/test/ring/middleware/session/test/cookie.clj index 21e76f89c..a8ab812c1 100644 --- a/ring-core/test/ring/middleware/session/test/cookie.clj +++ b/ring-core/test/ring/middleware/session/test/cookie.clj @@ -3,7 +3,9 @@ [ring.middleware.session.store :refer :all] [ring.middleware.session.cookie :as cookie :refer [cookie-store]] [ring.util.codec :as codec] - [crypto.random :as random])) + [crypto.random :as random]) + (:import [java.io Writer] + [java.time Instant])) (deftest cookie-session-read-not-exist (let [store (cookie-store)] @@ -58,14 +60,14 @@ (cookie-store {:key (.getBytes "012345678901234567890")})))) ; setup for serializing/deserializing Instant. -(defmethod print-method java.time.Instant [dt out] +(defmethod print-method Instant [^Instant dt ^Writer out] (.write out (str "#foo/instant \"" (.toString dt) "\""))) -(defn parse-instant [x] (java.time.Instant/parse x)) +(defn parse-instant [x] (Instant/parse x)) (deftest cookie-session-custom-type (let [store (cookie-store {:readers {'foo/instant #'parse-instant}}) - now (java.time.Instant/now) + now (Instant/now) sess-key (write-session store nil {:foo now})] (is (not (nil? sess-key))) (is (= (read-session store sess-key) diff --git a/ring-core/test/ring/middleware/test/file.clj b/ring-core/test/ring/middleware/test/file.clj index 33582d325..1d5291995 100644 --- a/ring-core/test/ring/middleware/test/file.clj +++ b/ring-core/test/ring/middleware/test/file.clj @@ -10,9 +10,9 @@ (is (thrown-with-msg? Exception #".*Directory does not exist.*" (wrap-file (constantly test-response) "not_here")))) -(def public-dir "test/ring/assets") -(def index-html (File. ^String public-dir "index.html")) -(def foo-html (File. ^String public-dir "foo.html")) +(def ^String public-dir "test/ring/assets") +(def index-html (File. public-dir "index.html")) +(def foo-html (File. public-dir "foo.html")) (def app (wrap-file (constantly test-response) public-dir)) diff --git a/ring-core/test/ring/middleware/test/file_info.clj b/ring-core/test/ring/middleware/test/file_info.clj index 498d183aa..33a4e1b93 100644 --- a/ring-core/test/ring/middleware/test/file_info.clj +++ b/ring-core/test/ring/middleware/test/file_info.clj @@ -15,10 +15,11 @@ "Lets us use a known file modification time for tests, without permanently changing the file's modification time." [[file new-time] form] - `(let [old-time# (.lastModified ~file)] - (.setLastModified ~file ~(* new-time 1000)) - (try ~form - (finally (.setLastModified ~file old-time#))))) + (let [file (vary-meta file assoc :tag `File)] + `(let [old-time# (.lastModified ~file)] + (.setLastModified ~file ~(* new-time 1000)) + (try ~form + (finally (.setLastModified ~file old-time#)))))) (def custom-type-app (wrap-file-info diff --git a/ring-core/test/ring/middleware/test/multipart_params.clj b/ring-core/test/ring/middleware/test/multipart_params.clj index 563bdd283..0d103714b 100644 --- a/ring-core/test/ring/middleware/test/multipart_params.clj +++ b/ring-core/test/ring/middleware/test/multipart_params.clj @@ -161,7 +161,7 @@ :body (string-input-stream form-body)} response (handler request)] (let [upload (get-in response [:multipart-params "upload"])] - (is (java.util.Arrays/equals (:bytes upload) (.getBytes "foo")))))) + (is (java.util.Arrays/equals ^bytes (:bytes upload) (.getBytes "foo")))))) (deftest forced-encoding-option-works (let [form-body (str "--XXXX\r\n" diff --git a/ring-core/test/ring/middleware/test/resource.clj b/ring-core/test/ring/middleware/test/resource.clj index 231ff42c9..560a6fddc 100644 --- a/ring-core/test/ring/middleware/test/resource.clj +++ b/ring-core/test/ring/middleware/test/resource.clj @@ -24,7 +24,7 @@ (deftest resource-loader-test (let [root-loader (->> (Thread/currentThread) .getContextClassLoader - (iterate (memfn getParent)) + (iterate (memfn ^ClassLoader getParent)) (take-while identity) last) jarfile (io/file "test/resource.jar") diff --git a/ring-core/test/ring/middleware/test/session.clj b/ring-core/test/ring/middleware/test/session.clj index b673774e7..c4f95b45d 100644 --- a/ring-core/test/ring/middleware/test/session.clj +++ b/ring-core/test/ring/middleware/test/session.clj @@ -24,10 +24,10 @@ (defn get-cookies [response] (get-in response [:headers "Set-Cookie"])) -(defn is-session-cookie? [c] +(defn is-session-cookie? [^String c] (.contains c "ring-session=")) -(defn get-session-cookie [response] +(defn get-session-cookie ^String [response] (first (filter is-session-cookie? (get-cookies response)))) (deftest session-is-read diff --git a/ring-devel/project.clj b/ring-devel/project.clj index b7ece5717..b5401105c 100644 --- a/ring-devel/project.clj +++ b/ring-devel/project.clj @@ -4,6 +4,7 @@ :scm {:dir ".."} :license {:name "The MIT License" :url "http://opensource.org/licenses/MIT"} + :managed-dependencies [[org.clojure/tools.reader "1.5.2"]] :dependencies [[org.clojure/clojure "1.9.0"] [ring/ring-core "1.15.2"] [hiccup "2.0.0"] @@ -13,4 +14,5 @@ :profiles {:1.10 {:dependencies [[org.clojure/clojure "1.10.3"]]} :1.11 {:dependencies [[org.clojure/clojure "1.11.4"]]} - :1.12 {:dependencies [[org.clojure/clojure "1.12.1"]]}}) + :1.12 {:dependencies [[org.clojure/clojure "1.12.1"]]}} + :global-vars {*warn-on-reflection* true}) diff --git a/ring-devel/test/ring/middleware/test/stacktrace.clj b/ring-devel/test/ring/middleware/test/stacktrace.clj index 53c7c1a0d..2c1591133 100644 --- a/ring-devel/test/ring/middleware/test/stacktrace.clj +++ b/ring-devel/test/ring/middleware/test/stacktrace.clj @@ -13,18 +13,18 @@ (binding [*err* (java.io.StringWriter.)] (doseq [app [exception-app assert-app]] (testing "requests with Accept: text/html" - (let [{:keys [status headers body]} (app html-req)] + (let [{:keys [status headers ^String body]} (app html-req)] (is (= 500 status)) (is (= {"Content-Type" "text/html"} headers)) (is (.startsWith body "")))) (testing "requests with Accept: application/javascript" - (let [{:keys [status headers body]} (app js-req)] + (let [{:keys [status headers ^String body]} (app js-req)] (is (= 500 status)) (is (= {"Content-Type" "text/plain"} headers)) (is (or (.startsWith body "java.lang.Exception") (.startsWith body "java.lang.AssertionError"))))) (testing "requests without Accept header" - (let [{:keys [status headers body]} (app plain-req)] + (let [{:keys [status headers ^String body]} (app plain-req)] (is (= 500 status)) (is (= {"Content-Type" "text/plain"} headers)) (is (or (.startsWith body "java.lang.Exception") diff --git a/ring-jakarta-servlet/project.clj b/ring-jakarta-servlet/project.clj index ed5fcfea1..471242014 100644 --- a/ring-jakarta-servlet/project.clj +++ b/ring-jakarta-servlet/project.clj @@ -12,4 +12,5 @@ :dev {:dependencies [[jakarta.servlet/jakarta.servlet-api "5.0.0"]]} :1.10 {:dependencies [[org.clojure/clojure "1.10.3"]]} :1.11 {:dependencies [[org.clojure/clojure "1.11.4"]]} - :1.12 {:dependencies [[org.clojure/clojure "1.12.1"]]}}) + :1.12 {:dependencies [[org.clojure/clojure "1.12.1"]]}} + :global-vars {*warn-on-reflection* true}) diff --git a/ring-jakarta-servlet/src/ring/util/jakarta/servlet.clj b/ring-jakarta-servlet/src/ring/util/jakarta/servlet.clj index d17e4bab1..8f1818e1b 100644 --- a/ring-jakarta-servlet/src/ring/util/jakarta/servlet.clj +++ b/ring-jakarta-servlet/src/ring/util/jakarta/servlet.clj @@ -129,9 +129,9 @@ (defn servlet "Create a servlet from a Ring handler." - ([handler] + (^HttpServlet [handler] (servlet handler {})) - ([handler options] + (^HttpServlet [handler options] (let [service-method (make-service-method handler options)] (proxy [HttpServlet] [] (service [request response] diff --git a/ring-jakarta-servlet/test/ring/util/jakarta/test/servlet.clj b/ring-jakarta-servlet/test/ring/util/jakarta/test/servlet.clj index 6a6823f0c..db14fd0ec 100644 --- a/ring-jakarta-servlet/test/ring/util/jakarta/test/servlet.clj +++ b/ring-jakarta-servlet/test/ring/util/jakarta/test/servlet.clj @@ -2,7 +2,8 @@ (:require [clojure.test :refer :all] [ring.util.jakarta.servlet :refer :all] [ring.core.protocols :as proto]) - (:import [java.util Locale])) + (:import [java.io OutputStream] + [java.util Locale])) (defmacro ^:private with-locale [locale & body] `(let [old-locale# (Locale/getDefault)] @@ -49,7 +50,10 @@ (getOutputStream [] (proxy [jakarta.servlet.ServletOutputStream] [] (write - ([b] (.write output-stream b)) + ([b] + (if (bytes? b) + (.write output-stream ^bytes b) + (.write output-stream ^int b))) ([b off len] (.write output-stream b off len))))) (setStatus [status] (swap! response assoc :status status)) @@ -146,7 +150,7 @@ (is (= (@response :status) 200)) (is (= (@response :content-type) "text/plain")) (is (= (get-in @response [:headers "X-Server"]) "Bar")) - (is (= (.toString (@response :body)) "Hello World")))))) + (is (= (.toString ^OutputStream (@response :body)) "Hello World")))))) (deftest servlet-cps-test (let [handler (fn [_ respond _] @@ -168,7 +172,7 @@ (is (= @(:completed request) true)) (is (= (@response :status) 200)) (is (= (@response :content-type) "text/plain")) - (is (= (.toString (@response :body)) "Hello World")))) + (is (= (.toString ^OutputStream (@response :body)) "Hello World")))) (defn- defservice-test* [service] (let [body (proxy [jakarta.servlet.ServletInputStream] []) @@ -192,7 +196,7 @@ (servlet-response response)) (is (= (@response :status) 200)) (is (= (get-in @response [:headers "Content-Type"]) "text/plain")) - (is (= (.toString (@response :body)) "Hello World")))) + (is (= (.toString ^OutputStream (@response :body)) "Hello World")))) (defn- service-handler [_] {:status 200 @@ -215,6 +219,6 @@ :headers {} :body (reify proto/StreamableResponseBody (write-body-to-stream [_ _ os] - (.write os (int \h)) - (.write os (.getBytes "ello"))))}) - (is (= "hello" (.toString (:body @response)))))) + (.write ^OutputStream os (int \h)) + (.write ^OutputStream os (.getBytes "ello"))))}) + (is (= "hello" (.toString ^OutputStream (:body @response)))))) diff --git a/ring-jetty-adapter/project.clj b/ring-jetty-adapter/project.clj index 5516ea68f..29329e8e3 100644 --- a/ring-jetty-adapter/project.clj +++ b/ring-jetty-adapter/project.clj @@ -21,4 +21,5 @@ :test {:dependencies [[org.eclipse.jetty/jetty-client "12.1.0"]]} :1.10 {:dependencies [[org.clojure/clojure "1.10.3"]]} :1.11 {:dependencies [[org.clojure/clojure "1.11.4"]]} - :1.12 {:dependencies [[org.clojure/clojure "1.12.1"]]}}) + :1.12 {:dependencies [[org.clojure/clojure "1.12.1"]]}} + :global-vars {*warn-on-reflection* true}) diff --git a/ring-jetty-adapter/test/ring/adapter/test/jetty.clj b/ring-jetty-adapter/test/ring/adapter/test/jetty.clj index 8b94e8ae5..106df9116 100644 --- a/ring-jetty-adapter/test/ring/adapter/test/jetty.clj +++ b/ring-jetty-adapter/test/ring/adapter/test/jetty.clj @@ -9,12 +9,14 @@ [ring.core.protocols :as p] [ring.websocket :as ws] [ring.websocket.protocols :as wsp]) - (:import [java.io File] + (:import [java.io File OutputStream] [java.nio ByteBuffer] [java.nio.file Paths] - [org.eclipse.jetty.util.thread QueuedThreadPool] - [org.eclipse.jetty.server Server Request SslConnectionFactory] + [org.eclipse.jetty.util.ssl SslContextFactory$Server] + [org.eclipse.jetty.util.thread QueuedThreadPool ThreadPool$SizedThreadPool] + [org.eclipse.jetty.server Server ServerConnector Request SslConnectionFactory] [org.eclipse.jetty.server.handler AbstractHandler] + [org.eclipse.jetty.unixdomain.server UnixDomainServerConnector] [org.eclipse.jetty.io ClientConnector Transport$TCPUnix] [org.eclipse.jetty.client HttpClient] [org.eclipse.jetty.client.transport HttpClientTransportOverHTTP] @@ -66,12 +68,12 @@ port)) (defn- get-ssl-context-factory - [^Server s] - (->> (seq (.getConnectors s)) - (mapcat #(seq (.getConnectionFactories %))) - (filter #(instance? SslConnectionFactory %)) - (first) - (.getSslContextFactory))) + ^SslContextFactory$Server [^Server s] + (let [^SslConnectionFactory factory (->> (seq (.getConnectors s)) + (mapcat #(seq (.getConnectionFactories ^ServerConnector %))) + (filter #(instance? SslConnectionFactory %)) + (first))] + (.getSslContextFactory factory))) (defn- exclude-ciphers [server] (set (.getExcludeCipherSuites (get-ssl-context-factory server)))) @@ -109,7 +111,7 @@ (with-server hello-world {:port test-port} (let [response (http/get test-url)] (is (= (:status response) 200)) - (is (.startsWith (get-in response [:headers "content-type"]) + (is (.startsWith ^String (get-in response [:headers "content-type"]) "text/plain")) (is (= (:body response) "Hello World"))))) @@ -132,8 +134,9 @@ (let [server (run-jetty hello-world {:http? false :unix-socket test-unix-domain-socket :join? false - :acceptor-threads 2})] - (is (= 2 (-> server (.getConnectors) first (.getAcceptors)))) + :acceptor-threads 2}) + ^UnixDomainServerConnector connector (-> server (.getConnectors) first)] + (is (= 2 (.getAcceptors connector))) (.stop server)))))) (testing "HTTPS server" @@ -258,12 +261,12 @@ (let [max-threads 20 new-handler (proxy [AbstractHandler] [] (handle [_ ^Request base-request request response])) - configurator (fn [server] - (.setMaxThreads (.getThreadPool server) max-threads) + configurator (fn [^Server server] + (-> server ^ThreadPool$SizedThreadPool (.getThreadPool) (.setMaxThreads max-threads)) (.setHandler server new-handler)) server (run-jetty hello-world {:join? false :port test-port :configurator configurator})] - (is (= (.getMaxThreads (.getThreadPool server)) max-threads)) + (is (= (.getMaxThreads ^ThreadPool$SizedThreadPool (.getThreadPool server)) max-threads)) (is (identical? new-handler (.getHandler server))) (is (= 1 (count (.getHandlers server)))) (.stop server))) @@ -271,15 +274,15 @@ (testing "setting daemon threads" (testing "default (daemon off)" (let [server (run-jetty hello-world {:port test-port :join? false})] - (is (not (.. server getThreadPool isDaemon))) + (is (not (-> server ^QueuedThreadPool (.getThreadPool) .isDaemon))) (.stop server))) (testing "daemon on" (let [server (run-jetty hello-world {:port test-port :join? false :daemon? true})] - (is (.. server getThreadPool isDaemon)) + (is (-> server ^QueuedThreadPool (.getThreadPool) .isDaemon)) (.stop server))) (testing "daemon off" (let [server (run-jetty hello-world {:port test-port :join? false :daemon? false})] - (is (not (.. server getThreadPool isDaemon))) + (is (not (-> server ^QueuedThreadPool (.getThreadPool) .isDaemon))) (.stop server)))) (testing "setting max idle timeout" @@ -291,8 +294,8 @@ :max-idle-time 5000 :sni-host-check? false}) connectors (. server getConnectors)] - (is (= 5000 (. (first connectors) getIdleTimeout))) - (is (= 5000 (. (second connectors) getIdleTimeout))) + (is (= 5000 (.getIdleTimeout ^ServerConnector (first connectors)))) + (is (= 5000 (.getIdleTimeout ^ServerConnector (second connectors)))) (.stop server))) (testing "using the default max idle time" @@ -303,54 +306,56 @@ :sni-host-check? false :join? false}) connectors (. server getConnectors)] - (is (= 200000 (. (first connectors) getIdleTimeout))) - (is (= 200000 (. (second connectors) getIdleTimeout))) + (is (= 200000 (.getIdleTimeout ^ServerConnector (first connectors)))) + (is (= 200000 (.getIdleTimeout ^ServerConnector (second connectors)))) (.stop server))) (testing "setting min-threads" (let [server (run-jetty hello-world {:port test-port :min-threads 3 :join? false}) - thread-pool (. server getThreadPool)] - (is (= 3 (. thread-pool getMinThreads))) + ^QueuedThreadPool thread-pool (. server getThreadPool)] + (is (= 3 (.getMinThreads thread-pool))) (.stop server))) (testing "default min-threads" (let [server (run-jetty hello-world {:port test-port :join? false}) - thread-pool (. server getThreadPool)] - (is (= 8 (. thread-pool getMinThreads))) + ^QueuedThreadPool thread-pool (. server getThreadPool)] + (is (= 8 (.getMinThreads thread-pool))) (.stop server))) (testing "default thread-idle-timeout" (let [server (run-jetty hello-world {:port test-port :join? false}) - thread-pool (. server getThreadPool)] - (is (= 60000 (. thread-pool getIdleTimeout))) + ^QueuedThreadPool thread-pool (. server getThreadPool)] + (is (= 60000 (.getIdleTimeout thread-pool))) (.stop server))) (testing "setting thread-idle-timeout" (let [server (run-jetty hello-world {:port test-port :join? false :thread-idle-timeout 1000}) - thread-pool (. server getThreadPool)] - (is (= 1000 (. thread-pool getIdleTimeout))) + ^QueuedThreadPool thread-pool (. server getThreadPool)] + (is (= 1000 (.getIdleTimeout thread-pool))) (.stop server))) (testing "using default connector options" (let [server (run-jetty hello-world {:port test-port - :join? false})] - (is (>= 1 (-> server (.getConnectors) first (.getAcceptors)))) - (is (> (-> server (.getConnectors) first (.getSelectorManager) (.getSelectorCount)) 1)) + :join? false}) + ^org.eclipse.jetty.server.ServerConnector connector (-> server (.getConnectors) first)] + (is (>= 1 (-> connector (.getAcceptors)))) + (is (> (-> connector (.getSelectorManager) (.getSelectorCount)) 1)) (.stop server))) (testing "using custom connector options" (let [server (run-jetty hello-world {:port test-port :join? false :acceptor-threads 2 - :selector-threads 8})] - (is (= 2 (-> server (.getConnectors) first (.getAcceptors)))) - (is (= 8 (-> server (.getConnectors) first (.getSelectorManager) (.getSelectorCount)))) + :selector-threads 8}) + ^org.eclipse.jetty.server.ServerConnector connector (-> server (.getConnectors) first)] + (is (= 2 (-> connector (.getAcceptors)))) + (is (= 8 (-> connector (.getSelectorManager) (.getSelectorCount)))) (.stop server))) (testing "providing custom thread-pool" @@ -365,7 +370,7 @@ (with-server (content-type-handler "text/plain") {:port test-port} (let [response (http/get test-url)] (is (.contains - (get-in response [:headers "content-type"]) + ^String (get-in response [:headers "content-type"]) "text/plain"))))) (testing "custom content-type" @@ -476,7 +481,7 @@ :headers {"Transfer-Encoding" "chunked"} :body (SequenceInputStream. (ByteArrayInputStream. - (.getBytes (apply str (range 100000)) "UTF-8")) + (.getBytes ^String (apply str (range 100000)) "UTF-8")) (proxy [InputStream] [] (read ([] (throw (IOException. "test error"))) @@ -585,7 +590,7 @@ (Thread/sleep 100) (is (empty? @thread-exceptions)) (is (= (:status response) 200)) - (is (.startsWith (get-in response [:headers "content-type"]) + (is (.startsWith ^String (get-in response [:headers "content-type"]) "text/plain")) (is (= (:body response) "Hello World"))))) @@ -593,7 +598,7 @@ (with-server hello-world-cps {:port test-port, :async? true} (let [response (http/get test-url)] (is (= (:status response) 200)) - (is (.startsWith (get-in response [:headers "content-type"]) + (is (.startsWith ^String (get-in response [:headers "content-type"]) "text/plain")) (is (= (:body response) "Hello World"))))) @@ -601,7 +606,7 @@ (with-server hello-world-streaming {:port test-port, :async? true} (let [response (http/get test-url)] (is (= (:status response) 200)) - (is (.startsWith (get-in response [:headers "content-type"]) + (is (.startsWith ^String (get-in response [:headers "content-type"]) "text/event-stream")) (is (= (:body response) "data: hello\n\ndata: world\n\n"))))) @@ -694,7 +699,7 @@ (def test-websocket-url (str "ws://localhost:" test-port)) -(defn- buf->str [buffer] +(defn- buf->str [^ByteBuffer buffer] (let [bs (byte-array (.capacity buffer))] (.get buffer bs) (String. bs))) @@ -1001,7 +1006,7 @@ (let [response {:status 200 :body (reify p/StreamableResponseBody (write-body-to-stream [_ _ os] - (with-open [os os] + (with-open [^OutputStream os os] (.write os (.getBytes "foo")) (.flush os) (Thread/sleep 100) diff --git a/ring-servlet/project.clj b/ring-servlet/project.clj index beed932bf..29b2efcbb 100644 --- a/ring-servlet/project.clj +++ b/ring-servlet/project.clj @@ -12,4 +12,5 @@ :dev {:dependencies [[javax.servlet/javax.servlet-api "3.1.0"]]} :1.10 {:dependencies [[org.clojure/clojure "1.10.3"]]} :1.11 {:dependencies [[org.clojure/clojure "1.11.4"]]} - :1.12 {:dependencies [[org.clojure/clojure "1.12.1"]]}}) + :1.12 {:dependencies [[org.clojure/clojure "1.12.1"]]}} + :global-vars {*warn-on-reflection* true}) diff --git a/ring-servlet/src/ring/util/servlet.clj b/ring-servlet/src/ring/util/servlet.clj index d7c977c0b..84517dc7a 100644 --- a/ring-servlet/src/ring/util/servlet.clj +++ b/ring-servlet/src/ring/util/servlet.clj @@ -129,9 +129,9 @@ (defn servlet "Create a servlet from a Ring handler." - ([handler] + (^HttpServlet [handler] (servlet handler {})) - ([handler options] + (^HttpServlet [handler options] (let [service-method (make-service-method handler options)] (proxy [HttpServlet] [] (service [request response] diff --git a/ring-servlet/test/ring/util/test/servlet.clj b/ring-servlet/test/ring/util/test/servlet.clj index e431b366e..15dcc7710 100644 --- a/ring-servlet/test/ring/util/test/servlet.clj +++ b/ring-servlet/test/ring/util/test/servlet.clj @@ -2,7 +2,9 @@ (:require [clojure.test :refer :all] [ring.util.servlet :refer :all] [ring.core.protocols :as proto]) - (:import [java.util Locale])) + (:import [java.io OutputStream] + [java.util Locale] + [javax.servlet ServletConfig])) (defmacro ^:private with-locale [locale & body] `(let [old-locale# (Locale/getDefault)] @@ -49,7 +51,10 @@ (getOutputStream [] (proxy [javax.servlet.ServletOutputStream] [] (write - ([b] (.write output-stream b)) + ([b] + (if (bytes? b) + (.write output-stream ^bytes b) + (.write output-stream ^int b))) ([b off len] (.write output-stream b off len))))) (setStatus [status] (swap! response assoc :status status)) @@ -59,7 +64,7 @@ (setContentType [value] (swap! response assoc :content-type value))))) -(defn- servlet-config [] +(defn- servlet-config ^ServletConfig [] (proxy [javax.servlet.ServletConfig] [] (getServletContext [] nil))) @@ -146,7 +151,7 @@ (is (= (@response :status) 200)) (is (= (@response :content-type) "text/plain")) (is (= (get-in @response [:headers "X-Server"]) "Bar")) - (is (= (.toString (@response :body)) "Hello World")))))) + (is (= (.toString ^OutputStream (@response :body)) "Hello World")))))) (deftest servlet-cps-test (let [handler (fn [_ respond _] @@ -168,7 +173,7 @@ (is (= @(:completed request) true)) (is (= (@response :status) 200)) (is (= (@response :content-type) "text/plain")) - (is (= (.toString (@response :body)) "Hello World")))) + (is (= (.toString ^OutputStream (@response :body)) "Hello World")))) (defn- defservice-test* [service] (let [body (proxy [javax.servlet.ServletInputStream] []) @@ -192,7 +197,7 @@ (servlet-response response)) (is (= (@response :status) 200)) (is (= (get-in @response [:headers "Content-Type"]) "text/plain")) - (is (= (.toString (@response :body)) "Hello World")))) + (is (= (.toString ^OutputStream (@response :body)) "Hello World")))) (defn- service-handler [_] {:status 200 @@ -215,6 +220,6 @@ :headers {} :body (reify proto/StreamableResponseBody (write-body-to-stream [_ _ os] - (.write os (int \h)) - (.write os (.getBytes "ello"))))}) - (is (= "hello" (.toString (:body @response)))))) + (.write ^OutputStream os (int \h)) + (.write ^OutputStream os (.getBytes "ello"))))}) + (is (= "hello" (.toString ^OutputStream (:body @response)))))) diff --git a/ring-websocket-protocols/project.clj b/ring-websocket-protocols/project.clj index 4f302b81e..515c9d504 100644 --- a/ring-websocket-protocols/project.clj +++ b/ring-websocket-protocols/project.clj @@ -6,4 +6,5 @@ :url "http://opensource.org/licenses/MIT"} :dependencies [] :profiles - {:dev {:dependencies [[org.clojure/clojure "1.9.0"]]}}) + {:dev {:dependencies [[org.clojure/clojure "1.9.0"]]}} + :global-vars {*warn-on-reflection* true})