{"record":{"id":"13b36691ff97c6db","repo":"projectdiscovery/katana","slug":"result-does-not-match-extension-filter","errorCode":null,"errorMessage":"result does not match extension filter","messagePattern":"result does not match extension filter","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"info","filePath":"pkg/output/output.go","lineNumber":193,"sourceCode":"}\n\n// Write writes the result to file and/or screen.\nfunc (w *StandardWriter) Write(result *Result) error {\n\tif result == nil {\n\t\treturn errors.New(\"result is nil\")\n\t}\n\n\t// Skip empty responses (e.g., from similarity filtering)\n\tif result.Response != nil && result.Response.Resp == nil && result.Response.Body == \"\" && result.Error == \"\" {\n\t\treturn errors.New(\"response filtered by similarity detection\")\n\t}\n\n\tif len(w.storeFields) > 0 {\n\t\tstoreFields(result, w.storeFields)\n\t}\n\n\tif !w.extensionValidator.ValidatePath(result.Request.URL) {\n\t\treturn errors.New(\"result does not match extension filter\")\n\t}\n\n\tif !w.matchOutput(result) {\n\t\treturn errors.New(\"result does not match output\")\n\t}\n\tif w.filterOutput(result) {\n\t\treturn errors.New(\"result is filtered out\")\n\t}\n\tif len(w.filterPageType) > 0 && result.Response != nil && result.Response.KnowledgeBase != nil {\n\t\tif pageType, ok := result.Response.KnowledgeBase[\"PageType\"].(string); ok {\n\t\t\tfor _, ft := range w.filterPageType {\n\t\t\t\tif strings.EqualFold(pageType, ft) {\n\t\t\t\t\treturn errors.New(\"result filtered by page type\")\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tvar data []byte","sourceCodeStart":175,"sourceCodeEnd":211,"githubUrl":"https://github.com/projectdiscovery/katana/blob/e3e742739c3746f085943ce918fb4e2b8daf6fe6/pkg/output/output.go#L175-L211","documentation":"StandardWriter.Write returns this when the result's request URL fails the extension validator (w.extensionValidator.ValidatePath). Katana only emits results whose URL extension passes the configured extension match/filter rules; anything else is rejected at the output stage.","triggerScenarios":"Calling Write(result) when result.Request.URL has a file extension excluded by -ef (extension filter) or not included by the extension match configuration, so extensionValidator.ValidatePath returns false.","commonSituations":"Crawling with extension filters configured (e.g. -ef png,jpg,css) while feeding results into a custom writer; URLs ending in filtered extensions like .jpg or .zip reaching the output pipeline; misconfigured extension list that unintentionally excludes wanted extensions.","solutions":["Review the extension filter configuration (-ef / extension match options) and remove or broaden it so the URL in question passes.","Pre-validate the URL extension in your own code before calling Write and skip non-matching results.","Confirm the URL is correct — an unexpected path (e.g. a redirect to a filtered asset) is often the cause.","Implement a custom writer/validator if you need different extension semantics."],"exampleFix":"// before\nfor _, res := range results {\n    _ = writer.Write(res) // fails for .jpg URLs when -ef jpg set\n}\n// after\nfor _, res := range results {\n    if !allowedExtension(res.Request.URL) {\n        continue\n    }\n    if err := writer.Write(res); err != nil {\n        return err\n    }\n}","handlingStrategy":"validation","validationCode":"func matchesExtensionFilter(rawURL string, allowed, excluded []string) bool {\n    ext := strings.ToLower(path.Ext(rawURL))\n    if slices.Contains(excluded, strings.TrimPrefix(ext, \".\")) { return false }\n    if len(allowed) > 0 && !slices.Contains(allowed, strings.TrimPrefix(ext, \".\")) { return false }\n    return true\n}","typeGuard":null,"tryCatchPattern":"if err := writer.Write(result); err != nil {\n    if err.Error() == \"result does not match extension filter\" {\n        log.Debugf(\"skipped by extension filter: %s\", result.Request.URL)\n        return nil\n    }\n    return err\n}","preventionTips":["Audit -ef / extension filter flags before long crawls","Pre-filter URLs by extension in your own pipeline","Log skipped URLs at debug level to catch overly broad filters"],"tags":["output","filtering","extensions","go"],"backgroundTag":"result-filtered-by-output-rules","analyzedSha":"e3e742739c3746f085943ce918fb4e2b8daf6fe6","analyzedAt":"2026-09-03T14:55:13.248Z","contentChangedAt":"2026-09-03T14:55:13.248Z","schemaVersion":2},"datasetVersion":"2026-09-10T17:17:09.494Z"}