diff --git a/src/toascii/models/image.clj b/src/toascii/models/image.clj index e0e9def..4ba77e4 100644 --- a/src/toascii/models/image.clj +++ b/src/toascii/models/image.clj @@ -1,7 +1,9 @@ (ns toascii.models.image (:import (java.awt.image BufferedImage) (javax.imageio.stream ImageInputStream) - (java.io Writer)) + (javax.imageio ImageIO ImageReader) + (java.io Writer) + (java.util Iterator)) (:require [clojure.java.io :as io] [clj-image2ascii.core :as i2a] [toascii.util :refer [query-param-url->java-url stream-response]])) @@ -38,4 +40,14 @@ (.write w "") (.write w "")))) \ No newline at end of file + (.write w "")))) + +(defn gif? [^ImageInputStream image-stream] + (let [^Iterator readers (ImageIO/getImageReaders image-stream)] + (->> (loop [formats []] + (if (.hasNext readers) + (recur (conj formats (.next readers))) + formats)) + (map (fn [^ImageReader r] + (.getFormatName r))) + (some #(= "gif" %))))) diff --git a/src/toascii/routes/api/image.clj b/src/toascii/routes/api/image.clj index d939ac9..80f17c4 100644 --- a/src/toascii/routes/api/image.clj +++ b/src/toascii/routes/api/image.clj @@ -5,7 +5,7 @@ [liberator.core :refer [defresource]] [compojure.core :refer [ANY]] [toascii.route-utils :refer [register-routes]] - [toascii.models.image :refer [image->ascii gif->ascii get-image get-image-stream]] + [toascii.models.image :refer [image->ascii gif->ascii get-image get-image-stream gif?]] [toascii.util :refer [parse-int parse-boolean]])) (defresource render-image [{:keys [url width color format] :as params}] @@ -54,7 +54,9 @@ :exists? (fn [_] (if-let [stream (get-image-stream url)] - {:image stream} + (if-not (gif? stream) + (throw (new Exception "Invalid GIF image.")) + {:image stream}) [false {:error "Image could not be loaded."}])) :handle-ok (fn [ctx]