Escape non-source characters in the encoder

This commit is contained in:
Eugen Wissner 2019-12-19 06:59:27 +01:00
parent 0cbe69736b
commit 9a5d54c035
3 changed files with 16 additions and 7 deletions

View File

@ -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).

View File

@ -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

View File

@ -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\""