@@ -41,6 +41,7 @@ import Network.HTTP.Media (MediaType, mainType, parameters, parseAc
4141 (/:))
4242import Network.Socket (HostName, PortNumber)
4343import Text.Read (readMaybe)
44+import Test.QuickCheck.Arbitrary.Generic
4445
4546import Data.HashMap.Strict.InsOrd (InsOrdHashMap)
4647import qualified Data.HashMap.Strict.InsOrd as InsOrdHashMap
@@ -774,6 +775,20 @@ data Header = Header
774775 , _headerSchema :: Maybe (Referenced Schema)
775776 } deriving (Eq, Show, Generic, Data, Typeable)
776777
778+-- | According to RFC7235
779+data HttpScheme
780+ = Basic
781+ | Bearer
782+ | Digest
783+ | HOBA
784+ | Mutual
785+ | Negotiate
786+ | OAuth
787+ | SCRAM_SHA_1
788+ | SCRAM_SHA_256
789+ | Vapid
790+ deriving (Eq, Show, Generic, Data, Typeable)
791+
777792-- | The location of the API key.
778793data ApiKeyLocation
779794 = ApiKeyQuery
@@ -839,7 +854,7 @@ data OAuth2Flows = OAuth2Flows
839854 } deriving (Eq, Show, Generic, Data, Typeable)
840855
841856data SecuritySchemeType
842− = SecuritySchemeHttp
857+ = SecuritySchemeHttp HttpScheme
843858 | SecuritySchemeApiKey ApiKeyParams
844859 | SecuritySchemeOAuth2 OAuth2Flows
845860 | SecuritySchemeOpenIdConnect URL
@@ -1127,6 +1142,13 @@ instance ToJSON License where
11271142instance ToJSON ServerVariable where
11281143 toJSON = genericToJSON (jsonPrefix "ServerVariable")
11291144
1145+instance ToJSON HttpScheme where
1146+ toJSON scheme = case scheme of
1147+ SCRAM_SHA_1 -> "SCRAM-SHA-1"
1148+ SCRAM_SHA_256 -> "SCRAM-SHA-256"
1149+ Vapid -> "vapid"
1150+ other -> genericToJSON defaultOptions other
1151+
11301152instance ToJSON ApiKeyLocation where
11311153 toJSON = genericToJSON (jsonPrefix "ApiKey")
11321154
@@ -1182,6 +1204,13 @@ instance FromJSON License where
11821204instance FromJSON ServerVariable where
11831205 parseJSON = genericParseJSON (jsonPrefix "ServerVariable")
11841206
1207+instance FromJSON HttpScheme where
1208+ parseJSON = withText "HttpScheme" $ \txt -> case txt of
1209+ "SCRAM-SHA-1" -> pure SCRAM_SHA_1
1210+ "SCRAM-SHA-256" -> pure SCRAM_SHA_256
1211+ "vapid" -> pure Vapid
1212+ _ -> genericParseJSON defaultOptions $ String txt
1213+
11851214instance FromJSON ApiKeyLocation where
11861215 parseJSON = genericParseJSON (jsonPrefix "ApiKey")
11871216
@@ -1229,8 +1258,8 @@ instance ToJSON OAuth2Flows where
12291258 toEncoding = sopSwaggerGenericToEncoding
12301259
12311260instance ToJSON SecuritySchemeType where
1232− toJSON SecuritySchemeHttp
1233− = object [ "type" .= ("http" :: Text) ]
1261+ toJSON (SecuritySchemeHttp scheme)
1262+ = object [ "type" .= ("http" :: Text), "scheme" .= toJSON scheme ]
12341263 toJSON (SecuritySchemeApiKey params)
12351264 = toJSON params
12361265 <+> object [ "type" .= ("apiKey" :: Text) ]
@@ -1379,7 +1408,7 @@ instance FromJSON SecuritySchemeType where
13791408 parseJSON js@(Object o) = do
13801409 (t :: Text) <- o .: "type"
13811410 case t of
1382− "http" -> pure SecuritySchemeHttp
1411+ "http" -> SecuritySchemeHttp <$> o .: "scheme"
13831412 "apiKey" -> SecuritySchemeApiKey <$> parseJSON js
13841413 "oauth2" -> SecuritySchemeOAuth2 <$> (o .: "flows")
13851414 "openIdConnect" -> SecuritySchemeOpenIdConnect <$> (o .: "openIdConnectUrl")
@@ -1550,3 +1579,6 @@ instance AesonDefaultValue MimeList where defaultValue = Just mempty
15501579instance AesonDefaultValue Info
15511580instance AesonDefaultValue ParamLocation
15521581instance AesonDefaultValue Link
1582+
1583+instance Arbitrary HttpScheme where
1584+ arbitrary = genericArbitrary