forked from OSS/graphql
Escape non-source characters in the encoder
This commit is contained in:
parent
0cbe69736b
commit
9a5d54c035
@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file.
|
|||||||
- Fragment spread is evaluated based on the `__typename` resolver. If the
|
- Fragment spread is evaluated based on the `__typename` resolver. If the
|
||||||
resolver is missing, it is assumed that the type condition is satisfied (all
|
resolver is missing, it is assumed that the type condition is satisfied (all
|
||||||
fragments are included).
|
fragments are included).
|
||||||
|
- Escaping characters during encoding.
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
- Directive support (@skip and @include).
|
- Directive support (@skip and @include).
|
||||||
|
@ -18,6 +18,7 @@ import Data.Monoid ((<>))
|
|||||||
import qualified Data.List.NonEmpty as NonEmpty (toList)
|
import qualified Data.List.NonEmpty as NonEmpty (toList)
|
||||||
import Data.Text.Lazy (Text)
|
import Data.Text.Lazy (Text)
|
||||||
import qualified Data.Text.Lazy as Text.Lazy
|
import qualified Data.Text.Lazy as Text.Lazy
|
||||||
|
import qualified Data.Text.Lazy.Builder as Builder
|
||||||
import Data.Text.Lazy.Builder (toLazyText)
|
import Data.Text.Lazy.Builder (toLazyText)
|
||||||
import Data.Text.Lazy.Builder.Int (decimal)
|
import Data.Text.Lazy.Builder.Int (decimal)
|
||||||
import Data.Text.Lazy.Builder.RealFloat (realFloat)
|
import Data.Text.Lazy.Builder.RealFloat (realFloat)
|
||||||
@ -191,10 +192,18 @@ booleanValue True = "true"
|
|||||||
booleanValue False = "false"
|
booleanValue False = "false"
|
||||||
|
|
||||||
stringValue :: Text -> Text
|
stringValue :: Text -> Text
|
||||||
stringValue
|
stringValue string = Builder.toLazyText
|
||||||
= quotes
|
$ quote
|
||||||
. Text.Lazy.replace "\"" "\\\""
|
<> Text.Lazy.foldr replace quote string
|
||||||
. Text.Lazy.replace "\\" "\\\\"
|
where
|
||||||
|
replace '\\' = mappend $ Builder.fromLazyText "\\\\"
|
||||||
|
replace '\"' = mappend $ Builder.fromLazyText "\\\""
|
||||||
|
replace '\b' = mappend $ Builder.fromLazyText "\\b"
|
||||||
|
replace '\f' = mappend $ Builder.fromLazyText "\\f"
|
||||||
|
replace '\n' = mappend $ Builder.fromLazyText "\\n"
|
||||||
|
replace '\r' = mappend $ Builder.fromLazyText "\\r"
|
||||||
|
replace char = mappend $ Builder.singleton char
|
||||||
|
quote = Builder.singleton '\"'
|
||||||
|
|
||||||
listValue :: Formatter -> [Full.Value] -> Text
|
listValue :: Formatter -> [Full.Value] -> Text
|
||||||
listValue formatter = bracketsCommas formatter $ value formatter
|
listValue formatter = bracketsCommas formatter $ value formatter
|
||||||
@ -243,9 +252,6 @@ brackets = between '[' ']'
|
|||||||
braces :: Text -> Text
|
braces :: Text -> Text
|
||||||
braces = between '{' '}'
|
braces = between '{' '}'
|
||||||
|
|
||||||
quotes :: Text -> Text
|
|
||||||
quotes = between '"' '"'
|
|
||||||
|
|
||||||
spaces :: forall a. (a -> Text) -> [a] -> Text
|
spaces :: forall a. (a -> Text) -> [a] -> Text
|
||||||
spaces f = Text.Lazy.intercalate "\SP" . fmap f
|
spaces f = Text.Lazy.intercalate "\SP" . fmap f
|
||||||
|
|
||||||
|
@ -17,3 +17,5 @@ spec = describe "value" $ do
|
|||||||
value minified (String "\\") `shouldBe` "\"\\\\\""
|
value minified (String "\\") `shouldBe` "\"\\\\\""
|
||||||
it "escapes quotes" $
|
it "escapes quotes" $
|
||||||
value minified (String "\"") `shouldBe` "\"\\\"\""
|
value minified (String "\"") `shouldBe` "\"\\\"\""
|
||||||
|
it "escapes backspace" $
|
||||||
|
value minified (String "a\bc") `shouldBe` "\"a\\bc\""
|
||||||
|
Loading…
Reference in New Issue
Block a user