Skip to content

Commit 249154d

Browse files
authored
Merge branch 'main' into repo-assist/fix-issue-1431-with-methods-ce7b64094b94985d
2 parents 20673bd + c6a017a commit 249154d

100 files changed

Lines changed: 735 additions & 668 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/repo-assist.lock.yml

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.github/workflows/repo-assist.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ network:
3535
- api.worldbank.org
3636
- schemas.microsoft.com
3737
- tomasp.net
38+
- http://www.w3.org
39+
- http://schemas.microsoft.com
3840

3941
safe-outputs:
4042
add-comment:

src/FSharp.Data.DesignTime/Xml/XmlProvider.fs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ type public XmlProvider(cfg: TypeProviderConfig) as this =
5151
let schema = args.[8] :?> string
5252
let inferenceMode = args.[9] :?> InferenceMode
5353
let preferDateOnly = args.[10] :?> bool
54-
let useOriginalNames = args.[11] :?> bool
54+
let dtdProcessing = args.[11] :?> string
55+
let useOriginalNames = args.[12] :?> bool
5556

5657
let inferenceMode =
5758
InferenceMode'.FromPublicApi(inferenceMode, inferTypesFromValues)
@@ -103,7 +104,8 @@ type public XmlProvider(cfg: TypeProviderConfig) as this =
103104

104105
{ GeneratedType = tpType
105106
RepresentationType = result.ConvertedType
106-
CreateFromTextReader = fun reader -> result.Converter <@@ XmlElement.Create(%reader) @@>
107+
CreateFromTextReader =
108+
fun reader -> result.Converter <@@ XmlElement.Create(%reader, dtdProcessing) @@>
107109
CreateListFromTextReader = None
108110
CreateFromTextReaderForSampleList =
109111
fun reader -> // hack: this will actually parse the schema
@@ -117,10 +119,10 @@ type public XmlProvider(cfg: TypeProviderConfig) as this =
117119
use _holder = IO.logTime "Parsing" sample
118120

119121
if sampleIsList then
120-
XmlElement.CreateList(new StringReader(value))
122+
XmlElement.CreateList(new StringReader(value), dtdProcessing)
121123
|> Array.map (fun doc -> doc.XElement)
122124
else
123-
[| XDocument.Parse(value).Root |]
125+
[| XmlElement.Create(new StringReader(value), dtdProcessing).XElement |]
124126

125127
let inferedType =
126128
use _holder = IO.logTime "Inference" sample
@@ -159,10 +161,11 @@ type public XmlProvider(cfg: TypeProviderConfig) as this =
159161

160162
{ GeneratedType = tpType
161163
RepresentationType = result.ConvertedType
162-
CreateFromTextReader = fun reader -> result.Converter <@@ XmlElement.Create(%reader) @@>
164+
CreateFromTextReader =
165+
fun reader -> result.Converter <@@ XmlElement.Create(%reader, dtdProcessing) @@>
163166
CreateListFromTextReader = None
164167
CreateFromTextReaderForSampleList =
165-
fun reader -> result.Converter <@@ XmlElement.CreateList(%reader) @@>
168+
fun reader -> result.Converter <@@ XmlElement.CreateList(%reader, dtdProcessing) @@>
166169
CreateFromValue = None }
167170

168171
let source =
@@ -199,6 +202,7 @@ type public XmlProvider(cfg: TypeProviderConfig) as this =
199202
parameterDefaultValue = InferenceMode.BackwardCompatible
200203
)
201204
ProvidedStaticParameter("PreferDateOnly", typeof<bool>, parameterDefaultValue = false)
205+
ProvidedStaticParameter("DtdProcessing", typeof<string>, parameterDefaultValue = "Ignore")
202206
ProvidedStaticParameter("UseOriginalNames", typeof<bool>, parameterDefaultValue = false) ]
203207

