Path: blob/dev/pkg/operators/extractors/compile.go
2070 views
package extractors12import (3"fmt"4"regexp"5"strings"67"github.com/Knetic/govaluate"8"github.com/itchyny/gojq"9"github.com/projectdiscovery/nuclei/v3/pkg/operators/common/dsl"10)1112// CompileExtractors performs the initial setup operation on an extractor13func (e *Extractor) CompileExtractors() error {14// Set up the extractor type15computedType, err := toExtractorTypes(e.GetType().String())16if err != nil {17return fmt.Errorf("unknown extractor type specified: %s", e.Type)18}19e.extractorType = computedType20// Compile the regexes21for _, regex := range e.Regex {22compiled, err := regexp.Compile(regex)23if err != nil {24return fmt.Errorf("could not compile regex: %s", regex)25}26e.regexCompiled = append(e.regexCompiled, compiled)27}28for i, kval := range e.KVal {29e.KVal[i] = strings.ToLower(kval)30}3132for _, query := range e.JSON {33query, err := gojq.Parse(query)34if err != nil {35return fmt.Errorf("could not parse json: %s", query)36}37compiled, err := gojq.Compile(query)38if err != nil {39return fmt.Errorf("could not compile json: %s", query)40}41e.jsonCompiled = append(e.jsonCompiled, compiled)42}4344for _, dslExp := range e.DSL {45compiled, err := govaluate.NewEvaluableExpressionWithFunctions(dslExp, dsl.HelperFunctions)46if err != nil {47return &dsl.CompilationError{DslSignature: dslExp, WrappedError: err}48}49e.dslCompiled = append(e.dslCompiled, compiled)50}5152if e.CaseInsensitive {53if e.GetType() != KValExtractor {54return fmt.Errorf("case-insensitive flag is supported only for 'kval' extractors (not '%s')", e.Type)55}56for i := range e.KVal {57e.KVal[i] = strings.ToLower(e.KVal[i])58}59}6061return nil62}636465