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