204208
let helpText =
@@ -224,6 +228,7 @@ type public XmlProvider(cfg: TypeProviderConfig) as this =
224228
Note inline schemas are not used from Xsd documents.
225229
</param>
226230
<param name='PreferDateOnly'>When true on .NET 6+, date-only strings are inferred as DateOnly and time-only strings as TimeOnly. Defaults to false for backward compatibility.</param>
231+
<param name='DtdProcessing'>Controls how DTD declarations in the XML are handled. Accepted values: "Ignore" (default, silently skips DTD processing, safe for most cases), "Prohibit" (throws on any DTD declaration), "Parse" (enables full DTD processing including entity expansion, use with caution).</param>
227232
<param name='UseOriginalNames'>When true, XML element and attribute names are used as-is for generated property names instead of being normalized to PascalCase. Defaults to false.</param>"""
228233

229234

src/FSharp.Data.WorldBank.Core/WorldBankRuntime.fs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,8 +247,7 @@ module Implementation =
247247
/// At runtime, download the data
248248
member internal __.GetDataAsync(countryOrRegionCode, indicatorCode) =
249249
async {
250-
let! data =
251-
getData [ "countries"; countryOrRegionCode; "indicators"; indicatorCode ] [ "date", "" ] "date"
250+
let! data = getData [ "countries"; countryOrRegionCode; "indicators"; indicatorCode ] [] "date"
252251

253252
return
254253
seq {

src/FSharp.Data.Xml.Core/XmlRuntime.fs

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ namespace FSharp.Data.Runtime.BaseTypes
66

77
open System.ComponentModel
88
open System.IO
9+
open System.Xml
910
open System.Xml.Linq
1011

1112
#nowarn "10001"
@@ -54,9 +55,37 @@ type XmlElement =
5455
10001,
5556
IsHidden = true,
5657
IsError = false)>]
57-
static member Create(reader: TextReader) =
58+
static member Create(reader: TextReader) = XmlElement.Create(reader, "Prohibit")
59+
60+
/// <exclude />
61+
[<EditorBrowsableAttribute(EditorBrowsableState.Never)>]
62+
[<CompilerMessageAttribute("This method is intended for use in generated code only.",
63+
10001,
64+
IsHidden = true,
65+
IsError = false)>]
66+
static member CreateList(reader: TextReader) =
67+
XmlElement.CreateList(reader, "Prohibit")
68+
69+
/// <exclude />
70+
[<EditorBrowsableAttribute(EditorBrowsableState.Never)>]
71+
[<CompilerMessageAttribute("This method is intended for use in generated code only.",
72+
10001,
73+
IsHidden = true,
74+
IsError = false)>]
75+
static member Create(reader: TextReader, dtdProcessing: string) =
5876
use reader = reader
59-
let element = XDocument.Load(reader, LoadOptions.PreserveWhitespace).Root
77+
78+
let dtd =
79+
match dtdProcessing with
80+
| "Ignore" -> DtdProcessing.Ignore
81+
| "Parse" -> DtdProcessing.Parse
82+
| _ -> DtdProcessing.Prohibit
83+
84+
let xmlReaderSettings =
85+
new XmlReaderSettings(DtdProcessing = dtd, XmlResolver = null, MaxCharactersFromEntities = 1024L * 1024L)
86+
87+
use xmlReader = XmlReader.Create(reader, xmlReaderSettings)
88+
let element = XDocument.Load(xmlReader, LoadOptions.PreserveWhitespace).Root
6089
{ XElement = element }
6190

6291
/// <exclude />
@@ -65,16 +94,30 @@ type XmlElement =
6594
10001,
6695
IsHidden = true,
6796
IsError = false)>]
68-
static member CreateList(reader: TextReader) =
97+
static member CreateList(reader: TextReader, dtdProcessing: string) =
6998
use reader = reader
7099
let text = reader.ReadToEnd()
71100

101+
let dtd =
102+
match dtdProcessing with
103+
| "Ignore" -> DtdProcessing.Ignore
104+
| "Parse" -> DtdProcessing.Parse
105+
| _ -> DtdProcessing.Prohibit
106+
107+
let xmlReaderSettings =
108+
new XmlReaderSettings(DtdProcessing = dtd, XmlResolver = null, MaxCharactersFromEntities = 1024L * 1024L)
109+
110+
let parseWithReader xmlText =
111+
use stringReader = new StringReader(xmlText)
112+
use xmlReader = XmlReader.Create(stringReader, xmlReaderSettings)
113+
XDocument.Load(xmlReader, LoadOptions.PreserveWhitespace)
114+
72115
try
73-
XDocument.Parse(text, LoadOptions.PreserveWhitespace).Root.Elements()
116+
(parseWithReader text).Root.Elements()
74117
|> Seq.map (fun value -> { XElement = value })
75118
|> Seq.toArray
76119
with _ when text.TrimStart().StartsWith "<" ->
77-
XDocument.Parse("<root>" + text + "</root>", LoadOptions.PreserveWhitespace).Root.Elements()
120+
(parseWithReader ("<root>" + text + "</root>")).Root.Elements()
78121
|> Seq.map (fun value -> { XElement = value })
79122
|> Seq.toArray
80123

0 commit comments

Comments
 (0)