Tarun Koyalwar c1bd4f82ea
Multiple bug fixes in query param fuzzing (#4925)
* fuzz: check and handle typed slice

* do not query encode params + fuzz/allow duplicates params

* sometimes order matters ~query params

* component: fix broken iterator

* result upload add meta params
2024-03-25 10:08:26 +05:30

63 lines
1.3 KiB
Go

package dataformat
import (
"fmt"
"regexp"
"strings"
"github.com/clbanning/mxj/v2"
)
// XML is an XML encoder
type XML struct{}
// NewXML returns a new XML encoder
func NewXML() *XML {
return &XML{}
}
// IsType returns true if the data is XML encoded
func (x *XML) IsType(data string) bool {
return strings.HasPrefix(data, "<") && strings.HasSuffix(data, ">")
}
// Encode encodes the data into XML format
func (x *XML) Encode(data KV) (string, error) {
var header string
if value := data.Get("#_xml_header"); value != nil {
header = value.(string)
data.Delete("#_xml_header")
}
marshalled, err := mxj.Map(data.Map).Xml()
if err != nil {
return "", err
}
if header != "" {
return fmt.Sprintf("<?%s?>%s", header, string(marshalled)), nil
}
return string(marshalled), err
}
var xmlHeader = regexp.MustCompile(`\<\?(.*)\?\>`)
// Decode decodes the data from XML format
func (x *XML) Decode(data string) (KV, error) {
var prefixStr string
prefix := xmlHeader.FindAllStringSubmatch(data, -1)
if len(prefix) > 0 {
prefixStr = prefix[0][1]
}
decoded, err := mxj.NewMapXml([]byte(data))
if err != nil {
return KV{}, err
}
decoded["#_xml_header"] = prefixStr
return KVMap(decoded), nil
}
// Name returns the name of the encoder
func (x *XML) Name() string {
return XMLDataFormat
}