Skip to content

Commit e926838

Browse files
Copilotxperiandri
andauthored
Escape U+2028/U+2029 in ToQueryString and add regression tests
Agent-Logs-Url: https://github.com/fsprojects/FSharp.Data.GraphQL/sessions/fe5050da-a1a6-43d1-978f-18d01b969c4c Co-authored-by: xperiandri <2365592+xperiandri@users.noreply.github.com>
1 parent ec333b2 commit e926838

2 files changed

Lines changed: 36 additions & 13 deletions

File tree

src/FSharp.Data.GraphQL.Shared/AstExtensions.fs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,16 @@ and internal AstSelectionInfo = {
3636
} with
3737

3838
member x.AliasOrName = x.Alias |> ValueOption.defaultValue x.Name
39-
static member Create (typeCondition : string voption, path : FieldPath, name : string, alias : string voption, [<Optional>] fields : AstSelectionInfo list) = {
40-
TypeCondition = typeCondition
41-
Name = name
42-
Alias = alias
43-
Path = path
44-
Fields = if obj.ReferenceEquals (fields, null) then [] else fields
45-
}
39+
static member Create
40+
(typeCondition : string voption, path : FieldPath, name : string, alias : string voption, [<Optional>] fields : AstSelectionInfo list)
41+
=
42+
{
43+
TypeCondition = typeCondition
44+
Name = name
45+
Alias = alias
46+
Path = path
47+
Fields = if obj.ReferenceEquals (fields, null) then [] else fields
48+
}
4649
member x.SetFields (fields : AstSelectionInfo list) = x.Fields <- fields
4750

4851
and AstFieldInfo =
@@ -102,11 +105,11 @@ type Document with
102105
/// Generates a GraphQL query string from this document.
103106
/// </summary>
104107
/// <param name="options">Specify custom printing voptions for the query string.</param>
105-
member x.ToQueryString ([<Optional; DefaultParameterValue (QueryStringPrintingOptions.None)>] options : QueryStringPrintingOptions) =
108+
member x.ToQueryString ([<Optional; DefaultParameterValue(QueryStringPrintingOptions.None)>] options : QueryStringPrintingOptions) =
106109
let sb = PaddedStringBuilder ()
107110
let escapeGraphQLString (s : string) =
108-
let escaped = StringBuilder(s.Length + 2)
109-
escaped.Append('"') |> ignore
111+
let escaped = StringBuilder (s.Length + 2)
112+
escaped.Append ('"') |> ignore
110113
for c in s do
111114
let appendStr =
112115
match c with
@@ -117,12 +120,14 @@ type Document with
117120
| '\n' -> "\\n"
118121
| '\r' -> "\\r"
119122
| '\t' -> "\\t"
123+
| '\u2028' -> "\\u2028"
124+
| '\u2029' -> "\\u2029"
120125
| c when c < '\u0020' ->
121-
let hex = (int c).ToString("x4", CultureInfo.InvariantCulture)
126+
let hex = (int c).ToString ("x4", CultureInfo.InvariantCulture)
122127
"\\u" + hex
123128
| c -> string c
124-
escaped.Append(appendStr) |> ignore
125-
escaped.Append('"').ToString()
129+
escaped.Append (appendStr) |> ignore
130+
escaped.Append('"').ToString ()
126131
let withQuotes = escapeGraphQLString
127132
let rec printValue x =
128133
let printObjectValue (name, value) =

tests/FSharp.Data.GraphQL.Tests/AstExtensionsTests.fs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,24 @@ let ``ToQueryString escapes control characters as unicode in string values`` ()
456456
let reparsed = parse printed
457457
equals (document.ToQueryString ()) (reparsed.ToQueryString ())
458458

459+
[<Fact>]
460+
let ``ToQueryString escapes unicode line separator in string values`` () =
461+
let query = """query q { hero(text: "\u2028") }"""
462+
let document = parse query
463+
let printed = document.ToQueryString ()
464+
Assert.Contains ("\\u2028", printed)
465+
let reparsed = parse printed
466+
equals (document.ToQueryString ()) (reparsed.ToQueryString ())
467+
468+
[<Fact>]
469+
let ``ToQueryString escapes unicode paragraph separator in string values`` () =
470+
let query = """query q { hero(text: "\u2029") }"""
471+
let document = parse query
472+
let printed = document.ToQueryString ()
473+
Assert.Contains ("\\u2029", printed)
474+
let reparsed = parse printed
475+
equals (document.ToQueryString ()) (reparsed.ToQueryString ())
476+
459477
[<Fact>]
460478
let ``ToQueryString escapes multiple special characters correctly`` () =
461479
let query = """query q { hero(text: "quote:\"newline:\nslash:\\tab:\t") }"""

0 commit comments

Comments
 (0)