nuclei/pkg/fuzz/dataformat/dataformat.go
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

99 lines
2.4 KiB
Go

package dataformat
import (
"errors"
"fmt"
)
// dataformats is a list of dataformats
var dataformats map[string]DataFormat
const (
// DefaultKey is the key i.e used when given
// data is not of k-v type
DefaultKey = "value"
)
func init() {
dataformats = make(map[string]DataFormat)
// register the default data formats
RegisterDataFormat(NewJSON())
RegisterDataFormat(NewXML())
RegisterDataFormat(NewRaw())
RegisterDataFormat(NewForm())
RegisterDataFormat(NewMultiPartForm())
}
const (
// JSONDataFormat is the name of the JSON data format
JSONDataFormat = "json"
// XMLDataFormat is the name of the XML data format
XMLDataFormat = "xml"
// RawDataFormat is the name of the Raw data format
RawDataFormat = "raw"
// FormDataFormat is the name of the Form data format
FormDataFormat = "form"
// MultiPartFormDataFormat is the name of the MultiPartForm data format
MultiPartFormDataFormat = "multipart/form-data"
)
// Get returns the dataformat by name
func Get(name string) DataFormat {
return dataformats[name]
}
// RegisterEncoder registers an encoder
func RegisterDataFormat(dataformat DataFormat) {
dataformats[dataformat.Name()] = dataformat
}
// DataFormat is an interface for encoding and decoding
type DataFormat interface {
// IsType returns true if the data is of the type
IsType(data string) bool
// Name returns the name of the encoder
Name() string
// Encode encodes the data into a format
Encode(data KV) (string, error)
// Decode decodes the data from a format
Decode(input string) (KV, error)
}
// Decoded is a decoded data format
type Decoded struct {
// DataFormat is the data format
DataFormat string
// Data is the decoded data
Data KV
}
// Decode decodes the data from a format
func Decode(data string) (*Decoded, error) {
for _, dataformat := range dataformats {
if dataformat.IsType(data) {
decoded, err := dataformat.Decode(data)
if err != nil {
return nil, err
}
value := &Decoded{
DataFormat: dataformat.Name(),
Data: decoded,
}
return value, nil
}
}
return nil, nil
}
// Encode encodes the data into a format
func Encode(data KV, dataformat string) (string, error) {
if dataformat == "" {
return "", errors.New("dataformat is required")
}
if encoder, ok := dataformats[dataformat]; ok {
return encoder.Encode(data)
}
return "", fmt.Errorf("dataformat %s is not supported", dataformat)
}