@@ -29,7 +29,7 @@ import Control.Monad.State (StateT, evalStateT, get, modify)
2929import Control.Monad.State (liftM, liftM2, liftIO)
3030import Data.ByteString.Base64 (encode)
3131import Data.Char (toLower, isSpace, isAscii, isControl)
32−import Data.List (intersperse, intercalate, isPrefixOf)
32+import Data.List (intersperse, intercalate, isPrefixOf, stripPrefix)
3333import Data.Either (lefts, rights)
3434import Network.Browser (browse, request, setAllowRedirects, setOutHandler)
3535import Network.HTTP (catchIO_, getRequest, getHeaders, getResponseBody)
@@ -252,22 +252,21 @@ readDataURI :: String -- ^ URI
252252 -> Maybe (String,String,Bool,String)
253253 -- ^ Maybe (mime,charset,isBase64,data)
254254readDataURI uri =
255− let prefix = "data:"
256− in if not (prefix `isPrefixOf` uri)
257− then Nothing
258− else
259− let rest = drop (length prefix) uri
260− meta = takeWhile (/= ',') rest -- without trailing ','
261− uridata = drop (length meta + 1) rest
262− parts = split (== ';') meta
263− (mime,cs,enc)=foldr upd ("text/plain","US-ASCII",False) parts
264− in Just (mime,cs,enc,uridata)
255+ case stripPrefix "data:" uri of
256+ Nothing -> Nothing
257+ Just rest ->
258+ let meta = takeWhile (/= ',') rest -- without trailing ','
259+ uridata = drop (length meta + 1) rest
260+ parts = split (== ';') meta
261+ (mime,cs,enc)=foldr upd ("text/plain","US-ASCII",False) parts
262+ in Just (mime,cs,enc,uridata)
263+
265264 where
266265 upd str m@(mime,cs,enc)
267− | isMimeType str = (str,cs,enc)
268− | "charset=" `isPrefixOf` str = (mime,drop (length "charset=") str,enc)
269− | str == "base64" = (mime,cs,True)
270− | otherwise = m
266+ | isMimeType str = (str,cs,enc)
267+ | Just str' <- stripPrefix "charset=" str = (mime,str',enc)
268+ | str == "base64" = (mime,cs,True)
269+ | otherwise = m
271270
272271-- Without parameters like ;charset=...; see RFC 2045, 5.1
273272isMimeType :: String -> Bool