crowdsecurity/crowdsec · error

parsing

Error message

parsing: %w

What it means

GetAppsecCoverage unmarshals each .appsec-tests config.yaml into HubTestItemConfig with yaml.Unmarshal and wraps failures as 'parsing: ...'. It means a test config YAML is syntactically invalid or its structure doesn't match the expected fields (the same wrapper is reused for the referenced appsec rule files).

Solutions

  1. Run the offending YAML through a linter/parser (yamllint) to find the syntax error at the file path from the wrapped error message
  2. Fix type mismatches: appsec-rules must be a list of file paths, scalar fields must have the right types
  3. Restore the config.yaml or rule file from the upstream hub branch if it was locally modified

Example fix

# before (broken)
appsec-rules: rules.yaml
# after
appsec-rules:
  - rules.yaml
Defensive patterns

Strategy: try-catch

Validate before calling

var probe map[string]any
if err := yaml.Unmarshal(data, &probe); err != nil {
	return fmt.Errorf("invalid YAML in %s: %w", path, err)
}
if _, ok := probe["appsec-rules"]; ok {
	if _, ok := probe["appsec-rules"].([]any); !ok {
		return fmt.Errorf("%s: 'appsec-rules' must be a list", path)
	}
}

Try / catch

_, err := h.GetAppsecCoverage(hubDir)
var yamlErr *yaml.TypeError
if err != nil && strings.HasPrefix(err.Error(), "parsing:") {
	if errors.As(err, &yamlErr) {
		// fix the offending field reported by yamlErr
	}
	// else: syntax error — lint the YAML file
}

Prevention

When it happens

Trigger: yaml.Unmarshal fails on a config.yaml under hubDir/.appsec-tests/*/ (or on a file listed in its appsec-rules: entries) due to bad YAML syntax or type mismatches (e.g. appsec-rules is a string instead of a list).

Common situations: Hand-edited test config with indentation/tab errors; appsec-rules entries pointing to rule files with malformed YAML; duplicate keys or wrong types after a hub branch update.

Related errors


AI-assisted analysis of crowdsecurity/crowdsec@909b515798 (2026-09-06). Data as JSON: /api/errors/07fac373f725300d. Report an issue: GitHub.

Appendix: source

Thrown at pkg/hubtest/coverage.go:60

	// parser the expressions a-la-oneagain
	appsecTestConfigs, err := filepath.Glob(filepath.Join(hubDir, ".appsec-tests", "*", "config.yaml"))
	if err != nil {
		return nil, fmt.Errorf("while find appsec-tests config: %w", err)
	}

	for _, appsecTestConfigPath := range appsecTestConfigs {
		configFileData := &HubTestItemConfig{}

		yamlFile, err := os.ReadFile(appsecTestConfigPath)
		if err != nil {
			log.Printf("unable to open appsec test config file '%s': %s", appsecTestConfigPath, err)
			continue
		}

		err = yaml.Unmarshal(yamlFile, configFileData)
		if err != nil {
			return nil, fmt.Errorf("parsing: %w", err)
		}

		for _, appsecRulesFile := range configFileData.AppsecRules {
			appsecRuleData := &appsec_rule.CustomRule{}

			yamlFile, err := os.ReadFile(appsecRulesFile)
			if err != nil {
				log.Printf("unable to open appsec rule '%s': %s", appsecRulesFile, err)
			}

			err = yaml.Unmarshal(yamlFile, appsecRuleData)
			if err != nil {
				return nil, fmt.Errorf("parsing: %w", err)
			}

			appsecRuleName := appsecRuleData.Name

			for idx, cov := range coverage {

View on GitHub (pinned to 909b515798)