git.iko.soy/typeable/servant
on master help sign in
servant: allow whitespace before JSON
commit54131821a5c4c14990ad1d9d1e10927b7afe3e06 authorChristian Marie <christian@ponies.io> dateSat 16 May 2015, 12:40 (11 years ago) parent43d0620
2 files changed+28−25
servant/src/Servant/API/ContentTypes.hs+23−22 servant/test/Servant/API/ContentTypesSpec.hs+5−3
servant/src/Servant/API/ContentTypes.hs+23−22
@@ -66,30 +66,31 @@ module Servant.API.ContentTypes
6666 ) where
6767
6868#if !MIN_VERSION_base(4,8,0)
69−import Control.Applicative ((<*))
69+import Control.Applicative ((*>), (<*))
7070#endif
71−import Control.Arrow (left)
71+import Control.Arrow (left)
7272import Control.Monad
73−import Data.Aeson (FromJSON, ToJSON, encode,
74− parseJSON)
75−import Data.Aeson.Parser (value)
76−import Data.Aeson.Types (parseEither)
73+import Data.Aeson (FromJSON, ToJSON, encode,
74+ parseJSON)
75+import Data.Aeson.Parser (value)
76+import Data.Aeson.Types (parseEither)
7777import Data.Attoparsec.ByteString.Char8 (endOfInput, parseOnly,
7878 skipSpace, (<?>))
79−import qualified Data.ByteString as BS
80−import Data.ByteString.Lazy (ByteString, fromStrict, toStrict)
81−import qualified Data.ByteString.Lazy as B
79+import qualified Data.ByteString as BS
80+import Data.ByteString.Lazy (ByteString, fromStrict,
81+ toStrict)
82+import qualified Data.ByteString.Lazy as B
8283import Data.Monoid
83−import Data.String.Conversions (cs)
84−import qualified Data.Text as TextS
85−import qualified Data.Text.Encoding as TextS
86−import qualified Data.Text.Lazy as TextL
87−import qualified Data.Text.Lazy.Encoding as TextL
84+import Data.String.Conversions (cs)
85+import qualified Data.Text as TextS
86+import qualified Data.Text.Encoding as TextS
87+import qualified Data.Text.Lazy as TextL
88+import qualified Data.Text.Lazy.Encoding as TextL
8889import Data.Typeable
89−import GHC.Exts (Constraint)
90−import qualified Network.HTTP.Media as M
91−import Network.URI (escapeURIString, isUnreserved,
92− unEscapeString)
90+import GHC.Exts (Constraint)
91+import qualified Network.HTTP.Media as M
92+import Network.URI (escapeURIString,
93+ isUnreserved, unEscapeString)
9394
9495-- * Provided content types
9596data JSON deriving Typeable
@@ -304,10 +305,10 @@ eitherDecodeLenient :: FromJSON a => ByteString -> Either String a
304305eitherDecodeLenient input =
305306 parseOnly parser (cs input) >>= parseEither parseJSON
306307 where
307− parser =
308− Data.Aeson.Parser.value
309− <* skipSpace
310− <* (endOfInput <?> "trailing junk after valid JSON")
308+ parser = skipSpace
309+ *> Data.Aeson.Parser.value
310+ <* skipSpace
311+ <* (endOfInput <?> "trailing junk after valid JSON")
311312
312313-- | `eitherDecode`
313314instance FromJSON a => MimeUnrender JSON a where
servant/test/Servant/API/ContentTypesSpec.hs+5−3
@@ -8,15 +8,15 @@ module Servant.API.ContentTypesSpec where
88
99#if !MIN_VERSION_base(4,8,0)
1010import Control.Applicative
11+import Data.Monoid
1112#endif
1213import Control.Arrow
13−import Data.Either
1414import Data.Aeson
1515import Data.Aeson.Parser (jstring)
1616import Data.Attoparsec.ByteString (parseOnly)
17+import Data.Either
1718import Data.Function (on)
1819import Data.Proxy
19−
2020import Data.ByteString.Char8 (ByteString, append, pack)
2121import qualified Data.ByteString.Lazy as BSL
2222import Data.List (maximumBy)
@@ -26,7 +26,6 @@ import Data.String.Conversions (cs)
2626import qualified Data.Text as TextS
2727import qualified Data.Text.Lazy as TextL
2828import GHC.Generics
29−import Data.Monoid
3029import Network.URL (exportParams, importParams)
3130import Test.Hspec
3231import Test.QuickCheck
@@ -43,6 +42,9 @@ spec = describe "Servant.API.ContentTypes" $ do
4342 it "handles whitespace at end of input" $ do
4443 mimeUnrender p "[1] " `shouldBe` Right [1 :: Int]
4544
45+ it "handles whitespace at beginning of input" $ do
46+ mimeUnrender p " [1] " `shouldBe` Right [1 :: Int]
47+
4648 it "does not like junk at end of input" $ do
4749 mimeUnrender p "[1] this probably shouldn't work"
4850 `shouldSatisfy` (isLeft :: Either a [Int] -> Bool)