diff --git a/src/Html/HtmlParser.fs b/src/Html/HtmlParser.fs
index 933145a11..c41fcb7a8 100644
--- a/src/Html/HtmlParser.fs
+++ b/src/Html/HtmlParser.fs
@@ -657,6 +657,7 @@ module internal HtmlParser =
and tagName isEndTag state =
match state.Peek() with
| TextParser.Whitespace _ -> state.Pop(); beforeAttributeName state
+ | TextParser.EndOfFile _ -> state.EmitTag(isEndTag)
| '/' -> state.Pop(); selfClosingStartTag state
| '>' -> state.Pop(); state.EmitTag(isEndTag)
| _ -> state.ConsTag(); tagName isEndTag state
@@ -684,6 +685,7 @@ module internal HtmlParser =
| '>' -> state.Pop(); state.EmitTag(false)
| TextParser.LetterDigit _ -> state.ConsAttrName(); attributeName state
| TextParser.Whitespace _ -> afterAttributeName state
+ | TextParser.EndOfFile _ -> state.EmitTag(false)
| _ -> state.ConsAttrName(); attributeName state
and afterAttributeName state =
match state.Peek() with
@@ -695,6 +697,7 @@ module internal HtmlParser =
and beforeAttributeValue state =
match state.Peek() with
| TextParser.Whitespace _ -> state.Pop(); beforeAttributeValue state
+ | TextParser.EndOfFile _ -> state.EmitTag(false)
| '/' -> state.Pop(); selfClosingStartTag state
| '>' -> state.Pop(); state.EmitTag(false)
| '"' -> state.Pop(); attributeValueQuoted '"' state
diff --git a/tests/FSharp.Data.Tests/HtmlParser.fs b/tests/FSharp.Data.Tests/HtmlParser.fs
index 7c7a37e92..359cdf175 100644
--- a/tests/FSharp.Data.Tests/HtmlParser.fs
+++ b/tests/FSharp.Data.Tests/HtmlParser.fs
@@ -907,3 +907,13 @@ let ``Parsing non-html content doesn't cause an infinite loop - Github-1264``()
HtmlNode.NewText content
]
result |> should equal expected
+
+[]
+let ``Can handle incomplete tags at end of file without creating an infinite loop``() =
+ let result = HtmlDocument.Parse """ should equal expected
\ No newline at end of file