Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/pkg/fuzz/dataformat/xml.go
2070 views
1
package dataformat
2
3
import (
4
"fmt"
5
"regexp"
6
"strings"
7
8
"github.com/clbanning/mxj/v2"
9
)
10
11
// XML is an XML encoder
12
type XML struct{}
13
14
// NewXML returns a new XML encoder
15
func NewXML() *XML {
16
return &XML{}
17
}
18
19
// IsType returns true if the data is XML encoded
20
func (x *XML) IsType(data string) bool {
21
return strings.HasPrefix(data, "<") && strings.HasSuffix(data, ">")
22
}
23
24
// Encode encodes the data into XML format
25
func (x *XML) Encode(data KV) (string, error) {
26
var header string
27
if value := data.Get("#_xml_header"); value != nil {
28
header = value.(string)
29
data.Delete("#_xml_header")
30
}
31
marshalled, err := mxj.Map(data.Map).Xml()
32
if err != nil {
33
return "", err
34
}
35
if header != "" {
36
return fmt.Sprintf("<?%s?>%s", header, string(marshalled)), nil
37
}
38
return string(marshalled), err
39
}
40
41
var xmlHeader = regexp.MustCompile(`\<\?(.*)\?\>`)
42
43
// Decode decodes the data from XML format
44
func (x *XML) Decode(data string) (KV, error) {
45
var prefixStr string
46
prefix := xmlHeader.FindAllStringSubmatch(data, -1)
47
if len(prefix) > 0 {
48
prefixStr = prefix[0][1]
49
}
50
51
decoded, err := mxj.NewMapXml([]byte(data))
52
if err != nil {
53
return KV{}, err
54
}
55
decoded["#_xml_header"] = prefixStr
56
return KVMap(decoded), nil
57
}
58
59
// Name returns the name of the encoder
60
func (x *XML) Name() string {
61
return XMLDataFormat
62
}
63
64