package burp
import (
"encoding/base64"
"io"
"strings"
"github.com/pkg/errors"
"github.com/projectdiscovery/nuclei/v3/pkg/input/formats"
"github.com/projectdiscovery/nuclei/v3/pkg/input/types"
"github.com/projectdiscovery/utils/conversion"
"github.com/seh-msft/burpxml"
)
type BurpFormat struct {
opts formats.InputFormatOptions
}
func New() *BurpFormat {
return &BurpFormat{}
}
var _ formats.Format = &BurpFormat{}
func (j *BurpFormat) Name() string {
return "burp"
}
func (j *BurpFormat) SetOptions(options formats.InputFormatOptions) {
j.opts = options
}
func (j *BurpFormat) Parse(input io.Reader, resultsCb formats.ParseReqRespCallback, filePath string) error {
items, err := burpxml.Parse(input, true)
if err != nil {
return errors.Wrap(err, "could not decode burp xml schema")
}
for _, item := range items.Items {
item := item
binx, err := base64.StdEncoding.DecodeString(item.Request.Raw)
if err != nil {
return errors.Wrap(err, "could not decode base64")
}
if strings.TrimSpace(conversion.String(binx)) == "" {
continue
}
rawRequest, err := types.ParseRawRequestWithURL(conversion.String(binx), item.Url)
if err != nil {
return errors.Wrap(err, "could not parse raw request")
}
resultsCb(rawRequest)
}
return nil
}