Skip to content

Commit 702a437

Browse files
committed
fix: Decode function panics when r io.Reader is empty.
1 parent ce21e23 commit 702a437

File tree

4 files changed

+40
-9
lines changed

4 files changed

+40
-9
lines changed

parser.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
package GoHtml
22

33
import (
4+
"errors"
45
"io"
56
"strings"
67

78
"golang.org/x/net/html"
89
)
910

11+
var (
12+
NoNodesFound error = errors.New("No nodes found in the node tree")
13+
)
14+
1015
// Decode reads from rd and create a node-tree. Then returns the root node and nil.
16+
// If no nodes are found Decode returns a error.
17+
// r must no be nil.
1118
func Decode(r io.Reader) (*Node, error) {
1219
t := NewTokenizer(r)
1320
nodeTreeBuilder := NewNodeTreeBuilder()
@@ -19,7 +26,11 @@ func Decode(r io.Reader) (*Node, error) {
1926

2027
nodeTreeBuilder.WriteNodeTree(t.GetCurrentNode(), tt)
2128
}
22-
return nodeTreeBuilder.GetRootNode(), nil
29+
rootNode := nodeTreeBuilder.GetRootNode()
30+
if rootNode == nil {
31+
return nil, NoNodesFound
32+
}
33+
return rootNode, nil
2334
}
2435

2536
// HTMLToNodeTree return html code as a node-tree. If error were to occur it would be SyntaxError.
@@ -28,4 +39,3 @@ func HTMLToNodeTree(html string) (*Node, error) {
2839
node, err := Decode(rd)
2940
return node, err
3041
}
31-

parser_test.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,15 @@ func TestDecode(t *testing.T) {
2727
GoHtml.Encode(&builder, node)
2828
}
2929

30+
func TestDecodeWithAEmptyReader(t *testing.T) {
31+
node, err := GoHtml.Decode(strings.NewReader(""))
32+
if err == nil {
33+
t.Fatal("Expected a error but got no error")
34+
} else if node != nil {
35+
t.Fatal("Expected node to be nil but got a Node")
36+
}
37+
}
38+
3039
func ExampleDecode() {
3140
r := strings.NewReader(`
3241
<!DOCTYPE html>
@@ -52,6 +61,6 @@ func ExampleDecode() {
5261
title = titleNode.GetInnerText()
5362
}
5463
fmt.Println(title)
55-
//Output:
64+
//Output:
5665
//User Profile
5766
}

serializer.go

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ func encodeListAttributes(node *Node) string {
2323
}
2424

2525
// Encode writes to w encoding of the node tree from rootNode.
26-
func Encode(w io.Writer, rootNode *Node) {
26+
// w must not be nil
27+
func Encode(w io.Writer, rootNode *Node) error {
2728
if rootNode == nil {
28-
return
29+
return NoNodesFound
2930
}
3031

3132
type stackFrame struct {
@@ -43,27 +44,36 @@ func Encode(w io.Writer, rootNode *Node) {
4344
currentStackFrame := v.(stackFrame)
4445

4546
if currentStackFrame.isClosingTag {
46-
fmt.Fprintf(w, "</%s>", currentStackFrame.node.GetTagName())
47+
_, err := fmt.Fprintf(w, "</%s>", currentStackFrame.node.GetTagName())
48+
if err != nil {
49+
return err
50+
}
4751
continue
4852
} else if currentStackFrame.node.IsTextNode() {
49-
fmt.Fprint(w, html.EscapeString(currentStackFrame.node.GetText()))
53+
_, err := fmt.Fprint(w, html.EscapeString(currentStackFrame.node.GetText()))
54+
if err != nil {
55+
return err
56+
}
5057
} else {
51-
fmt.Fprintf(w, "<%s%s>", func() string {
58+
_, err := fmt.Fprintf(w, "<%s%s>", func() string {
5259
tagName := currentStackFrame.node.GetTagName()
5360
tagNameUpperCased := strings.ToUpper(tagName)
5461
if tagNameUpperCased == DOCTYPEDTD {
5562
tagName = tagNameUpperCased
5663
}
5764
return tagName
5865
}(), encodeListAttributes(currentStackFrame.node))
66+
if err != nil {
67+
return err
68+
}
5969
}
6070

6171
if currentStackFrame.node.GetNextNode() != nil {
6272
stack.Push(stackFrame{
6373
node: currentStackFrame.node.GetNextNode(),
6474
})
6575
}
66-
if !IsVoidTag(currentStackFrame.node.GetTagName()) && !currentStackFrame.node.IsTextNode(){
76+
if !IsVoidTag(currentStackFrame.node.GetTagName()) && !currentStackFrame.node.IsTextNode() {
6777
stack.Push(stackFrame{
6878
node: currentStackFrame.node,
6979
isClosingTag: true,
@@ -75,6 +85,7 @@ func Encode(w io.Writer, rootNode *Node) {
7585
})
7686
}
7787
}
88+
return nil
7889
}
7990

8091
// NodeTreeToHTML returns encoding of node-tree as a string.

tokenizer.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ type Tokenizer struct {
1414
}
1515

1616
// NewTokenizer returns a new Tokenizer.
17+
// r must not be nil
1718
func NewTokenizer(r io.Reader) Tokenizer {
1819
return Tokenizer{
1920
z: html.NewTokenizer(r),

0 commit comments

Comments
 (0)