@@ -44,7 +44,7 @@ import Servant.API ((:<|>) (..), (:>), AuthProtect,
44
44
NoContent (.. ), Patch , PlainText ,
45
45
Post , Put ,
46
46
QueryFlag , QueryParam , QueryParams ,
47
- Raw , RemoteHost , ReqBody ,
47
+ QueryParamForm , Raw , RemoteHost , ReqBody ,
48
48
StdMethod (.. ), Verb , addHeader )
49
49
import Servant.API.Internal.Test.ComprehensiveAPI
50
50
import Servant.Server (Server , Handler , err401 , err403 ,
@@ -64,6 +64,7 @@ import Servant.Server.Experimental.Auth
64
64
mkAuthHandler )
65
65
import Servant.Server.Internal.Context
66
66
(NamedContext (.. ))
67
+ import Web.FormUrlEncoded (FromForm )
67
68
68
69
-- * comprehensive api test
69
70
@@ -277,12 +278,13 @@ type QueryParamApi = QueryParam "name" String :> Get '[JSON] Person
277
278
:<|> " b" :> QueryFlag " capitalize" :> Get '[JSON ] Person
278
279
:<|> " param" :> QueryParam " age" Integer :> Get '[JSON ] Person
279
280
:<|> " multiparam" :> QueryParams " ages" Integer :> Get '[JSON ] Person
281
+ :<|> " paramform" :> QueryParamForm Person :> Get '[JSON ] Person
280
282
281
283
queryParamApi :: Proxy QueryParamApi
282
284
queryParamApi = Proxy
283
285
284
286
qpServer :: Server QueryParamApi
285
- qpServer = queryParamServer :<|> qpNames :<|> qpCapitalize :<|> qpAge :<|> qpAges
287
+ qpServer = queryParamServer :<|> qpNames :<|> qpCapitalize :<|> qpAge :<|> qpAges :<|> qpPerson
286
288
287
289
where qpNames (_: name2: _) = return alice { name = name2 }
288
290
qpNames _ = return alice
@@ -295,6 +297,8 @@ qpServer = queryParamServer :<|> qpNames :<|> qpCapitalize :<|> qpAge :<|> qpAge
295
297
296
298
qpAges ages = return alice{ age = sum ages}
297
299
300
+ qpPerson person = return person
301
+
298
302
queryParamServer (Just name_) = return alice{name = name_}
299
303
queryParamServer Nothing = return alice
300
304
@@ -410,6 +414,28 @@ queryParamSpec = do
410
414
name = " Alice"
411
415
}
412
416
417
+ it " parses query form" $
418
+ (flip runSession) (serve queryParamApi qpServer) $ do
419
+ let params = " ?name=Alice&age=42"
420
+ response <- Network.Wai.Test. request defaultRequest{
421
+ rawQueryString = params,
422
+ queryString = parseQuery params,
423
+ pathInfo = [" paramform" ]
424
+ }
425
+ liftIO $
426
+ decode' (simpleBody response) `shouldBe` Just alice
427
+
428
+ it " generates an error on parse failures of query form" $
429
+ (flip runSession) (serve queryParamApi qpServer) $ do
430
+ let params = " ?name=Alice"
431
+ response <- Network.Wai.Test. request defaultRequest{
432
+ rawQueryString = params,
433
+ queryString = parseQuery params,
434
+ pathInfo = [" paramform" ]
435
+ }
436
+ liftIO $ statusCode (simpleStatus response) `shouldBe` 400
437
+ return ()
438
+
413
439
-- }}}
414
440
------------------------------------------------------------------------------
415
441
-- * reqBodySpec {{{
@@ -732,6 +758,7 @@ data Person = Person {
732
758
733
759
instance ToJSON Person
734
760
instance FromJSON Person
761
+ instance FromForm Person
735
762
736
763
alice :: Person
737
764
alice = Person " Alice" 42
0 commit comments