From a880be60a0c3f21f28e070ce125b9122d5b27944 Mon Sep 17 00:00:00 2001 From: iko Date: Thu, 19 Mar 2020 17:11:25 +0300 Subject: [PATCH 1/4] Added percent encoding --- src/Data/Swagger/Internal.hs | 22 ++++++++-- src/Data/Swagger/Internal/AesonUtils.hs | 57 +++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 4 deletions(-) diff --git a/src/Data/Swagger/Internal.hs b/src/Data/Swagger/Internal.hs index d7b1a5b..4aa5e35 100644 --- a/src/Data/Swagger/Internal.hs +++ b/src/Data/Swagger/Internal.hs @@ -56,7 +56,9 @@ import Data.Swagger.Internal.AesonUtils (sopSwaggerGenericToJSON ,AesonDefaultValue(..) ,mkSwaggerAesonOptions ,saoAdditionalPairs - ,saoSubObject) + ,saoSubObject + ,percentEncodeT + ,percentDecodeT) import Data.Swagger.Internal.Utils #if MIN_VERSION_aeson(0,10,0) @@ -1073,8 +1075,14 @@ instance ToJSON SecuritySchemeType where <+> object [ "type" .= ("oauth2" :: Text) ] instance ToJSON Swagger where - toJSON = sopSwaggerGenericToJSON - DEFINE_TOENCODING + toJSON = sopSwaggerGenericToJSON . percentEncodeSwagger + toEncoding = sopSwaggerGenericToEncoding . percentEncodeSwagger + +percentEncodeSwagger :: Swagger -> Swagger +percentEncodeSwagger s = s + { _swaggerDefinitions = + InsOrdHashMap.mapKeys percentEncodeT $ _swaggerDefinitions s + } instance ToJSON SecurityScheme where toJSON = sopSwaggerGenericToJSON @@ -1217,7 +1225,13 @@ instance FromJSON SecuritySchemeType where parseJSON _ = empty instance FromJSON Swagger where - parseJSON = sopSwaggerGenericParseJSON + parseJSON = fmap percentDecodeSwagger . sopSwaggerGenericParseJSON + +percentDecodeSwagger :: Swagger -> Swagger +percentDecodeSwagger s = s + { _swaggerDefinitions = + InsOrdHashMap.mapKeys percentEncodeT $ _swaggerDefinitions s + } instance FromJSON SecurityScheme where parseJSON = sopSwaggerGenericParseJSON diff --git a/src/Data/Swagger/Internal/AesonUtils.hs b/src/Data/Swagger/Internal/AesonUtils.hs index 3193670..3733866 100644 --- a/src/Data/Swagger/Internal/AesonUtils.hs +++ b/src/Data/Swagger/Internal/AesonUtils.hs @@ -24,6 +24,11 @@ module Data.Swagger.Internal.AesonUtils ( saoPrefix, saoAdditionalPairs, saoSubObject, + -- * Percent encoding + percentEncodeS, + percentEncodeT, + percentDecodeS, + percentDecodeT, ) where import Prelude () @@ -344,3 +349,55 @@ sopSwaggerGenericToEncoding'' (SwaggerAesonOptions prefix _ sub) = go where (x, y) = span isUpper s #endif + +percentEncodeS :: String -> String +percentEncodeS "" = "" +percentEncodeS ('!' : s) = "%21" <> percentEncodeS s +percentEncodeS ('#' : s) = "%23" <> percentEncodeS s +percentEncodeS ('$' : s) = "%24" <> percentEncodeS s +percentEncodeS ('%' : s) = "%25" <> percentEncodeS s +percentEncodeS ('&' : s) = "%26" <> percentEncodeS s +percentEncodeS ('\'' : s) = "%27" <> percentEncodeS s +percentEncodeS ('(' : s) = "%28" <> percentEncodeS s +percentEncodeS (')' : s) = "%29" <> percentEncodeS s +percentEncodeS ('*' : s) = "%2A" <> percentEncodeS s +percentEncodeS ('+' : s) = "%2B" <> percentEncodeS s +percentEncodeS (',' : s) = "%2C" <> percentEncodeS s +percentEncodeS ('/' : s) = "%2F" <> percentEncodeS s +percentEncodeS (':' : s) = "%3A" <> percentEncodeS s +percentEncodeS (';' : s) = "%3B" <> percentEncodeS s +percentEncodeS ('=' : s) = "%3D" <> percentEncodeS s +percentEncodeS ('?' : s) = "%3F" <> percentEncodeS s +percentEncodeS ('@' : s) = "%40" <> percentEncodeS s +percentEncodeS ('[' : s) = "%5B" <> percentEncodeS s +percentEncodeS (']' : s) = "%5D" <> percentEncodeS s +percentEncodeS (c : s) = c : percentEncodeS s + +percentEncodeT :: Text -> Text +percentEncodeT = T.pack . percentEncodeS . T.unpack + +percentDecodeS :: String -> String +percentDecodeS "" = "" +percentDecodeS ('%':'2':'1':s) = '!' : percentDecodeS s +percentDecodeS ('%':'2':'3':s) = '#' : percentDecodeS s +percentDecodeS ('%':'2':'4':s) = '$' : percentDecodeS s +percentDecodeS ('%':'2':'5':s) = '%' : percentDecodeS s +percentDecodeS ('%':'2':'6':s) = '&' : percentDecodeS s +percentDecodeS ('%':'2':'7':s) = '\'' : percentDecodeS s +percentDecodeS ('%':'2':'8':s) = '(' : percentDecodeS s +percentDecodeS ('%':'2':'9':s) = ')' : percentDecodeS s +percentDecodeS ('%':'2':'A':s) = '*' : percentDecodeS s +percentDecodeS ('%':'2':'B':s) = '+' : percentDecodeS s +percentDecodeS ('%':'2':'C':s) = ',' : percentDecodeS s +percentDecodeS ('%':'2':'F':s) = '/' : percentDecodeS s +percentDecodeS ('%':'3':'A':s) = ':' : percentDecodeS s +percentDecodeS ('%':'3':'B':s) = ';' : percentDecodeS s +percentDecodeS ('%':'3':'D':s) = '=' : percentDecodeS s +percentDecodeS ('%':'3':'F':s) = '?' : percentDecodeS s +percentDecodeS ('%':'4':'0':s) = '@' : percentDecodeS s +percentDecodeS ('%':'5':'B':s) = '[' : percentDecodeS s +percentDecodeS ('%':'5':'D':s) = ']' : percentDecodeS s +percentDecodeS (c : s) = c : percentDecodeS s + +percentDecodeT :: Text -> Text +percentDecodeT = T.pack . percentDecodeS . T.unpack From fa13c4b99e2e0fd9468b5f8cefc6d3471ae05dc7 Mon Sep 17 00:00:00 2001 From: iko Date: Thu, 19 Mar 2020 18:01:25 +0300 Subject: [PATCH 2/4] encode Reference --- src/Data/Swagger/Internal.hs | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/Data/Swagger/Internal.hs b/src/Data/Swagger/Internal.hs index 4aa5e35..410a684 100644 --- a/src/Data/Swagger/Internal.hs +++ b/src/Data/Swagger/Internal.hs @@ -28,6 +28,7 @@ import Control.Lens ((&), (.~), (?~)) import Control.Applicative import Data.Aeson import qualified Data.Aeson.Types as JSON +import Data.Coerce import Data.Data (Data(..), Typeable, mkConstr, mkDataType, Fixity(..), Constr, DataType, constrIndex) import Data.Hashable (Hashable) import qualified Data.HashMap.Strict as HashMap @@ -1082,6 +1083,13 @@ percentEncodeSwagger :: Swagger -> Swagger percentEncodeSwagger s = s { _swaggerDefinitions = InsOrdHashMap.mapKeys percentEncodeT $ _swaggerDefinitions s + , _swaggerParameters = + InsOrdHashMap.mapKeys percentEncodeT $ _swaggerParameters s + , _swaggerResponses = + InsOrdHashMap.mapKeys percentEncodeT $ _swaggerResponses s + , _swaggerSecurityDefinitions = + SecurityDefinitions . InsOrdHashMap.mapKeys percentEncodeT . coerce + $ _swaggerSecurityDefinitions s } instance ToJSON SecurityScheme where @@ -1158,10 +1166,11 @@ instance ToJSON SecurityDefinitions where toJSON (SecurityDefinitions sd) = toJSON sd instance ToJSON Reference where - toJSON (Reference ref) = object [ "$ref" .= ref ] + toJSON (Reference ref) = object [ "$ref" .= percentEncodeT ref ] referencedToJSON :: ToJSON a => Text -> Referenced a -> Value -referencedToJSON prefix (Ref (Reference ref)) = object [ "$ref" .= (prefix <> ref) ] +referencedToJSON prefix (Ref (Reference ref)) = + object [ "$ref" .= (prefix <> percentEncodeT ref) ] referencedToJSON _ (Inline x) = toJSON x instance ToJSON (Referenced Schema) where toJSON = referencedToJSON "#/definitions/" @@ -1230,7 +1239,14 @@ instance FromJSON Swagger where percentDecodeSwagger :: Swagger -> Swagger percentDecodeSwagger s = s { _swaggerDefinitions = - InsOrdHashMap.mapKeys percentEncodeT $ _swaggerDefinitions s + InsOrdHashMap.mapKeys percentDecodeT $ _swaggerDefinitions s + , _swaggerParameters = + InsOrdHashMap.mapKeys percentDecodeT $ _swaggerParameters s + , _swaggerResponses = + InsOrdHashMap.mapKeys percentDecodeT $ _swaggerResponses s + , _swaggerSecurityDefinitions = + SecurityDefinitions . InsOrdHashMap.mapKeys percentDecodeT . coerce + $ _swaggerSecurityDefinitions s } instance FromJSON SecurityScheme where @@ -1328,7 +1344,7 @@ instance FromJSON SecurityDefinitions where parseJSON js = SecurityDefinitions <$> parseJSON js instance FromJSON Reference where - parseJSON (Object o) = Reference <$> o .: "$ref" + parseJSON (Object o) = Reference . percentDecodeT <$> o .: "$ref" parseJSON _ = empty referencedParseJSON :: FromJSON a => Text -> Value -> JSON.Parser (Referenced a) From cdf6de3aea3f6e379881d4f4e70dfaaaab5d0308 Mon Sep 17 00:00:00 2001 From: iko Date: Thu, 19 Mar 2020 18:40:03 +0300 Subject: [PATCH 3/4] Removed swagger percent encoding --- src/Data/Swagger/Internal.hs | 32 +++----------------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/src/Data/Swagger/Internal.hs b/src/Data/Swagger/Internal.hs index 410a684..70e2742 100644 --- a/src/Data/Swagger/Internal.hs +++ b/src/Data/Swagger/Internal.hs @@ -1076,21 +1076,8 @@ instance ToJSON SecuritySchemeType where <+> object [ "type" .= ("oauth2" :: Text) ] instance ToJSON Swagger where - toJSON = sopSwaggerGenericToJSON . percentEncodeSwagger - toEncoding = sopSwaggerGenericToEncoding . percentEncodeSwagger - -percentEncodeSwagger :: Swagger -> Swagger -percentEncodeSwagger s = s - { _swaggerDefinitions = - InsOrdHashMap.mapKeys percentEncodeT $ _swaggerDefinitions s - , _swaggerParameters = - InsOrdHashMap.mapKeys percentEncodeT $ _swaggerParameters s - , _swaggerResponses = - InsOrdHashMap.mapKeys percentEncodeT $ _swaggerResponses s - , _swaggerSecurityDefinitions = - SecurityDefinitions . InsOrdHashMap.mapKeys percentEncodeT . coerce - $ _swaggerSecurityDefinitions s - } + toJSON = sopSwaggerGenericToJSON + DEFINE_TOENCODING instance ToJSON SecurityScheme where toJSON = sopSwaggerGenericToJSON @@ -1234,20 +1221,7 @@ instance FromJSON SecuritySchemeType where parseJSON _ = empty instance FromJSON Swagger where - parseJSON = fmap percentDecodeSwagger . sopSwaggerGenericParseJSON - -percentDecodeSwagger :: Swagger -> Swagger -percentDecodeSwagger s = s - { _swaggerDefinitions = - InsOrdHashMap.mapKeys percentDecodeT $ _swaggerDefinitions s - , _swaggerParameters = - InsOrdHashMap.mapKeys percentDecodeT $ _swaggerParameters s - , _swaggerResponses = - InsOrdHashMap.mapKeys percentDecodeT $ _swaggerResponses s - , _swaggerSecurityDefinitions = - SecurityDefinitions . InsOrdHashMap.mapKeys percentDecodeT . coerce - $ _swaggerSecurityDefinitions s - } + parseJSON = sopSwaggerGenericParseJSON instance FromJSON SecurityScheme where parseJSON = sopSwaggerGenericParseJSON From 4145bdc6c59dd3fd0ae000f0bed8319f00b0207c Mon Sep 17 00:00:00 2001 From: iko Date: Tue, 24 Mar 2020 13:21:29 +0300 Subject: [PATCH 4/4] Removed unneeded import --- src/Data/Swagger/Internal.hs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Data/Swagger/Internal.hs b/src/Data/Swagger/Internal.hs index 70e2742..560b6ec 100644 --- a/src/Data/Swagger/Internal.hs +++ b/src/Data/Swagger/Internal.hs @@ -28,7 +28,6 @@ import Control.Lens ((&), (.~), (?~)) import Control.Applicative import Data.Aeson import qualified Data.Aeson.Types as JSON -import Data.Coerce import Data.Data (Data(..), Typeable, mkConstr, mkDataType, Fixity(..), Constr, DataType, constrIndex) import Data.Hashable (Hashable) import qualified Data.HashMap.Strict as HashMap