@@ -14,6 +14,8 @@ import Control.Applicative
14import Data.Traversable (Traversable(traverse))
14import Data.Traversable (Traversable(traverse))
16import Control.Arrow ((&&&))
16import Control.Arrow ((&&&))
17+import Control.Monad ((<=<))
18+import Data.Either.Combinators (mapLeft)
18import Data.Monoid
20import Data.Monoid
19import Data.ByteString (ByteString)
21import Data.ByteString (ByteString)
@@ -23,7 +25,7 @@ import Data.Int
23import Data.Word
25import Data.Word
25import Data.Text (Text)
27import Data.Text (Text)
26−import Data.Text.Encoding (encodeUtf8, decodeUtf8)
28+import Data.Text.Encoding (encodeUtf8, decodeUtf8')
27import Data.Text.Read (signed, decimal, rational, Reader)
29import Data.Text.Read (signed, decimal, rational, Reader)
28import qualified Data.Text as T
30import qualified Data.Text as T
29import qualified Data.Text.Lazy as L
31import qualified Data.Text.Lazy as L
@@ -73,7 +75,7 @@ class FromHttpApiData a where
74 -- | Parse HTTP header value.
76 -- | Parse HTTP header value.
75 parseHeader :: ByteString -> Either Text a
77 parseHeader :: ByteString -> Either Text a
76− parseHeader = parseUrlPiece . decodeUtf8
78+ parseHeader = parseUrlPiece <=< (mapLeft (T.pack . show) . decodeUtf8')
78 -- | Parse query param value.
80 -- | Parse query param value.
79 parseQueryParam :: Text -> Either Text a
81 parseQueryParam :: Text -> Either Text a
@@ -331,7 +333,7 @@ parseBoundedQueryParam = parseBoundedEnumOfI toQueryParam
331-- Uses @'toHeader'@ to get possible values.
333-- Uses @'toHeader'@ to get possible values.
332parseBoundedHeader :: (ToHttpApiData a, Bounded a, Enum a) => ByteString -> Either Text a
334parseBoundedHeader :: (ToHttpApiData a, Bounded a, Enum a) => ByteString -> Either Text a
333parseBoundedHeader bs = case lookupBoundedEnumOf toHeader bs of
335parseBoundedHeader bs = case lookupBoundedEnumOf toHeader bs of
334− Nothing -> defaultParseError (decodeUtf8 bs)
336+ Nothing -> defaultParseError $ T.pack $ show bs
335 Just x -> return x
337 Just x -> return x
337-- | Parse URL piece using @'Read'@ instance.
339-- | Parse URL piece using @'Read'@ instance.