@@ -14,6 +14,8 @@ import Control.Applicative
1414import Data.Traversable (Traversable(traverse))
1515#endif
1616import Control.Arrow ((&&&))
17+import Control.Monad ((<=<))
18+import Data.Either.Combinators (mapLeft)
1719
1820import Data.Monoid
1921import Data.ByteString (ByteString)
@@ -23,7 +25,7 @@ import Data.Int
2325import Data.Word
2426
2527import Data.Text (Text)
26−import Data.Text.Encoding (encodeUtf8, decodeUtf8)
28+import Data.Text.Encoding (encodeUtf8, decodeUtf8')
2729import Data.Text.Read (signed, decimal, rational, Reader)
2830import qualified Data.Text as T
2931import qualified Data.Text.Lazy as L
@@ -73,7 +75,7 @@ class FromHttpApiData a where
7375
7476 -- | Parse HTTP header value.
7577 parseHeader :: ByteString -> Either Text a
76− parseHeader = parseUrlPiece . decodeUtf8
78+ parseHeader = parseUrlPiece <=< (mapLeft (T.pack . show) . decodeUtf8')
7779
7880 -- | Parse query param value.
7981 parseQueryParam :: Text -> Either Text a
@@ -331,7 +333,7 @@ parseBoundedQueryParam = parseBoundedEnumOfI toQueryParam
331333-- Uses @'toHeader'@ to get possible values.
332334parseBoundedHeader :: (ToHttpApiData a, Bounded a, Enum a) => ByteString -> Either Text a
333335parseBoundedHeader bs = case lookupBoundedEnumOf toHeader bs of
334− Nothing -> defaultParseError (decodeUtf8 bs)
336+ Nothing -> defaultParseError $ T.pack $ show bs
335337 Just x -> return x
336338
337339-- | Parse URL piece using @'Read'@ instance.