Full Code of epi052/feroxbuster for AI

main 242b134a3d37 cached
150 files
2.3 MB
614.9k tokens
1092 symbols
1 requests
Download .txt
Showing preview only (2,457K chars total). Download the full file or copy to clipboard to get everything.
Repository: epi052/feroxbuster
Branch: main
Commit: 242b134a3d37
Files: 150
Total size: 2.3 MB

Directory structure:
gitextract_exndm3wn/

├── .all-contributorsrc
├── .cargo/
│   └── config.toml
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── actions-rs/
│   │   └── grcov.yml
│   ├── dependabot.yml
│   ├── pull_request_template.md
│   ├── stale.yml
│   └── workflows/
│       ├── build.yml
│       ├── check.yml
│       ├── cicd-to-dockerhub.yml
│       ├── coverage.yml
│       └── winget.yml
├── .gitignore
├── .rustfmt.toml
├── CONTRIBUTING.md
├── Cargo.toml
├── Dockerfile
├── LICENSE
├── Makefile
├── Makefile.toml
├── README.md
├── build.rs
├── choco_package/
│   ├── feroxbuster.nuspec
│   ├── legal/
│   │   ├── LICENSE.txt
│   │   └── VERIFICATION.txt
│   └── tools/
│       ├── chocolateyinstall.ps1
│       └── chocolateyuninstall.ps1
├── docs/
│   ├── .nojekyll
│   └── index.html
├── ferox-config.toml.example
├── install-nix.sh
├── shell_completions/
│   ├── _feroxbuster
│   ├── _feroxbuster.ps1
│   ├── feroxbuster.bash
│   ├── feroxbuster.elv
│   └── feroxbuster.fish
├── snapcraft.yaml
├── src/
│   ├── banner/
│   │   ├── container.rs
│   │   ├── entry.rs
│   │   ├── mod.rs
│   │   └── tests.rs
│   ├── client.rs
│   ├── config/
│   │   ├── container.rs
│   │   ├── mod.rs
│   │   ├── tests.rs
│   │   └── utils.rs
│   ├── event_handlers/
│   │   ├── command.rs
│   │   ├── container.rs
│   │   ├── filters.rs
│   │   ├── inputs.rs
│   │   ├── mod.rs
│   │   ├── outputs.rs
│   │   ├── scans.rs
│   │   └── statistics.rs
│   ├── extractor/
│   │   ├── builder.rs
│   │   ├── container.rs
│   │   ├── mod.rs
│   │   └── tests.rs
│   ├── filters/
│   │   ├── container.rs
│   │   ├── empty.rs
│   │   ├── init.rs
│   │   ├── lines.rs
│   │   ├── mod.rs
│   │   ├── regex.rs
│   │   ├── similarity.rs
│   │   ├── size.rs
│   │   ├── status_code.rs
│   │   ├── tests.rs
│   │   ├── utils.rs
│   │   ├── wildcard.rs
│   │   └── words.rs
│   ├── heuristics.rs
│   ├── lib.rs
│   ├── logger.rs
│   ├── macros.rs
│   ├── main.rs
│   ├── message.rs
│   ├── nlp/
│   │   ├── constants.rs
│   │   ├── document.rs
│   │   ├── mod.rs
│   │   ├── model.rs
│   │   ├── term.rs
│   │   └── utils.rs
│   ├── parser.rs
│   ├── progress.rs
│   ├── response.rs
│   ├── scan_manager/
│   │   ├── menu.rs
│   │   ├── mod.rs
│   │   ├── order.rs
│   │   ├── response_container.rs
│   │   ├── scan.rs
│   │   ├── scan_container.rs
│   │   ├── state.rs
│   │   ├── tests.rs
│   │   └── utils.rs
│   ├── scanner/
│   │   ├── ferox_scanner.rs
│   │   ├── init.rs
│   │   ├── limit_heap.rs
│   │   ├── mod.rs
│   │   ├── policy_data.rs
│   │   ├── requester.rs
│   │   ├── tests.rs
│   │   └── utils.rs
│   ├── statistics/
│   │   ├── container.rs
│   │   ├── error.rs
│   │   ├── field.rs
│   │   ├── init.rs
│   │   ├── macros.rs
│   │   ├── mod.rs
│   │   └── tests.rs
│   ├── sync/
│   │   ├── dynamic_semaphore.rs
│   │   └── mod.rs
│   ├── traits.rs
│   ├── url.rs
│   └── utils.rs
└── tests/
    ├── extra-words
    ├── mutual-auth/
    │   ├── Caddyfile
    │   ├── README.md
    │   ├── certs/
    │   │   ├── client/
    │   │   │   ├── client.crt
    │   │   │   └── client.key
    │   │   └── server/
    │   │       ├── ca.crt
    │   │       ├── server.crt
    │   │       ├── server.crt.1
    │   │       ├── server.crt.2
    │   │       ├── server.der
    │   │       └── server.key
    │   └── gen-certs.sh
    ├── payloads/
    │   ├── simple.json
    │   └── simple.key.value
    ├── policies/
    │   ├── README.md
    │   └── test_policies_with_deps.rs
    ├── policy-test-words.shuffled
    ├── test_banner.rs
    ├── test_config.rs
    ├── test_deny_list.rs
    ├── test_dynamic_semaphore.rs
    ├── test_extractor.rs
    ├── test_filters.rs
    ├── test_heuristics.rs
    ├── test_main.rs
    ├── test_parser.rs
    ├── test_policies.rs
    ├── test_rate_limiting.rs
    ├── test_response_size_limit.rs
    ├── test_scan_manager.rs
    ├── test_scanner.rs
    ├── test_unique_responses.rs
    └── utils/
        └── mod.rs

================================================
FILE CONTENTS
================================================

================================================
FILE: .all-contributorsrc
================================================
{
  "files": [
    "README.md"
  ],
  "imageSize": 100,
  "commit": false,
  "contributors": [
    {
      "login": "joohoi",
      "name": "Joona Hoikkala",
      "avatar_url": "https://avatars.githubusercontent.com/u/5235109?v=4",
      "profile": "https://io.fi",
      "contributions": [
        "doc"
      ]
    },
    {
      "login": "jsav0",
      "name": "J Savage",
      "avatar_url": "https://avatars.githubusercontent.com/u/20546041?v=4",
      "profile": "https://github.com/jsav0",
      "contributions": [
        "infra",
        "doc"
      ]
    },
    {
      "login": "TGotwig",
      "name": "Thomas Gotwig",
      "avatar_url": "https://avatars.githubusercontent.com/u/30773779?v=4",
      "profile": "http://www.tgotwig.dev",
      "contributions": [
        "infra",
        "doc"
      ]
    },
    {
      "login": "spikecodes",
      "name": "Spike",
      "avatar_url": "https://avatars.githubusercontent.com/u/19519553?v=4",
      "profile": "https://github.com/spikecodes",
      "contributions": [
        "infra",
        "doc"
      ]
    },
    {
      "login": "evanrichter",
      "name": "Evan Richter",
      "avatar_url": "https://avatars.githubusercontent.com/u/330292?v=4",
      "profile": "https://github.com/evanrichter",
      "contributions": [
        "code",
        "doc"
      ]
    },
    {
      "login": "mzpqnxow",
      "name": "AG",
      "avatar_url": "https://avatars.githubusercontent.com/u/8016228?v=4",
      "profile": "https://github.com/mzpqnxow",
      "contributions": [
        "ideas",
        "doc"
      ]
    },
    {
      "login": "n-thumann",
      "name": "Nicolas Thumann",
      "avatar_url": "https://avatars.githubusercontent.com/u/46975855?v=4",
      "profile": "https://n-thumann.de/",
      "contributions": [
        "code",
        "doc"
      ]
    },
    {
      "login": "tomtastic",
      "name": "Tom Matthews",
      "avatar_url": "https://avatars.githubusercontent.com/u/302127?v=4",
      "profile": "https://github.com/tomtastic",
      "contributions": [
        "doc"
      ]
    },
    {
      "login": "bsysop",
      "name": "bsysop",
      "avatar_url": "https://avatars.githubusercontent.com/u/9998303?v=4",
      "profile": "https://github.com/bsysop",
      "contributions": [
        "doc"
      ]
    },
    {
      "login": "bpsizemore",
      "name": "Brian Sizemore",
      "avatar_url": "https://avatars.githubusercontent.com/u/11645898?v=4",
      "profile": "http://bpsizemore.me",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "noraj",
      "name": "Alexandre ZANNI",
      "avatar_url": "https://avatars.githubusercontent.com/u/16578570?v=4",
      "profile": "https://pwn.by/noraj",
      "contributions": [
        "infra",
        "doc"
      ]
    },
    {
      "login": "craig",
      "name": "Craig",
      "avatar_url": "https://avatars.githubusercontent.com/u/99729?v=4",
      "profile": "https://github.com/craig",
      "contributions": [
        "infra"
      ]
    },
    {
      "login": "EONRaider",
      "name": "EONRaider",
      "avatar_url": "https://avatars.githubusercontent.com/u/15611424?v=4",
      "profile": "https://www.reddit.com/u/EONRaider",
      "contributions": [
        "infra"
      ]
    },
    {
      "login": "wtwver",
      "name": "wtwver",
      "avatar_url": "https://avatars.githubusercontent.com/u/53866088?v=4",
      "profile": "https://github.com/wtwver",
      "contributions": [
        "infra"
      ]
    },
    {
      "login": "Tib3rius",
      "name": "Tib3rius",
      "avatar_url": "https://avatars.githubusercontent.com/u/48113936?v=4",
      "profile": "https://tib3rius.com",
      "contributions": [
        "bug",
        "ideas"
      ]
    },
    {
      "login": "0xdf",
      "name": "0xdf",
      "avatar_url": "https://avatars.githubusercontent.com/u/1489045?v=4",
      "profile": "https://github.com/0xdf",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "secure-77",
      "name": "secure-77",
      "avatar_url": "https://avatars.githubusercontent.com/u/31564517?v=4",
      "profile": "http://secure77.de",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "sbrun",
      "name": "Sophie Brun",
      "avatar_url": "https://avatars.githubusercontent.com/u/7712154?v=4",
      "profile": "https://github.com/sbrun",
      "contributions": [
        "infra"
      ]
    },
    {
      "login": "black-A",
      "name": "black-A",
      "avatar_url": "https://avatars.githubusercontent.com/u/30686803?v=4",
      "profile": "https://github.com/black-A",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "dinosn",
      "name": "Nicolas Krassas",
      "avatar_url": "https://avatars.githubusercontent.com/u/3851678?v=4",
      "profile": "https://github.com/dinosn",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "N0ur5",
      "name": "N0ur5",
      "avatar_url": "https://avatars.githubusercontent.com/u/24260009?v=4",
      "profile": "https://github.com/N0ur5",
      "contributions": [
        "ideas",
        "bug"
      ]
    },
    {
      "login": "moscowchill",
      "name": "mchill",
      "avatar_url": "https://avatars.githubusercontent.com/u/72578879?v=4",
      "profile": "https://github.com/moscowchill",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "BitThr3at",
      "name": "Naman",
      "avatar_url": "https://avatars.githubusercontent.com/u/45028933?v=4",
      "profile": "http://BitThr3at.github.io",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "sicks3c",
      "name": "Ayoub Elaich",
      "avatar_url": "https://avatars.githubusercontent.com/u/32225186?v=4",
      "profile": "https://github.com/Sicks3c",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "HenryHoggard",
      "name": "Henry",
      "avatar_url": "https://avatars.githubusercontent.com/u/1208121?v=4",
      "profile": "https://github.com/HenryHoggard",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "SleepiPanda",
      "name": "SleepiPanda",
      "avatar_url": "https://avatars.githubusercontent.com/u/6428561?v=4",
      "profile": "https://github.com/SleepiPanda",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "uBadRequest",
      "name": "Bad Requests",
      "avatar_url": "https://avatars.githubusercontent.com/u/47282747?v=4",
      "profile": "https://github.com/uBadRequest",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "dnaka91",
      "name": "Dominik Nakamura",
      "avatar_url": "https://avatars.githubusercontent.com/u/36804488?v=4",
      "profile": "https://home.dnaka91.rocks",
      "contributions": [
        "infra"
      ]
    },
    {
      "login": "hunter0x8",
      "name": "Muhammad Ahsan",
      "avatar_url": "https://avatars.githubusercontent.com/u/46222314?v=4",
      "profile": "https://github.com/hunter0x8",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "cortantief",
      "name": "cortantief",
      "avatar_url": "https://avatars.githubusercontent.com/u/34527333?v=4",
      "profile": "https://github.com/cortantief",
      "contributions": [
        "bug",
        "code"
      ]
    },
    {
      "login": "dsaxton",
      "name": "Daniel Saxton",
      "avatar_url": "https://avatars.githubusercontent.com/u/2658661?v=4",
      "profile": "https://github.com/dsaxton",
      "contributions": [
        "ideas",
        "code"
      ]
    },
    {
      "login": "n0kovo",
      "name": "n0kovo",
      "avatar_url": "https://avatars.githubusercontent.com/u/16690056?v=4",
      "profile": "https://github.com/n0kovo",
      "contributions": [
        "ideas",
        "bug"
      ]
    },
    {
      "login": "justinsteven",
      "name": "Justin Steven",
      "avatar_url": "https://avatars.githubusercontent.com/u/1893909?v=4",
      "profile": "https://ring0.lol",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "7047payloads",
      "name": "7047payloads",
      "avatar_url": "https://avatars.githubusercontent.com/u/95562424?v=4",
      "profile": "https://github.com/7047payloads",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "unkn0wnsyst3m",
      "name": "unkn0wnsyst3m",
      "avatar_url": "https://avatars.githubusercontent.com/u/21272239?v=4",
      "profile": "https://github.com/unkn0wnsyst3m",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "its0x08",
      "name": "0x08",
      "avatar_url": "https://avatars.githubusercontent.com/u/15280042?v=4",
      "profile": "https://ironwort.me/",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "MD-Levitan",
      "name": "kusok",
      "avatar_url": "https://avatars.githubusercontent.com/u/12116508?v=4",
      "profile": "https://github.com/MD-Levitan",
      "contributions": [
        "ideas",
        "code"
      ]
    },
    {
      "login": "godylockz",
      "name": "godylockz",
      "avatar_url": "https://avatars.githubusercontent.com/u/81207744?v=4",
      "profile": "https://github.com/godylockz",
      "contributions": [
        "ideas",
        "code"
      ]
    },
    {
      "login": "0dayCTF",
      "name": "Ryan Montgomery",
      "avatar_url": "https://avatars.githubusercontent.com/u/44453666?v=4",
      "profile": "http://ryanmontgomery.me",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "ippsec",
      "name": "ippsec",
      "avatar_url": "https://avatars.githubusercontent.com/u/24677271?v=4",
      "profile": "https://github.com/IppSec",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "gtjamesa",
      "name": "James",
      "avatar_url": "https://avatars.githubusercontent.com/u/2078364?v=4",
      "profile": "https://github.com/gtjamesa",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "jhaddix",
      "name": "Jason Haddix",
      "avatar_url": "https://avatars.githubusercontent.com/u/3488554?v=4",
      "profile": "https://twitter.com/Jhaddix",
      "contributions": [
        "ideas",
        "bug"
      ]
    },
    {
      "login": "ThisLimn0",
      "name": "Limn0",
      "avatar_url": "https://avatars.githubusercontent.com/u/67125885?v=4",
      "profile": "https://github.com/ThisLimn0",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "0xdf223",
      "name": "0xdf",
      "avatar_url": "https://avatars.githubusercontent.com/u/76954092?v=4",
      "profile": "https://github.com/0xdf223",
      "contributions": [
        "bug",
        "ideas"
      ]
    },
    {
      "login": "Flangyver",
      "name": "Flangyver",
      "avatar_url": "https://avatars.githubusercontent.com/u/59575870?v=4",
      "profile": "https://github.com/Flangyver",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "DonatoReis",
      "name": "PeakyBlinder",
      "avatar_url": "https://avatars.githubusercontent.com/u/93531354?v=4",
      "profile": "https://github.com/DonatoReis",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "postmodern",
      "name": "Postmodern",
      "avatar_url": "https://avatars.githubusercontent.com/u/12671?v=4",
      "profile": "https://postmodern.github.io/",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "herrcykel",
      "name": "O",
      "avatar_url": "https://avatars.githubusercontent.com/u/1936757?v=4",
      "profile": "https://github.com/herrcykel",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "udoprog",
      "name": "John-John Tedro",
      "avatar_url": "https://avatars.githubusercontent.com/u/111092?v=4",
      "profile": "http://udoprog.github.io/",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "kmanc",
      "name": "kmanc",
      "avatar_url": "https://avatars.githubusercontent.com/u/14863147?v=4",
      "profile": "https://github.com/kmanc",
      "contributions": [
        "bug",
        "code"
      ]
    },
    {
      "login": "hakdogpinas",
      "name": "hakdogpinas",
      "avatar_url": "https://avatars.githubusercontent.com/u/71529469?v=4",
      "profile": "https://github.com/hakdogpinas",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "duokebei",
      "name": "多可悲",
      "avatar_url": "https://avatars.githubusercontent.com/u/75022552?v=4",
      "profile": "https://github.com/duokebei",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "aidanhall34",
      "name": "Aidan Hall",
      "avatar_url": "https://avatars.githubusercontent.com/u/58670593?v=4",
      "profile": "https://blog.ah34.net/",
      "contributions": [
        "code",
        "infra"
      ]
    },
    {
      "login": "joaociocca",
      "name": "João Ciocca",
      "avatar_url": "https://avatars.githubusercontent.com/u/6473725?v=4",
      "profile": "https://hachyderm.io/@JohnnyCiocca",
      "contributions": [
        "bug",
        "ideas"
      ]
    },
    {
      "login": "f3rn0s",
      "name": "f3rn0s",
      "avatar_url": "https://avatars.githubusercontent.com/u/1351279?v=4",
      "profile": "https://github.com/f3rn0s",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "pich4ya",
      "name": "LongCat",
      "avatar_url": "https://avatars.githubusercontent.com/u/2099767?v=4",
      "profile": "https://sth.sh",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "xaeroborg",
      "name": "xaeroborg",
      "avatar_url": "https://avatars.githubusercontent.com/u/33274680?v=4",
      "profile": "https://github.com/xaeroborg",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "Luoooio",
      "name": "Luoooio",
      "avatar_url": "https://avatars.githubusercontent.com/u/26653157?v=4",
      "profile": "https://github.com/Luoooio",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "aancw",
      "name": "Aan",
      "avatar_url": "https://avatars.githubusercontent.com/u/6284204?v=4",
      "profile": "https://petruknisme.com",
      "contributions": [
        "code",
        "infra",
        "ideas"
      ]
    },
    {
      "login": "imBigo",
      "name": "Simon",
      "avatar_url": "https://avatars.githubusercontent.com/u/54672433?v=4",
      "profile": "https://github.com/imBigo",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "acut3",
      "name": "Nicolas Christin",
      "avatar_url": "https://avatars.githubusercontent.com/u/17295243?v=4",
      "profile": "https://acut3.github.io/",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "DrorDvash",
      "name": "DrDv",
      "avatar_url": "https://avatars.githubusercontent.com/u/8413651?v=4",
      "profile": "https://github.com/DrorDvash",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "aroly",
      "name": "Antoine Roly",
      "avatar_url": "https://avatars.githubusercontent.com/u/1257705?v=4",
      "profile": "https://github.com/aroly",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "lavafroth",
      "name": "Himadri Bhattacharjee",
      "avatar_url": "https://avatars.githubusercontent.com/u/107522312?v=4",
      "profile": "http://lavafroth.is-a.dev",
      "contributions": [
        "code",
        "ideas"
      ]
    },
    {
      "login": "AkechiShiro",
      "name": "Samy Lahfa",
      "avatar_url": "https://avatars.githubusercontent.com/u/14914796?v=4",
      "profile": "https://github.com/AkechiShiro",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "sectroyer",
      "name": "sectroyer",
      "avatar_url": "https://avatars.githubusercontent.com/u/6706818?v=4",
      "profile": "https://github.com/sectroyer",
      "contributions": [
        "bug",
        "ideas"
      ]
    },
    {
      "login": "ktecv2000",
      "name": "ktecv2000",
      "avatar_url": "https://avatars.githubusercontent.com/u/19836003?v=4",
      "profile": "https://medium.com/@b3rm1nG",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "andreademurtas",
      "name": "Andrea De Murtas",
      "avatar_url": "https://avatars.githubusercontent.com/u/56048157?v=4",
      "profile": "http://untrue.me",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "sawmj",
      "name": "sawmj",
      "avatar_url": "https://avatars.githubusercontent.com/u/30024085?v=4",
      "profile": "https://github.com/sawmj",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "devx00",
      "name": "Zach Hanson",
      "avatar_url": "https://avatars.githubusercontent.com/u/6897405?v=4",
      "profile": "https://github.com/devx00",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "ocervell",
      "name": "Olivier Cervello",
      "avatar_url": "https://avatars.githubusercontent.com/u/9629314?v=4",
      "profile": "https://github.com/ocervell",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "RavySena",
      "name": "RavySena",
      "avatar_url": "https://avatars.githubusercontent.com/u/67729597?v=4",
      "profile": "https://github.com/RavySena",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "stuhlmann",
      "name": "Florian Stuhlmann",
      "avatar_url": "https://avatars.githubusercontent.com/u/11061864?v=4",
      "profile": "https://github.com/stuhlmann",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "Mister7F",
      "name": "Mister7F",
      "avatar_url": "https://avatars.githubusercontent.com/u/35213773?v=4",
      "profile": "https://github.com/Mister7F",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "manugramm",
      "name": "manugramm",
      "avatar_url": "https://avatars.githubusercontent.com/u/145961515?v=4",
      "profile": "https://github.com/manugramm",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "ArthurMuraro",
      "name": "ArthurMuraro",
      "avatar_url": "https://avatars.githubusercontent.com/u/73059809?v=4",
      "profile": "https://github.com/ArthurMuraro",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "amiremami",
      "name": "Shadow",
      "avatar_url": "https://avatars.githubusercontent.com/u/15929497?v=4",
      "profile": "https://github.com/amiremami",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "dirhamgithub",
      "name": "dirhamgithub",
      "avatar_url": "https://avatars.githubusercontent.com/u/115349974?v=4",
      "profile": "https://github.com/dirhamgithub",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "FieldOfRice",
      "name": "FieldOfRice",
      "avatar_url": "https://avatars.githubusercontent.com/u/85353?v=4",
      "profile": "https://github.com/FieldOfRice",
      "contributions": [
        "infra"
      ]
    },
    {
      "login": "NotoriousRebel",
      "name": "Matt",
      "avatar_url": "https://avatars.githubusercontent.com/u/36310667?v=4",
      "profile": "https://github.com/NotoriousRebel",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "tritoke",
      "name": "Sam Leonard",
      "avatar_url": "https://avatars.githubusercontent.com/u/34941249?v=4",
      "profile": "https://github.com/tritoke",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "rew1nter",
      "name": "Rewinter",
      "avatar_url": "https://avatars.githubusercontent.com/u/64508791?v=4",
      "profile": "https://github.com/rew1nter",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "deadloot",
      "name": "deadloot",
      "avatar_url": "https://avatars.githubusercontent.com/u/92878901?v=4",
      "profile": "https://github.com/deadloot",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "Spidle",
      "name": "Spidle",
      "avatar_url": "https://avatars.githubusercontent.com/u/90011249?v=4",
      "profile": "https://github.com/Spidle",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "JulianGR",
      "name": "Julián Gómez",
      "avatar_url": "https://avatars.githubusercontent.com/u/53094530?v=4",
      "profile": "https://github.com/JulianGR",
      "contributions": [
        "ideas",
        "infra",
        "doc"
      ]
    },
    {
      "login": "soutzis",
      "name": "Petros",
      "avatar_url": "https://avatars.githubusercontent.com/u/25797286?v=4",
      "profile": "https://github.com/soutzis",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "sitiom",
      "name": "Ryan",
      "avatar_url": "https://avatars.githubusercontent.com/u/56180050?v=4",
      "profile": "https://github.com/sitiom",
      "contributions": [
        "infra",
        "doc"
      ]
    },
    {
      "login": "wikamp-collaborator",
      "name": "wikamp-collaborator",
      "avatar_url": "https://avatars.githubusercontent.com/u/147445097?v=4",
      "profile": "https://github.com/wikamp-collaborator",
      "contributions": [
        "ideas",
        "infra"
      ]
    },
    {
      "login": "L1-0",
      "name": "Lino",
      "avatar_url": "https://avatars.githubusercontent.com/u/123986259?v=4",
      "profile": "http://lino.codes",
      "contributions": [
        "bug",
        "ideas"
      ]
    },
    {
      "login": "sa7mon",
      "name": "Dan Salmon",
      "avatar_url": "https://avatars.githubusercontent.com/u/3712226?v=4",
      "profile": "https://danthesalmon.com",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "swordfish0x0",
      "name": "swordfish0x0",
      "avatar_url": "https://avatars.githubusercontent.com/u/21209130?v=4",
      "profile": "https://github.com/swordfish0x0",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "libklein",
      "name": "Patrick Klein",
      "avatar_url": "https://avatars.githubusercontent.com/u/42714034?v=4",
      "profile": "https://github.com/libklein",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "Raymond-JV",
      "name": "Raymond",
      "avatar_url": "https://avatars.githubusercontent.com/u/23642921?v=4",
      "profile": "https://github.com/Raymond-JV",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "zer0x64",
      "name": "zer0x64",
      "avatar_url": "https://avatars.githubusercontent.com/u/17575242?v=4",
      "profile": "https://github.com/zer0x64",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "zar3bski",
      "name": "zar3bski",
      "avatar_url": "https://avatars.githubusercontent.com/u/22128014?v=4",
      "profile": "https://zar3bski.com",
      "contributions": [
        "code",
        "ideas"
      ]
    },
    {
      "login": "karanabe",
      "name": "karanabe",
      "avatar_url": "https://avatars.githubusercontent.com/u/152078880?v=4",
      "profile": "https://github.com/karanabe",
      "contributions": [
        "doc",
        "code"
      ]
    },
    {
      "login": "h121h",
      "name": "h121h",
      "avatar_url": "https://avatars.githubusercontent.com/u/616758?v=4",
      "profile": "https://github.com/h121h",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "s0i37",
      "name": "s0i37",
      "avatar_url": "https://avatars.githubusercontent.com/u/22872513?v=4",
      "profile": "https://github.com/s0i37",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "wilco375",
      "name": "Wilco",
      "avatar_url": "https://avatars.githubusercontent.com/u/7385023?v=4",
      "profile": "https://github.com/wilco375",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "HenriBom",
      "name": "HenriBom",
      "avatar_url": "https://avatars.githubusercontent.com/u/46447744?v=4",
      "profile": "https://github.com/HenriBom",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "0x7274",
      "name": "R̝͖̱͖͕̤̰̯͙ͫ͒̀ͮȁ̤͔̝̘̪̻͕̝̖ͧͪͤu̗̠̜̩̗͇͑̀ͣ̃͂̔͂c̫͔͚̲̬̓̂̿͌̿͊̐͗h͚̲̤̟͓̟̥̊ͬͪ̏̍̍ T̟̜̞͉͙̙ͣ́ͪ͗̓̇ͭo͍̰͎̼͓̟̽ͧ̓̉ͬ̐͐b͇̖̳̫̰̗̭͍ͧ̄̄̌̈i̙̪̤̝̟͓̹̋̽͋̀ͧ̒a͕̭̱͎̪̦̤ͤ͊̊̑ͣ̄s̪̯͖̰̯͍ͫ̋͑̄ͭͅͅ",
      "avatar_url": "https://avatars.githubusercontent.com/u/85586890?v=4",
      "profile": "https://github.com/0x7274",
      "contributions": [
        "bug",
        "ideas",
        "doc"
      ]
    },
    {
      "login": "4FunAndProfit",
      "name": "4FunAndProfit",
      "avatar_url": "https://avatars.githubusercontent.com/u/174417079?v=4",
      "profile": "https://github.com/4FunAndProfit",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "lidorelias3",
      "name": "lidorelias3",
      "avatar_url": "https://avatars.githubusercontent.com/u/41958137?v=4",
      "profile": "https://github.com/lidorelias3",
      "contributions": [
        "ideas"
      ]
    },
    {
      "login": "auk0x01",
      "name": "Adnan Ullah Khan (auk0x01)",
      "avatar_url": "https://avatars.githubusercontent.com/u/75381620?v=4",
      "profile": "http://adnanullahkhan.com",
      "contributions": [
        "code"
      ]
    },
    {
      "login": "mzember",
      "name": "Martin Žember",
      "avatar_url": "https://avatars.githubusercontent.com/u/61412285?v=4",
      "profile": "https://github.com/mzember",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "pg9051",
      "name": "pg9051",
      "avatar_url": "https://avatars.githubusercontent.com/u/202219877?v=4",
      "profile": "https://github.com/pg9051",
      "contributions": [
        "doc"
      ]
    },
    {
      "login": "sebastiaanspeck",
      "name": "Sebastiaan Speck",
      "avatar_url": "https://avatars.githubusercontent.com/u/12570668?v=4",
      "profile": "https://github.com/sebastiaanspeck",
      "contributions": [
        "bug",
        "doc"
      ]
    },
    {
      "login": "OpenSourceKyle",
      "name": "OpenSourceKyle",
      "avatar_url": "https://avatars.githubusercontent.com/u/173112933?v=4",
      "profile": "https://github.com/OpenSourceKyle",
      "contributions": [
        "doc",
        "bug"
      ]
    },
    {
      "login": "Antonio-R1",
      "name": "Antonio",
      "avatar_url": "https://avatars.githubusercontent.com/u/54741970?v=4",
      "profile": "https://github.com/Antonio-R1",
      "contributions": [
        "code",
        "bug"
      ]
    },
    {
      "login": "redacean",
      "name": "Redacean",
      "avatar_url": "https://avatars.githubusercontent.com/u/125687454?v=4",
      "profile": "https://github.com/redacean",
      "contributions": [
        "bug"
      ]
    },
    {
      "login": "ghsdpolley",
      "name": "ghsdpolley",
      "avatar_url": "https://avatars.githubusercontent.com/u/19826831?v=4",
      "profile": "https://github.com/ghsdpolley",
      "contributions": [
        "bug"
      ]
    }
  ],
  "contributorsPerLine": 7,
  "projectName": "feroxbuster",
  "projectOwner": "epi052",
  "repoType": "github",
  "repoHost": "https://github.com",
  "skipCi": true,
  "commitConvention": "angular",
  "commitType": "docs"
}


================================================
FILE: .cargo/config.toml
================================================
[target.armv7-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"

[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: [epi052]
ko_fi: epi052


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: "[BUG] "
labels: bug
assignees: ''

---

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:
1.
2.
3.

**Expected behavior**
A clear and concise description of what you expected to happen.

**Traceback / Error Output**
If applicable, add error output to help explain your problem.

**Environment (please complete the following information):**
 - feroxbuster version: [e.g. v1.0.1]
 - OS [e.g. ubuntu 20.04]

**Additional context**
Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: "[FEATURE REQUEST] "
labels: enhancement
assignees: ''

---

**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.


================================================
FILE: .github/actions-rs/grcov.yml
================================================
branch: false
ignore-not-existing: true
llvm: true
output-type: lcov
output-path: ./lcov.info
# excl-br-line: "^\\s*((debug_)?assert(_eq|_ne)?!|#\\[derive\\(|log::)"
ignore:
  - "../*"


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: cargo
  directory: "/"
  schedule:
    interval: daily
  open-pull-requests-limit: 10


================================================
FILE: .github/pull_request_template.md
================================================
# Landing a Pull Request (PR)

Long form explanations of most of the items below can be found in the [CONTRIBUTING](https://github.com/epi052/feroxbuster/blob/master/CONTRIBUTING.md) guide.

## Branching checklist
- [ ] There is an issue associated with your PR (bug, feature, etc.. if not, create one)
- [ ] Your PR description references the associated issue (i.e. fixes #123456)
- [ ] Code is in its own branch
- [ ] Branch name is related to the PR contents
- [ ] PR targets main

## Static analysis checks
- [ ] All rust files are formatted using `cargo fmt`
- [ ] All `clippy` checks pass when running `cargo clippy --all-targets --all-features -- -D warnings -A clippy::mutex-atomic`
- [ ] All existing tests pass

## Documentation
- [ ] New code is documented using [doc comments](https://doc.rust-lang.org/stable/rust-by-example/meta/doc.html)
- [ ] Documentation about your PR is included in the `docs`, as needed. The docs live in a [separate repository](https://epi052.github.io/feroxbuster-docs/). Update the appropriate pages at the links below.
  - [ ] update [example config file section](https://epi052.github.io/feroxbuster-docs/configuration/ferox-config-toml/)
  - [ ] update [help output section](https://epi052.github.io/feroxbuster-docs/configuration/command-line/)
  - [ ] add an [example](https://epi052.github.io/feroxbuster-docs/examples/auto-tune/)

## Additional Tests
- [ ] New code is unit tested
- [ ] New code is integration tested, as needed
- [ ] New tests pass


================================================
FILE: .github/stale.yml
================================================
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 14
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
  - pinned
  - security
  - confirmed
# Label to use when marking an issue as stale
staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
  This issue has been automatically marked as stale because it has not had
  recent activity. It will be closed if no further activity occurs. Thank you
  for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false


================================================
FILE: .github/workflows/build.yml
================================================
name: CD Pipeline

on: [push]

jobs:
  build-nix:
    env:
      IN_PIPELINE: true
    runs-on: ${{ matrix.os }}
    if: github.ref == 'refs/heads/main'
    strategy:
      matrix:
        type: [ubuntu-x64, ubuntu-x86, armv7, aarch64]
        include:
          - type: ubuntu-x64
            os: ubuntu-latest
            target: x86_64-unknown-linux-musl
            name: x86_64-linux-feroxbuster
            path: target/x86_64-unknown-linux-musl/release/feroxbuster
            pkg_config_path: /usr/lib/x86_64-linux-gnu/pkgconfig
          - type: ubuntu-x86
            os: ubuntu-latest
            target: i686-unknown-linux-musl
            name: x86-linux-feroxbuster
            path: target/i686-unknown-linux-musl/release/feroxbuster
            pkg_config_path: /usr/lib/i686-linux-gnu/pkgconfig
          - type: armv7
            os: ubuntu-latest
            target: armv7-unknown-linux-gnueabihf
            name: armv7-linux-feroxbuster
            path: target/armv7-unknown-linux-gnueabihf/release/feroxbuster
            pkg_config_path: /usr/lib/x86_64-linux-gnu/pkgconfig
          - type: aarch64
            os: ubuntu-latest
            target: aarch64-unknown-linux-gnu
            name: aarch64-linux-feroxbuster
            path: target/aarch64-unknown-linux-gnu/release/feroxbuster
            pkg_config_path: /usr/lib/x86_64-linux-gnu/pkgconfig
    steps:
      - uses: actions/checkout@v4
      - name: Cache cargo & target directories
        uses: Swatinem/rust-cache@v2
      - name: Build binary
        uses: houseabsolute/actions-rust-cross@v0
        with:
          command: build
          target: ${{ matrix.target }}
          args: "--locked --release"
          strip: true
          toolchain: stable
      - name: Build tar.gz for homebrew installs
        if: matrix.type == 'ubuntu-x64'
        run: |
          tar czf ${{ matrix.name }}.tar.gz -C target/x86_64-unknown-linux-musl/release feroxbuster
      - uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.name }}
          path: ${{ matrix.path }}
      - uses: actions/upload-artifact@v4
        if: matrix.type == 'ubuntu-x64'
        with:
          name: ${{ matrix.name }}.tar.gz
          path: ${{ matrix.name }}.tar.gz

  build-debug:
    env:
      IN_PIPELINE: true
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install System Dependencies
        run: |
          env
          sudo apt-get update
          sudo apt-get install -y --no-install-recommends libssl-dev pkg-config musl-tools
      - name: Set up Rust toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: stable
          target: x86_64-unknown-linux-musl

      - name: Build the project
        env:
          PKG_CONFIG_PATH: /usr/lib/x86_64-linux-gnu/pkgconfig
          OPENSSL_DIR: /usr/lib/ssl
        run: cargo build --target=x86_64-unknown-linux-musl
      - uses: actions/upload-artifact@v4
        with:
          name: x86_64-linux-debug-feroxbuster
          path: target/x86_64-unknown-linux-musl/debug/feroxbuster

  build-debug-windows:
    env:
      IN_PIPELINE: true
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v4

      - name: Set up Rust toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: stable
          target: x86_64-pc-windows-msvc

      - name: Build the project
        run: cargo build --target=x86_64-pc-windows-msvc
      - uses: actions/upload-artifact@v4
        with:
          name: x86_64-windows-debug-feroxbuster.exe
          path: target\x86_64-pc-windows-msvc\debug\feroxbuster.exe

  build-deb:
    needs: [build-nix]
    runs-on: ubuntu-latest
    env:
      IN_PIPELINE: true
    steps:
      - uses: actions/checkout@v4
      - name: Install cargo-deb
        run: cargo install -f cargo-deb
      - uses: awalsh128/cache-apt-pkgs-action@v1
        with:
          packages: musl-tools # provides musl-gcc
          version: 1.0
      - name: Install musl toolchain
        run: rustup target add x86_64-unknown-linux-musl
      - name: Deb Build
        run: cargo deb --target=x86_64-unknown-linux-musl
      - name: Upload Deb Artifact
        uses: actions/upload-artifact@v4
        with:
          name: feroxbuster_amd64.deb
          path: ./target/x86_64-unknown-linux-musl/debian/*

  build-macos:
    env:
      IN_PIPELINE: true
    runs-on: macos-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - uses: actions/checkout@v4
      - name: Cache cargo & target directories
        uses: Swatinem/rust-cache@v2
      - name: Build binary
        uses: houseabsolute/actions-rust-cross@v0
        with:
          command: build
          target: x86_64-apple-darwin
          args: "--locked --release"
          strip: true
          toolchain: stable
      - name: Build tar.gz for homebrew installs
        run: |
          tar czf x86_64-macos-feroxbuster.tar.gz -C target/x86_64-apple-darwin/release feroxbuster
      - uses: actions/upload-artifact@v4
        with:
          name: x86_64-macos-feroxbuster
          path: target/x86_64-apple-darwin/release/feroxbuster
      - uses: actions/upload-artifact@v4
        with:
          name: x86_64-macos-feroxbuster.tar.gz
          path: x86_64-macos-feroxbuster.tar.gz
  
  build-macos-aarch64:
    env:
      IN_PIPELINE: true
    runs-on: macos-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - uses: actions/checkout@v4
      - name: Cache cargo & target directories
        uses: Swatinem/rust-cache@v2
      - name: Build binary
        uses: houseabsolute/actions-rust-cross@v0
        with:
          command: build
          target: aarch64-apple-darwin
          args: "--locked --release"
          strip: true
          toolchain: stable
      - name: Build tar.gz for homebrew installs
        run: |
          tar czf aarch64-macos-feroxbuster.tar.gz -C target/aarch64-apple-darwin/release feroxbuster
      - uses: actions/upload-artifact@v4
        with:
          name: aarch64-macos-feroxbuster
          path: target/aarch64-apple-darwin/release/feroxbuster
      - uses: actions/upload-artifact@v4
        with:
          name: aarch64-macos-feroxbuster.tar.gz
          path: aarch64-macos-feroxbuster.tar.gz

  build-windows:
    env:
      IN_PIPELINE: true
    runs-on: ${{ matrix.os }}
    if: github.ref == 'refs/heads/main'
    strategy:
      matrix:
        type: [windows-x64, windows-x86]
        include:
          - type: windows-x64
            os: windows-latest
            target: x86_64-pc-windows-msvc
            name: x86_64-windows-feroxbuster.exe
            path: target\x86_64-pc-windows-msvc\release\feroxbuster.exe
          - type: windows-x86
            os: windows-latest
            target: i686-pc-windows-msvc
            name: x86-windows-feroxbuster.exe
            path: target\i686-pc-windows-msvc\release\feroxbuster.exe
    steps:
      - uses: actions/checkout@v4
      - name: Cache cargo & target directories
        uses: Swatinem/rust-cache@v2
      - name: Build binary
        uses: houseabsolute/actions-rust-cross@v0
        with:
          command: build
          target:  ${{ matrix.target }}
          args: "--locked --release"
          strip: true
          toolchain: stable
      - uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.name }}
          path: ${{ matrix.path }}


================================================
FILE: .github/workflows/check.yml
================================================
name: CI Pipeline

on: [push, pull_request]

jobs:
  check:
    name: Check
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Cache cargo & target directories
        uses: Swatinem/rust-cache@v2
      - uses: dtolnay/rust-toolchain@stable
      - run: cargo check

  test:
    name: Test Suite
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Cache cargo & target directories
        uses: Swatinem/rust-cache@v2
      - name: Install latest nextest release
        uses: taiki-e/install-action@nextest
      - uses: dtolnay/rust-toolchain@stable
      - name: Test with latest nextest release
        run: cargo nextest run --all-features --all-targets --retries 4 --no-fail-fast

  fmt:
    name: Rust fmt
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Cache cargo & target directories
        uses: Swatinem/rust-cache@v2
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt
      - run: cargo fmt --all -- --check

  clippy:
    name: Clippy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Cache cargo & target directories
        uses: Swatinem/rust-cache@v2
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy
      - run: cargo clippy --all-targets --all-features -- -D warnings


================================================
FILE: .github/workflows/cicd-to-dockerhub.yml
================================================
name: ci-to-dockerhub

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}

      - name: Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@v3

      - name: Build and push
        id: docker_build
        uses: docker/build-push-action@v6
        with:
          context: ./
          file: ./Dockerfile
          push: true
          tags: ${{ secrets.DOCKER_HUB_USERNAME }}/feroxbuster:latest

      - name: Image digest
        run: echo ${{ steps.docker_build.outputs.digest }}

      - name: Verify pushed image
        run: |
          # Wait a moment for the image to be available
          sleep 5
          
          # Pull the image we just pushed
          docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/feroxbuster:latest
          
          # Get the digest of the pulled image
          PULLED_DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' ${{ secrets.DOCKER_HUB_USERNAME }}/feroxbuster:latest | cut -d'@' -f2)
          PUSHED_DIGEST="${{ steps.docker_build.outputs.digest }}"
          
          echo "Pushed digest: $PUSHED_DIGEST"
          echo "Pulled digest: $PULLED_DIGEST"
          
          # Verify they match
          if [ "$PULLED_DIGEST" = "$PUSHED_DIGEST" ]; then
            echo "✓ Verification successful: Pulled image matches pushed image"
            
            # Test that the binary works
            docker run --rm ${{ secrets.DOCKER_HUB_USERNAME }}/feroxbuster:latest --version
          else
            echo "✗ Verification failed: Digests do not match"
            exit 1
          fi


================================================
FILE: .github/workflows/coverage.yml
================================================
on: [push]

name: Code Coverage Pipeline

jobs:
  coverage:
    name: LLVM Coverage
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: llvm-tools-preview
      - name: Install cargo-llvm-cov and cargo-nextest
        uses: taiki-e/install-action@v2
        with:
          tool: cargo-nextest,cargo-llvm-cov
      - name: Generate code coverage
        run: cargo llvm-cov nextest --all-features --no-fail-fast --lcov --retries 4 --output-path lcov.info
      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v4
        with:
          files: lcov.info
          fail_ci_if_error: true
          token: ${{ secrets.CODECOV_TOKEN }}

================================================
FILE: .github/workflows/winget.yml
================================================
name: Publish to Winget
on:
  release:
    types: [released]
  workflow_dispatch:
    inputs:
      tag_name:
        description: 'Tag name of release'
        required: true
        type: string

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: vedantmgoyal2009/winget-releaser@main
        with:
          identifier: epi052.feroxbuster
          installers-regex: '-windows-feroxbuster\.exe\.zip$'
          token: ${{ secrets.WINGET_TOKEN }}
          release-tag: ${{ inputs.tag_name || github.event.release.tag_name || github.ref_name }}


================================================
FILE: .gitignore
================================================
# Generated by Cargo
# will have compiled files and executables
debug/
target/

# These are backup files generated by rustfmt
**/*.rs.bk

# jetbrains metadata folder
.idea/

# vscode metadata folder
.vscode/

# personal feroxbuster config for testing
ferox-config.toml

# images for the README on github
img/**

# scripts to check code coverage using nightly compiler
check-coverage.sh
lcov_cobertura.py

# dockerignore file that makes it so i can work on the docker config without copying a 4GB manifest or w/e it is
.dockerignore

# state file created during tests
ferox-*.state

# python stuff cuz reasons
Pipfile*

# ignore choco_package generated nupkg
/choco_package/*.nupkg


================================================
FILE: .rustfmt.toml
================================================
reorder_modules = false


================================================
FILE: CONTRIBUTING.md
================================================
# Contributor's guide

<!-- this guide is a modified version of the guide that I already modified which was based on the one used by the awesome guys that wrote cmd2 -->

First of all, thank you for contributing! Please follow these steps to contribute:

1. Find an issue that needs assistance by searching for the [Help Wanted](https://github.com/epi052/feroxbuster/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) tag
2. Let us know you're working on it by posting a comment on the issue
3. Follow the [Contribution guidelines](#contribution-guidelines) to start working on the issue

Remember to feel free to ask for help by leaving a comment within the Issue.

Working on your first pull request? You can learn how from this *free* series
[How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github).

###### If you've found a bug that is not on the board, [follow these steps](README.md#found-a-bug).

---

## Contribution guidelines

- [Prerequisites](#prerequisites)
- [Forking the project](#forking-the-project)
- [Creating a branch](#creating-a-branch)
- [Setting up for recon-pipeline development](#setting-up-for-recon-pipeline-development)
- [Making changes](#making-changes)
- [Static code analysis](#static-code-analysis)
- [Running the test suite](#running-the-test-suite)
- [Squashing your commits](#squashing-your-commits)
- [Creating a pull request](#creating-a-pull-request)
- [How we review and merge pull requests](#how-we-review-and-merge-pull-requests)
- [Next steps](#next-steps)
- [Other resources](#other-resources)
- [Advice](#advice)

### Forking the project

#### Setting up your system

1. Install your favorite `git` client
2. Create a parent projects directory on your system. For this guide, it will be assumed that it is `~/projects`.

#### Forking feroxbuster

1. Go to the top-level feroxbuster repository: <https://github.com/epi052/feroxbuster>
2. Click the "Fork" button in the upper right hand corner of the interface
([more details here](https://help.github.com/articles/fork-a-repo/))
3. After the repository has been forked, you will be taken to your copy of the feroxbuster repo at `your_username/feroxbuster`

#### Cloning your fork

1. Open a terminal / command line / Bash shell in your projects directory (_e.g.: `~/projects/`_)
2. Clone your fork of feroxbuster, making sure to replace `your_username` with your GitHub username. This will download the
entire feroxbuster repo to your projects directory.

```sh
$ git clone https://github.com/your_username/feroxbuster.git
```

#### Set up your upstream

1. Change directory to the new feroxbuster directory (`cd feroxbuster`)
2. Add a remote to the official feroxbuster repo:

```sh
$ git remote add upstream https://github.com/epi052/feroxbuster.git
```

Now you have a local copy of the feroxbuster repo!

#### Maintaining your fork

Now that you have a copy of your fork, there is work you will need to do to keep it current.

##### **Rebasing from upstream**

Do this prior to every time you create a branch for a PR:

1. Make sure you are on the `main` branch

  > ```sh
  > $ git status
  > On branch main
  > Your branch is up-to-date with 'origin/main'.
  > ```

  > If your aren't on `main`, resolve outstanding files and commits and checkout the `main` branch

  > ```sh
  > $ git checkout main
  > ```

2. Do a pull with rebase against `upstream`

  > ```sh
  > $ git pull --rebase upstream main
  > ```

  > This will pull down all of the changes to the official main branch, without making an additional commit in your local repo.

3. (_Optional_) Force push your updated main branch to your GitHub fork

  > ```sh
  > $ git push origin main --force
  > ```

  > This will overwrite the main branch of your fork.

### Creating a branch

Before you start working, you will need to create a separate branch specific to the issue or feature you're working on.
You will push your work to this branch.

#### Naming your branch

Name the branch something like `23-xxx` where `xxx` is a short description of the changes or feature
you are attempting to add and `23` corresponds to the Issue you're working on.

#### Adding your branch

To create a branch on your local machine (and switch to this branch):

```sh
$ git checkout -b [name_of_your_new_branch]
```

and to push to GitHub:

```sh
$ git push origin [name_of_your_new_branch]
```

##### If you need more help with branching, take a look at _[this](https://github.com/Kunena/Kunena-Forum/wiki/Create-a-new-branch-with-git-and-manage-branches)_.

### Setting up for feroxbuster development
For doing feroxbuster development, all you really need is `rust` installed on your system (I'll leave the choice of IDE to you, but VS Code and JetBrains both have very nice rust plugins).

#### Install rustup

The primary way that folks install Rust is through a tool called Rustup, which is a Rust installer and version management tool.

```sh
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup update
```

After running the two commands above, you should be able to run `cargo`.

```shell script
$> cargo --version
cargo 1.45.0 (744bd1fbb 2020-06-15)
```

### Making changes

It's your time to shine!

#### How to find code in the feroxbuster codebase to fix/edit

The feroxbuster project directory structure is pretty simple and straightforward.  All
actual code for feroxbuster is located underneath the `src` directory. Integration tests are in the
`tests` directory.  There are various other files in the root directory, but these are
primarily related to continuous integration and release deployment.

### Static code analysis

feroxbuster uses the [`clippy`](https://rust-lang.github.io/rust-clippy/) code linter.

The command that will ultimately be used in the CI pipeline for linting is `cargo clippy --all-targets --all-features -- -D warnings -A clippy::mutex-atomic`.

Before submitting a Pull Request, the above command should be run. Please do not ignore any linting errors in code you write or modify, as they are meant to **help** by ensuring a clean and simple code base.

### Running the test suite
When you're ready to share your code, run the test suite:
```sh
$ cd ~/projects/feroxbuster
$ cargo test
```
and ensure all tests pass.

Test coverage can be checked using [grcov](https://github.com/mozilla/grcov).  Installation and execution are summarized below.

```sh
cargo install grcov
rustup component add llvm-tools
rustup install nightly
rustup default nightly
export CARGO_INCREMENTAL=0
export RUSTFLAGS="-Cinstrument-coverage -Clink-dead-code -Ccodegen-units=1 -Coverflow-checks=off"
export LLVM_PROFILE_FILE="target/debug/coverage/profraw/feroxbuster-%p-%m.profraw"
export RUSTDOCFLAGS="-Cpanic=abort"
rm -r target/debug/coverage/profraw
cargo build
cargo test
grcov . --source-dir . --keep-only "src/*" --binary-path ./target/debug/ -t html --branch --ignore-not-existing -o ./target/debug/coverage/
firefox target/debug/coverage/index.html
```

### Squashing your commits

When you make a pull request, it is preferable for all of your changes to be in one commit.  Github has made it very
simple to squash commits now as it's [available through the web interface](https://stackoverflow.com/a/43858707) at
pull request submission time.

### Creating a pull request

#### What is a pull request?

A pull request (PR) is a method of submitting proposed changes to the feroxbuster
repo (or any repo, for that matter). You will make changes to copies of the
files which make up feroxbuster in a personal fork, then apply to have them
accepted by the feroxbuster team.

#### Need help?

GitHub has a good guide on how to contribute to open source [here](https://opensource.guide/how-to-contribute/).

##### Editing via your local fork

1.  Perform the maintenance step of rebasing `main`
2.  Ensure you're on the `main` branch using `git status`:

```sh
$ git status
On branch main
Your branch is up-to-date with 'origin/main'.

nothing to commit, working directory clean
```

1.  If you're not on main or your working directory is not clean, resolve
    any outstanding files/commits and checkout main `git checkout main`
2.  Create a branch off of `main` with git: `git checkout -B
    branch/name-here`
3.  Edit your file(s) locally with the editor of your choice
4.  Check your `git status` to see unstaged files
5.  Add your edited files: `git add path/to/filename.ext` You can also do: `git
    add .` to add all unstaged files. Take care, though, because you can
    accidentally add files you don't want added. Review your `git status` first.
6.  Commit your edits: `git commit -m "Brief description of commit"`.
7.  Squash your commits, if there are more than one
8.  Push your commits to your GitHub Fork: `git push -u origin branch/name-here`
9.  Once the edits have been committed, you will be prompted to create a pull
    request on your fork's GitHub page
10.  By default, all pull requests should be against the `main` branch
11.  Submit a pull request from your branch to feroxbuster's `main` branch
12.  The title (also called the subject) of your PR should be descriptive of your
    changes and succinctly indicate what is being fixed
    -   Examples: `Add test cases for Unicode support`; `Correct typo in overview documentation`
13.  In the body of your PR include a more detailed summary of the changes you
    made and why
    -   If the PR is meant to fix an existing bug/issue, then, at the end of
        your PR's description, append the keyword `closes` and #xxxx (where xxxx
        is the issue number). Example: `closes #1337`. This tells GitHub to
        close the existing issue if the PR is merged.
14.  Creating the PR causes our continuous integration (CI) systems to automatically run all of the
    unit tests on all supported OSes. You should watch your PR to make sure that all unit tests pass.
15.  If any unit tests fail, you should look at the details and fix the failures. You can then push
    the fix to the same branch in your fork. The PR will automatically get updated and the CI system
    will automatically run all of the unit tests again.

### How we review and merge pull requests

1. If your changes can merge without conflicts and all unit tests pass, then your pull request (PR) will have a big
green checkbox which says something like "All Checks Passed" next to it. If this is not the case, there will be a
link you can click on to get details regarding what the problem is.  It is your responsibility to make sure all unit
tests are passing.  Generally a Maintainer will not QA a pull request unless it can merge without conflicts and all
unit tests pass.

2. If a Maintainer reviews a pull request and confirms that the new code does what it is supposed to do without
seeming to introduce any new bugs, and doesn't present any backward compatibility issues, they will merge the pull request.

### Next steps

#### If your PR is accepted

Once your PR is accepted, you may delete the branch you created to submit it.
This keeps your working fork clean.

You can do this with a press of a button on the GitHub PR interface. You can
delete the local copy of the branch with: `git branch -D branch/to-delete-name`

#### If your PR is rejected

Don't worry! You will receive solid feedback from the Maintainers as to
why it was rejected and what changes are needed.

Many pull requests, especially first pull requests, require correction or
updating.

If you have a local copy of the repo, you can make the requested changes and
amend your commit with: `git commit --amend` This will update your existing
commit. When you push it to your fork you will need to do a force push to
overwrite your old commit: `git push --force`

Be sure to post in the PR conversation that you have made the requested changes.

### Other resources

-   [Searching for your issue on GitHub](https://help.github.com/articles/searching-issues/)
-   [Creating a new GitHub issue](https://help.github.com/articles/creating-an-issue/)

### Advice

Here is some advice regarding what makes a good pull request (PR) from our perspective:
- Multiple smaller PRs divided by topic are better than a single large PR containing a bunch of unrelated changes
- Good unit/functional tests are very important
- Accurate documentation is also important
- It's best to create a dedicated branch for a PR, use it only for that PR, and delete it once the PR has been merged
- It's good if the branch name is related to the PR contents, even if it's just "fix123" or "add_more_tests"
- Code coverage of the unit tests matters, so try not to decrease it
- Think twice before adding dependencies to third-party libraries because it could affect a lot of users

## Acknowledgement
Thanks to the awesome guys at [cmd2](https://github.com/python-cmd2/cmd2) for their fantastic `CONTRIBUTING` file from
which we have borrowed heavily.


================================================
FILE: Cargo.toml
================================================
[package]
name = "feroxbuster"
version = "2.13.1"
authors = ["Ben 'epi' Risher (@epi052)"]
license = "MIT"
edition = "2021"
homepage = "https://github.com/epi052/feroxbuster"
repository = "https://github.com/epi052/feroxbuster"
description = "A fast, simple, recursive content discovery tool."
categories = ["command-line-utilities"]
keywords = [
    "pentest",
    "enumeration",
    "url-bruteforce",
    "content-discovery",
    "web",
]
exclude = [".github/*", "img/*", "check-coverage.sh"]
build = "build.rs"

[badges]
maintenance = { status = "actively-developed" }

[build-dependencies]
clap = { version = "4.5", features = ["wrap_help", "cargo"] }
clap_complete = "4.5"
regex = "1.11"
lazy_static = "1.5"
dirs = "5.0"

[dependencies]
scraper = "0.19"
futures = "0.3"
tokio = { version = "1.47", features = ["full"] }
tokio-util = { version = "0.7", features = ["codec"] }
log = "0.4"
env_logger = "0.11"
reqwest = { version = "0.12", features = ["socks", "native-tls-alpn"] }
# uses feature unification to add 'serde' to reqwest::Url
url = { version = "2.5", features = ["serde"] }
serde_regex = "1.1"
clap = { version = "4.5", features = ["wrap_help", "cargo"] }
lazy_static = "1.5"
toml = "0.8"
serde = { version = "1.0", features = ["derive", "rc"] }
serde_json = "1.0"
uuid = { version = "1.17", features = ["v4"] }
indicatif = { version = "0.17.11" }
console = "0.15"
openssl = { version = "0.10", features = ["vendored"] }
dirs = "5.0"
regex = "1.11"
crossterm = "0.27"
rlimit = "0.10"
ctrlc = "3.4"
anyhow = "1.0"
leaky-bucket = "1.1"
gaoya = "0.2"
# 0.37+ relies on the broken version of indicatif and forces
# the broken version to be used regardless of the version
# specified above 
self_update = { version = "0.40", features = [
    "archive-tar",
    "compression-flate2",
    "archive-zip",
    "compression-zip-deflate",
] }

[dev-dependencies]
tempfile = "3.20"
httpmock = "0.7"
assert_cmd = "2.1"
predicates = "3.1"

[profile.release]
lto = true
codegen-units = 1
panic = 'abort'

[package.metadata.deb]
section = "utility"
license-file = ["LICENSE", "4"]
conf-files = ["/etc/feroxbuster/ferox-config.toml"]
assets = [
    [
        "target/release/feroxbuster",
        "/usr/bin/",
        "755",
    ],
    [
        "ferox-config.toml.example",
        "/etc/feroxbuster/ferox-config.toml",
        "644",
    ],
    [
        "shell_completions/feroxbuster.bash",
        "/usr/share/bash-completion/completions/feroxbuster.bash",
        "644",
    ],
    [
        "shell_completions/feroxbuster.fish",
        "/usr/share/fish/completions/feroxbuster.fish",
        "644",
    ],
    [
        "shell_completions/_feroxbuster",
        "/usr/share/zsh/vendor-completions/_feroxbuster",
        "644",
    ],
]


================================================
FILE: Dockerfile
================================================
FROM alpine:3.17.1 AS build
LABEL maintainer="wfnintr@null.net"

RUN apk upgrade --update-cache --available && apk add --update openssl

# Download latest release
RUN wget https://github.com/epi052/feroxbuster/releases/latest/download/x86_64-linux-feroxbuster.zip -qO feroxbuster.zip \
    && unzip -d /tmp/ feroxbuster.zip feroxbuster \
    && chmod +x /tmp/feroxbuster \
    && wget https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/raft-medium-directories.txt -O /tmp/raft-medium-directories.txt

FROM alpine:3.17.1 AS release
COPY --from=build /tmp/raft-medium-directories.txt /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt
COPY --from=build /tmp/feroxbuster /usr/local/bin/feroxbuster

RUN adduser \
    --gecos "" \
    --disabled-password \
    feroxbuster

USER feroxbuster

ENTRYPOINT ["feroxbuster"]


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2020-2026 epi

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: Makefile
================================================
default_prefix = /usr/local
prefix ?= $(default_prefix)
exec_prefix = $(prefix)
bindir = $(exec_prefix)/bin
datarootdir = $(prefix)/share
datadir = $(datarootdir)
example_config = ferox-config.toml.example
config_file = ferox-config.toml
completion_dir = shell_completions
completion_prefix = $(completion_dir)/$(BIN)

BIN=feroxbuster
SHR_SOURCES = $(shell find src -type f -wholename '*src/*.rs') Cargo.toml Cargo.lock

RELEASE = debug
DEBUG ?= 0

ifeq (0, $(DEBUG))
	ARGS = --release
	RELEASE = release
endif

VENDORED ?= 0
ifeq (1,$(VENDORED))
    ARGS += --frozen
endif

TARGET = target/$(RELEASE)

.PHONY: all clean install uninstall test update

all: cli
cli: $(TARGET)/$(BIN) $(TARGET)/$(BIN).1.gz $(SHR_SOURCES)
install: all install-cli

verify:
	cargo fmt
	cargo clippy --all-targets --all-features -- -D warnings -A clippy::mutex-atomic
	cargo test

clean:
	cargo clean

vendor: vendor.tar

vendor.tar:
	cargo vendor
	tar pcf vendor.tar vendor
	rm -rf vendor

install-cli: cli
	install -Dm 0644 "$(completion_prefix).bash" "$(DESTDIR)/usr/share/bash-completion/completions/$(BIN).bash"
	install -Dm 0644 "$(completion_prefix).fish" "$(DESTDIR)/usr/share/fish/completions/$(BIN).fish"
	install -Dm 0644 "$(completion_dir)/_$(BIN)" "$(DESTDIR)/usr/share/zsh/vendor-completions/_$(BIN)"
	install -sDm 0755 "$(TARGET)/$(BIN)" "$(DESTDIR)$(bindir)/$(BIN)"
	install -Dm 0644 "$(TARGET)/$(BIN).1.gz" "$(DESTDIR)$(datadir)/man/man1/$(BIN).1.gz"
	install -Dm 0644 "$(example_config)" "$(DESTDIR)/etc/$(BIN)/$(config_file)"

uninstall:
	rm -f "$(DESTDIR)$(bindir)/$(BIN)"
	rm -f "$(DESTDIR)$(datadir)/man/man1/$(BIN).1.gz"
	rm -rf "$(DESTDIR)/etc/$(BIN)/"
	rm -f "$(DESTDIR)/usr/share/bash-completion/completions/$(BIN).bash"
	rm -f "$(DESTDIR)/usr/share/zsh/vendor-completions/_$(BIN)"
	rm -f "$(DESTDIR)/usr/share/fish/completions/$(BIN).fish"

extract:
ifeq (1, $(VENDORED))
	tar pxf vendor.tar
endif

$(TARGET)/$(BIN): extract
	mkdir -p .cargo debian
	touch debian/cargo.config
	cp debian/cargo.config .cargo/config.toml
	cargo build $(ARGS)

$(TARGET)/$(BIN).1.gz: $(TARGET)/$(BIN)
	help2man --no-info $< | gzip -c > $@.partial
	mv $@.partial $@


================================================
FILE: Makefile.toml
================================================
# composite tasks
[tasks.upgrade]
dependencies = ["upgrade-deps", "update"]

[tasks.check]
dependencies = ["fmt", "clippy", "test"]

# cleaning
[tasks.clean-state]
script = """
rm ferox-*.state
"""

# dependency management
[tasks.upgrade-deps]
command = "cargo"
args = ["upgrade", "--exclude", "self_update"]

[tasks.update]
command = "cargo"
args = ["update"]

# clippy / lint
[tasks.clippy]
clear = true
script = """
cargo clippy --all-targets --all-features -- -D warnings
"""

[tasks.fmt]
clear = true
script = """
cargo fmt --all
"""

# tests
[tasks.test]
clear = true
dependencies = ["test-local", "test-remote"]

[tasks.test-remote]
condition = { env_set = ["CI"] }
clear = true
script = """
cargo nextest run --all-features --all-targets --retries 4 --no-fail-fast
"""

[tasks.test-local]
condition = { env_not_set = ["CI"] }
clear = true
script = """
cargo nextest run --all-features --all-targets --no-fail-fast --run-ignored all --retries 4
"""

================================================
FILE: README.md
================================================
⚠️ **Security Notice – Domain Impersonation**

The domain **feroxbuster.com** is **NOT affiliated** with this project, its maintainers, or any official feroxbuster releases.

Official feroxbuster downloads are distributed **ONLY** through:

 - [https://github.com/epi052/feroxbuster](https://github.com/epi052/feroxbuster/releases)
 - package repositories listed in this README
 - package repositories listed in the [installation docs](https://epi052.github.io/feroxbuster-docs/installation/android/)

 We do **not** distribute software from feroxbuster.com, and we cannot vouch for the authenticity or safety of files hosted there.  
 If you downloaded feroxbuster from any other domain, we strongly recommend deleting it and reinstalling from an official source.

<h1 align="center">
  <br>
  <a href="https://github.com/epi052/feroxbuster"><img src="img/logo/default-cropped.png" alt="feroxbuster"></a>
  <br>
</h1>

<h4 align="center">A simple, fast, recursive content discovery tool written in Rust</h4>

<p align="center">
  <a href="https://github.com/epi052/feroxbuster/actions?query=workflow%3A%22CI+Pipeline%22">
    <img src="https://img.shields.io/github/actions/workflow/status/epi052/feroxbuster/.github/workflows/check.yml?branch=main&logo=github">
  </a>

  <a href="https://github.com/epi052/feroxbuster/releases">
    <img src="https://img.shields.io/github/downloads/epi052/feroxbuster/total?label=downloads&logo=github&color=inactive" alt="github downloads">
  </a>

  <a href="https://github.com/epi052/feroxbuster/commits/master">
    <img src="https://img.shields.io/github/last-commit/epi052/feroxbuster?logo=github">
  </a>

  <a href="https://crates.io/crates/feroxbuster">
    <img src="https://img.shields.io/crates/v/feroxbuster?color=blue&label=version&logo=rust">
  </a>

  <a href="https://crates.io/crates/feroxbuster">
    <img src="https://img.shields.io/crates/d/feroxbuster?label=downloads&logo=rust&color=inactive">
  </a>

  <a href="https://codecov.io/gh/epi052/feroxbuster">
    <img src="https://codecov.io/gh/epi052/feroxbuster/branch/master/graph/badge.svg" />
  </a>
  <!--
  <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section 
    [![All Contributors](https://img.shields.io/badge/all_contributors-15-orange.svg?style=flat-square)](#contributors-)
  <!-- ALL-CONTRIBUTORS-BADGE:END -->
  <a href="https://github.com/epi052/feroxbuster/graphs/contributors">
    <img src="https://img.shields.io/badge/all_contributors-31-orange.svg" />
  </a>

</p>

![demo](img/demo.gif)

<p align="center">
  🦀
  <a href="https://github.com/epi052/feroxbuster/releases">Releases</a> ✨
  <a href="https://epi052.github.io/feroxbuster-docs/examples/auto-tune/">Example Usage</a> ✨
  <a href="https://github.com/epi052/feroxbuster/blob/main/CONTRIBUTING.md">Contributing</a> ✨
  <a href="https://epi052.github.io/feroxbuster-docs/overview">Documentation</a>
  🦀
</p>

---

<h1><p align="center">✨🎉👉 <a href="https://epi052.github.io/feroxbuster-docs/">NEW DOCUMENTATION SITE</a> 👈🎉✨</p></h1>


## 🚀 Documentation has **moved** 🚀  

Instead of having a 1300 line `README.md` (sorry...), feroxbuster's documentation has moved to GitHub Pages. The move to hosting documentation on Pages should make it a LOT easier to find the information you're looking for, whatever that may be. Please check it out for anything you need beyond a quick-start. The new documentation can be found [here](https://epi052.github.io/feroxbuster-docs/overview). 

## 😕 What the heck is a ferox anyway?

Ferox is short for Ferric Oxide. Ferric Oxide, simply put, is rust. The name rustbuster was taken, so I decided on a
variation. 🤷

## 🤔 What's it do tho?

`feroxbuster` is a tool designed to perform [Forced Browsing](https://owasp.org/www-community/attacks/Forced_browsing).

Forced browsing is an attack where the aim is to enumerate and access resources that are not referenced by the web
application, but are still accessible by an attacker.

`feroxbuster` uses brute force combined with a wordlist to search for unlinked content in target directories. These
resources may store sensitive information about web applications and operational systems, such as source code,
credentials, internal network addressing, etc...

This attack is also known as Predictable Resource Location, File Enumeration, Directory Enumeration, and Resource
Enumeration.

## ⏳ Quick Start

This section will cover the minimum amount of information to get up and running with feroxbuster. Please refer the the [documentation](https://epi052.github.io/feroxbuster-docs/overview/), as it's much more comprehensive.

### 💿 Installation

There are quite a few other [installation methods](https://epi052.github.io/feroxbuster-docs/installation/android/), but these snippets should cover the majority of users. 

#### Kali 

If you're using kali, this is the preferred install method. Installing from the repos adds a [**ferox-config.toml**](https://epi052.github.io/feroxbuster-docs/configuration/ferox-config-toml/) in `/etc/feroxbuster/`, adds command completion for bash, fish, and zsh, includes a man page entry, and installs `feroxbuster` itself. 

```
sudo apt update && sudo apt install -y feroxbuster
```

#### Linux (32 and 64-bit) & MacOS

Install to a particular directory
```
curl -sL https://raw.githubusercontent.com/epi052/feroxbuster/main/install-nix.sh | bash -s $HOME/.local/bin
```

Install to current working directory
```
curl -sL https://raw.githubusercontent.com/epi052/feroxbuster/main/install-nix.sh | bash
```

#### MacOS via Homebrew 

```
brew install feroxbuster
```

#### Windows x86_64

```
Invoke-WebRequest https://github.com/epi052/feroxbuster/releases/latest/download/x86_64-windows-feroxbuster.exe.zip -OutFile feroxbuster.zip
Expand-Archive .\feroxbuster.zip
.\feroxbuster\feroxbuster.exe -V
```

#### Windows via Winget

```
winget install epi052.feroxbuster
```

#### Windows via Chocolatey

```
choco install feroxbuster
```

#### All others 

Please refer the the [documentation](https://epi052.github.io/feroxbuster-docs/overview).

### Updating feroxbuster (new in v2.9.1)

```
./feroxbuster --update
```

## 🧰 Example Usage

Here are a few brief examples to get you started.  Please note, feroxbuster can do a **lot more** than what's listed below.  As a result, there are **many more** examples, with **demonstration gifs** that highlight specific features, in the [documentation](https://epi052.github.io/feroxbuster-docs/overview).

### Multiple Values

Options that take multiple values are very flexible. Consider the following ways of specifying extensions:

```
./feroxbuster -u http://127.1 -x pdf -x js,html -x php txt json,docx
```

The command above adds .pdf, .js, .html, .php, .txt, .json, and .docx to each url

All of the methods above (multiple flags, space separated, comma separated, etc...) are valid and interchangeable. The
same goes for urls, headers, status codes, queries, and size filters.

### Include Headers

```
./feroxbuster -u http://127.1 -H Accept:application/json "Authorization: Bearer {token}"
```

### IPv6, non-recursive scan with INFO-level logging enabled

```
./feroxbuster -u http://[::1] --no-recursion -vv
```

### Read urls from STDIN; pipe only resulting urls out to another tool

```
cat targets | ./feroxbuster --stdin --silent -s 200 301 302 --redirects -x js | fff -s 200 -o js-files
```

### Proxy traffic through Burp

```
./feroxbuster -u http://127.1 --insecure --proxy http://127.0.0.1:8080
```

### Proxy traffic through a SOCKS proxy (including DNS lookups)

```
./feroxbuster -u http://127.1 --proxy socks5h://127.0.0.1:9050
```

### Pass auth token via query parameter

```
./feroxbuster -u http://127.1 --query token=0123456789ABCDEF
```

### Set the Content-Type of the body automatically with --data-json --data-urlencoded

```
./feroxbuster -u http://127.1 --data-json '{"some": "payload"}'
./feroxbuster -u http://127.1 --data-json @payload.json
./feroxbuster -u http://127.1 --data-urlencoded 'some=payload'
./feroxbuster -u http://127.1 --data-urlencoded @file.payload
```

## 🚀 Documentation has **moved** 🚀  

For realsies, there used to be over 1300 lines in this README, but it's all been moved to the [new documentation site](https://epi052.github.io/feroxbuster-docs/overview). Go check it out! 

<h1><p align="center">✨🎉👉 <a href="https://epi052.github.io/feroxbuster-docs/overview">DOCUMENTATION</a> 👈🎉✨</p></h1>

## Contributors ✨

Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
  <tbody>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://io.fi"><img src="https://avatars.githubusercontent.com/u/5235109?v=4?s=100" width="100px;" alt="Joona Hoikkala"/><br /><sub><b>Joona Hoikkala</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=joohoi" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/jsav0"><img src="https://avatars.githubusercontent.com/u/20546041?v=4?s=100" width="100px;" alt="J Savage"/><br /><sub><b>J Savage</b></sub></a><br /><a href="#infra-jsav0" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=jsav0" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="14.28%"><a href="http://www.tgotwig.dev"><img src="https://avatars.githubusercontent.com/u/30773779?v=4?s=100" width="100px;" alt="Thomas Gotwig"/><br /><sub><b>Thomas Gotwig</b></sub></a><br /><a href="#infra-TGotwig" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=TGotwig" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/spikecodes"><img src="https://avatars.githubusercontent.com/u/19519553?v=4?s=100" width="100px;" alt="Spike"/><br /><sub><b>Spike</b></sub></a><br /><a href="#infra-spikecodes" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=spikecodes" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/evanrichter"><img src="https://avatars.githubusercontent.com/u/330292?v=4?s=100" width="100px;" alt="Evan Richter"/><br /><sub><b>Evan Richter</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=evanrichter" title="Code">💻</a> <a href="https://github.com/epi052/feroxbuster/commits?author=evanrichter" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/mzpqnxow"><img src="https://avatars.githubusercontent.com/u/8016228?v=4?s=100" width="100px;" alt="AG"/><br /><sub><b>AG</b></sub></a><br /><a href="#ideas-mzpqnxow" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=mzpqnxow" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://n-thumann.de/"><img src="https://avatars.githubusercontent.com/u/46975855?v=4?s=100" width="100px;" alt="Nicolas Thumann"/><br /><sub><b>Nicolas Thumann</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=n-thumann" title="Code">💻</a> <a href="https://github.com/epi052/feroxbuster/commits?author=n-thumann" title="Documentation">📖</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/tomtastic"><img src="https://avatars.githubusercontent.com/u/302127?v=4?s=100" width="100px;" alt="Tom Matthews"/><br /><sub><b>Tom Matthews</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=tomtastic" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/bsysop"><img src="https://avatars.githubusercontent.com/u/9998303?v=4?s=100" width="100px;" alt="bsysop"/><br /><sub><b>bsysop</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=bsysop" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="14.28%"><a href="http://bpsizemore.me"><img src="https://avatars.githubusercontent.com/u/11645898?v=4?s=100" width="100px;" alt="Brian Sizemore"/><br /><sub><b>Brian Sizemore</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=bpsizemore" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://pwn.by/noraj"><img src="https://avatars.githubusercontent.com/u/16578570?v=4?s=100" width="100px;" alt="Alexandre ZANNI"/><br /><sub><b>Alexandre ZANNI</b></sub></a><br /><a href="#infra-noraj" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=noraj" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/craig"><img src="https://avatars.githubusercontent.com/u/99729?v=4?s=100" width="100px;" alt="Craig"/><br /><sub><b>Craig</b></sub></a><br /><a href="#infra-craig" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://www.reddit.com/u/EONRaider"><img src="https://avatars.githubusercontent.com/u/15611424?v=4?s=100" width="100px;" alt="EONRaider"/><br /><sub><b>EONRaider</b></sub></a><br /><a href="#infra-EONRaider" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/wtwver"><img src="https://avatars.githubusercontent.com/u/53866088?v=4?s=100" width="100px;" alt="wtwver"/><br /><sub><b>wtwver</b></sub></a><br /><a href="#infra-wtwver" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://tib3rius.com"><img src="https://avatars.githubusercontent.com/u/48113936?v=4?s=100" width="100px;" alt="Tib3rius"/><br /><sub><b>Tib3rius</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3ATib3rius" title="Bug reports">🐛</a> <a href="#ideas-Tib3rius" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/0xdf"><img src="https://avatars.githubusercontent.com/u/1489045?v=4?s=100" width="100px;" alt="0xdf"/><br /><sub><b>0xdf</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3A0xdf" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="http://secure77.de"><img src="https://avatars.githubusercontent.com/u/31564517?v=4?s=100" width="100px;" alt="secure-77"/><br /><sub><b>secure-77</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Asecure-77" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/sbrun"><img src="https://avatars.githubusercontent.com/u/7712154?v=4?s=100" width="100px;" alt="Sophie Brun"/><br /><sub><b>Sophie Brun</b></sub></a><br /><a href="#infra-sbrun" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/black-A"><img src="https://avatars.githubusercontent.com/u/30686803?v=4?s=100" width="100px;" alt="black-A"/><br /><sub><b>black-A</b></sub></a><br /><a href="#ideas-black-A" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/dinosn"><img src="https://avatars.githubusercontent.com/u/3851678?v=4?s=100" width="100px;" alt="Nicolas Krassas"/><br /><sub><b>Nicolas Krassas</b></sub></a><br /><a href="#ideas-dinosn" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/N0ur5"><img src="https://avatars.githubusercontent.com/u/24260009?v=4?s=100" width="100px;" alt="N0ur5"/><br /><sub><b>N0ur5</b></sub></a><br /><a href="#ideas-N0ur5" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/issues?q=author%3AN0ur5" title="Bug reports">🐛</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/moscowchill"><img src="https://avatars.githubusercontent.com/u/72578879?v=4?s=100" width="100px;" alt="mchill"/><br /><sub><b>mchill</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Amoscowchill" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="http://BitThr3at.github.io"><img src="https://avatars.githubusercontent.com/u/45028933?v=4?s=100" width="100px;" alt="Naman"/><br /><sub><b>Naman</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3ABitThr3at" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Sicks3c"><img src="https://avatars.githubusercontent.com/u/32225186?v=4?s=100" width="100px;" alt="Ayoub Elaich"/><br /><sub><b>Ayoub Elaich</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Asicks3c" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/HenryHoggard"><img src="https://avatars.githubusercontent.com/u/1208121?v=4?s=100" width="100px;" alt="Henry"/><br /><sub><b>Henry</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3AHenryHoggard" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/SleepiPanda"><img src="https://avatars.githubusercontent.com/u/6428561?v=4?s=100" width="100px;" alt="SleepiPanda"/><br /><sub><b>SleepiPanda</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3ASleepiPanda" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/uBadRequest"><img src="https://avatars.githubusercontent.com/u/47282747?v=4?s=100" width="100px;" alt="Bad Requests"/><br /><sub><b>Bad Requests</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3AuBadRequest" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://home.dnaka91.rocks"><img src="https://avatars.githubusercontent.com/u/36804488?v=4?s=100" width="100px;" alt="Dominik Nakamura"/><br /><sub><b>Dominik Nakamura</b></sub></a><br /><a href="#infra-dnaka91" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/hunter0x8"><img src="https://avatars.githubusercontent.com/u/46222314?v=4?s=100" width="100px;" alt="Muhammad Ahsan"/><br /><sub><b>Muhammad Ahsan</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Ahunter0x8" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/cortantief"><img src="https://avatars.githubusercontent.com/u/34527333?v=4?s=100" width="100px;" alt="cortantief"/><br /><sub><b>cortantief</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Acortantief" title="Bug reports">🐛</a> <a href="https://github.com/epi052/feroxbuster/commits?author=cortantief" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/dsaxton"><img src="https://avatars.githubusercontent.com/u/2658661?v=4?s=100" width="100px;" alt="Daniel Saxton"/><br /><sub><b>Daniel Saxton</b></sub></a><br /><a href="#ideas-dsaxton" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=dsaxton" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/n0kovo"><img src="https://avatars.githubusercontent.com/u/16690056?v=4?s=100" width="100px;" alt="n0kovo"/><br /><sub><b>n0kovo</b></sub></a><br /><a href="#ideas-n0kovo" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/issues?q=author%3An0kovo" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://ring0.lol"><img src="https://avatars.githubusercontent.com/u/1893909?v=4?s=100" width="100px;" alt="Justin Steven"/><br /><sub><b>Justin Steven</b></sub></a><br /><a href="#ideas-justinsteven" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/7047payloads"><img src="https://avatars.githubusercontent.com/u/95562424?v=4?s=100" width="100px;" alt="7047payloads"/><br /><sub><b>7047payloads</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=7047payloads" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/unkn0wnsyst3m"><img src="https://avatars.githubusercontent.com/u/21272239?v=4?s=100" width="100px;" alt="unkn0wnsyst3m"/><br /><sub><b>unkn0wnsyst3m</b></sub></a><br /><a href="#ideas-unkn0wnsyst3m" title="Ideas, Planning, & Feedback">🤔</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://ironwort.me/"><img src="https://avatars.githubusercontent.com/u/15280042?v=4?s=100" width="100px;" alt="0x08"/><br /><sub><b>0x08</b></sub></a><br /><a href="#ideas-its0x08" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/MD-Levitan"><img src="https://avatars.githubusercontent.com/u/12116508?v=4?s=100" width="100px;" alt="kusok"/><br /><sub><b>kusok</b></sub></a><br /><a href="#ideas-MD-Levitan" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=MD-Levitan" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/godylockz"><img src="https://avatars.githubusercontent.com/u/81207744?v=4?s=100" width="100px;" alt="godylockz"/><br /><sub><b>godylockz</b></sub></a><br /><a href="#ideas-godylockz" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=godylockz" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="http://ryanmontgomery.me"><img src="https://avatars.githubusercontent.com/u/44453666?v=4?s=100" width="100px;" alt="Ryan Montgomery"/><br /><sub><b>Ryan Montgomery</b></sub></a><br /><a href="#ideas-0dayCTF" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/IppSec"><img src="https://avatars.githubusercontent.com/u/24677271?v=4?s=100" width="100px;" alt="ippsec"/><br /><sub><b>ippsec</b></sub></a><br /><a href="#ideas-ippsec" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/gtjamesa"><img src="https://avatars.githubusercontent.com/u/2078364?v=4?s=100" width="100px;" alt="James"/><br /><sub><b>James</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Agtjamesa" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://twitter.com/Jhaddix"><img src="https://avatars.githubusercontent.com/u/3488554?v=4?s=100" width="100px;" alt="Jason Haddix"/><br /><sub><b>Jason Haddix</b></sub></a><br /><a href="#ideas-jhaddix" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/issues?q=author%3Ajhaddix" title="Bug reports">🐛</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/ThisLimn0"><img src="https://avatars.githubusercontent.com/u/67125885?v=4?s=100" width="100px;" alt="Limn0"/><br /><sub><b>Limn0</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3AThisLimn0" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/0xdf223"><img src="https://avatars.githubusercontent.com/u/76954092?v=4?s=100" width="100px;" alt="0xdf"/><br /><sub><b>0xdf</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3A0xdf223" title="Bug reports">🐛</a> <a href="#ideas-0xdf223" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Flangyver"><img src="https://avatars.githubusercontent.com/u/59575870?v=4?s=100" width="100px;" alt="Flangyver"/><br /><sub><b>Flangyver</b></sub></a><br /><a href="#ideas-Flangyver" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/DonatoReis"><img src="https://avatars.githubusercontent.com/u/93531354?v=4?s=100" width="100px;" alt="PeakyBlinder"/><br /><sub><b>PeakyBlinder</b></sub></a><br /><a href="#ideas-DonatoReis" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://postmodern.github.io/"><img src="https://avatars.githubusercontent.com/u/12671?v=4?s=100" width="100px;" alt="Postmodern"/><br /><sub><b>Postmodern</b></sub></a><br /><a href="#ideas-postmodern" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/herrcykel"><img src="https://avatars.githubusercontent.com/u/1936757?v=4?s=100" width="100px;" alt="O"/><br /><sub><b>O</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=herrcykel" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="http://udoprog.github.io/"><img src="https://avatars.githubusercontent.com/u/111092?v=4?s=100" width="100px;" alt="John-John Tedro"/><br /><sub><b>John-John Tedro</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=udoprog" title="Code">💻</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/kmanc"><img src="https://avatars.githubusercontent.com/u/14863147?v=4?s=100" width="100px;" alt="kmanc"/><br /><sub><b>kmanc</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Akmanc" title="Bug reports">🐛</a> <a href="https://github.com/epi052/feroxbuster/commits?author=kmanc" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/hakdogpinas"><img src="https://avatars.githubusercontent.com/u/71529469?v=4?s=100" width="100px;" alt="hakdogpinas"/><br /><sub><b>hakdogpinas</b></sub></a><br /><a href="#ideas-hakdogpinas" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/duokebei"><img src="https://avatars.githubusercontent.com/u/75022552?v=4?s=100" width="100px;" alt="多可悲"/><br /><sub><b>多可悲</b></sub></a><br /><a href="#ideas-duokebei" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://blog.ah34.net/"><img src="https://avatars.githubusercontent.com/u/58670593?v=4?s=100" width="100px;" alt="Aidan Hall"/><br /><sub><b>Aidan Hall</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=aidanhall34" title="Code">💻</a> <a href="#infra-aidanhall34" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://hachyderm.io/@JohnnyCiocca"><img src="https://avatars.githubusercontent.com/u/6473725?v=4?s=100" width="100px;" alt="João Ciocca"/><br /><sub><b>João Ciocca</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Ajoaociocca" title="Bug reports">🐛</a> <a href="#ideas-joaociocca" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/f3rn0s"><img src="https://avatars.githubusercontent.com/u/1351279?v=4?s=100" width="100px;" alt="f3rn0s"/><br /><sub><b>f3rn0s</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Af3rn0s" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://sth.sh"><img src="https://avatars.githubusercontent.com/u/2099767?v=4?s=100" width="100px;" alt="LongCat"/><br /><sub><b>LongCat</b></sub></a><br /><a href="#ideas-pich4ya" title="Ideas, Planning, & Feedback">🤔</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/xaeroborg"><img src="https://avatars.githubusercontent.com/u/33274680?v=4?s=100" width="100px;" alt="xaeroborg"/><br /><sub><b>xaeroborg</b></sub></a><br /><a href="#ideas-xaeroborg" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Luoooio"><img src="https://avatars.githubusercontent.com/u/26653157?v=4?s=100" width="100px;" alt="Luoooio"/><br /><sub><b>Luoooio</b></sub></a><br /><a href="#ideas-Luoooio" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://petruknisme.com"><img src="https://avatars.githubusercontent.com/u/6284204?v=4?s=100" width="100px;" alt="Aan"/><br /><sub><b>Aan</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=aancw" title="Code">💻</a> <a href="#infra-aancw" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-aancw" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/imBigo"><img src="https://avatars.githubusercontent.com/u/54672433?v=4?s=100" width="100px;" alt="Simon"/><br /><sub><b>Simon</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3AimBigo" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://acut3.github.io/"><img src="https://avatars.githubusercontent.com/u/17295243?v=4?s=100" width="100px;" alt="Nicolas Christin"/><br /><sub><b>Nicolas Christin</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Aacut3" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/DrorDvash"><img src="https://avatars.githubusercontent.com/u/8413651?v=4?s=100" width="100px;" alt="DrDv"/><br /><sub><b>DrDv</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3ADrorDvash" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/aroly"><img src="https://avatars.githubusercontent.com/u/1257705?v=4?s=100" width="100px;" alt="Antoine Roly"/><br /><sub><b>Antoine Roly</b></sub></a><br /><a href="#ideas-aroly" title="Ideas, Planning, & Feedback">🤔</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="http://lavafroth.is-a.dev"><img src="https://avatars.githubusercontent.com/u/107522312?v=4?s=100" width="100px;" alt="Himadri Bhattacharjee"/><br /><sub><b>Himadri Bhattacharjee</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=lavafroth" title="Code">💻</a> <a href="#ideas-lavafroth" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/AkechiShiro"><img src="https://avatars.githubusercontent.com/u/14914796?v=4?s=100" width="100px;" alt="Samy Lahfa"/><br /><sub><b>Samy Lahfa</b></sub></a><br /><a href="#ideas-AkechiShiro" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/sectroyer"><img src="https://avatars.githubusercontent.com/u/6706818?v=4?s=100" width="100px;" alt="sectroyer"/><br /><sub><b>sectroyer</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Asectroyer" title="Bug reports">🐛</a> <a href="#ideas-sectroyer" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://medium.com/@b3rm1nG"><img src="https://avatars.githubusercontent.com/u/19836003?v=4?s=100" width="100px;" alt="ktecv2000"/><br /><sub><b>ktecv2000</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Aktecv2000" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="http://untrue.me"><img src="https://avatars.githubusercontent.com/u/56048157?v=4?s=100" width="100px;" alt="Andrea De Murtas"/><br /><sub><b>Andrea De Murtas</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=andreademurtas" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/sawmj"><img src="https://avatars.githubusercontent.com/u/30024085?v=4?s=100" width="100px;" alt="sawmj"/><br /><sub><b>sawmj</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Asawmj" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/devx00"><img src="https://avatars.githubusercontent.com/u/6897405?v=4?s=100" width="100px;" alt="Zach Hanson"/><br /><sub><b>Zach Hanson</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Adevx00" title="Bug reports">🐛</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/ocervell"><img src="https://avatars.githubusercontent.com/u/9629314?v=4?s=100" width="100px;" alt="Olivier Cervello"/><br /><sub><b>Olivier Cervello</b></sub></a><br /><a href="#ideas-ocervell" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/RavySena"><img src="https://avatars.githubusercontent.com/u/67729597?v=4?s=100" width="100px;" alt="RavySena"/><br /><sub><b>RavySena</b></sub></a><br /><a href="#ideas-RavySena" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/stuhlmann"><img src="https://avatars.githubusercontent.com/u/11061864?v=4?s=100" width="100px;" alt="Florian Stuhlmann"/><br /><sub><b>Florian Stuhlmann</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Astuhlmann" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Mister7F"><img src="https://avatars.githubusercontent.com/u/35213773?v=4?s=100" width="100px;" alt="Mister7F"/><br /><sub><b>Mister7F</b></sub></a><br /><a href="#ideas-Mister7F" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/manugramm"><img src="https://avatars.githubusercontent.com/u/145961515?v=4?s=100" width="100px;" alt="manugramm"/><br /><sub><b>manugramm</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Amanugramm" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/ArthurMuraro"><img src="https://avatars.githubusercontent.com/u/73059809?v=4?s=100" width="100px;" alt="ArthurMuraro"/><br /><sub><b>ArthurMuraro</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3AArthurMuraro" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/amiremami"><img src="https://avatars.githubusercontent.com/u/15929497?v=4?s=100" width="100px;" alt="Shadow"/><br /><sub><b>Shadow</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Aamiremami" title="Bug reports">🐛</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/dirhamgithub"><img src="https://avatars.githubusercontent.com/u/115349974?v=4?s=100" width="100px;" alt="dirhamgithub"/><br /><sub><b>dirhamgithub</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Adirhamgithub" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/FieldOfRice"><img src="https://avatars.githubusercontent.com/u/85353?v=4?s=100" width="100px;" alt="FieldOfRice"/><br /><sub><b>FieldOfRice</b></sub></a><br /><a href="#infra-FieldOfRice" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/NotoriousRebel"><img src="https://avatars.githubusercontent.com/u/36310667?v=4?s=100" width="100px;" alt="Matt"/><br /><sub><b>Matt</b></sub></a><br /><a href="#ideas-NotoriousRebel" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/tritoke"><img src="https://avatars.githubusercontent.com/u/34941249?v=4?s=100" width="100px;" alt="Sam Leonard"/><br /><sub><b>Sam Leonard</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=tritoke" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/rew1nter"><img src="https://avatars.githubusercontent.com/u/64508791?v=4?s=100" width="100px;" alt="Rewinter"/><br /><sub><b>Rewinter</b></sub></a><br /><a href="#ideas-rew1nter" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/deadloot"><img src="https://avatars.githubusercontent.com/u/92878901?v=4?s=100" width="100px;" alt="deadloot"/><br /><sub><b>deadloot</b></sub></a><br /><a href="#ideas-deadloot" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Spidle"><img src="https://avatars.githubusercontent.com/u/90011249?v=4?s=100" width="100px;" alt="Spidle"/><br /><sub><b>Spidle</b></sub></a><br /><a href="#ideas-Spidle" title="Ideas, Planning, & Feedback">🤔</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/JulianGR"><img src="https://avatars.githubusercontent.com/u/53094530?v=4?s=100" width="100px;" alt="Julián Gómez"/><br /><sub><b>Julián Gómez</b></sub></a><br /><a href="#ideas-JulianGR" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-JulianGR" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=JulianGR" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/soutzis"><img src="https://avatars.githubusercontent.com/u/25797286?v=4?s=100" width="100px;" alt="Petros"/><br /><sub><b>Petros</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Asoutzis" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/sitiom"><img src="https://avatars.githubusercontent.com/u/56180050?v=4?s=100" width="100px;" alt="Ryan"/><br /><sub><b>Ryan</b></sub></a><br /><a href="#infra-sitiom" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=sitiom" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/wikamp-collaborator"><img src="https://avatars.githubusercontent.com/u/147445097?v=4?s=100" width="100px;" alt="wikamp-collaborator"/><br /><sub><b>wikamp-collaborator</b></sub></a><br /><a href="#ideas-wikamp-collaborator" title="Ideas, Planning, & Feedback">🤔</a> <a href="#infra-wikamp-collaborator" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
      <td align="center" valign="top" width="14.28%"><a href="http://lino.codes"><img src="https://avatars.githubusercontent.com/u/123986259?v=4?s=100" width="100px;" alt="Lino"/><br /><sub><b>Lino</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3AL1-0" title="Bug reports">🐛</a> <a href="#ideas-L1-0" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://danthesalmon.com"><img src="https://avatars.githubusercontent.com/u/3712226?v=4?s=100" width="100px;" alt="Dan Salmon"/><br /><sub><b>Dan Salmon</b></sub></a><br /><a href="#ideas-sa7mon" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/swordfish0x0"><img src="https://avatars.githubusercontent.com/u/21209130?v=4?s=100" width="100px;" alt="swordfish0x0"/><br /><sub><b>swordfish0x0</b></sub></a><br /><a href="#ideas-swordfish0x0" title="Ideas, Planning, & Feedback">🤔</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/libklein"><img src="https://avatars.githubusercontent.com/u/42714034?v=4?s=100" width="100px;" alt="Patrick Klein"/><br /><sub><b>Patrick Klein</b></sub></a><br /><a href="#ideas-libklein" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Raymond-JV"><img src="https://avatars.githubusercontent.com/u/23642921?v=4?s=100" width="100px;" alt="Raymond"/><br /><sub><b>Raymond</b></sub></a><br /><a href="#ideas-Raymond-JV" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/zer0x64"><img src="https://avatars.githubusercontent.com/u/17575242?v=4?s=100" width="100px;" alt="zer0x64"/><br /><sub><b>zer0x64</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=zer0x64" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://zar3bski.com"><img src="https://avatars.githubusercontent.com/u/22128014?v=4?s=100" width="100px;" alt="zar3bski"/><br /><sub><b>zar3bski</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=zar3bski" title="Code">💻</a> <a href="#ideas-zar3bski" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/karanabe"><img src="https://avatars.githubusercontent.com/u/152078880?v=4?s=100" width="100px;" alt="karanabe"/><br /><sub><b>karanabe</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=karanabe" title="Documentation">📖</a> <a href="https://github.com/epi052/feroxbuster/commits?author=karanabe" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/h121h"><img src="https://avatars.githubusercontent.com/u/616758?v=4?s=100" width="100px;" alt="h121h"/><br /><sub><b>h121h</b></sub></a><br /><a href="#ideas-h121h" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/s0i37"><img src="https://avatars.githubusercontent.com/u/22872513?v=4?s=100" width="100px;" alt="s0i37"/><br /><sub><b>s0i37</b></sub></a><br /><a href="#ideas-s0i37" title="Ideas, Planning, & Feedback">🤔</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/wilco375"><img src="https://avatars.githubusercontent.com/u/7385023?v=4?s=100" width="100px;" alt="Wilco"/><br /><sub><b>Wilco</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Awilco375" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/HenriBom"><img src="https://avatars.githubusercontent.com/u/46447744?v=4?s=100" width="100px;" alt="HenriBom"/><br /><sub><b>HenriBom</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3AHenriBom" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/0x7274"><img src="https://avatars.githubusercontent.com/u/85586890?v=4?s=100" width="100px;" alt="R̝͖̱͖͕̤̰̯͙ͫ͒̀ͮȁ̤͔̝̘̪̻͕̝̖ͧͪͤu̗̠̜̩̗͇͑̀ͣ̃͂̔͂c̫͔͚̲̬̓̂̿͌̿͊̐͗h͚̲̤̟͓̟̥̊ͬͪ̏̍̍ T̟̜̞͉͙̙ͣ́ͪ͗̓̇ͭo͍̰͎̼͓̟̽ͧ̓̉ͬ̐͐b͇̖̳̫̰̗̭͍ͧ̄̄̌̈i̙̪̤̝̟͓̹̋̽͋̀ͧ̒a͕̭̱͎̪̦̤ͤ͊̊̑ͣ̄s̪̯͖̰̯͍ͫ̋͑̄ͭͅͅ"/><br /><sub><b>R̝͖̱͖͕̤̰̯͙ͫ͒̀ͮȁ̤͔̝̘̪̻͕̝̖ͧͪͤu̗̠̜̩̗͇͑̀ͣ̃͂̔͂c̫͔͚̲̬̓̂̿͌̿͊̐͗h͚̲̤̟͓̟̥̊ͬͪ̏̍̍ T̟̜̞͉͙̙ͣ́ͪ͗̓̇ͭo͍̰͎̼͓̟̽ͧ̓̉ͬ̐͐b͇̖̳̫̰̗̭͍ͧ̄̄̌̈i̙̪̤̝̟͓̹̋̽͋̀ͧ̒a͕̭̱͎̪̦̤ͤ͊̊̑ͣ̄s̪̯͖̰̯͍ͫ̋͑̄ͭͅͅ</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3A0x7274" title="Bug reports">🐛</a> <a href="#ideas-0x7274" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=0x7274" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/4FunAndProfit"><img src="https://avatars.githubusercontent.com/u/174417079?v=4?s=100" width="100px;" alt="4FunAndProfit"/><br /><sub><b>4FunAndProfit</b></sub></a><br /><a href="#ideas-4FunAndProfit" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/lidorelias3"><img src="https://avatars.githubusercontent.com/u/41958137?v=4?s=100" width="100px;" alt="lidorelias3"/><br /><sub><b>lidorelias3</b></sub></a><br /><a href="#ideas-lidorelias3" title="Ideas, Planning, & Feedback">🤔</a></td>
      <td align="center" valign="top" width="14.28%"><a href="http://adnanullahkhan.com"><img src="https://avatars.githubusercontent.com/u/75381620?v=4?s=100" width="100px;" alt="Adnan Ullah Khan (auk0x01)"/><br /><sub><b>Adnan Ullah Khan (auk0x01)</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=auk0x01" title="Code">💻</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/mzember"><img src="https://avatars.githubusercontent.com/u/61412285?v=4?s=100" width="100px;" alt="Martin Žember"/><br /><sub><b>Martin Žember</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Amzember" title="Bug reports">🐛</a></td>
    </tr>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/pg9051"><img src="https://avatars.githubusercontent.com/u/202219877?v=4?s=100" width="100px;" alt="pg9051"/><br /><sub><b>pg9051</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=pg9051" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/sebastiaanspeck"><img src="https://avatars.githubusercontent.com/u/12570668?v=4?s=100" width="100px;" alt="Sebastiaan Speck"/><br /><sub><b>Sebastiaan Speck</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Asebastiaanspeck" title="Bug reports">🐛</a> <a href="https://github.com/epi052/feroxbuster/commits?author=sebastiaanspeck" title="Documentation">📖</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/OpenSourceKyle"><img src="https://avatars.githubusercontent.com/u/173112933?v=4?s=100" width="100px;" alt="OpenSourceKyle"/><br /><sub><b>OpenSourceKyle</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=OpenSourceKyle" title="Documentation">📖</a> <a href="https://github.com/epi052/feroxbuster/issues?q=author%3AOpenSourceKyle" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Antonio-R1"><img src="https://avatars.githubusercontent.com/u/54741970?v=4?s=100" width="100px;" alt="Antonio"/><br /><sub><b>Antonio</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=Antonio-R1" title="Code">💻</a> <a href="https://github.com/epi052/feroxbuster/issues?q=author%3AAntonio-R1" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/redacean"><img src="https://avatars.githubusercontent.com/u/125687454?v=4?s=100" width="100px;" alt="Redacean"/><br /><sub><b>Redacean</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Aredacean" title="Bug reports">🐛</a></td>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/ghsdpolley"><img src="https://avatars.githubusercontent.com/u/19826831?v=4?s=100" width="100px;" alt="ghsdpolley"/><br /><sub><b>ghsdpolley</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Aghsdpolley" title="Bug reports">🐛</a></td>
    </tr>
  </tbody>
</table>

<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->

<!-- ALL-CONTRIBUTORS-LIST:END -->

This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!


================================================
FILE: build.rs
================================================
use std::fs::{copy, create_dir_all, OpenOptions};
use std::io::{Read, Seek, Write};

use clap_complete::{generate_to, shells};

include!("src/parser.rs");

fn main() {
    println!("cargo:rerun-if-env-changed=src/parser.rs");

    if std::env::var("DOCS_RS").is_ok() {
        return; // only build when we're not generating docs
    }

    let outdir = "shell_completions";

    let mut app = initialize();

    generate_to(shells::Bash, &mut app, "feroxbuster", outdir).unwrap();
    generate_to(shells::Zsh, &mut app, "feroxbuster", outdir).unwrap();
    generate_to(shells::Fish, &mut app, "feroxbuster", outdir).unwrap();
    generate_to(shells::PowerShell, &mut app, "feroxbuster", outdir).unwrap();
    generate_to(shells::Elvish, &mut app, "feroxbuster", outdir).unwrap();

    // 0xdf pointed out an oddity when tab-completing options that expect file paths, the fix we
    // landed on was to add -o plusdirs to the bash completion script. The following code aims to
    // automate that fix and have it present in all future builds
    let mut contents = String::new();

    let mut bash_file = OpenOptions::new()
        .read(true)
        .write(true)
        .open(format!("{outdir}/feroxbuster.bash"))
        .expect("Couldn't open bash completion script");

    bash_file
        .read_to_string(&mut contents)
        .expect("Couldn't read bash completion script");

    contents = contents.replace("default feroxbuster", "default -o plusdirs feroxbuster");

    bash_file
        .rewind()
        .expect("Couldn't seek to position 0 in bash completion script");

    bash_file
        .write_all(contents.as_bytes())
        .expect("Couldn't write updated bash completion script to disk");

    // hunter0x8 let me know that when installing via cargo, it would be nice if we dropped a
    // config file during the build process. The following code will place an example config in
    // the user's configuration directory
    //   - linux: $XDG_CONFIG_HOME or $HOME/.config
    //   - macOS: $HOME/Library/Application Support
    //   - windows: {FOLDERID_RoamingAppData}
    let mut config_dir = dirs::config_dir().expect("Couldn't resolve user's config directory");
    config_dir = config_dir.join("feroxbuster"); // $HOME/.config/feroxbuster

    if !config_dir.exists() {
        // recursively create the feroxbuster directory and all of its parent components if
        // they are missing
        if create_dir_all(&config_dir).is_err() {
            // only copy the config file when we're not running in the CI/CD pipeline
            // which fails with permission denied
            eprintln!("Couldn't create one or more directories needed to copy the config file");
            return;
        }
    }

    // hard-coding config name here to not rely on the crate we're building, if DEFAULT_CONFIG_NAME
    // ever changes, this will need to be updated
    let config_file = config_dir.join("ferox-config.toml");

    if !config_file.exists() {
        // config file doesn't exist, add it to the config directory
        if copy("ferox-config.toml.example", config_file).is_err() {
            eprintln!("Couldn't copy example config into config directory");
        }
    }
}


================================================
FILE: choco_package/feroxbuster.nuspec
================================================
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd">
  <metadata>
    <id>feroxbuster</id>
    <version>2.8.0</version>
    <packageSourceUrl>https://github.com/epi052/feroxbuster/releases/</packageSourceUrl>
    <owners>epi052</owners>
    <title>feroxbuster (Install)</title>
    <authors>epi052</authors>
    <projectUrl>https://github.com/epi052/feroxbuster</projectUrl>
    <iconUrl>https://rawcdn.githack.com/epi052/feroxbuster/2d381e7e057ce60c580b324dd36c9abaf30c2ec7/img/logo/logo.png</iconUrl>
    <copyright>2020-2023</copyright>
    <licenseUrl>https://github.com/epi052/feroxbuster/blob/main/LICENSE</licenseUrl>
    <requireLicenseAcceptance>true</requireLicenseAcceptance>
    <projectSourceUrl>https://github.com/epi052/feroxbuster</projectSourceUrl>
    <docsUrl>https://epi052.github.io/feroxbuster-docs/</docsUrl>
    <!--<mailingListUrl></mailingListUrl>-->
    <bugTrackerUrl>https://github.com/epi052/feroxbuster/issues</bugTrackerUrl>
    <tags>content-discovery pentesting-tool url-bruteforcer</tags>
    <summary>A simple, fast, recursive content discovery tool written in Rust</summary>
    <description>
    A simple, fast, recursive content discovery tool written in Rust
[![Feroxbuster](https://github.com/epi052/feroxbuster/raw/main/img/logo/default-cropped.png)](https://github.com/epi052/feroxbuster)

## What the heck is a ferox anyway?

Ferox is short for Ferric Oxide. Ferric Oxide, simply put, is rust. The name rustbuster was taken, so I decided on a
variation. 

## What's it do tho?

`feroxbuster` is a tool designed to perform [Forced Browsing](https://owasp.org/www-community/attacks/Forced_browsing).

Forced browsing is an attack where the aim is to enumerate and access resources that are not referenced by the web
application, but are still accessible by an attacker.

`feroxbuster` uses brute force combined with a wordlist to search for unlinked content in target directories. These
resources may store sensitive information about web applications and operational systems, such as source code,
credentials, internal network addressing, etc...

This attack is also known as Predictable Resource Location, File Enumeration, Directory Enumeration, and Resource
Enumeration.

## Quick Start

This section will cover the minimum amount of information to get up and running with feroxbuster. Please refer the the [documentation](https://epi052.github.io/feroxbuster-docs/overview), as it's much more comprehensive.

### Installation

There are quite a few other [installation methods](https://epi052.github.io/feroxbuster-docs/installation/android/), but these snippets should cover the majority of users. 

#### All others Docs

Please refer the the [documentation](https://epi052.github.io/feroxbuster-docs/overview).

## Example Usage

Here are a few brief examples to get you started.  Please note, feroxbuster can do a **lot more** than what's listed below.  As a result, there are **many more** examples, with **demonstration gifs** that highlight specific features, in the [documentation](https://epi052.github.io/feroxbuster-docs/overview).

### Multiple Values

Options that take multiple values are very flexible. Consider the following ways of specifying extensions:

```
./feroxbuster -u http://127.1 -x pdf -x js,html -x php txt json,docx
```

The command above adds .pdf, .js, .html, .php, .txt, .json, and .docx to each url

All of the methods above (multiple flags, space separated, comma separated, etc...) are valid and interchangeable. The
same goes for urls, headers, status codes, queries, and size filters.
</description>
    <!-- <releaseNotes>__REPLACE_OR_REMOVE__MarkDown_Okay</releaseNotes> -->
  </metadata>
  <files>
    <!-- this section controls what actually gets packaged into the Chocolatey package -->
    <file src="tools\**" target="tools" />
  </files>
</package>


================================================
FILE: choco_package/legal/LICENSE.txt
================================================

From: https://github.com/epi052/feroxbuster/blob/main/LICENSE

LICENSE

MIT License

Copyright (c) 2020-2023 epi

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: choco_package/legal/VERIFICATION.txt
================================================

VERIFICATION

checksum -t sha512 -f .\x86-windows-feroxbuster.exe.zip
checksum -t sha512 -f .\x86_64-windows-feroxbuster.exe.zip

================================================
FILE: choco_package/tools/chocolateyinstall.ps1
================================================
$ErrorActionPreference = 'Stop' 

$toolsDir   = "$(Split-Path -parent $MyInvocation.MyCommand.Definition)"
$version    = '2.8.0'
$url        = "https://github.com/epi052/feroxbuster/releases/download/v$version/x86-windows-feroxbuster.exe.zip"
$url64      = "https://github.com/epi052/feroxbuster/releases/download/v$version/x86_64-windows-feroxbuster.exe.zip"

$packageArgs = @{
  packageName   = $env:ChocolateyPackageName
  unzipLocation = $toolsDir
  fileType      = 'exe' #only one of these: exe, msi, msu
  url           = $url
  url64bit      = $url64
  #file         = $fileLocation

  softwareName  = 'feroxbuster*' 

  # Checksums are now required as of 0.10.0.
  # To determine checksums, you can get that from the original site if provided.
  # You can also use checksum.exe (choco install checksum) and use it
  # e.g. checksum -t sha256 -f path\to\file
  checksum      = 'e5cac59c737260233903a17706a68bac11fe0d7a15169e1c5a9637cc221e7230fd6ddbfc1a7243833dde6472ad053c033449ca8338164654f7354363da54ba88'
  checksumType  = 'sha512'
  checksum64    = 'cce58d6eacef7e12c31076f5a00fee9742a4e3fdfc69d807d98736200e50469f77359978e137ecafd87b14460845c65c6808d1f8b23ae561f7e7c637e355dee3'
  checksumType64= 'sha512'
}
Install-ChocolateyZipPackage @packageArgs # https://docs.chocolatey.org/en-us/create/functions/install-chocolateyzippackage

================================================
FILE: choco_package/tools/chocolateyuninstall.ps1
================================================
$ErrorActionPreference = 'Stop' # stop on all errors
$packageArgs = @{
  packageName   = $env:ChocolateyPackageName
  softwareName  = 'feroxbuster*'  #part or all of the Display Name as you see it in Programs and Features. It should be enough to be unique
  fileType      = 'exe' #only one of these: MSI or EXE (ignore MSU for now)
}

# Get-UninstallRegistryKey is new to 0.9.10, if supporting 0.9.9.x and below,
# take a dependency on "chocolatey-core.extension" in your nuspec file.
# This is only a fuzzy search if $softwareName includes '*'. Otherwise it is
# exact. In the case of versions in key names, we recommend removing the version
# and using '*'.
[array]$key = Get-UninstallRegistryKey -SoftwareName $packageArgs['softwareName']

if ($key.Count -eq 1) {
  $key | % {
    $packageArgs['file'] = "$($_.UninstallString)" #NOTE: You may need to split this if it contains spaces, see below

    if ($packageArgs['fileType'] -eq 'MSI') {
      # The Product Code GUID is all that should be passed for MSI, and very
      # FIRST, because it comes directly after /x, which is already set in the
      # Uninstall-ChocolateyPackage msiargs (facepalm).
      $packageArgs['silentArgs'] = "$($_.PSChildName) $($packageArgs['silentArgs'])"

      # Don't pass anything for file, it is ignored for msi (facepalm number 2)
      # Alternatively if you need to pass a path to an msi, determine that and
      # use it instead of the above in silentArgs, still very first
      $packageArgs['file'] = ''
    } else {
      # NOTES:
      # - You probably will need to sanitize $packageArgs['file'] as it comes from the registry and could be in a variety of fun but unusable formats
      # - Split args from exe in $packageArgs['file'] and pass those args through $packageArgs['silentArgs'] or ignore them
      # - Ensure you don't pass double quotes in $file (aka $packageArgs['file']) - otherwise you will get "Illegal characters in path when you attempt to run this"
      # - Review the code for auto-uninstaller for all of the fun things it does in sanitizing - https://github.com/chocolatey/choco/blob/bfe351b7d10c798014efe4bfbb100b171db25099/src/chocolatey/infrastructure.app/services/AutomaticUninstallerService.cs#L142-L192
    }

    Uninstall-ChocolateyPackage @packageArgs
  }
} elseif ($key.Count -eq 0) {
  Write-Warning "$packageName has already been uninstalled by other means."
} elseif ($key.Count -gt 1) {
  Write-Warning "$($key.Count) matches found!"
  Write-Warning "To prevent accidental data loss, no programs will be uninstalled."
  Write-Warning "Please alert package maintainer the following keys were matched:"
  $key | % {Write-Warning "- $($_.DisplayName)"}
}



================================================
FILE: docs/.nojekyll
================================================


================================================
FILE: docs/index.html
================================================
<html>
<head>
   <meta http-equiv="refresh"
   content="0; url=https://epi052.github.io/feroxbuster-docs/">
</head>
<body>
   <p>The page has moved to:
   <a href="https://epi052.github.io/feroxbuster-docs/">feroxbuster-docs</a></p>
</body>
</html>



================================================
FILE: ferox-config.toml.example
================================================
# Example configuration for feroxbuster
#
# If you wish to provide persistent settings to feroxbuster, rename this file to ferox-config.toml and make sure
# it resides in the same directory as the feroxbuster binary.
#
# After that, uncomment any line to override the default value provided by the binary itself.
#
# Any setting used here can be overridden by the corresponding command line option/argument
#
# wordlist = "/wordlists/seclists/Discovery/Web-Content/raft-medium-directories.txt"
# status_codes = [200, 500]
# filter_status = [301]
# threads = 1
# timeout = 5
# proxy = "http://127.0.0.1:8080"
# replay_proxy = "http://127.0.0.1:8081"
# replay_codes = [200, 302]
# verbosity = 1
# parallel = 8
# scan_limit = 6
# rate_limit = 250
# quiet = true
# silent = true
# auto_tune = true
# auto_bail = true
# json = true
# output = "/targets/ellingson_mineral_company/gibson.txt"
# debug_log = "/var/log/find-the-derp.log"
# user_agent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0"
# random_agent = false
# redirects = true
# insecure = true
# collect_words = true
# collect_backups = true
# collect_extensions = true
# extensions = ["php", "html"]
# dont_collect = ["png", "gif", "jpg", "jpeg"]
# methods = ["GET", "POST"]
# data = [11, 12, 13, 14, 15]
# url_denylist = ["http://dont-scan.me", "https://also-not.me"]
# any subdomain of a domain provided to scope is implicitly allowed also.
# so things like "api.other.com" and "sub.third.com" would also be considered
# in-scope given the example config below.
# scope = ["example.com", "other.com", "third.com"]
# regex_denylist = ["/deny.*"]
# no_recursion = true
# add_slash = true
# stdin = true
# dont_filter = true
# extract_links = true
# depth = 1
# limit_bars = 3
# force_recursion = true
# filter_size = [5174]
# filter_regex = ["^ignore me$"]
# filter_similar = ["https://somesite.com/soft404"]
# filter_word_count = [993]
# filter_line_count = [35, 36]
# queries = [["name","value"], ["rick", "astley"]]
# save_state = false
# time_limit = "10m"
# server_certs = ["/some/cert.pem", "/some/other/cert.pem"]
# client_cert = "/some/client/cert.pem"
# client_key = "/some/client/key.pem"
# request_file = "/some/raw/request/file"
# protocol = "http"
# scan_dir_listings = true
# unique = true
# response_size_limit = 4194304

# headers can be specified on multiple lines or as an inline table
#
# inline example
# headers = {"stuff" = "things"}
#
# multi-line example
#   note: if multi-line is used, all key/value pairs under it belong to the headers table until the next table
#         is found or the end of the file is reached
#
# If you want to use [headers], UNCOMMENT the line below
# [headers]
# stuff = "things"
# more = "headers"


================================================
FILE: install-nix.sh
================================================
#!/usr/bin/env bash

BASE_URL=https://github.com/epi052/feroxbuster/releases/latest/download

MAC_ZIP=x86_64-macos-feroxbuster.zip
MAC_URL="$BASE_URL/$MAC_ZIP"

LIN32_ZIP=x86-linux-feroxbuster.zip
LIN32_URL="$BASE_URL/$LIN32_ZIP"

LIN64_ZIP=x86_64-linux-feroxbuster.zip
LIN64_URL="$BASE_URL/$LIN64_ZIP"

EMOJI_URL=https://gist.github.com/epi052/8196b550ea51d0907ad4b93751b1b57d/raw/6112c9f32ae07922983fdc549c54fd3fb9a38e4c/NotoColorEmoji.ttf

INSTALL_DIR="${1:-$(pwd)}"

echo "[+] Installing feroxbuster to ${INSTALL_DIR}!"

which unzip &>/dev/null
if [ "$?" != "0" ]; then
  echo "[!] unzip not found, exiting. "
  exit -1
fi

if [[ "$(uname)" == "Darwin" ]]; then
  echo "[=] Found MacOS, downloading from $MAC_URL"

  curl -sLO "$MAC_URL"
  unzip -o "$MAC_ZIP" -d "${INSTALL_DIR}" >/dev/null
  rm "$MAC_ZIP"
elif [[ "$(expr substr $(uname -s) 1 5)" == "Linux" ]]; then
  if [[ $(getconf LONG_BIT) == 32 ]]; then
    echo "[=] Found 32-bit Linux, downloading from $LIN32_URL"

    curl -sLO "$LIN32_URL"
    unzip -o "$LIN32_ZIP" -d "${INSTALL_DIR}" >/dev/null
    rm "$LIN32_ZIP"
  else
    echo "[=] Found 64-bit Linux, downloading from $LIN64_URL"

    curl -sLO "$LIN64_URL"
    unzip -o "$LIN64_ZIP" -d "${INSTALL_DIR}" >/dev/null
    rm "$LIN64_ZIP"
  fi

  if [[ "$(fc-list NotoColorEmoji | wc -l)" -gt 0 ]]; then
    echo "[=] Found Noto Emoji Font, skipping install"
  else
    echo "[=] Installing Noto Emoji Font"
    mkdir -p ~/.fonts
    pushd ~/.fonts 2>&1 >/dev/null

    curl -sLO "$EMOJI_URL"

    fc-cache -f -v >/dev/null

    popd 2>&1 >/dev/null
    echo "[+] Noto Emoji Font installed"
  fi
fi

chmod +x "${INSTALL_DIR}/feroxbuster"

echo "[+] Installed feroxbuster"
echo "  [-] path: ${INSTALL_DIR}/feroxbuster"
echo "  [-] version: $(${INSTALL_DIR}/feroxbuster -V | awk '{print $2}')"


================================================
FILE: shell_completions/_feroxbuster
================================================
#compdef feroxbuster

autoload -U is-at-least

_feroxbuster() {
    typeset -A opt_args
    typeset -a _arguments_options
    local ret=1

    if is-at-least 5.2; then
        _arguments_options=(-s -S -C)
    else
        _arguments_options=(-s -C)
    fi

    local context curcontext="$curcontext" state line
    _arguments "${_arguments_options[@]}" : \
'-u+[The target URL (required, unless \[--stdin || --resume-from || --request-file\] used)]:URL:_urls' \
'--url=[The target URL (required, unless \[--stdin || --resume-from || --request-file\] used)]:URL:_urls' \
'(-u --url)--resume-from=[State file from which to resume a partially complete scan (ex. --resume-from ferox-1606586780.state)]:STATE_FILE:_files' \
'(-u --url)--request-file=[Raw HTTP request file to use as a template for all requests]:REQUEST_FILE:_files' \
'(--data --data-json)--data-urlencoded=[Set -H '\''Content-Type\: application/x-www-form-urlencoded'\'', --data to <data-urlencoded> (supports @file) and -m to POST]:DATA:_default' \
'(--data --data-urlencoded)--data-json=[Set -H '\''Content-Type\: application/json'\'', --data to <data-json> (supports @file) and -m to POST]:DATA:_default' \
'-p+[Proxy to use for requests (ex\: http(s)\://host\:port, socks5(h)\://host\:port)]:PROXY:_urls' \
'--proxy=[Proxy to use for requests (ex\: http(s)\://host\:port, socks5(h)\://host\:port)]:PROXY:_urls' \
'-P+[Send only unfiltered requests through a Replay Proxy, instead of all requests]:REPLAY_PROXY:_urls' \
'--replay-proxy=[Send only unfiltered requests through a Replay Proxy, instead of all requests]:REPLAY_PROXY:_urls' \
'*-R+[Status Codes to send through a Replay Proxy when found (default\: --status-codes value)]:REPLAY_CODE:_default' \
'*--replay-codes=[Status Codes to send through a Replay Proxy when found (default\: --status-codes value)]:REPLAY_CODE:_default' \
'-a+[Sets the User-Agent (default\: feroxbuster/2.13.1)]:USER_AGENT:_default' \
'--user-agent=[Sets the User-Agent (default\: feroxbuster/2.13.1)]:USER_AGENT:_default' \
'*-x+[File extension(s) to search for (ex\: -x php -x pdf js); reads values (newline-separated) from file if input starts with an @ (ex\: @ext.txt)]:FILE_EXTENSION:_default' \
'*--extensions=[File extension(s) to search for (ex\: -x php -x pdf js); reads values (newline-separated) from file if input starts with an @ (ex\: @ext.txt)]:FILE_EXTENSION:_default' \
'*-m+[Which HTTP request method(s) should be sent (default\: GET)]:HTTP_METHODS:_default' \
'*--methods=[Which HTTP request method(s) should be sent (default\: GET)]:HTTP_METHODS:_default' \
'--data=[Request'\''s Body; can read data from a file if input starts with an @ (ex\: @post.bin)]:DATA:_default' \
'*-H+[Specify HTTP headers to be used in each request (ex\: -H Header\:val -H '\''stuff\: things'\'')]:HEADER:_default' \
'*--headers=[Specify HTTP headers to be used in each request (ex\: -H Header\:val -H '\''stuff\: things'\'')]:HEADER:_default' \
'*-b+[Specify HTTP cookies to be used in each request (ex\: -b stuff=things)]:COOKIE:_default' \
'*--cookies=[Specify HTTP cookies to be used in each request (ex\: -b stuff=things)]:COOKIE:_default' \
'*-Q+[Request'\''s URL query parameters (ex\: -Q token=stuff -Q secret=key)]:QUERY:_default' \
'*--query=[Request'\''s URL query parameters (ex\: -Q token=stuff -Q secret=key)]:QUERY:_default' \
'--protocol=[Specify the protocol to use when targeting via --request-file or --url with domain only (default\: https)]:PROTOCOL:_default' \
'*--dont-scan=[URL(s) or Regex Pattern(s) to exclude from recursion/scans]:URL:_default' \
'*--scope=[Additional domains/URLs to consider in-scope for scanning (in addition to current domain)]:URL:_default' \
'*-S+[Filter out messages of a particular size (ex\: -S 5120 -S 4927,1970)]:SIZE:_default' \
'*--filter-size=[Filter out messages of a particular size (ex\: -S 5120 -S 4927,1970)]:SIZE:_default' \
'*-X+[Filter out messages via regular expression matching on the response'\''s body/headers (ex\: -X '\''^ignore me\$'\'')]:REGEX:_default' \
'*--filter-regex=[Filter out messages via regular expression matching on the response'\''s body/headers (ex\: -X '\''^ignore me\$'\'')]:REGEX:_default' \
'*-W+[Filter out messages of a particular word count (ex\: -W 312 -W 91,82)]:WORDS:_default' \
'*--filter-words=[Filter out messages of a particular word count (ex\: -W 312 -W 91,82)]:WORDS:_default' \
'*-N+[Filter out messages of a particular line count (ex\: -N 20 -N 31,30)]:LINES:_default' \
'*--filter-lines=[Filter out messages of a particular line count (ex\: -N 20 -N 31,30)]:LINES:_default' \
'(-s --status-codes)*-C+[Filter out status codes (deny list) (ex\: -C 200 -C 401)]:STATUS_CODE:_default' \
'(-s --status-codes)*--filter-status=[Filter out status codes (deny list) (ex\: -C 200 -C 401)]:STATUS_CODE:_default' \
'*--filter-similar-to=[Filter out pages that are similar to the given page (ex. --filter-similar-to http\://site.xyz/soft404)]:UNWANTED_PAGE:_urls' \
'*-s+[Status Codes to include (allow list) (default\: All Status Codes)]:STATUS_CODE:_default' \
'*--status-codes=[Status Codes to include (allow list) (default\: All Status Codes)]:STATUS_CODE:_default' \
'-T+[Number of seconds before a client'\''s request times out (default\: 7)]:SECONDS:_default' \
'--timeout=[Number of seconds before a client'\''s request times out (default\: 7)]:SECONDS:_default' \
'--server-certs=[Add custom root certificate(s) for servers with unknown certificates]:PEM|DER:_files' \
'--client-cert=[Add a PEM encoded certificate for mutual authentication (mTLS)]:PEM:_files' \
'--client-key=[Add a PEM encoded private key for mutual authentication (mTLS)]:PEM:_files' \
'-t+[Number of concurrent threads (default\: 50)]:THREADS:_default' \
'--threads=[Number of concurrent threads (default\: 50)]:THREADS:_default' \
'-d+[Maximum recursion depth, a depth of 0 is infinite recursion (default\: 4)]:RECURSION_DEPTH:_default' \
'--depth=[Maximum recursion depth, a depth of 0 is infinite recursion (default\: 4)]:RECURSION_DEPTH:_default' \
'-L+[Limit total number of concurrent scans (default\: 0, i.e. no limit)]:SCAN_LIMIT:_default' \
'--scan-limit=[Limit total number of concurrent scans (default\: 0, i.e. no limit)]:SCAN_LIMIT:_default' \
'(-v --verbosity -u --url)--parallel=[Run parallel feroxbuster instances (one child process per url passed via stdin)]:PARALLEL_SCANS:_default' \
'--rate-limit=[Limit number of requests per second (per directory) (default\: 0, i.e. no limit)]:RATE_LIMIT:_default' \
'--response-size-limit=[Limit size of response body to read in bytes (default\: 4MB)]:BYTES:_default' \
'--time-limit=[Limit total run time of all scans (ex\: --time-limit 10m)]:TIME_SPEC:_default' \
'-w+[Path or URL of the wordlist]:FILE:_files' \
'--wordlist=[Path or URL of the wordlist]:FILE:_files' \
'-B+[Automatically request likely backup extensions for "found" urls (default\: ~, .bak, .bak2, .old, .1)]' \
'--collect-backups=[Automatically request likely backup extensions for "found" urls (default\: ~, .bak, .bak2, .old, .1)]' \
'*-I+[File extension(s) to Ignore while collecting extensions (only used with --collect-extensions)]:FILE_EXTENSION:_default' \
'*--dont-collect=[File extension(s) to Ignore while collecting extensions (only used with --collect-extensions)]:FILE_EXTENSION:_default' \
'-o+[Output file to write results to (use w/ --json for JSON entries)]:FILE:_files' \
'--output=[Output file to write results to (use w/ --json for JSON entries)]:FILE:_files' \
'--debug-log=[Output file to write log entries (use w/ --json for JSON entries)]:FILE:_files' \
'--limit-bars=[Number of directory scan bars to show at any given time (default\: no limit)]:NUM_BARS_TO_SHOW:_default' \
'(-u --url)--stdin[Read url(s) from STDIN]' \
'(-p --proxy -k --insecure --burp-replay)--burp[Set --proxy to http\://127.0.0.1\:8080 and set --insecure to true]' \
'(-P --replay-proxy -k --insecure)--burp-replay[Set --replay-proxy to http\://127.0.0.1\:8080 and set --insecure to true]' \
'(--rate-limit --auto-bail)--smart[Set --auto-tune, --collect-words, and --collect-backups to true]' \
'(--rate-limit --auto-bail)--thorough[Use the same settings as --smart and set --collect-extensions and --scan-dir-listings to true]' \
'-A[Use a random User-Agent]' \
'--random-agent[Use a random User-Agent]' \
'-f[Append / to each request'\''s URL]' \
'--add-slash[Append / to each request'\''s URL]' \
'--unique[Only show unique responses]' \
'-r[Allow client to follow redirects]' \
'--redirects[Allow client to follow redirects]' \
'-k[Disables TLS certificate validation in the client]' \
'--insecure[Disables TLS certificate validation in the client]' \
'-n[Do not scan recursively]' \
'--no-recursion[Do not scan recursively]' \
'(-n --no-recursion)--force-recursion[Force recursion attempts on all '\''found'\'' endpoints (still respects recursion depth)]' \
'-e[Extract links from response body (html, javascript, etc...); make new requests based on findings (default\: true)]' \
'--extract-links[Extract links from response body (html, javascript, etc...); make new requests based on findings (default\: true)]' \
'--dont-extract-links[Don'\''t extract links from response body (html, javascript, etc...)]' \
'(--auto-bail)--auto-tune[Automatically lower scan rate when an excessive amount of errors are encountered]' \
'--auto-bail[Automatically stop scanning when an excessive amount of errors are encountered]' \
'-D[Don'\''t auto-filter wildcard responses]' \
'--dont-filter[Don'\''t auto-filter wildcard responses]' \
'-E[Automatically discover extensions and add them to --extensions (unless they'\''re in --dont-collect)]' \
'--collect-extensions[Automatically discover extensions and add them to --extensions (unless they'\''re in --dont-collect)]' \
'-g[Automatically discover important words from within responses and add them to the wordlist]' \
'--collect-words[Automatically discover important words from within responses and add them to the wordlist]' \
'--scan-dir-listings[Force scans to recurse into directory listings]' \
'(--silent)*-v[Increase verbosity level (use -vv or more for greater effect. \[CAUTION\] 4 -v'\''s is probably too much)]' \
'(--silent)*--verbosity[Increase verbosity level (use -vv or more for greater effect. \[CAUTION\] 4 -v'\''s is probably too much)]' \
'(-q --quiet)--silent[Only print URLs (or JSON w/ --json) + turn off logging (good for piping a list of urls to other commands)]' \
'-q[Hide progress bars and banner (good for tmux windows w/ notifications)]' \
'--quiet[Hide progress bars and banner (good for tmux windows w/ notifications)]' \
'--json[Emit JSON logs to --output and --debug-log instead of normal text]' \
'--no-state[Disable state output file (*.state)]' \
'-U[Update feroxbuster to the latest version]' \
'--update[Update feroxbuster to the latest version]' \
'-h[Print help (see more with '\''--help'\'')]' \
'--help[Print help (see more with '\''--help'\'')]' \
'-V[Print version]' \
'--version[Print version]' \
&& ret=0
}

(( $+functions[_feroxbuster_commands] )) ||
_feroxbuster_commands() {
    local commands; commands=()
    _describe -t commands 'feroxbuster commands' commands "$@"
}

if [ "$funcstack[1]" = "_feroxbuster" ]; then
    _feroxbuster "$@"
else
    compdef _feroxbuster feroxbuster
fi


================================================
FILE: shell_completions/_feroxbuster.ps1
================================================

using namespace System.Management.Automation
using namespace System.Management.Automation.Language

Register-ArgumentCompleter -Native -CommandName 'feroxbuster' -ScriptBlock {
    param($wordToComplete, $commandAst, $cursorPosition)

    $commandElements = $commandAst.CommandElements
    $command = @(
        'feroxbuster'
        for ($i = 1; $i -lt $commandElements.Count; $i++) {
            $element = $commandElements[$i]
            if ($element -isnot [StringConstantExpressionAst] -or
                $element.StringConstantType -ne [StringConstantType]::BareWord -or
                $element.Value.StartsWith('-') -or
                $element.Value -eq $wordToComplete) {
                break
        }
        $element.Value
    }) -join ';'

    $completions = @(switch ($command) {
        'feroxbuster' {
            [CompletionResult]::new('-u', '-u', [CompletionResultType]::ParameterName, 'The target URL (required, unless [--stdin || --resume-from || --request-file] used)')
            [CompletionResult]::new('--url', '--url', [CompletionResultType]::ParameterName, 'The target URL (required, unless [--stdin || --resume-from || --request-file] used)')
            [CompletionResult]::new('--resume-from', '--resume-from', [CompletionResultType]::ParameterName, 'State file from which to resume a partially complete scan (ex. --resume-from ferox-1606586780.state)')
            [CompletionResult]::new('--request-file', '--request-file', [CompletionResultType]::ParameterName, 'Raw HTTP request file to use as a template for all requests')
            [CompletionResult]::new('--data-urlencoded', '--data-urlencoded', [CompletionResultType]::ParameterName, 'Set -H ''Content-Type: application/x-www-form-urlencoded'', --data to <data-urlencoded> (supports @file) and -m to POST')
            [CompletionResult]::new('--data-json', '--data-json', [CompletionResultType]::ParameterName, 'Set -H ''Content-Type: application/json'', --data to <data-json> (supports @file) and -m to POST')
            [CompletionResult]::new('-p', '-p', [CompletionResultType]::ParameterName, 'Proxy to use for requests (ex: http(s)://host:port, socks5(h)://host:port)')
            [CompletionResult]::new('--proxy', '--proxy', [CompletionResultType]::ParameterName, 'Proxy to use for requests (ex: http(s)://host:port, socks5(h)://host:port)')
            [CompletionResult]::new('-P', '-P ', [CompletionResultType]::ParameterName, 'Send only unfiltered requests through a Replay Proxy, instead of all requests')
            [CompletionResult]::new('--replay-proxy', '--replay-proxy', [CompletionResultType]::ParameterName, 'Send only unfiltered requests through a Replay Proxy, instead of all requests')
            [CompletionResult]::new('-R', '-R ', [CompletionResultType]::ParameterName, 'Status Codes to send through a Replay Proxy when found (default: --status-codes value)')
            [CompletionResult]::new('--replay-codes', '--replay-codes', [CompletionResultType]::ParameterName, 'Status Codes to send through a Replay Proxy when found (default: --status-codes value)')
            [CompletionResult]::new('-a', '-a', [CompletionResultType]::ParameterName, 'Sets the User-Agent (default: feroxbuster/2.13.1)')
            [CompletionResult]::new('--user-agent', '--user-agent', [CompletionResultType]::ParameterName, 'Sets the User-Agent (default: feroxbuster/2.13.1)')
            [CompletionResult]::new('-x', '-x', [CompletionResultType]::ParameterName, 'File extension(s) to search for (ex: -x php -x pdf js); reads values (newline-separated) from file if input starts with an @ (ex: @ext.txt)')
            [CompletionResult]::new('--extensions', '--extensions', [CompletionResultType]::ParameterName, 'File extension(s) to search for (ex: -x php -x pdf js); reads values (newline-separated) from file if input starts with an @ (ex: @ext.txt)')
            [CompletionResult]::new('-m', '-m', [CompletionResultType]::ParameterName, 'Which HTTP request method(s) should be sent (default: GET)')
            [CompletionResult]::new('--methods', '--methods', [CompletionResultType]::ParameterName, 'Which HTTP request method(s) should be sent (default: GET)')
            [CompletionResult]::new('--data', '--data', [CompletionResultType]::ParameterName, 'Request''s Body; can read data from a file if input starts with an @ (ex: @post.bin)')
            [CompletionResult]::new('-H', '-H ', [CompletionResultType]::ParameterName, 'Specify HTTP headers to be used in each request (ex: -H Header:val -H ''stuff: things'')')
            [CompletionResult]::new('--headers', '--headers', [CompletionResultType]::ParameterName, 'Specify HTTP headers to be used in each request (ex: -H Header:val -H ''stuff: things'')')
            [CompletionResult]::new('-b', '-b', [CompletionResultType]::ParameterName, 'Specify HTTP cookies to be used in each request (ex: -b stuff=things)')
            [CompletionResult]::new('--cookies', '--cookies', [CompletionResultType]::ParameterName, 'Specify HTTP cookies to be used in each request (ex: -b stuff=things)')
            [CompletionResult]::new('-Q', '-Q ', [CompletionResultType]::ParameterName, 'Request''s URL query parameters (ex: -Q token=stuff -Q secret=key)')
            [CompletionResult]::new('--query', '--query', [CompletionResultType]::ParameterName, 'Request''s URL query parameters (ex: -Q token=stuff -Q secret=key)')
            [CompletionResult]::new('--protocol', '--protocol', [CompletionResultType]::ParameterName, 'Specify the protocol to use when targeting via --request-file or --url with domain only (default: https)')
            [CompletionResult]::new('--dont-scan', '--dont-scan', [CompletionResultType]::ParameterName, 'URL(s) or Regex Pattern(s) to exclude from recursion/scans')
            [CompletionResult]::new('--scope', '--scope', [CompletionResultType]::ParameterName, 'Additional domains/URLs to consider in-scope for scanning (in addition to current domain)')
            [CompletionResult]::new('-S', '-S ', [CompletionResultType]::ParameterName, 'Filter out messages of a particular size (ex: -S 5120 -S 4927,1970)')
            [CompletionResult]::new('--filter-size', '--filter-size', [CompletionResultType]::ParameterName, 'Filter out messages of a particular size (ex: -S 5120 -S 4927,1970)')
            [CompletionResult]::new('-X', '-X ', [CompletionResultType]::ParameterName, 'Filter out messages via regular expression matching on the response''s body/headers (ex: -X ''^ignore me$'')')
            [CompletionResult]::new('--filter-regex', '--filter-regex', [CompletionResultType]::ParameterName, 'Filter out messages via regular expression matching on the response''s body/headers (ex: -X ''^ignore me$'')')
            [CompletionResult]::new('-W', '-W ', [CompletionResultType]::ParameterName, 'Filter out messages of a particular word count (ex: -W 312 -W 91,82)')
            [CompletionResult]::new('--filter-words', '--filter-words', [CompletionResultType]::ParameterName, 'Filter out messages of a particular word count (ex: -W 312 -W 91,82)')
            [CompletionResult]::new('-N', '-N ', [CompletionResultType]::ParameterName, 'Filter out messages of a particular line count (ex: -N 20 -N 31,30)')
            [CompletionResult]::new('--filter-lines', '--filter-lines', [CompletionResultType]::ParameterName, 'Filter out messages of a particular line count (ex: -N 20 -N 31,30)')
            [CompletionResult]::new('-C', '-C ', [CompletionResultType]::ParameterName, 'Filter out status codes (deny list) (ex: -C 200 -C 401)')
            [CompletionResult]::new('--filter-status', '--filter-status', [CompletionResultType]::ParameterName, 'Filter out status codes (deny list) (ex: -C 200 -C 401)')
            [CompletionResult]::new('--filter-similar-to', '--filter-similar-to', [CompletionResultType]::ParameterName, 'Filter out pages that are similar to the given page (ex. --filter-similar-to http://site.xyz/soft404)')
            [CompletionResult]::new('-s', '-s', [CompletionResultType]::ParameterName, 'Status Codes to include (allow list) (default: All Status Codes)')
            [CompletionResult]::new('--status-codes', '--status-codes', [CompletionResultType]::ParameterName, 'Status Codes to include (allow list) (default: All Status Codes)')
            [CompletionResult]::new('-T', '-T ', [CompletionResultType]::ParameterName, 'Number of seconds before a client''s request times out (default: 7)')
            [CompletionResult]::new('--timeout', '--timeout', [CompletionResultType]::ParameterName, 'Number of seconds before a client''s request times out (default: 7)')
            [CompletionResult]::new('--server-certs', '--server-certs', [CompletionResultType]::ParameterName, 'Add custom root certificate(s) for servers with unknown certificates')
            [CompletionResult]::new('--client-cert', '--client-cert', [CompletionResultType]::ParameterName, 'Add a PEM encoded certificate for mutual authentication (mTLS)')
            [CompletionResult]::new('--client-key', '--client-key', [CompletionResultType]::ParameterName, 'Add a PEM encoded private key for mutual authentication (mTLS)')
            [CompletionResult]::new('-t', '-t', [CompletionResultType]::ParameterName, 'Number of concurrent threads (default: 50)')
            [CompletionResult]::new('--threads', '--threads', [CompletionResultType]::ParameterName, 'Number of concurrent threads (default: 50)')
            [CompletionResult]::new('-d', '-d', [CompletionResultType]::ParameterName, 'Maximum recursion depth, a depth of 0 is infinite recursion (default: 4)')
            [CompletionResult]::new('--depth', '--depth', [CompletionResultType]::ParameterName, 'Maximum recursion depth, a depth of 0 is infinite recursion (default: 4)')
            [CompletionResult]::new('-L', '-L ', [CompletionResultType]::ParameterName, 'Limit total number of concurrent scans (default: 0, i.e. no limit)')
            [CompletionResult]::new('--scan-limit', '--scan-limit', [CompletionResultType]::ParameterName, 'Limit total number of concurrent scans (default: 0, i.e. no limit)')
            [CompletionResult]::new('--parallel', '--parallel', [CompletionResultType]::ParameterName, 'Run parallel feroxbuster instances (one child process per url passed via stdin)')
            [CompletionResult]::new('--rate-limit', '--rate-limit', [CompletionResultType]::ParameterName, 'Limit number of requests per second (per directory) (default: 0, i.e. no limit)')
            [CompletionResult]::new('--response-size-limit', '--response-size-limit', [CompletionResultType]::ParameterName, 'Limit size of response body to read in bytes (default: 4MB)')
            [CompletionResult]::new('--time-limit', '--time-limit', [CompletionResultType]::ParameterName, 'Limit total run time of all scans (ex: --time-limit 10m)')
            [CompletionResult]::new('-w', '-w', [CompletionResultType]::ParameterName, 'Path or URL of the wordlist')
            [CompletionResult]::new('--wordlist', '--wordlist', [CompletionResultType]::ParameterName, 'Path or URL of the wordlist')
            [CompletionResult]::new('-B', '-B ', [CompletionResultType]::ParameterName, 'Automatically request likely backup extensions for "found" urls (default: ~, .bak, .bak2, .old, .1)')
            [CompletionResult]::new('--collect-backups', '--collect-backups', [CompletionResultType]::ParameterName, 'Automatically request likely backup extensions for "found" urls (default: ~, .bak, .bak2, .old, .1)')
            [CompletionResult]::new('-I', '-I ', [CompletionResultType]::ParameterName, 'File extension(s) to Ignore while collecting extensions (only used with --collect-extensions)')
            [CompletionResult]::new('--dont-collect', '--dont-collect', [CompletionResultType]::ParameterName, 'File extension(s) to Ignore while collecting extensions (only used with --collect-extensions)')
            [CompletionResult]::new('-o', '-o', [CompletionResultType]::ParameterName, 'Output file to write results to (use w/ --json for JSON entries)')
            [CompletionResult]::new('--output', '--output', [CompletionResultType]::ParameterName, 'Output file to write results to (use w/ --json for JSON entries)')
            [CompletionResult]::new('--debug-log', '--debug-log', [CompletionResultType]::ParameterName, 'Output file to write log entries (use w/ --json for JSON entries)')
            [CompletionResult]::new('--limit-bars', '--limit-bars', [CompletionResultType]::ParameterName, 'Number of directory scan bars to show at any given time (default: no limit)')
            [CompletionResult]::new('--stdin', '--stdin', [CompletionResultType]::ParameterName, 'Read url(s) from STDIN')
            [CompletionResult]::new('--burp', '--burp', [CompletionResultType]::ParameterName, 'Set --proxy to http://127.0.0.1:8080 and set --insecure to true')
            [CompletionResult]::new('--burp-replay', '--burp-replay', [CompletionResultType]::ParameterName, 'Set --replay-proxy to http://127.0.0.1:8080 and set --insecure to true')
            [CompletionResult]::new('--smart', '--smart', [CompletionResultType]::ParameterName, 'Set --auto-tune, --collect-words, and --collect-backups to true')
            [CompletionResult]::new('--thorough', '--thorough', [CompletionResultType]::ParameterName, 'Use the same settings as --smart and set --collect-extensions and --scan-dir-listings to true')
            [CompletionResult]::new('-A', '-A ', [CompletionResultType]::ParameterName, 'Use a random User-Agent')
            [CompletionResult]::new('--random-agent', '--random-agent', [CompletionResultType]::ParameterName, 'Use a random User-Agent')
            [CompletionResult]::new('-f', '-f', [CompletionResultType]::ParameterName, 'Append / to each request''s URL')
            [CompletionResult]::new('--add-slash', '--add-slash', [CompletionResultType]::ParameterName, 'Append / to each request''s URL')
            [CompletionResult]::new('--unique', '--unique', [CompletionResultType]::ParameterName, 'Only show unique responses')
            [CompletionResult]::new('-r', '-r', [CompletionResultType]::ParameterName, 'Allow client to follow redirects')
            [CompletionResult]::new('--redirects', '--redirects', [CompletionResultType]::ParameterName, 'Allow client to follow redirects')
            [CompletionResult]::new('-k', '-k', [CompletionResultType]::ParameterName, 'Disables TLS certificate validation in the client')
            [CompletionResult]::new('--insecure', '--insecure', [CompletionResultType]::ParameterName, 'Disables TLS certificate validation in the client')
            [CompletionResult]::new('-n', '-n', [CompletionResultType]::ParameterName, 'Do not scan recursively')
            [CompletionResult]::new('--no-recursion', '--no-recursion', [CompletionResultType]::ParameterName, 'Do not scan recursively')
            [CompletionResult]::new('--force-recursion', '--force-recursion', [CompletionResultType]::ParameterName, 'Force recursion attempts on all ''found'' endpoints (still respects recursion depth)')
            [CompletionResult]::new('-e', '-e', [CompletionResultType]::ParameterName, 'Extract links from response body (html, javascript, etc...); make new requests based on findings (default: true)')
            [CompletionResult]::new('--extract-links', '--extract-links', [CompletionResultType]::ParameterName, 'Extract links from response body (html, javascript, etc...); make new requests based on findings (default: true)')
            [CompletionResult]::new('--dont-extract-links', '--dont-extract-links', [CompletionResultType]::ParameterName, 'Don''t extract links from response body (html, javascript, etc...)')
            [CompletionResult]::new('--auto-tune', '--auto-tune', [CompletionResultType]::ParameterName, 'Automatically lower scan rate when an excessive amount of errors are encountered')
            [CompletionResult]::new('--auto-bail', '--auto-bail', [CompletionResultType]::ParameterName, 'Automatically stop scanning when an excessive amount of errors are encountered')
            [CompletionResult]::new('-D', '-D ', [CompletionResultType]::ParameterName, 'Don''t auto-filter wildcard responses')
            [CompletionResult]::new('--dont-filter', '--dont-filter', [CompletionResultType]::ParameterName, 'Don''t auto-filter wildcard responses')
            [CompletionResult]::new('-E', '-E ', [CompletionResultType]::ParameterName, 'Automatically discover extensions and add them to --extensions (unless they''re in --dont-collect)')
            [CompletionResult]::new('--collect-extensions', '--collect-extensions', [CompletionResultType]::ParameterName, 'Automatically discover extensions and add them to --extensions (unless they''re in --dont-collect)')
            [CompletionResult]::new('-g', '-g', [CompletionResultType]::ParameterName, 'Automatically discover important words from within responses and add them to the wordlist')
            [CompletionResult]::new('--collect-words', '--collect-words', [CompletionResultType]::ParameterName, 'Automatically discover important words from within responses and add them to the wordlist')
            [CompletionResult]::new('--scan-dir-listings', '--scan-dir-listings', [CompletionResultType]::ParameterName, 'Force scans to recurse into directory listings')
            [CompletionResult]::new('-v', '-v', [CompletionResultType]::ParameterName, 'Increase verbosity level (use -vv or more for greater effect. [CAUTION] 4 -v''s is probably too much)')
            [CompletionResult]::new('--verbosity', '--verbosity', [CompletionResultType]::ParameterName, 'Increase verbosity level (use -vv or more for greater effect. [CAUTION] 4 -v''s is probably too much)')
            [CompletionResult]::new('--silent', '--silent', [CompletionResultType]::ParameterName, 'Only print URLs (or JSON w/ --json) + turn off logging (good for piping a list of urls to other commands)')
            [CompletionResult]::new('-q', '-q', [CompletionResultType]::ParameterName, 'Hide progress bars and banner (good for tmux windows w/ notifications)')
            [CompletionResult]::new('--quiet', '--quiet', [CompletionResultType]::ParameterName, 'Hide progress bars and banner (good for tmux windows w/ notifications)')
            [CompletionResult]::new('--json', '--json', [CompletionResultType]::ParameterName, 'Emit JSON logs to --output and --debug-log instead of normal text')
            [CompletionResult]::new('--no-state', '--no-state', [CompletionResultType]::ParameterName, 'Disable state output file (*.state)')
            [CompletionResult]::new('-U', '-U ', [CompletionResultType]::ParameterName, 'Update feroxbuster to the latest version')
            [CompletionResult]::new('--update', '--update', [CompletionResultType]::ParameterName, 'Update feroxbuster to the latest version')
            [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help (see more with ''--help'')')
            [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help (see more with ''--help'')')
            [CompletionResult]::new('-V', '-V ', [CompletionResultType]::ParameterName, 'Print version')
            [CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')
            break
        }
    })

    $completions.Where{ $_.CompletionText -like "$wordToComplete*" } |
        Sort-Object -Property ListItemText
}


================================================
FILE: shell_completions/feroxbuster.bash
================================================
_feroxbuster() {
    local i cur prev opts cmd
    COMPREPLY=()
    if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then
        cur="$2"
    else
        cur="${COMP_WORDS[COMP_CWORD]}"
    fi
    prev="$3"
    cmd=""
    opts=""

    for i in "${COMP_WORDS[@]:0:COMP_CWORD}"
    do
        case "${cmd},${i}" in
            ",$1")
                cmd="feroxbuster"
                ;;
            *)
                ;;
        esac
    done

    case "${cmd}" in
        feroxbuster)
            opts="-u -p -P -R -a -A -x -m -H -b -Q -f -S -X -W -N -C -s -T -r -k -t -n -d -e -L -w -D -E -B -g -I -v -q -o -U -h -V --url --stdin --resume-from --request-file --burp --burp-replay --data-urlencoded --data-json --smart --thorough --proxy --replay-proxy --replay-codes --user-agent --random-agent --extensions --methods --data --headers --cookies --query --add-slash --protocol --dont-scan --scope --filter-size --filter-regex --filter-words --filter-lines --filter-status --filter-similar-to --status-codes --unique --timeout --redirects --insecure --server-certs --client-cert --client-key --threads --no-recursion --depth --force-recursion --extract-links --dont-extract-links --scan-limit --parallel --rate-limit --response-size-limit --time-limit --wordlist --auto-tune --auto-bail --dont-filter --collect-extensions --collect-backups --collect-words --dont-collect --scan-dir-listings --verbosity --silent --quiet --json --output --debug-log --no-state --limit-bars --update --help --version"
            if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
                return 0
            fi
            case "${prev}" in
                --url)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -u)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --resume-from)
                    local oldifs
                    if [ -n "${IFS+x}" ]; then
                        oldifs="$IFS"
                    fi
                    IFS=$'\n'
                    COMPREPLY=($(compgen -f "${cur}"))
                    if [ -n "${oldifs+x}" ]; then
                        IFS="$oldifs"
                    fi
                    if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then
                        compopt -o filenames
                    fi
                    return 0
                    ;;
                --request-file)
                    local oldifs
                    if [ -n "${IFS+x}" ]; then
                        oldifs="$IFS"
                    fi
                    IFS=$'\n'
                    COMPREPLY=($(compgen -f "${cur}"))
                    if [ -n "${oldifs+x}" ]; then
                        IFS="$oldifs"
                    fi
                    if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then
                        compopt -o filenames
                    fi
                    return 0
                    ;;
                --data-urlencoded)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --data-json)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --proxy)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -p)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --replay-proxy)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -P)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --replay-codes)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -R)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --user-agent)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -a)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --extensions)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -x)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --methods)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -m)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --data)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --headers)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -H)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --cookies)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -b)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --query)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -Q)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --protocol)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --dont-scan)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --scope)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --filter-size)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -S)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --filter-regex)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -X)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --filter-words)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -W)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --filter-lines)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -N)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --filter-status)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -C)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --filter-similar-to)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --status-codes)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -s)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --timeout)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -T)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --server-certs)
                    local oldifs
                    if [ -n "${IFS+x}" ]; then
                        oldifs="$IFS"
                    fi
                    IFS=$'\n'
                    COMPREPLY=($(compgen -f "${cur}"))
                    if [ -n "${oldifs+x}" ]; then
                        IFS="$oldifs"
                    fi
                    if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then
                        compopt -o filenames
                    fi
                    return 0
                    ;;
                --client-cert)
                    local oldifs
                    if [ -n "${IFS+x}" ]; then
                        oldifs="$IFS"
                    fi
                    IFS=$'\n'
                    COMPREPLY=($(compgen -f "${cur}"))
                    if [ -n "${oldifs+x}" ]; then
                        IFS="$oldifs"
                    fi
                    if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then
                        compopt -o filenames
                    fi
                    return 0
                    ;;
                --client-key)
                    local oldifs
                    if [ -n "${IFS+x}" ]; then
                        oldifs="$IFS"
                    fi
                    IFS=$'\n'
                    COMPREPLY=($(compgen -f "${cur}"))
                    if [ -n "${oldifs+x}" ]; then
                        IFS="$oldifs"
                    fi
                    if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then
                        compopt -o filenames
                    fi
                    return 0
                    ;;
                --threads)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -t)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --depth)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -d)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --scan-limit)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -L)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --parallel)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --rate-limit)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --response-size-limit)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --time-limit)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --wordlist)
                    local oldifs
                    if [ -n "${IFS+x}" ]; then
                        oldifs="$IFS"
                    fi
                    IFS=$'\n'
                    COMPREPLY=($(compgen -f "${cur}"))
                    if [ -n "${oldifs+x}" ]; then
                        IFS="$oldifs"
                    fi
                    if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then
                        compopt -o filenames
                    fi
                    return 0
                    ;;
                -w)
                    local oldifs
                    if [ -n "${IFS+x}" ]; then
                        oldifs="$IFS"
                    fi
                    IFS=$'\n'
                    COMPREPLY=($(compgen -f "${cur}"))
                    if [ -n "${oldifs+x}" ]; then
                        IFS="$oldifs"
                    fi
                    if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then
                        compopt -o filenames
                    fi
                    return 0
                    ;;
                --collect-backups)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -B)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --dont-collect)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                -I)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                --output)
                    local oldifs
                    if [ -n "${IFS+x}" ]; then
                        oldifs="$IFS"
                    fi
                    IFS=$'\n'
                    COMPREPLY=($(compgen -f "${cur}"))
                    if [ -n "${oldifs+x}" ]; then
                        IFS="$oldifs"
                    fi
                    if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then
                        compopt -o filenames
                    fi
                    return 0
                    ;;
                -o)
                    local oldifs
                    if [ -n "${IFS+x}" ]; then
                        oldifs="$IFS"
                    fi
                    IFS=$'\n'
                    COMPREPLY=($(compgen -f "${cur}"))
                    if [ -n "${oldifs+x}" ]; then
                        IFS="$oldifs"
                    fi
                    if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then
                        compopt -o filenames
                    fi
                    return 0
                    ;;
                --debug-log)
                    local oldifs
                    if [ -n "${IFS+x}" ]; then
                        oldifs="$IFS"
                    fi
                    IFS=$'\n'
                    COMPREPLY=($(compgen -f "${cur}"))
                    if [ -n "${oldifs+x}" ]; then
                        IFS="$oldifs"
                    fi
                    if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then
                        compopt -o filenames
                    fi
                    return 0
                    ;;
                --limit-bars)
                    COMPREPLY=($(compgen -f "${cur}"))
                    return 0
                    ;;
                *)
                    COMPREPLY=()
                    ;;
            esac
            COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
            return 0
            ;;
    esac
}

if [[ "${BASH_VERSINFO[0]}" -eq 4 && "${BASH_VERSINFO[1]}" -ge 4 || "${BASH_VERSINFO[0]}" -gt 4 ]]; then
    complete -F _feroxbuster -o nosort -o bashdefault -o default -o plusdirs feroxbuster
else
    complete -F _feroxbuster -o bashdefault -o default -o plusdirs feroxbuster
fi


================================================
FILE: shell_completions/feroxbuster.elv
================================================

use builtin;
use str;

set edit:completion:arg-completer[feroxbuster] = {|@words|
    fn spaces {|n|
        builtin:repeat $n ' ' | str:join ''
    }
    fn cand {|text desc|
        edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc
    }
    var command = 'feroxbuster'
    for word $words[1..-1] {
        if (str:has-prefix $word '-') {
            break
        }
        set command = $command';'$word
    }
    var completions = [
        &'feroxbuster'= {
            cand -u 'The target URL (required, unless [--stdin || --resume-from || --request-file] used)'
            cand --url 'The target URL (required, unless [--stdin || --resume-from || --request-file] used)'
            cand --resume-from 'State file from which to resume a partially complete scan (ex. --resume-from ferox-1606586780.state)'
            cand --request-file 'Raw HTTP request file to use as a template for all requests'
            cand --data-urlencoded 'Set -H ''Content-Type: application/x-www-form-urlencoded'', --data to <data-urlencoded> (supports @file) and -m to POST'
            cand --data-json 'Set -H ''Content-Type: application/json'', --data to <data-json> (supports @file) and -m to POST'
            cand -p 'Proxy to use for requests (ex: http(s)://host:port, socks5(h)://host:port)'
            cand --proxy 'Proxy to use for requests (ex: http(s)://host:port, socks5(h)://host:port)'
            cand -P 'Send only unfiltered requests through a Replay Proxy, instead of all requests'
            cand --replay-proxy 'Send only unfiltered requests through a Replay Proxy, instead of all requests'
            cand -R 'Status Codes to send through a Replay Proxy when found (default: --status-codes value)'
            cand --replay-codes 'Status Codes to send through a Replay Proxy when found (default: --status-codes value)'
            cand -a 'Sets the User-Agent (default: feroxbuster/2.13.1)'
            cand --user-agent 'Sets the User-Agent (default: feroxbuster/2.13.1)'
            cand -x 'File extension(s) to search for (ex: -x php -x pdf js); reads values (newline-separated) from file if input starts with an @ (ex: @ext.txt)'
            cand --extensions 'File extension(s) to search for (ex: -x php -x pdf js); reads values (newline-separated) from file if input starts with an @ (ex: @ext.txt)'
            cand -m 'Which HTTP request method(s) should be sent (default: GET)'
            cand --methods 'Which HTTP request method(s) should be sent (default: GET)'
            cand --data 'Request''s Body; can read data from a file if input starts with an @ (ex: @post.bin)'
            cand -H 'Specify HTTP headers to be used in each request (ex: -H Header:val -H ''stuff: things'')'
            cand --headers 'Specify HTTP headers to be used in each request (ex: -H Header:val -H ''stuff: things'')'
            cand -b 'Specify HTTP cookies to be used in each request (ex: -b stuff=things)'
            cand --cookies 'Specify HTTP cookies to be used in each request (ex: -b stuff=things)'
            cand -Q 'Request''s URL query parameters (ex: -Q token=stuff -Q secret=key)'
            cand --query 'Request''s URL query parameters (ex: -Q token=stuff -Q secret=key)'
            cand --protocol 'Specify the protocol to use when targeting via --request-file or --url with domain only (default: https)'
            cand --dont-scan 'URL(s) or Regex Pattern(s) to exclude from recursion/scans'
            cand --scope 'Additional domains/URLs to consider in-scope for scanning (in addition to current domain)'
            cand -S 'Filter out messages of a particular size (ex: -S 5120 -S 4927,1970)'
            cand --filter-size 'Filter out messages of a particular size (ex: -S 5120 -S 4927,1970)'
            cand -X 'Filter out messages via regular expression matching on the response''s body/headers (ex: -X ''^ignore me$'')'
            cand --filter-regex 'Filter out messages via regular expression matching on the response''s body/headers (ex: -X ''^ignore me$'')'
            cand -W 'Filter out messages of a particular word count (ex: -W 312 -W 91,82)'
            cand --filter-words 'Filter out messages of a particular word count (ex: -W 312 -W 91,82)'
            cand -N 'Filter out messages of a particular line count (ex: -N 20 -N 31,30)'
            cand --filter-lines 'Filter out messages of a particular line count (ex: -N 20 -N 31,30)'
            cand -C 'Filter out status codes (deny list) (ex: -C 200 -C 401)'
            cand --filter-status 'Filter out status codes (deny list) (ex: -C 200 -C 401)'
            cand --filter-similar-to 'Filter out pages that are similar to the given page (ex. --filter-similar-to http://site.xyz/soft404)'
            cand -s 'Status Codes to include (allow list) (default: All Status Codes)'
            cand --status-codes 'Status Codes to include (allow list) (default: All Status Codes)'
            cand -T 'Number of seconds before a client''s request times out (default: 7)'
            cand --timeout 'Number of seconds before a client''s request times out (default: 7)'
            cand --server-certs 'Add custom root certificate(s) for servers with unknown certificates'
            cand --client-cert 'Add a PEM encoded certificate for mutual authentication (mTLS)'
            cand --client-key 'Add a PEM encoded private key for mutual authentication (mTLS)'
            cand -t 'Number of concurrent threads (default: 50)'
            cand --threads 'Number of concurrent threads (default: 50)'
            cand -d 'Maximum recursion depth, a depth of 0 is infinite recursion (default: 4)'
            cand --depth 'Maximum recursion depth, a depth of 0 is infinite recursion (default: 4)'
            cand -L 'Limit total number of concurrent scans (default: 0, i.e. no limit)'
            cand --scan-limit 'Limit total number of concurrent scans (default: 0, i.e. no limit)'
            cand --parallel 'Run parallel feroxbuster instances (one child process per url passed via stdin)'
            cand --rate-limit 'Limit number of requests per second (per directory) (default: 0, i.e. no limit)'
            cand --response-size-limit 'Limit size of response body to read in bytes (default: 4MB)'
            cand --time-limit 'Limit total run time of all scans (ex: --time-limit 10m)'
            cand -w 'Path or URL of the wordlist'
            cand --wordlist 'Path or URL of the wordlist'
            cand -B 'Automatically request likely backup extensions for "found" urls (default: ~, .bak, .bak2, .old, .1)'
            cand --collect-backups 'Automatically request likely backup extensions for "found" urls (default: ~, .bak, .bak2, .old, .1)'
            cand -I 'File extension(s) to Ignore while collecting extensions (only used with --collect-extensions)'
            cand --dont-collect 'File extension(s) to Ignore while collecting extensions (only used with --collect-extensions)'
            cand -o 'Output file to write results to (use w/ --json for JSON entries)'
            cand --output 'Output file to write results to (use w/ --json for JSON entries)'
            cand --debug-log 'Output file to write log entries (use w/ --json for JSON entries)'
            cand --limit-bars 'Number of directory scan bars to show at any given time (default: no limit)'
            cand --stdin 'Read url(s) from STDIN'
            cand --burp 'Set --proxy to http://127.0.0.1:8080 and set --insecure to true'
            cand --burp-replay 'Set --replay-proxy to http://127.0.0.1:8080 and set --insecure to true'
            cand --smart 'Set --auto-tune, --collect-words, and --collect-backups to true'
            cand --thorough 'Use the same settings as --smart and set --collect-extensions and --scan-dir-listings to true'
            cand -A 'Use a random User-Agent'
            cand --random-agent 'Use a random User-Agent'
            cand -f 'Append / to each request''s URL'
            cand --add-slash 'Append / to each request''s URL'
            cand --unique 'Only show unique responses'
            cand -r 'Allow client to follow redirects'
            cand --redirects 'Allow client to follow redirects'
            cand -k 'Disables TLS certificate validation in the client'
            cand --insecure 'Disables TLS certificate validation in the client'
            cand -n 'Do not scan recursively'
            cand --no-recursion 'Do not scan recursively'
            cand --force-recursion 'Force recursion attempts on all ''found'' endpoints (still respects recursion depth)'
            cand -e 'Extract links from response body (html, javascript, etc...); make new requests based on findings (default: true)'
            cand --extract-links 'Extract links from response body (html, javascript, etc...); make new requests based on findings (default: true)'
            cand --dont-extract-links 'Don''t extract links from response body (html, javascript, etc...)'
            cand --auto-tune 'Automatically lower scan rate when an excessive amount of errors are encountered'
            cand --auto-bail 'Automatically stop scanning when an excessive amount of errors are encountered'
            cand -D 'Don''t auto-filter wildcard responses'
            cand --dont-filter 'Don''t auto-filter wildcard responses'
            cand -E 'Automatically discover extensions and add them to --extensions (unless they''re in --dont-collect)'
            cand --collect-extensions 'Automatically discover extensions and add them to --extensions (unless they''re in --dont-collect)'
            cand -g 'Automatically discover important words from within responses and add them to the wordlist'
            cand --collect-words 'Automatically discover important words from within responses and add them to the wordlist'
            cand --scan-dir-listings 'Force scans to recurse into directory listings'
            cand -v 'Increase verbosity level (use -vv or more for greater effect. [CAUTION] 4 -v''s is probably too much)'
            cand --verbosity 'Increase verbosity level (use -vv or more for greater effect. [CAUTION] 4 -v''s is probably too much)'
            cand --silent 'Only print URLs (or JSON w/ --json) + turn off logging (good for piping a list of urls to other commands)'
            cand -q 'Hide progress bars and banner (good for tmux windows w/ notifications)'
            cand --quiet 'Hide progress bars and banner (good for tmux windows w/ notifications)'
            cand --json 'Emit JSON logs to --output and --debug-log instead of normal text'
            cand --no-state 'Disable state output file (*.state)'
            cand -U 'Update feroxbuster to the latest version'
            cand --update 'Update feroxbuster to the latest version'
            cand -h 'Print help (see more with ''--help'')'
            cand --help 'Print help (see more with ''--help'')'
            cand -V 'Print version'
            cand --version 'Print version'
        }
    ]
    $completions[$command]
}


================================================
FILE: shell_completions/feroxbuster.fish
================================================
complete -c feroxbuster -s u -l url -d 'The target URL (required, unless [--stdin || --resume-from || --request-file] used)' -r -f
complete -c feroxbuster -l resume-from -d 'State file from which to resume a partially complete scan (ex. --resume-from ferox-1606586780.state)' -r -F
complete -c feroxbuster -l request-file -d 'Raw HTTP request file to use as a template for all requests' -r -F
complete -c feroxbuster -l data-urlencoded -d 'Set -H \'Content-Type: application/x-www-form-urlencoded\', --data to <data-urlencoded> (supports @file) and -m to POST' -r
complete -c feroxbuster -l data-json -d 'Set -H \'Content-Type: application/json\', --data to <data-json> (supports @file) and -m to POST' -r
complete -c feroxbuster -s p -l proxy -d 'Proxy to use for requests (ex: http(s)://host:port, socks5(h)://host:port)' -r -f
complete -c feroxbuster -s P -l replay-proxy -d 'Send only unfiltered requests through a Replay Proxy, instead of all requests' -r -f
complete -c feroxbuster -s R -l replay-codes -d 'Status Codes to send through a Replay Proxy when found (default: --status-codes value)' -r
complete -c feroxbuster -s a -l user-agent -d 'Sets the User-Agent (default: feroxbuster/2.13.1)' -r
complete -c feroxbuster -s x -l extensions -d 'File extension(s) to search for (ex: -x php -x pdf js); reads values (newline-separated) from file if input starts with an @ (ex: @ext.txt)' -r
complete -c feroxbuster -s m -l methods -d 'Which HTTP request method(s) should be sent (default: GET)' -r
complete -c feroxbuster -l data -d 'Request\'s Body; can read data from a file if input starts with an @ (ex: @post.bin)' -r
complete -c feroxbuster -s H -l headers -d 'Specify HTTP headers to be used in each request (ex: -H Header:val -H \'stuff: things\')' -r
complete -c feroxbuster -s b -l cookies -d 'Specify HTTP cookies to be used in each request (ex: -b stuff=things)' -r
complete -c feroxbuster -s Q -l query -d 'Request\'s URL query parameters (ex: -Q token=stuff -Q secret=key)' -r
complete -c feroxbuster -l protocol -d 'Specify the protocol to use when targeting via --request-file or --url with domain only (default: https)' -r
complete -c feroxbuster -l dont-scan -d 'URL(s) or Regex Pattern(s) to exclude from recursion/scans' -r
complete -c feroxbuster -l scope -d 'Additional domains/URLs to consider in-scope for scanning (in addition to current domain)' -r
complete -c feroxbuster -s S -l filter-size -d 'Filter out messages of a particular size (ex: -S 5120 -S 4927,1970)' -r
complete -c feroxbuster -s X -l filter-regex -d 'Filter out messages via regular expression matching on the response\'s body/headers (ex: -X \'^ignore me$\')' -r
complete -c feroxbuster -s W -l filter-words -d 'Filter out messages of a particular word count (ex: -W 312 -W 91,82)' -r
complete -c feroxbuster -s N -l filter-lines -d 'Filter out messages of a particular line count (ex: -N 20 -N 31,30)' -r
complete -c feroxbuster -s C -l filter-status -d 'Filter out status codes (deny list) (ex: -C 200 -C 401)' -r
complete -c feroxbuster -l filter-similar-to -d 'Filter out pages that are similar to the given page (ex. --filter-similar-to http://site.xyz/soft404)' -r -f
complete -c feroxbuster -s s -l status-codes -d 'Status Codes to include (allow list) (default: All Status Codes)' -r
complete -c feroxbuster -s T -l timeout -d 'Number of seconds before a client\'s request times out (default: 7)' -r
complete -c feroxbuster -l server-certs -d 'Add custom root certificate(s) for servers with unknown certificates' -r -F
complete -c feroxbuster -l client-cert -d 'Add a PEM encoded certificate for mutual authentication (mTLS)' -r -F
complete -c feroxbuster -l client-key -d 'Add a PEM encoded private key for mutual authentication (mTLS)' -r -F
complete -c feroxbuster -s t -l threads -d 'Number of concurrent threads (default: 50)' -r
complete -c feroxbuster -s d -l depth -d 'Maximum recursion depth, a depth of 0 is infinite recursion (default: 4)' -r
complete -c feroxbuster -s L -l scan-limit -d 'Limit total number of concurrent scans (default: 0, i.e. no limit)' -r
complete -c feroxbuster -l parallel -d 'Run parallel feroxbuster instances (one child process per url passed via stdin)' -r
complete -c feroxbuster -l rate-limit -d 'Limit number of requests per second (per directory) (default: 0, i.e. no limit)' -r
complete -c feroxbuster -l response-size-limit -d 'Limit size of response body to read in bytes (default: 4MB)' -r
complete -c feroxbuster -l time-limit -d 'Limit total run time of all scans (ex: --time-limit 10m)' -r
complete -c feroxbuster -s w -l wordlist -d 'Path or URL of the wordlist' -r -F
complete -c feroxbuster -s B -l collect-backups -d 'Automatically request likely backup extensions for "found" urls (default: ~, .bak, .bak2, .old, .1)' -r
complete -c feroxbuster -s I -l dont-collect -d 'File extension(s) to Ignore while collecting extensions (only used with --collect-extensions)' -r
complete -c feroxbuster -s o -l output -d 'Output file to write results to (use w/ --json for JSON entries)' -r -F
complete -c feroxbuster -l debug-log -d 'Output file to write log entries (use w/ --json for JSON entries)' -r -F
complete -c feroxbuster -l limit-bars -d 'Number of directory scan bars to show at any given time (default: no limit)' -r
complete -c feroxbuster -l stdin -d 'Read url(s) from STDIN'
complete -c feroxbuster -l burp -d 'Set --proxy to http://127.0.0.1:8080 and set --insecure to true'
complete -c feroxbuster -l burp-replay -d 'Set --replay-proxy to http://127.0.0.1:8080 and set --insecure to true'
complete -c feroxbuster -l smart -d 'Set --auto-tune, --collect-words, and --collect-backups to true'
complete -c feroxbuster -l thorough -d 'Use the same settings as --smart and set --collect-extensions and --scan-dir-listings to true'
complete -c feroxbuster -s A -l random-agent -d 'Use a random User-Agent'
complete -c feroxbuster -s f -l add-slash -d 'Append / to each request\'s URL'
complete -c feroxbuster -l unique -d 'Only show unique responses'
complete -c feroxbuster -s r -l redirects -d 'Allow client to follow redirects'
complete -c feroxbuster -s k -l insecure -d 'Disables TLS certificate validation in the client'
complete -c feroxbuster -s n -l no-recursion -d 'Do not scan recursively'
complete -c feroxbuster -l force-recursion -d 'Force recursion attempts on all \'found\' endpoints (still respects recursion depth)'
complete -c feroxbuster -s e -l extract-links -d 'Extract links from response body (html, javascript, etc...); make new requests based on findings (default: true)'
complete -c feroxbuster -l dont-extract-links -d 'Don\'t extract links from response body (html, javascript, etc...)'
complete -c feroxbuster -l auto-tune -d 'Automatically lower scan rate when an excessive amount of errors are encountered'
complete -c feroxbuster -l auto-bail -d 'Automatically stop scanning when an excessive amount of errors are encountered'
complete -c feroxbuster -s D -l 
Download .txt
gitextract_exndm3wn/

├── .all-contributorsrc
├── .cargo/
│   └── config.toml
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── actions-rs/
│   │   └── grcov.yml
│   ├── dependabot.yml
│   ├── pull_request_template.md
│   ├── stale.yml
│   └── workflows/
│       ├── build.yml
│       ├── check.yml
│       ├── cicd-to-dockerhub.yml
│       ├── coverage.yml
│       └── winget.yml
├── .gitignore
├── .rustfmt.toml
├── CONTRIBUTING.md
├── Cargo.toml
├── Dockerfile
├── LICENSE
├── Makefile
├── Makefile.toml
├── README.md
├── build.rs
├── choco_package/
│   ├── feroxbuster.nuspec
│   ├── legal/
│   │   ├── LICENSE.txt
│   │   └── VERIFICATION.txt
│   └── tools/
│       ├── chocolateyinstall.ps1
│       └── chocolateyuninstall.ps1
├── docs/
│   ├── .nojekyll
│   └── index.html
├── ferox-config.toml.example
├── install-nix.sh
├── shell_completions/
│   ├── _feroxbuster
│   ├── _feroxbuster.ps1
│   ├── feroxbuster.bash
│   ├── feroxbuster.elv
│   └── feroxbuster.fish
├── snapcraft.yaml
├── src/
│   ├── banner/
│   │   ├── container.rs
│   │   ├── entry.rs
│   │   ├── mod.rs
│   │   └── tests.rs
│   ├── client.rs
│   ├── config/
│   │   ├── container.rs
│   │   ├── mod.rs
│   │   ├── tests.rs
│   │   └── utils.rs
│   ├── event_handlers/
│   │   ├── command.rs
│   │   ├── container.rs
│   │   ├── filters.rs
│   │   ├── inputs.rs
│   │   ├── mod.rs
│   │   ├── outputs.rs
│   │   ├── scans.rs
│   │   └── statistics.rs
│   ├── extractor/
│   │   ├── builder.rs
│   │   ├── container.rs
│   │   ├── mod.rs
│   │   └── tests.rs
│   ├── filters/
│   │   ├── container.rs
│   │   ├── empty.rs
│   │   ├── init.rs
│   │   ├── lines.rs
│   │   ├── mod.rs
│   │   ├── regex.rs
│   │   ├── similarity.rs
│   │   ├── size.rs
│   │   ├── status_code.rs
│   │   ├── tests.rs
│   │   ├── utils.rs
│   │   ├── wildcard.rs
│   │   └── words.rs
│   ├── heuristics.rs
│   ├── lib.rs
│   ├── logger.rs
│   ├── macros.rs
│   ├── main.rs
│   ├── message.rs
│   ├── nlp/
│   │   ├── constants.rs
│   │   ├── document.rs
│   │   ├── mod.rs
│   │   ├── model.rs
│   │   ├── term.rs
│   │   └── utils.rs
│   ├── parser.rs
│   ├── progress.rs
│   ├── response.rs
│   ├── scan_manager/
│   │   ├── menu.rs
│   │   ├── mod.rs
│   │   ├── order.rs
│   │   ├── response_container.rs
│   │   ├── scan.rs
│   │   ├── scan_container.rs
│   │   ├── state.rs
│   │   ├── tests.rs
│   │   └── utils.rs
│   ├── scanner/
│   │   ├── ferox_scanner.rs
│   │   ├── init.rs
│   │   ├── limit_heap.rs
│   │   ├── mod.rs
│   │   ├── policy_data.rs
│   │   ├── requester.rs
│   │   ├── tests.rs
│   │   └── utils.rs
│   ├── statistics/
│   │   ├── container.rs
│   │   ├── error.rs
│   │   ├── field.rs
│   │   ├── init.rs
│   │   ├── macros.rs
│   │   ├── mod.rs
│   │   └── tests.rs
│   ├── sync/
│   │   ├── dynamic_semaphore.rs
│   │   └── mod.rs
│   ├── traits.rs
│   ├── url.rs
│   └── utils.rs
└── tests/
    ├── extra-words
    ├── mutual-auth/
    │   ├── Caddyfile
    │   ├── README.md
    │   ├── certs/
    │   │   ├── client/
    │   │   │   ├── client.crt
    │   │   │   └── client.key
    │   │   └── server/
    │   │       ├── ca.crt
    │   │       ├── server.crt
    │   │       ├── server.crt.1
    │   │       ├── server.crt.2
    │   │       ├── server.der
    │   │       └── server.key
    │   └── gen-certs.sh
    ├── payloads/
    │   ├── simple.json
    │   └── simple.key.value
    ├── policies/
    │   ├── README.md
    │   └── test_policies_with_deps.rs
    ├── policy-test-words.shuffled
    ├── test_banner.rs
    ├── test_config.rs
    ├── test_deny_list.rs
    ├── test_dynamic_semaphore.rs
    ├── test_extractor.rs
    ├── test_filters.rs
    ├── test_heuristics.rs
    ├── test_main.rs
    ├── test_parser.rs
    ├── test_policies.rs
    ├── test_rate_limiting.rs
    ├── test_response_size_limit.rs
    ├── test_scan_manager.rs
    ├── test_scanner.rs
    ├── test_unique_responses.rs
    └── utils/
        └── mod.rs
Download .txt
SYMBOL INDEX (1092 symbols across 82 files)

FILE: build.rs
  function main (line 8) | fn main() {

FILE: src/banner/container.rs
  constant UPDATE_URL (line 16) | pub const UPDATE_URL: &str = "https://api.github.com/repos/epi052/feroxb...
  type UpdateStatus (line 20) | pub(super) enum UpdateStatus {
  type Banner (line 32) | pub struct Banner {
    method new (line 202) | pub fn new(tgts: &[String], config: &Configuration) -> Self {
    method header (line 519) | fn header(&self) -> String {
    method footer (line 536) | fn footer(&self) -> String {
    method check_for_updates (line 553) | pub async fn check_for_updates(&mut self, url: &str, handles: Arc<Hand...
    method print_to (line 636) | pub fn print_to<W>(&self, mut writer: W, config: Arc<Configuration>) -...

FILE: src/banner/entry.rs
  constant INDENT (line 5) | const INDENT: usize = 3;
  constant COL_WIDTH (line 8) | const COL_WIDTH: usize = 22;
  type BannerEntry (line 12) | pub(super) struct BannerEntry {
    method new (line 26) | pub fn new(emoji: &str, title: &str, value: &str) -> Self {
    method format_emoji (line 35) | fn format_emoji(&self) -> String {
    method fmt (line 46) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {

FILE: src/banner/tests.rs
  function banner_intialize_without_targets (line 10) | async fn banner_intialize_without_targets() {
  function banner_intialize_without_status_codes (line 18) | async fn banner_intialize_without_status_codes() {
  function banner_intialize_without_config_file (line 30) | async fn banner_intialize_without_config_file() {
  function banner_intialize_without_queries (line 42) | async fn banner_intialize_without_queries() {
  function banner_needs_update_returns_unknown_with_bad_url (line 54) | async fn banner_needs_update_returns_unknown_with_bad_url() {
  function banner_needs_update_returns_up_to_date (line 69) | async fn banner_needs_update_returns_up_to_date() {
  function banner_needs_update_returns_out_of_date (line 91) | async fn banner_needs_update_returns_out_of_date() {
  function banner_needs_update_returns_unknown_on_timeout (line 114) | async fn banner_needs_update_returns_unknown_on_timeout() {
  function banner_needs_update_returns_unknown_on_bad_json_response (line 136) | async fn banner_needs_update_returns_unknown_on_bad_json_response() {
  function banner_needs_update_returns_unknown_on_json_without_correct_tag (line 156) | async fn banner_needs_update_returns_unknown_on_json_without_correct_tag...

FILE: src/client.rs
  type ClientConfig (line 12) | pub struct ClientConfig<'a, I>
  function create_redirect_policy (line 40) | fn create_redirect_policy<I>(config: &ClientConfig<'_, I>) -> Policy
  function initialize (line 72) | pub fn initialize<I>(config: ClientConfig<'_, I>) -> Result<Client>
  function client_with_bad_proxy (line 139) | fn client_with_bad_proxy() {
  function client_with_good_proxy (line 158) | fn client_with_good_proxy() {
  function client_with_valid_server_pem (line 178) | fn client_with_valid_server_pem() {
  function client_with_valid_server_der (line 198) | fn client_with_valid_server_der() {
  function client_with_valid_server_pem_and_der (line 218) | fn client_with_valid_server_pem_and_der() {
  function client_with_invalid_server_cert (line 245) | fn client_with_invalid_server_cert() {
  function initialize_with_scope_creates_client (line 265) | fn initialize_with_scope_creates_client() {
  function initialize_with_scope_empty_scope (line 291) | fn initialize_with_scope_empty_scope() {

FILE: src/config/container.rs
  type Configuration (line 91) | pub struct Configuration {
    method new (line 556) | pub fn new() -> Result<Self> {
    method parse_config_files (line 631) | fn parse_config_files(config: &mut Self) -> Result<()> {
    method parse_cli_args (line 674) | fn parse_cli_args(args: &ArgMatches) -> Self {
    method try_rebuild_clients (line 1223) | fn try_rebuild_clients(configuration: &mut Configuration) {
    method parse_and_merge_config (line 1296) | fn parse_and_merge_config(config_file: PathBuf, config: &mut Self) -> ...
    method merge_config (line 1312) | fn merge_config(conf: &mut Self, new: Self) {
    method parse_config (line 1439) | pub(super) fn parse_config(config_file: PathBuf) -> Result<Self> {
    method parse_data_arg (line 1459) | fn parse_data_arg(&mut self, arg: &str, content_type: Option<ContentTy...
  method default (line 376) | fn default() -> Self {
  method as_str (line 1491) | fn as_str(&self) -> String {
  method as_json (line 1519) | fn as_json(&self) -> Result<String> {

FILE: src/config/tests.rs
  function setup_config_test (line 10) | fn setup_config_test() -> Configuration {
  function default_configuration (line 79) | fn default_configuration() {
  function config_reads_wordlist (line 146) | fn config_reads_wordlist() {
  function config_reads_debug_log (line 153) | fn config_reads_debug_log() {
  function config_reads_status_codes (line 160) | fn config_reads_status_codes() {
  function config_reads_replay_codes (line 167) | fn config_reads_replay_codes() {
  function config_reads_threads (line 174) | fn config_reads_threads() {
  function config_reads_depth (line 181) | fn config_reads_depth() {
  function config_reads_scan_limit (line 188) | fn config_reads_scan_limit() {
  function config_reads_parallel (line 195) | fn config_reads_parallel() {
  function config_reads_rate_limit (line 202) | fn config_reads_rate_limit() {
  function config_reads_timeout (line 209) | fn config_reads_timeout() {
  function config_reads_proxy (line 216) | fn config_reads_proxy() {
  function config_reads_replay_proxy (line 223) | fn config_reads_replay_proxy() {
  function config_reads_silent (line 230) | fn config_reads_silent() {
  function config_reads_force_recursion (line 237) | fn config_reads_force_recursion() {
  function config_reads_quiet (line 244) | fn config_reads_quiet() {
  function config_reads_json (line 251) | fn config_reads_json() {
  function config_reads_auto_bail (line 258) | fn config_reads_auto_bail() {
  function config_reads_auto_tune (line 265) | fn config_reads_auto_tune() {
  function config_reads_verbosity (line 272) | fn config_reads_verbosity() {
  function config_reads_limit_bars (line 279) | fn config_reads_limit_bars() {
  function config_reads_output (line 286) | fn config_reads_output() {
  function config_reads_redirects (line 293) | fn config_reads_redirects() {
  function config_reads_insecure (line 300) | fn config_reads_insecure() {
  function config_reads_no_recursion (line 307) | fn config_reads_no_recursion() {
  function config_reads_stdin (line 314) | fn config_reads_stdin() {
  function config_reads_dont_filter (line 321) | fn config_reads_dont_filter() {
  function config_reads_add_slash (line 328) | fn config_reads_add_slash() {
  function config_reads_extract_links (line 335) | fn config_reads_extract_links() {
  function config_reads_collect_extensions (line 342) | fn config_reads_collect_extensions() {
  function config_reads_collect_backups (line 349) | fn config_reads_collect_backups() {
  function config_reads_collect_words (line 356) | fn config_reads_collect_words() {
  function config_reads_extensions (line 363) | fn config_reads_extensions() {
  function config_reads_dont_collect (line 370) | fn config_reads_dont_collect() {
  function config_reads_methods (line 377) | fn config_reads_methods() {
  function config_reads_data (line 384) | fn config_reads_data() {
  function config_reads_regex_denylist (line 391) | fn config_reads_regex_denylist() {
  function config_reads_url_denylist (line 401) | fn config_reads_url_denylist() {
  function config_reads_scope (line 414) | fn config_reads_scope() {
  function config_reads_filter_regex (line 427) | fn config_reads_filter_regex() {
  function config_reads_filter_similar (line 434) | fn config_reads_filter_similar() {
  function config_reads_filter_size (line 441) | fn config_reads_filter_size() {
  function config_reads_filter_word_count (line 448) | fn config_reads_filter_word_count() {
  function config_reads_filter_line_count (line 455) | fn config_reads_filter_line_count() {
  function config_reads_filter_status (line 462) | fn config_reads_filter_status() {
  function config_reads_save_state (line 469) | fn config_reads_save_state() {
  function config_reads_time_limit (line 476) | fn config_reads_time_limit() {
  function config_reads_scan_dir_listings (line 483) | fn config_reads_scan_dir_listings() {
  function config_reads_protocol (line 490) | fn config_reads_protocol() {
  function config_reads_request_file (line 497) | fn config_reads_request_file() {
  function config_reads_resume_from (line 504) | fn config_reads_resume_from() {
  function config_reads_server_certs (line 511) | fn config_reads_server_certs() {
  function config_reads_backup_extensions (line 521) | fn config_reads_backup_extensions() {
  function config_reads_client_cert (line 528) | fn config_reads_client_cert() {
  function config_reads_client_key (line 535) | fn config_reads_client_key() {
  function config_reads_headers (line 542) | fn config_reads_headers() {
  function config_reads_queries (line 552) | fn config_reads_queries() {
  function config_default_not_random_agent (line 562) | fn config_default_not_random_agent() {
  function config_report_and_exit_works (line 570) | fn config_report_and_exit_works() {
  function as_str_returns_string_with_newline (line 576) | fn as_str_returns_string_with_newline() {
  function as_json_returns_json_representation_of_configuration_with_newline (line 589) | fn as_json_returns_json_representation_of_configuration_with_newline() {
  function config_reads_unique (line 604) | fn config_reads_unique() {
  function config_reads_response_size_limit (line 611) | fn config_reads_response_size_limit() {

FILE: src/config/utils.rs
  function report_and_exit (line 17) | pub(super) fn report_and_exit(err: &str) -> ! {
  function serialized_type (line 36) | pub(super) fn serialized_type() -> String {
  function timeout (line 41) | pub(super) fn timeout() -> u64 {
  function save_state (line 46) | pub(super) fn save_state() -> bool {
  function threads (line 51) | pub(super) fn threads() -> usize {
  function request_protocol (line 56) | pub(super) fn request_protocol() -> String {
  function status_codes (line 61) | pub(super) fn status_codes() -> Vec<u16> {
  function methods (line 73) | pub(super) fn methods() -> Vec<String> {
  function ignored_extensions (line 78) | pub(super) fn ignored_extensions() -> Vec<String> {
  function backup_extensions (line 86) | pub(super) fn backup_extensions() -> Vec<String> {
  function wordlist (line 94) | pub(super) fn wordlist() -> String {
  function user_agent (line 99) | pub(super) fn user_agent() -> String {
  function depth (line 104) | pub(super) fn depth() -> usize {
  function extract_links (line 109) | pub(super) fn extract_links() -> bool {
  function response_size_limit (line 114) | pub(super) fn response_size_limit() -> usize {
  type OutputLevel (line 120) | pub enum OutputLevel {
  method default (line 137) | fn default() -> Self {
  function determine_output_level (line 143) | pub fn determine_output_level(quiet: bool, silent: bool, json: bool) -> ...
  type RequesterPolicy (line 166) | pub enum RequesterPolicy {
  method default (line 180) | fn default() -> Self {
  function determine_requester_policy (line 186) | pub fn determine_requester_policy(auto_tune: bool, auto_bail: bool) -> R...
  function split_query (line 219) | pub fn split_query(query: &str) -> Result<(String, String)> {
  function split_header (line 257) | pub fn split_header(header: &str) -> Result<(String, String)> {
  function combine_cookies (line 303) | pub fn combine_cookies(cookie1: &str, cookie2: &str) -> String {
  type ContentType (line 330) | pub enum ContentType {
    method to_header_value (line 339) | pub fn to_header_value(self: ContentType) -> String {
  function parse_request_file (line 383) | pub fn parse_request_file(config: &mut Configuration) -> Result<()> {
  function preconfig_log (line 575) | pub fn preconfig_log(level: LevelFilter, message: String) {
  type TempSetup (line 594) | struct TempSetup {
    method new (line 601) | pub fn new() -> Self {
    method cleanup (line 626) | pub fn cleanup(self) {
  function determine_output_level_returns_correct_results (line 633) | fn determine_output_level_returns_correct_results() {
  function determine_requester_policy_returns_correct_results (line 661) | fn determine_requester_policy_returns_correct_results() {
  function report_and_exit_panics_under_test (line 678) | fn report_and_exit_panics_under_test() {
  function test_split_query_simple (line 683) | fn test_split_query_simple() {
  function test_split_query_with_spaces (line 690) | fn test_split_query_with_spaces() {
  function test_split_query_empty_value (line 697) | fn test_split_query_empty_value() {
  function test_split_query_no_value (line 704) | fn test_split_query_no_value() {
  function test_split_query_multiple_equals (line 711) | fn test_split_query_multiple_equals() {
  function test_split_query_empty_key_and_value (line 718) | fn test_split_query_empty_key_and_value() {
  function test_split_query_empty_key (line 725) | fn test_split_query_empty_key() {
  function test_split_query_trailing_equals_in_value (line 732) | fn test_split_query_trailing_equals_in_value() {
  function test_split_query_no_equals (line 739) | fn test_split_query_no_equals() {
  function test_split_query_empty_input (line 746) | fn test_split_query_empty_input() {
  function test_split_header_simple (line 752) | fn test_split_header_simple() -> Result<()> {
  function test_split_header_with_leading_space_in_value (line 763) | fn test_split_header_with_leading_space_in_value() -> Result<()> {
  function test_split_header_with_trimmed_leading_space (line 774) | fn test_split_header_with_trimmed_leading_space() -> Result<()> {
  function test_split_header_with_multiple_colons (line 785) | fn test_split_header_with_multiple_colons() -> Result<()> {
  function test_split_header_empty_value (line 799) | fn test_split_header_empty_value() -> Result<()> {
  function test_split_header_no_value (line 807) | fn test_split_header_no_value() -> Result<()> {
  function test_split_header_no_colon (line 815) | fn test_split_header_no_colon() -> Result<()> {
  function test_split_header_empty_key (line 823) | fn test_split_header_empty_key() {
  function test_split_header_empty_key_and_value (line 834) | fn test_split_header_empty_key_and_value() {
  function test_split_header_empty_input (line 845) | fn test_split_header_empty_input() {
  function test_split_header_value_with_leading_single_space (line 853) | fn test_split_header_value_with_leading_single_space() -> Result<()> {
  function test_split_header_value_with_leading_multiple_spaces (line 864) | fn test_split_header_value_with_leading_multiple_spaces() -> Result<()> {
  function test_parse_raw_with_empty_request (line 875) | fn test_parse_raw_with_empty_request() {
  function test_parse_raw_with_empty_file (line 881) | fn test_parse_raw_with_empty_file() -> io::Result<()> {
  function test_parse_raw_without_head_body_crlf (line 897) | fn test_parse_raw_without_head_body_crlf() -> io::Result<()> {
  function test_parse_raw_with_only_head_body_crlf (line 915) | fn test_parse_raw_with_only_head_body_crlf() -> io::Result<()> {
  function test_parse_raw_body_is_overridden_by_cli (line 933) | fn test_parse_raw_body_is_overridden_by_cli() -> io::Result<()> {
  function test_parse_raw_with_empty_request_line (line 954) | fn test_parse_raw_with_empty_request_line() -> io::Result<()> {
  function test_parse_raw_with_missing_uri (line 972) | fn test_parse_raw_with_missing_uri() -> io::Result<()> {
  function test_parse_raw_with_missing_method (line 990) | fn test_parse_raw_with_missing_method() -> io::Result<()> {
  function test_parse_raw_methods_are_appended_if_unique (line 1008) | fn test_parse_raw_methods_are_appended_if_unique() -> io::Result<()> {
  function test_parse_raw_methods_are_ignored_if_already_present_from_cli (line 1026) | fn test_parse_raw_methods_are_ignored_if_already_present_from_cli() -> i...
  function test_parse_raw_headers_added_to_config_if_missing_else_overridden_from_cli (line 1044) | fn test_parse_raw_headers_added_to_config_if_missing_else_overridden_fro...
  function test_parse_raw_with_user_agent_in_request (line 1071) | fn test_parse_raw_with_user_agent_in_request() -> io::Result<()> {
  function test_parse_raw_with_user_agent_in_request_and_cli (line 1089) | fn test_parse_raw_with_user_agent_in_request_and_cli() -> io::Result<()> {
  function test_parse_raw_content_length_is_always_skipped (line 1109) | fn test_parse_raw_content_length_is_always_skipped() -> io::Result<()> {
  function test_parse_raw_cookie_header_appended_or_overridden (line 1127) | fn test_parse_raw_cookie_header_appended_or_overridden() -> io::Result<(...
  function test_parse_raw_with_relative_path_and_partial_host_header (line 1158) | fn test_parse_raw_with_relative_path_and_partial_host_header() -> io::Re...
  function test_parse_raw_with_relative_path_and_no_host_header (line 1173) | fn test_parse_raw_with_relative_path_and_no_host_header() -> io::Result<...
  function test_parse_raw_with_full_url_and_no_host_header (line 1191) | fn test_parse_raw_with_full_url_and_no_host_header() -> io::Result<()> {
  function test_parse_raw_with_full_url_and_host_header (line 1206) | fn test_parse_raw_with_full_url_and_host_header() -> io::Result<()> {
  function test_parse_raw_with_partial_url_and_queries (line 1224) | fn test_parse_raw_with_partial_url_and_queries() -> io::Result<()> {
  function test_parse_raw_with_full_url_and_queries (line 1256) | fn test_parse_raw_with_full_url_and_queries() -> io::Result<()> {
  function test_combine_cookies (line 1288) | fn test_combine_cookies() {
  function test_split_header (line 1299) | fn test_split_header() {
  function test_split_query (line 1329) | fn test_split_query() {

FILE: src/event_handlers/command.rs
  type Command (line 17) | pub enum Command {

FILE: src/event_handlers/container.rs
  type Tasks (line 16) | pub struct Tasks {
    method new (line 33) | pub fn new(terminal: Joiner, stats: Joiner, filters: Joiner, scans: Jo...
  type Handles (line 45) | pub struct Handles {
    method new (line 68) | pub fn new(
    method for_testing (line 87) | pub fn for_testing(
    method set_scan_handle (line 112) | pub fn set_scan_handle(&self, handle: ScanHandle) {
    method send_scan_command (line 121) | pub fn send_scan_command(&self, command: Command) -> Result<()> {
    method num_collected_extensions (line 133) | pub fn num_collected_extensions(&self) -> usize {
    method collected_extensions (line 143) | pub fn collected_extensions(&self) -> HashSet<String> {
    method expected_num_requests_per_dir (line 154) | pub fn expected_num_requests_per_dir(&self) -> usize {
    method expected_num_requests_multiplier (line 162) | pub fn expected_num_requests_multiplier(&self) -> usize {
    method ferox_scans (line 174) | pub fn ferox_scans(&self) -> Result<Arc<FeroxScans>> {

FILE: src/event_handlers/filters.rs
  type FiltersHandle (line 13) | pub struct FiltersHandle {
    method new (line 24) | pub fn new(data: Arc<FeroxFilters>, tx: CommandSender) -> Self {
    method send (line 29) | pub fn send(&self, command: Command) -> Result<()> {
    method sync (line 35) | pub async fn sync(&self) -> Result<()> {
  type FiltersHandler (line 45) | pub struct FiltersHandler {
    method new (line 56) | pub fn new(data: Arc<FeroxFilters>, receiver: UnboundedReceiver<Comman...
    method initialize (line 62) | pub fn initialize() -> (Joiner, FiltersHandle) {
    method start (line 82) | pub async fn start(&mut self) -> Result<()> {
  function empty_filter_skipped (line 114) | async fn empty_filter_skipped() {

FILE: src/event_handlers/inputs.rs
  type TermInputHandler (line 28) | pub struct TermInputHandler {
    method new (line 40) | pub fn new(handles: Arc<Handles>) -> Self {
    method initialize (line 46) | pub fn initialize(handles: Arc<Handles>) {
    method start (line 56) | fn start(&self) {
    method sigint_handler (line 78) | pub fn sigint_handler(handles: Arc<Handles>) -> Result<()> {
    method enter_handler (line 147) | fn enter_handler() {

FILE: src/event_handlers/outputs.rs
  type ProcessResponseCall (line 26) | enum ProcessResponseCall {
  type TermOutHandle (line 36) | pub struct TermOutHandle {
    method new (line 47) | pub fn new(tx: CommandSender, tx_file: CommandSender) -> Self {
    method send (line 52) | pub fn send(&self, command: Command) -> Result<()> {
    method sync (line 58) | pub async fn sync(&self, send_to_file: bool) -> Result<()> {
  type FileOutHandler (line 75) | pub struct FileOutHandler {
    method new (line 86) | fn new(rx: CommandReceiver, config: Arc<Configuration>) -> Self {
    method start (line 96) | async fn start(&mut self, tx_stats: CommandSender) -> Result<()> {
  type TermOutHandler (line 138) | pub struct TermOutHandler {
    method new (line 159) | fn new(
    method initialize (line 175) | pub fn initialize(
    method start (line 210) | async fn start(&mut self, tx_stats: CommandSender) -> Result<()> {
    method process_response (line 246) | fn process_response(
    method add_new_url_to_vec (line 395) | fn add_new_url_to_vec(&self, url: &Url, new_name: &str, urls: &mut Vec...
    method generate_backup_urls (line 414) | async fn generate_backup_urls(&self, response: &FeroxResponse) -> Vec<...
  function struct_fields_of_file_out_handler (line 457) | fn struct_fields_of_file_out_handler() {
  function struct_fields_of_term_out_handler (line 469) | async fn struct_fields_of_term_out_handler() {
  function generate_backup_urls_creates_correct_urls_when_extension_present (line 489) | async fn generate_backup_urls_creates_correct_urls_when_extension_presen...
  function generate_backup_urls_creates_correct_urls_when_extension_not_present (line 534) | async fn generate_backup_urls_creates_correct_urls_when_extension_not_pr...
  function generate_backup_urls_creates_correct_urls_when_not_at_root (line 579) | async fn generate_backup_urls_creates_correct_urls_when_not_at_root() {

FILE: src/event_handlers/scans.rs
  type ScanHandle (line 25) | pub struct ScanHandle {
    method new (line 36) | pub fn new(data: Arc<FeroxScans>, tx: CommandSender) -> Self {
    method send (line 41) | pub fn send(&self, command: Command) -> Result<()> {
  type ScanHandler (line 49) | pub struct ScanHandler {
    method new (line 78) | pub fn new(
    method wordlist (line 111) | fn wordlist(&self, wordlist: Arc<Vec<String>>) {
    method initialize (line 121) | pub fn initialize(handles: Arc<Handles>) -> (Joiner, ScanHandle) {
    method start (line 146) | pub async fn start(&mut self) -> Result<()> {
    method update_all_bar_lengths (line 237) | fn update_all_bar_lengths(&self) -> Result<()> {
    method get_wordlist (line 315) | pub fn get_wordlist(&self, offset: usize) -> Result<Arc<Vec<String>>> {
    method ordered_scan_url (line 330) | async fn ordered_scan_url(&mut self, targets: Vec<String>, order: Scan...
    method try_recursion (line 409) | async fn try_recursion(&mut self, response: Box<FeroxResponse>) -> Res...

FILE: src/event_handlers/statistics.rs
  type StatsHandle (line 19) | pub struct StatsHandle {
    method new (line 30) | pub fn new(data: Arc<Stats>, tx: CommandSender) -> Self {
    method send (line 35) | pub fn send(&self, command: Command) -> Result<()> {
    method sync (line 41) | pub async fn sync(&self) -> Result<()> {
  type StatsHandler (line 51) | pub struct StatsHandler {
    method new (line 65) | fn new(stats: Arc<Stats>, rx_stats: UnboundedReceiver<Command>) -> Self {
    method start (line 79) | async fn start(&mut self, output_file: &str) -> Result<()> {
    method increment_bar (line 147) | fn increment_bar(&self) {
    method initialize (line 167) | pub fn initialize(config: Arc<Configuration>) -> (Joiner, StatsHandle) {

FILE: src/extractor/builder.rs
  constant LINKFINDER_REGEX (line 11) | pub(super) const LINKFINDER_REGEX: &str = r#"(?x)
  constant ROBOTS_TXT_REGEX (line 53) | pub(super) const ROBOTS_TXT_REGEX: &str =
  constant URL_CHARS_REGEX (line 59) | pub(super) const URL_CHARS_REGEX: &str = r#"["<>\\^`{|} ]"#;
  type ExtractionTarget (line 63) | pub enum ExtractionTarget {
  type ExtractorBuilder (line 75) | pub struct ExtractorBuilder<'a> {
  method default (line 91) | fn default() -> Self {
  function handles (line 104) | pub fn handles(&mut self, handles: Arc<Handles>) -> &mut Self {
  function url (line 110) | pub fn url(&mut self, url: &str) -> &mut Self {
  function target (line 116) | pub fn target(&mut self, target: ExtractionTarget) -> &mut Self {
  function response (line 122) | pub fn response(&mut self, response: &'a FeroxResponse) -> &mut Self {
  function build (line 130) | pub fn build(&self) -> Result<Extractor<'a>> {

FILE: src/extractor/container.rs
  function request_link (line 31) | pub(super) async fn request_link(url: &str, handles: Arc<Handles>) -> Re...
  type RecursionStatus (line 69) | enum RecursionStatus {
  type Extractor (line 79) | pub struct Extractor<'a> {
  function extract (line 105) | pub async fn extract(&self) -> Result<ExtractionResult> {
  function parse_url_and_add_subpaths (line 121) | fn parse_url_and_add_subpaths(
  function request_links (line 164) | pub async fn request_links(
  function extract_all_links_from_html_tags (line 315) | fn extract_all_links_from_html_tags(
  function extract_all_links_from_javascript (line 342) | fn extract_all_links_from_javascript(
  function add_all_sub_paths (line 373) | fn add_all_sub_paths(&self, url_path: &str, links: &mut HashSet<String>)...
  function normalize_url_path (line 386) | pub(super) fn normalize_url_path(&self, path: &str) -> String {
  function get_sub_paths_from_path (line 432) | pub(super) fn get_sub_paths_from_path(&self, path: &str) -> Vec<String> {
  function add_link_to_set_of_links (line 477) | pub(super) fn add_link_to_set_of_links(
  function extract_from_robots (line 522) | pub(super) async fn extract_from_robots(&self) -> Result<ExtractionResul...
  function extract_from_body (line 553) | pub(super) async fn extract_from_body(&self) -> Result<ExtractionResult> {
  function extract_from_dir_listing (line 576) | pub async fn extract_from_dir_listing(&self) -> Result<ExtractionResult> {
  function extract_links_by_attr (line 591) | fn extract_links_by_attr(
  function make_extract_request (line 627) | pub(super) async fn make_extract_request(&self, location: &str) -> Resul...
  function update_stats (line 712) | fn update_stats(&self, num_links: usize) -> Result<()> {

FILE: src/extractor/tests.rs
  function get_test_response (line 32) | fn get_test_response() -> FeroxResponse {
  function setup_extractor (line 39) | fn setup_extractor(target: ExtractionTarget, scanned_urls: Arc<FeroxScan...
  function extractor_get_sub_paths_from_path_with_multiple_paths (line 68) | fn extractor_get_sub_paths_from_path_with_multiple_paths() {
  function extractor_get_sub_paths_from_path_with_enclosing_slashes (line 92) | fn extractor_get_sub_paths_from_path_with_enclosing_slashes() {
  function extractor_get_sub_paths_from_path_with_only_a_word (line 109) | fn extractor_get_sub_paths_from_path_with_only_a_word() {
  function extractor_get_sub_paths_from_path_with_an_absolute_word (line 125) | fn extractor_get_sub_paths_from_path_with_an_absolute_word() {
  function extractor_builder_bails_when_neither_required_field_is_set (line 141) | fn extractor_builder_bails_when_neither_required_field_is_set() {
  function extractor_with_non_base_url_bails (line 155) | fn extractor_with_non_base_url_bails() -> Result<()> {
  function extractor_add_link_to_set_of_links_happy_path (line 175) | fn extractor_add_link_to_set_of_links_happy_path() {
  function extractor_add_link_to_set_of_links_with_non_base_url (line 201) | fn extractor_add_link_to_set_of_links_with_non_base_url() {
  function normalize_url_path_filters_queries_and_fragments (line 216) | fn normalize_url_path_filters_queries_and_fragments() {
  function extractor_get_links_with_absolute_url_that_differs_from_target_domain (line 246) | async fn extractor_get_links_with_absolute_url_that_differs_from_target_...
  function request_robots_txt_without_proxy (line 304) | async fn request_robots_txt_without_proxy() -> Result<()> {
  function request_robots_txt_with_proxy (line 335) | async fn request_robots_txt_with_proxy() -> Result<()> {
  function request_link_happy_path (line 367) | async fn request_link_happy_path() -> Result<()> {
  function request_link_bails_on_seen_url (line 388) | async fn request_link_bails_on_seen_url() -> Result<()> {

FILE: src/filters/container.rs
  type FeroxFilters (line 18) | pub struct FeroxFilters {
    method push (line 26) | pub fn push(&self, filter: Box<dyn FeroxFilter>) -> Result<()> {
    method remove (line 42) | pub fn remove(&self, indices: &mut [usize]) {
    method should_filter_response (line 70) | pub fn should_filter_response(
  method serialize (line 94) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>

FILE: src/filters/empty.rs
  type EmptyFilter (line 5) | pub struct EmptyFilter {}
  method should_filter_response (line 9) | fn should_filter_response(&self, _response: &FeroxResponse) -> bool {
  method box_eq (line 14) | fn box_eq(&self, other: &dyn Any) -> bool {
  method as_any (line 19) | fn as_any(&self) -> &dyn Any {

FILE: src/filters/init.rs
  function initialize (line 11) | pub async fn initialize(handles: Arc<Handles>) -> Result<()> {

FILE: src/filters/lines.rs
  type LinesFilter (line 6) | pub struct LinesFilter {
  method should_filter_response (line 14) | fn should_filter_response(&self, response: &FeroxResponse) -> bool {
  method box_eq (line 25) | fn box_eq(&self, other: &dyn Any) -> bool {
  method as_any (line 30) | fn as_any(&self) -> &dyn Any {

FILE: src/filters/regex.rs
  type RegexFilter (line 7) | pub struct RegexFilter {
  method default (line 17) | fn default() -> Self {
  method should_filter_response (line 29) | fn should_filter_response(&self, response: &FeroxResponse) -> bool {
  method box_eq (line 44) | fn box_eq(&self, other: &dyn Any) -> bool {
  method as_any (line 49) | fn as_any(&self) -> &dyn Any {
  method eq (line 57) | fn eq(&self, other: &RegexFilter) -> bool {

FILE: src/filters/similarity.rs
  type SimilarityFilter (line 16) | pub struct SimilarityFilter {
    method new (line 29) | pub fn new(hash: u64, original_url: String, cutoff: usize) -> Self {
    method from (line 39) | fn from(response: &FeroxResponse) -> Self {
  method should_filter_response (line 52) | fn should_filter_response(&self, response: &FeroxResponse) -> bool {
  method box_eq (line 58) | fn box_eq(&self, other: &dyn Any) -> bool {
  method as_any (line 65) | fn as_any(&self) -> &dyn Any {

FILE: src/filters/size.rs
  type SizeFilter (line 6) | pub struct SizeFilter {
  method should_filter_response (line 14) | fn should_filter_response(&self, response: &FeroxResponse) -> bool {
  method box_eq (line 25) | fn box_eq(&self, other: &dyn Any) -> bool {
  method as_any (line 30) | fn as_any(&self) -> &dyn Any {

FILE: src/filters/status_code.rs
  type StatusCodeFilter (line 6) | pub struct StatusCodeFilter {
  method should_filter_response (line 14) | fn should_filter_response(&self, response: &FeroxResponse) -> bool {
  method box_eq (line 32) | fn box_eq(&self, other: &dyn Any) -> bool {
  method as_any (line 37) | fn as_any(&self) -> &dyn Any {

FILE: src/filters/tests.rs
  function wildcard_filter_default (line 9) | fn wildcard_filter_default() {
  function wildcard_filter_as_any (line 21) | fn wildcard_filter_as_any() {
  function lines_filter_as_any (line 42) | fn lines_filter_as_any() {
  function words_filter_as_any (line 57) | fn words_filter_as_any() {
  function size_filter_as_any (line 72) | fn size_filter_as_any() {
  function status_code_filter_as_any (line 87) | fn status_code_filter_as_any() {
  function regex_filter_as_any (line 102) | fn regex_filter_as_any() {
  function wildcard_should_filter_when_static_wildcard_found (line 126) | fn wildcard_should_filter_when_static_wildcard_found() {
  function wildcard_should_filter_when_static_wildcard_len_is_zero (line 149) | fn wildcard_should_filter_when_static_wildcard_len_is_zero() {
  function wildcard_should_filter_when_dynamic_wildcard_found (line 169) | fn wildcard_should_filter_when_dynamic_wildcard_found() {
  function regexfilter_should_filter_when_regex_matches_on_response_body (line 188) | fn regexfilter_should_filter_when_regex_matches_on_response_body() {
  function similarity_filter_is_accurate (line 205) | fn similarity_filter_is_accurate() {
  function similarity_filter_as_any (line 235) | fn similarity_filter_as_any() {
  function remove_function_works_as_expected (line 258) | fn remove_function_works_as_expected() {

FILE: src/filters/utils.rs
  function create_similarity_filter (line 19) | pub(crate) async fn create_similarity_filter(
  function filter_lookup (line 57) | pub(crate) fn filter_lookup(filter_type: &str, filter_value: &str) -> Op...
  function filter_lookup_returns_correct_filters (line 115) | fn filter_lookup_returns_correct_filters() {
  function create_similarity_filter_is_correct (line 166) | async fn create_similarity_filter_is_correct() {

FILE: src/filters/wildcard.rs
  type WildcardFilter (line 9) | pub struct WildcardFilter {
    method new (line 32) | pub fn new(dont_filter: bool) -> Self {
    method fmt (line 157) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  method default (line 42) | fn default() -> Self {
  method should_filter_response (line 58) | fn should_filter_response(&self, response: &FeroxResponse) -> bool {
  method box_eq (line 146) | fn box_eq(&self, other: &dyn Any) -> bool {
  method as_any (line 151) | fn as_any(&self) -> &dyn Any {

FILE: src/filters/words.rs
  type WordsFilter (line 6) | pub struct WordsFilter {
  method should_filter_response (line 14) | fn should_filter_response(&self, response: &FeroxResponse) -> bool {
  method box_eq (line 25) | fn box_eq(&self, other: &dyn Any) -> bool {
  method as_any (line 30) | fn as_any(&self) -> &dyn Any {

FILE: src/heuristics.rs
  type DirListingType (line 45) | pub enum DirListingType {
  type DirListingResult (line 66) | pub struct DirListingResult {
  type WildcardResult (line 77) | pub enum WildcardResult {
  type HeuristicTests (line 86) | pub struct HeuristicTests {
    method new (line 94) | pub fn new(handles: Arc<Handles>) -> Self {
    method unique_string (line 103) | fn unique_string(&self, length: usize) -> String {
    method connectivity (line 122) | pub async fn connectivity(&self, target_urls: &[String]) -> Result<Vec...
    method directory_listing (line 169) | pub async fn directory_listing(&self, target_url: &str) -> Result<Opti...
    method detect_directory_listing (line 244) | fn detect_directory_listing(&self, html: &Html) -> Option<DirListingTy...
    method has_parent_directory_link (line 313) | fn has_parent_directory_link(&self, html: &Html) -> bool {
    method has_directory_table_headers (line 351) | fn has_directory_table_headers(&self, html: &Html) -> bool {
    method has_sorting_query_params (line 418) | fn has_sorting_query_params(&self, html: &Html) -> bool {
    method has_high_link_density (line 449) | fn has_high_link_density(&self, html: &Html) -> bool {
    method detect_404_like_responses (line 494) | pub async fn detect_404_like_responses(
    method examine_404_like_responses (line 713) | fn examine_404_like_responses<'a>(
  function heuristics_unique_string_returns_correct_length (line 847) | fn heuristics_unique_string_returns_correct_length() {
  function detect_directory_listing_finds_tomcat_python (line 857) | fn detect_directory_listing_finds_tomcat_python() {
  function detect_directory_listing_finds_apache (line 871) | fn detect_directory_listing_finds_apache() {
  function detect_directory_listing_finds_asp_dot_net (line 882) | fn detect_directory_listing_finds_asp_dot_net() {
  function detect_directory_listing_returns_none_as_default (line 893) | fn detect_directory_listing_returns_none_as_default() {
  function has_parent_directory_link_detects_by_href (line 904) | fn has_parent_directory_link_detects_by_href() {
  function has_parent_directory_link_detects_by_text (line 918) | fn has_parent_directory_link_detects_by_text() {
  function has_parent_directory_link_returns_false_when_absent (line 932) | fn has_parent_directory_link_returns_false_when_absent() {
  function has_directory_table_headers_detects_name_and_size (line 942) | fn has_directory_table_headers_detects_name_and_size() {
  function has_directory_table_headers_detects_name_and_date (line 952) | fn has_directory_table_headers_detects_name_and_date() {
  function has_directory_table_headers_requires_two_categories (line 962) | fn has_directory_table_headers_requires_two_categories() {
  function has_sorting_query_params_detects_apache_style (line 972) | fn has_sorting_query_params_detects_apache_style() {
  function has_sorting_query_params_returns_false_when_absent (line 982) | fn has_sorting_query_params_returns_false_when_absent() {
  function has_high_link_density_detects_files_and_dirs (line 992) | fn has_high_link_density_detects_files_and_dirs() {
  function has_high_link_density_requires_minimum_links (line 1006) | fn has_high_link_density_requires_minimum_links() {
  function has_high_link_density_ignores_parent_links (line 1019) | fn has_high_link_density_ignores_parent_links() {
  function detect_directory_listing_detects_custom_with_multiple_signals (line 1033) | fn detect_directory_listing_detects_custom_with_multiple_signals() {
  function detect_directory_listing_requires_two_signals (line 1055) | fn detect_directory_listing_requires_two_signals() {
  function detect_directory_listing_detects_rootme_sample (line 1067) | fn detect_directory_listing_detects_rootme_sample() {
  function detect_directory_listing_ignores_generic_pages (line 1092) | fn detect_directory_listing_ignores_generic_pages() {

FILE: src/lib.rs
  type CommandSender (line 36) | pub(crate) type CommandSender = UnboundedSender<Command>;
  type CommandReceiver (line 39) | pub(crate) type CommandReceiver = UnboundedReceiver<Command>;
  type Joiner (line 42) | pub(crate) type Joiner = JoinHandle<Result<()>>;
  type FeroxChannel (line 45) | pub(crate) type FeroxChannel<T> = (UnboundedSender<T>, UnboundedReceiver...
  type ExtractionResult (line 48) | pub(crate) type ExtractionResult = HashSet<String>;
  constant VERSION (line 51) | pub(crate) const VERSION: &str = env!("CARGO_PKG_VERSION");
  constant DEFAULT_OPEN_FILE_LIMIT (line 54) | pub const DEFAULT_OPEN_FILE_LIMIT: u64 = 8192;
  constant DEFAULT_IGNORED_EXTENSIONS (line 57) | pub(crate) const DEFAULT_IGNORED_EXTENSIONS: [&str; 43] = [
  constant DEFAULT_BACKUP_EXTENSIONS (line 65) | pub(crate) const DEFAULT_BACKUP_EXTENSIONS: [&str; 5] = ["~", ".bak", "....
  constant COMMON_FILE_EXTENSIONS (line 69) | pub(crate) const COMMON_FILE_EXTENSIONS: [&str; 154] = [
  constant DEFAULT_WORDLIST (line 245) | pub const DEFAULT_WORDLIST: &str =
  constant DEFAULT_WORDLIST (line 248) | pub const DEFAULT_WORDLIST: &str =
  constant SECONDARY_WORDLIST (line 250) | pub const SECONDARY_WORDLIST: &str =
  constant SLEEP_DURATION (line 254) | pub(crate) const SLEEP_DURATION: u64 = 500;
  constant HIGH_ERROR_RATIO (line 257) | pub const HIGH_ERROR_RATIO: f64 = 0.90;
  constant DEFAULT_STATUS_CODES (line 260) | pub const DEFAULT_STATUS_CODES: [StatusCode; 60] = [
  constant DEFAULT_METHOD (line 329) | pub(crate) const DEFAULT_METHOD: &str = "GET";
  constant DEFAULT_CONFIG_NAME (line 334) | pub const DEFAULT_CONFIG_NAME: &str = "ferox-config.toml";
  constant USER_AGENTS (line 336) | pub const USER_AGENTS: [&str; 12] = [
  constant NEAR_DUPLICATE_DISTANCE (line 355) | pub(crate) const NEAR_DUPLICATE_DISTANCE: usize = 3;
  constant UNIQUE_DISTANCE (line 358) | pub(crate) const UNIQUE_DISTANCE: usize = 1;
  function default_config_name (line 366) | fn default_config_name() {
  function default_wordlist (line 372) | fn default_wordlist() {
  function default_version (line 381) | fn default_version() {

FILE: src/logger.rs
  function initialize (line 21) | pub fn initialize(config: Arc<Configuration>) -> Result<()> {

FILE: src/main.rs
  function get_unique_words_from_wordlist (line 52) | fn get_unique_words_from_wordlist(path: &str) -> Result<Arc<Vec<String>>> {
  function scan (line 93) | async fn scan(targets: Vec<String>, handles: Arc<Handles>) -> Result<()> {
  function get_targets (line 143) | async fn get_targets(handles: Arc<Handles>) -> Result<Vec<String>> {
  function wrapped_main (line 219) | async fn wrapped_main(config: Arc<Configuration>) -> Result<()> {
  function clean_up (line 588) | async fn clean_up(handles: Arc<Handles>, tasks: Tasks) -> Result<()> {
  function update_app (line 621) | async fn update_app() -> Result<self_update::Status, Box<dyn ::std::erro...
  function main (line 639) | fn main() -> Result<()> {

FILE: src/message.rs
  type FeroxMessage (line 10) | pub struct FeroxMessage {
  method as_str (line 33) | fn as_str(&self) -> String {
  method as_json (line 64) | fn as_json(&self) -> anyhow::Result<String> {
  function ferox_message_as_str_returns_string_with_newline (line 82) | fn ferox_message_as_str_returns_string_with_newline() {
  function ferox_message_as_json_returns_json_representation_of_ferox_message_with_newline (line 101) | fn ferox_message_as_json_returns_json_representation_of_ferox_message_wi...
  function message_defaults (line 124) | fn message_defaults() {
  function message_as_str_edges (line 135) | fn message_as_str_edges() {

FILE: src/nlp/document.rs
  type Document (line 8) | pub(crate) struct Document {
    method new (line 18) | pub(super) fn new(text: &str) -> Self {
    method add_term (line 34) | fn add_term(&mut self, word: &str) {
    method from_html (line 42) | pub(crate) fn from_html(raw_html: &str) -> Option<Self> {
    method term_frequency (line 100) | pub(super) fn term_frequency(&self, term: &Term) -> f32 {
    method terms (line 109) | pub(super) fn terms(&self) -> &HashMap<Term, TermMetaData> {
    method number_of_terms (line 114) | fn number_of_terms(&self) -> usize {
  function nlp_document_creation_from_text (line 125) | fn nlp_document_creation_from_text() {
  function nlp_document_creation_from_html (line 146) | fn nlp_document_creation_from_html() {
  function term_frequency_validation (line 180) | fn term_frequency_validation() {
  function document_accessor_test (line 194) | fn document_accessor_test() {
  function document_creation_skips_script_and_style_tags (line 209) | fn document_creation_skips_script_and_style_tags() {

FILE: src/nlp/model.rs
  type TfIdf (line 9) | pub(crate) struct TfIdf {
    method new (line 19) | pub(crate) fn new() -> Self {
    method terms (line 24) | fn terms(&self) -> &HashMap<Term, TermMetaData> {
    method num_documents (line 29) | pub(crate) fn num_documents(&self) -> usize {
    method add_document (line 34) | pub(crate) fn add_document(&mut self, document: Document) {
    method calculate_tf_idf_scores (line 60) | pub(crate) fn calculate_tf_idf_scores(&mut self) {
    method all_words (line 87) | pub(crate) fn all_words(&self) -> Vec<String> {
  function get_score (line 101) | fn get_score(word: &str, model: &TfIdf) -> f32 {
  function model_generates_expected_tf_idf_scores (line 108) | fn model_generates_expected_tf_idf_scores() {
  function select_n_words_grabs_correct_words (line 144) | fn select_n_words_grabs_correct_words() {

FILE: src/nlp/term.rs
  type Term (line 5) | pub(crate) struct Term {
    method new (line 12) | pub(super) fn new(word: &str) -> Self {
    method raw (line 19) | pub(super) fn raw(&self) -> &str {
  type TermMetaData (line 35) | pub(super) struct TermMetaData {
    method document_frequency (line 48) | pub(super) fn document_frequency(&self) -> usize {
    method term_frequencies_mut (line 53) | pub(super) fn term_frequencies_mut(&mut self) -> &mut Vec<f32> {
    method term_frequencies (line 58) | pub(super) fn term_frequencies(&self) -> &[f32] {
    method count_mut (line 63) | pub(super) fn count_mut(&mut self) -> &mut u32 {
    method count (line 68) | pub(super) fn count(&self) -> u32 {
    method tf_idf_score_mut (line 73) | pub(super) fn tf_idf_score_mut(&mut self) -> &mut f32 {
    method tf_idf_score (line 78) | pub(super) fn tf_idf_score(&self) -> f32 {
  function nlp_term_accessor_test (line 89) | fn nlp_term_accessor_test() {
  function nlp_term_metadata_accessor_test (line 96) | fn nlp_term_metadata_accessor_test() {

FILE: src/nlp/utils.rs
  function preprocess (line 7) | pub(crate) fn preprocess(text: &str) -> Vec<String> {
  function normalize_case (line 18) | fn normalize_case<'a, S: Into<Cow<'a, str>>>(input: S) -> Cow<'a, str> {
  function remove_punctuation (line 42) | fn remove_punctuation(text: &str) -> String {
  function remove_stop_words (line 54) | fn remove_stop_words(text: &str) -> String {
  function inverse_document_frequency (line 68) | pub(super) fn inverse_document_frequency(num_docs: f32, doc_frequency: f...
  function tf_idf_score (line 73) | pub(super) fn tf_idf_score(term_frequency: f32, idf: f32) -> f32 {
  function test_remove_punctuation (line 83) | fn test_remove_punctuation() {
  function test_normalize_case (line 94) | fn test_normalize_case() {
  function test_remove_stopwords (line 101) | fn test_remove_stopwords() {
  function test_preprocess_results (line 116) | fn test_preprocess_results() {
  function idf_returns_expected_value (line 131) | fn idf_returns_expected_value() {
  function tf_idf_returns_expected_value (line 149) | fn tf_idf_returns_expected_value() {

FILE: src/parser.rs
  function initialize (line 29) | pub fn initialize() -> Command {
  function valid_time_spec (line 767) | fn valid_time_spec(time_spec: &str) -> Result<String, String> {
  constant EPILOGUE (line 779) | const EPILOGUE: &str = r#"NOTE:
  function parser_initialize_gives_defaults (line 831) | fn parser_initialize_gives_defaults() {
  function validate_valid_time_spec_validation (line 841) | fn validate_valid_time_spec_validation() {

FILE: src/progress.rs
  type BarType (line 14) | pub enum BarType {
  function add_bar (line 33) | pub fn add_bar(prefix: &str, length: u64, bar_type: BarType) -> Progress...
  function update_style (line 42) | pub fn update_style(bar: &ProgressBar, bar_type: BarType) {
  function add_bar_with_all_configurations (line 87) | fn add_bar_with_all_configurations() {

FILE: src/response.rs
  type FeroxResponse (line 30) | pub struct FeroxResponse {
    method fmt (line 100) | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    method status (line 115) | pub fn status(&self) -> &StatusCode {
    method method (line 120) | pub fn method(&self) -> &Method {
    method wildcard (line 125) | pub fn wildcard(&self) -> bool {
    method url (line 130) | pub fn url(&self) -> &Url {
    method text (line 135) | pub fn text(&self) -> &str {
    method headers (line 140) | pub fn headers(&self) -> &HeaderMap {
    method content_length (line 145) | pub fn content_length(&self) -> u64 {
    method timestamp (line 150) | pub fn timestamp(&self) -> f64 {
    method truncated (line 155) | pub fn truncated(&self) -> bool {
    method set_url (line 160) | pub fn set_url(&mut self, url: &str) {
    method set_wildcard (line 172) | pub fn set_wildcard(&mut self, is_wildcard: bool) {
    method set_text (line 178) | pub fn set_text(&mut self, text: &str) {
    method drop_text (line 190) | pub fn drop_text(&mut self) {
    method line_count (line 196) | pub fn line_count(&self) -> usize {
    method word_count (line 201) | pub fn word_count(&self) -> usize {
    method from (line 206) | pub async fn from(
    method parse_extension (line 309) | pub(crate) fn parse_extension(&mut self, handles: Arc<Handles>) -> Res...
    method reached_max_depth (line 367) | pub(crate) fn reached_max_depth(
    method is_directory (line 395) | pub fn is_directory(&self) -> bool {
    method send_report (line 442) | pub fn send_report(self, report_sender: CommandSender) -> Result<()> {
    method deserialize (line 648) | fn deserialize<D>(deserializer: D) -> anyhow::Result<Self, D::Error>
  method default (line 77) | fn default() -> Self {
  method as_str (line 462) | fn as_str(&self) -> String {
  method as_json (line 598) | fn as_json(&self) -> anyhow::Result<String> {
  method serialize (line 609) | fn serialize<S>(&self, serializer: S) -> anyhow::Result<S::Ok, S::Error>
  function reached_max_depth_returns_early_on_zero (line 766) | fn reached_max_depth_returns_early_on_zero() {
  function reached_max_depth_current_depth_equals_max (line 779) | fn reached_max_depth_current_depth_equals_max() {
  function reached_max_depth_current_depth_less_than_max (line 794) | fn reached_max_depth_current_depth_less_than_max() {
  function reached_max_depth_base_depth_equals_max_depth (line 808) | fn reached_max_depth_base_depth_equals_max_depth() {
  function reached_max_depth_current_greater_than_max (line 822) | fn reached_max_depth_current_greater_than_max() {
  function parse_extension_finds_simple_extension (line 836) | fn parse_extension_finds_simple_extension() {
  function parse_extension_ignores_hidden_files (line 858) | fn parse_extension_ignores_hidden_files() {
  function parse_extension_early_returns_based_on_config (line 880) | fn parse_extension_early_returns_based_on_config() {
  function truncated_getter_returns_correct_value (line 897) | fn truncated_getter_returns_correct_value() {
  function truncated_response_shows_in_url_display (line 910) | fn truncated_response_shows_in_url_display() {

FILE: src/scan_manager/menu.rs
  type MenuCmd (line 14) | pub enum MenuCmd {
  type MenuCmdResult (line 33) | pub enum MenuCmdResult {
  type Menu (line 52) | pub(super) struct Menu {
    method new (line 72) | pub(super) fn new() -> Self {
    method print_header (line 156) | pub(super) fn print_header(&self) {
    method print_border (line 161) | pub(super) fn print_border(&self) {
    method print_footer (line 166) | pub(super) fn print_footer(&self) {
    method print_eta (line 171) | pub(super) fn print_eta(&self, eta: Duration) {
    method print_scan_limit (line 178) | pub(super) fn print_scan_limit(&self, limiter: Arc<DynamicSemaphore>) {
    method hide_progress_bars (line 189) | pub(super) fn hide_progress_bars(&self) {
    method show_progress_bars (line 194) | pub(super) fn show_progress_bars(&self) {
    method clear_screen (line 199) | pub(super) fn clear_screen(&self) {
    method println (line 205) | pub(super) fn println(&self, msg: &str) {
    method str_to_usize (line 210) | fn str_to_usize(&self, value: &str) -> usize {
    method split_to_nums (line 226) | pub(super) fn split_to_nums(&self, line: &str) -> Vec<usize> {
    method get_command_input_from_user (line 273) | pub(super) fn get_command_input_from_user(&self, line: &str) -> Option...
    method confirm_cancellation (line 357) | pub(super) fn confirm_cancellation(&self, url: &str) -> char {
  method default (line 369) | fn default() -> Menu {

FILE: src/scan_manager/order.rs
  type ScanOrder (line 4) | pub enum ScanOrder {

FILE: src/scan_manager/response_container.rs
  type FeroxResponses (line 7) | pub struct FeroxResponses {
    method insert (line 38) | pub fn insert(&self, response: FeroxResponse) {
    method contains (line 45) | pub fn contains(&self, other: &FeroxResponse) -> bool {
  method serialize (line 15) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
  function create_response_json (line 62) | fn create_response_json(
  function contains_method_works_correctly (line 76) | fn contains_method_works_correctly() {

FILE: src/scan_manager/scan.rs
  type Visibility (line 27) | pub enum Visibility {
  type FeroxScan (line 41) | pub struct FeroxScan {
    method visible (line 129) | pub fn visible(&self) -> bool {
    method swap_visibility (line 133) | pub fn swap_visibility(&self) {
    method abort (line 168) | pub async fn abort(&self, active_bars: usize) -> Result<()> {
    method url (line 189) | pub fn url(&self) -> &str {
    method requests_made_so_far (line 194) | pub fn requests_made_so_far(&self) -> u64 {
    method set_task (line 199) | pub async fn set_task(&self, task: JoinHandle<()>) -> Result<()> {
    method set_status (line 206) | pub fn set_status(&self, status: ScanStatus) -> Result<()> {
    method set_start_time (line 214) | pub fn set_start_time(&self, start_time: Instant) -> Result<()> {
    method stop_progress_bar (line 222) | pub(super) fn stop_progress_bar(&self, active_bars: usize) {
    method progress_bar (line 248) | pub fn progress_bar(&self) -> ProgressBar {
    method new (line 301) | pub fn new(
    method finish (line 326) | pub fn finish(&self, active_bars: usize) -> Result<()> {
    method is_active (line 334) | pub fn is_active(&self) -> bool {
    method is_complete (line 346) | pub fn is_complete(&self) -> bool {
    method is_cancelled (line 354) | pub fn is_cancelled(&self) -> bool {
    method is_running (line 362) | pub fn is_running(&self) -> bool {
    method is_not_started (line 370) | pub fn is_not_started(&self) -> bool {
    method join (line 378) | pub async fn join(&self) {
    method add_403 (line 393) | pub(crate) fn add_403(&self) {
    method add_429 (line 398) | pub(crate) fn add_429(&self) {
    method add_error (line 403) | pub(crate) fn add_error(&self) {
    method num_errors (line 408) | pub fn num_errors(&self, trigger: PolicyTrigger) -> usize {
    method errors (line 418) | fn errors(&self) -> usize {
    method status_403s (line 423) | fn status_403s(&self) -> usize {
    method status_429s (line 428) | fn status_429s(&self) -> usize {
    method requests_per_second (line 433) | pub fn requests_per_second(&self) -> u64 {
    method requests (line 460) | pub fn requests(&self) -> u64 {
    method fmt (line 467) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    method deserialize (line 515) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
  method default (line 101) | fn default() -> Self {
  method eq (line 486) | fn eq(&self, other: &Self) -> bool {
  method serialize (line 494) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
  type ScanType (line 580) | pub enum ScanType {
  method default (line 591) | fn default() -> Self {
  type ScanStatus (line 598) | pub enum ScanStatus {
  method default (line 618) | fn default() -> Self {
  function num_errors_returns_correct_values (line 633) | fn num_errors_returns_correct_values() {
  function requests_per_second_returns_correct_values (line 659) | fn requests_per_second_returns_correct_values() {
  function test_swap_visibility (line 700) | fn test_swap_visibility() {
  function test_is_running (line 729) | fn test_is_running() {

FILE: src/scan_manager/scan_container.rs
  type FeroxScans (line 50) | pub struct FeroxScans {
    method new (line 101) | pub fn new(output_level: OutputLevel, bar_limit: usize) -> Self {
    method insert (line 112) | pub fn insert(&self, scan: Arc<FeroxScan>) -> bool {
    method add_serialized_scans (line 136) | pub fn add_serialized_scans(&self, filename: &str, handles: Arc<Handle...
    method contains (line 231) | pub fn contains(&self, url: &str) -> bool {
    method get_scan_by_url (line 245) | pub fn get_scan_by_url(&self, url: &str) -> Option<Arc<FeroxScan>> {
    method get_base_scan_by_url (line 258) | pub fn get_base_scan_by_url(&self, url: &str) -> Option<Arc<FeroxScan>> {
    method increment_status_code (line 294) | pub fn increment_status_code(&self, url: &str, code: StatusCode) {
    method increment_error (line 309) | pub fn increment_error(&self, url: &str) {
    method display_scans (line 321) | pub async fn display_scans(&self) {
    method cancel_scans (line 361) | async fn cancel_scans(&self, indexes: Vec<usize>, force: bool) -> usize {
    method display_filters (line 415) | fn display_filters(&self, handles: Arc<Handles>) {
    method interactive_menu (line 437) | async fn interactive_menu(
    method print_known_responses (line 542) | pub fn print_known_responses(&self) {
    method print_completed_bars (line 557) | pub fn print_completed_bars(&self, bar_length: usize) -> Result<()> {
    method pause (line 594) | pub async fn pause(
    method set_bar_length (line 635) | pub fn set_bar_length(&self, bar_length: u64) {
    method add_scan (line 646) | pub(super) fn add_scan(
    method add_directory_scan (line 698) | pub fn add_directory_scan(
    method add_file_scan (line 713) | pub fn add_file_scan(
    method number_of_bars (line 723) | pub fn number_of_bars(&self) -> usize {
    method make_visible (line 742) | pub fn make_visible(&self) {
    method has_active_scans (line 775) | pub fn has_active_scans(&self) -> bool {
    method get_active_scans (line 787) | pub fn get_active_scans(&self) -> Vec<Arc<FeroxScan>> {
    method add_discovered_extension (line 803) | pub fn add_discovered_extension(&self, extension: String) -> bool {
  method serialize (line 76) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
  function unknown_extension_is_added_to_collected_extensions (line 835) | fn unknown_extension_is_added_to_collected_extensions() {
  function known_extension_is_added_to_collected_extensions (line 848) | fn known_extension_is_added_to_collected_extensions() {

FILE: src/scan_manager/state.rs
  type FeroxState (line 11) | pub struct FeroxState {
    method new (line 34) | pub fn new(
  method as_str (line 60) | fn as_str(&self) -> String {
  method as_json (line 65) | fn as_json(&self) -> Result<String> {

FILE: src/scan_manager/tests.rs
  function default_scantype_is_file (line 27) | fn default_scantype_is_file() {
  function scanner_pause_scan_with_finished_spinner (line 38) | async fn scanner_pause_scan_with_finished_spinner() {
  function add_url_to_list_of_scanned_urls_with_unknown_url (line 60) | fn add_url_to_list_of_scanned_urls_with_unknown_url() {
  function add_url_to_list_of_scanned_urls_with_known_url (line 74) | fn add_url_to_list_of_scanned_urls_with_known_url() {
  function stop_progress_bar_stops_bar (line 104) | fn stop_progress_bar_stops_bar() {
  function add_url_to_list_of_scanned_urls_with_known_url_without_slash (line 140) | fn add_url_to_list_of_scanned_urls_with_known_url_without_slash() {
  function call_display_scans (line 169) | async fn call_display_scans() {
  function partial_eq_compares_the_id_field (line 212) | fn partial_eq_compares_the_id_field() {
  function ferox_scan_get_progress_bar_when_none_is_set (line 245) | fn ferox_scan_get_progress_bar_when_none_is_set() {
  function ferox_scan_deserialize (line 259) | fn ferox_scan_deserialize() {
  function ferox_scan_serialize (line 307) | fn ferox_scan_serialize() {
  function ferox_scans_serialize (line 327) | fn ferox_scans_serialize() {
  function ferox_responses_serialize (line 352) | fn ferox_responses_serialize() {
  function ferox_response_serialize_and_deserialize (line 369) | fn ferox_response_serialize_and_deserialize() {
  function feroxstates_feroxserialize_implementation (line 392) | fn feroxstates_feroxserialize_implementation() {
  function start_max_time_thread_panics_after_delay (line 572) | async fn start_max_time_thread_panics_after_delay() {
  function start_max_time_thread_returns_immediately_with_too_large_input (line 591) | async fn start_max_time_thread_returns_immediately_with_too_large_input() {
  function feroxscan_display (line 609) | fn feroxscan_display() {
  function ferox_scan_abort (line 657) | async fn ferox_scan_abort() {
  function menu_print_header_and_footer (line 693) | fn menu_print_header_and_footer() {
  function menu_get_command_input_from_user_returns_cancel (line 709) | fn menu_get_command_input_from_user_returns_cancel() {
  function menu_get_command_input_from_user_returns_add (line 734) | fn menu_get_command_input_from_user_returns_add() {
  function split_to_nums_is_correct (line 756) | fn split_to_nums_is_correct() {
  function get_base_scan_by_url_finds_correct_scan (line 770) | fn get_base_scan_by_url_finds_correct_scan() {
  function get_base_scan_by_url_finds_correct_scan_without_trailing_slash (line 820) | fn get_base_scan_by_url_finds_correct_scan_without_trailing_slash() {
  function get_base_scan_by_url_finds_correct_scan_with_trailing_slash (line 839) | fn get_base_scan_by_url_finds_correct_scan_with_trailing_slash() {

FILE: src/scan_manager/utils.rs
  function start_max_time_thread (line 19) | pub async fn start_max_time_thread(handles: Arc<Handles>) {
  function resume_scan (line 62) | pub fn resume_scan(filename: &str) -> Configuration {
  function determine_bar_type (line 102) | pub fn determine_bar_type(
  function test_no_limit_visible (line 133) | fn test_no_limit_visible() {
  function test_limit_exceeded_hidden (line 139) | fn test_limit_exceeded_hidden() {
  function test_limit_not_exceeded_visible (line 145) | fn test_limit_not_exceeded_visible() {
  function test_quiet_visible (line 151) | fn test_quiet_visible() {
  function test_quiet_hidden (line 157) | fn test_quiet_hidden() {
  function test_silent_hidden (line 163) | fn test_silent_hidden() {
  function test_silent_json_hidden (line 169) | fn test_silent_json_hidden() {

FILE: src/scanner/ferox_scanner.rs
  function check_for_user_input (line 42) | async fn check_for_user_input(
  type FeroxScanner (line 117) | pub struct FeroxScanner {
    method new (line 138) | pub fn new(
    method stream_requests (line 155) | async fn stream_requests(
    method scan_url (line 217) | pub async fn scan_url(&self) -> Result<()> {

FILE: src/scanner/init.rs
  function initialize (line 10) | pub async fn initialize(num_words: usize, handles: Arc<Handles>) -> Resu...

FILE: src/scanner/limit_heap.rs
  type LimitHeap (line 14) | pub(super) struct LimitHeap {
    method move_right (line 52) | pub(super) fn move_right(&mut self) -> usize {
    method move_left (line 73) | pub(super) fn move_left(&mut self) -> usize {
    method move_up (line 94) | pub(super) fn move_up(&mut self) -> usize {
    method move_to (line 104) | pub(super) fn move_to(&mut self, index: usize) {
    method value (line 117) | pub(super) fn value(&self) -> i32 {
    method set_value (line 131) | pub(super) fn set_value(&mut self, value: i32) {
    method has_parent (line 144) | pub(super) fn has_parent(&self) -> bool {
    method parent_value (line 149) | pub(super) fn parent_value(&mut self) -> i32 {
    method has_children (line 160) | pub(super) fn has_children(&self) -> bool {
    method right_child_value (line 166) | fn right_child_value(&mut self) -> i32 {
    method set_left_child (line 174) | fn set_left_child(&mut self) {
    method set_right_child (line 185) | fn set_right_child(&mut self) {
    method clamp_to_max (line 201) | pub(super) fn clamp_to_max(&mut self, max: i32) {
    method build (line 210) | pub(super) fn build(&mut self) {
  method default (line 28) | fn default() -> Self {
  method fmt (line 40) | fn fmt(&self, f: &mut Formatter<'_>) -> Result {

FILE: src/scanner/policy_data.rs
  type PolicyData (line 9) | pub struct PolicyData {
    method new (line 44) | pub fn new(policy: RequesterPolicy, timeout: u64) -> Self {
    method with_rate_limit (line 61) | pub fn with_rate_limit(mut self, rate_limit: usize) -> Self {
    method set_reqs_sec (line 67) | pub(super) fn set_reqs_sec(&self, reqs_sec: usize) {
    method set_errors (line 86) | pub(super) fn set_errors(&self, trigger: PolicyTrigger, errors: usize) {
    method get_errors (line 94) | pub(super) fn get_errors(&self, trigger: PolicyTrigger) -> usize {
    method heap_initialized (line 102) | pub(super) fn heap_initialized(&self) -> bool {
    method reset_heap (line 107) | pub(super) fn reset_heap(&self) {
    method set_limit (line 117) | fn set_limit(&self, limit: usize) {
    method get_limit (line 122) | pub(super) fn get_limit(&self) -> usize {
    method adjust_up (line 127) | pub(super) fn adjust_up(&self, streak_counter: &usize) {
    method adjust_down (line 170) | pub(super) fn adjust_down(&self) {
  function set_reqs_sec_builds_heap_and_sets_initial_value (line 188) | fn set_reqs_sec_builds_heap_and_sets_initial_value() {
  function policy_data_getters_and_setters (line 202) | fn policy_data_getters_and_setters() {
  function policy_data_adjust_down_simple (line 216) | fn policy_data_adjust_down_simple() {
  function policy_data_adjust_down_no_children (line 226) | fn policy_data_adjust_down_no_children() {
  function policy_data_adjust_up_simple (line 242) | fn policy_data_adjust_up_simple() {
  function policy_data_adjust_up_with_streak_and_2_moves (line 252) | fn policy_data_adjust_up_with_streak_and_2_moves() {
  function policy_data_adjust_up_with_streak_and_2_moves_to_arrive_at_root (line 270) | fn policy_data_adjust_up_with_streak_and_2_moves_to_arrive_at_root() {
  function policy_data_adjust_up_with_streak_and_2_moves_to_find_less_than_current (line 287) | fn policy_data_adjust_up_with_streak_and_2_moves_to_find_less_than_curre...
  function policy_data_adjust_up_with_streak_and_3_moves (line 304) | fn policy_data_adjust_up_with_streak_and_3_moves() {
  function policy_data_adjust_up_with_no_children_2_moves (line 321) | fn policy_data_adjust_up_with_no_children_2_moves() {
  function policy_data_adjust_up_with_no_children_3_moves (line 339) | fn policy_data_adjust_up_with_no_children_3_moves() {
  function increase_limit_heap_coverage_by_hitting_edge_cases (line 357) | fn increase_limit_heap_coverage_by_hitting_edge_cases() {

FILE: src/scanner/requester.rs
  type Requester (line 46) | pub(super) struct Requester {
    method from (line 80) | pub fn from(scanner: &FeroxScanner, ferox_scan: Arc<FeroxScan>) -> Res...
    method build_a_bucket (line 108) | fn build_a_bucket(limit: usize) -> Result<RateLimiter> {
    method cool_down (line 129) | async fn cool_down(&self) {
    method limit (line 139) | pub async fn limit(&self) -> Result<()> {
    method too_many_errors (line 150) | fn too_many_errors(&self) -> bool {
    method too_many_status_errors (line 160) | fn too_many_status_errors(&self, trigger: PolicyTrigger) -> bool {
    method should_enforce_policy (line 179) | fn should_enforce_policy(&self) -> Option<PolicyTrigger> {
    method adjust_limit (line 221) | async fn adjust_limit(&self, trigger: PolicyTrigger, create_limiter: b...
    method set_rate_limiter (line 318) | async fn set_rate_limiter(&self, new_limit: Option<usize>) -> Result<(...
    method tune (line 339) | async fn tune(&self, trigger: PolicyTrigger) -> Result<()> {
    method bail (line 395) | async fn bail(&self, trigger: PolicyTrigger) -> Result<()> {
    method request (line 447) | pub async fn request(&self, word: &str) -> Result<()> {
  function setup_requester_test (line 697) | async fn setup_requester_test(config: Option<Arc<Configuration>>) -> (Ar...
  function increment_errors (line 726) | async fn increment_errors(handles: Arc<Handles>, scan: Arc<FeroxScan>, n...
  function increment_scan_errors (line 738) | async fn increment_scan_errors(handles: Arc<Handles>, url: &str, num_err...
  function increment_scan_status_codes (line 747) | async fn increment_scan_status_codes(
  function increment_status_codes (line 760) | async fn increment_status_codes(
  function create_scan (line 780) | async fn create_scan(
  function should_enforce_policy_returns_false_on_not_enough_requests_seen (line 835) | async fn should_enforce_policy_returns_false_on_not_enough_requests_seen...
  function should_enforce_policy_returns_true_on_error_times_threads (line 859) | async fn should_enforce_policy_returns_true_on_error_times_threads() {
  function should_enforce_policy_returns_true_on_excessive_403s (line 889) | async fn should_enforce_policy_returns_true_on_excessive_403s() {
  function should_enforce_policy_returns_true_on_excessive_429s (line 927) | async fn should_enforce_policy_returns_true_on_excessive_429s() {
  function bail_calls_abort_on_highest_errored_feroxscan (line 968) | async fn bail_calls_abort_on_highest_errored_feroxscan() {
  function bail_returns_ok_on_no_active_scans (line 1011) | async fn bail_returns_ok_on_no_active_scans() {
  function should_enforce_policy_returns_none_on_cooldown (line 1042) | async fn should_enforce_policy_returns_none_on_cooldown() {
  function cooldown_pauses_for_wait_time (line 1070) | async fn cooldown_pauses_for_wait_time() {
  function adjust_limit_increments_streak_counter_on_upward_movement (line 1098) | async fn adjust_limit_increments_streak_counter_on_upward_movement() {
  function adjust_limit_resets_streak_counter_on_downward_movement (line 1129) | async fn adjust_limit_resets_streak_counter_on_downward_movement() {
  function adjust_limit_removes_rate_limiter (line 1171) | async fn adjust_limit_removes_rate_limiter() {
  function too_many_status_errors_returns_correct_values (line 1204) | async fn too_many_status_errors_returns_correct_values() {
  function set_rate_limiter_early_exit (line 1244) | async fn set_rate_limiter_early_exit() {
  function tune_sets_expected_values_and_then_waits (line 1276) | async fn tune_sets_expected_values_and_then_waits() {
  function build_a_bucket_handles_low_rates_correctly (line 1352) | fn build_a_bucket_handles_low_rates_correctly() {
  function policy_triggered_reset_when_limiter_removed (line 1375) | async fn policy_triggered_reset_when_limiter_removed() {
  function should_enforce_policy_uses_per_scan_requests (line 1422) | async fn should_enforce_policy_uses_per_scan_requests() {
  function heap_values_clamped_to_rate_limit_cap (line 1463) | async fn heap_values_clamped_to_rate_limit_cap() {
  function auto_tune_with_cap_adjusts_down_on_errors (line 1488) | async fn auto_tune_with_cap_adjusts_down_on_errors() {
  function auto_tune_with_cap_never_exceeds_cap_on_upward_adjustment (line 1513) | async fn auto_tune_with_cap_never_exceeds_cap_on_upward_adjustment() {
  function remove_limit_with_cap_sets_to_cap_instead_of_removing (line 1547) | async fn remove_limit_with_cap_sets_to_cap_instead_of_removing() {
  function initial_limiter_set_to_cap_when_both_flags_present (line 1593) | async fn initial_limiter_set_to_cap_when_both_flags_present() {
  function capped_auto_tune_full_lifecycle (line 1635) | async fn capped_auto_tune_full_lifecycle() {

FILE: src/scanner/tests.rs
  function get_scan_by_url_bails_on_unfound_url (line 16) | async fn get_scan_by_url_bails_on_unfound_url() {

FILE: src/scanner/utils.rs
  type PolicyTrigger (line 3) | pub enum PolicyTrigger {
    method as_index (line 19) | pub fn as_index(&self) -> usize {

FILE: src/statistics/container.rs
  type Stats (line 26) | pub struct Stats {
    method deserialize (line 215) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    method new (line 480) | pub fn new(is_json: bool) -> Self {
    method expected_per_scan (line 490) | pub fn expected_per_scan(&self) -> usize {
    method resources_discovered (line 495) | pub fn resources_discovered(&self) -> usize {
    method errors (line 500) | pub fn errors(&self) -> usize {
    method status_403s (line 505) | pub fn status_403s(&self) -> usize {
    method status_429s (line 510) | pub fn status_429s(&self) -> usize {
    method total_expected (line 515) | pub fn total_expected(&self) -> usize {
    method initial_targets (line 520) | pub fn initial_targets(&self) -> usize {
    method add_request (line 525) | pub fn add_request(&self) {
    method update_runtime (line 530) | fn update_runtime(&self, seconds: f64) {
    method update_targets (line 537) | pub fn update_targets(&self, targets: Vec<String>) {
    method save (line 544) | pub fn save(&self, seconds: f64, location: &str) -> Result<()> {
    method add_error (line 559) | pub fn add_error(&self, error: StatError) {
    method add_status_code (line 592) | pub fn add_status_code(&self, status: StatusCode) {
    method update_f64_field (line 641) | pub fn update_f64_field(&self, field: StatField, value: f64) {
    method subtract_from_usize_field (line 650) | pub fn subtract_from_usize_field(&self, field: StatField, value: usize) {
    method update_usize_field (line 657) | pub fn update_usize_field(&self, field: StatField, value: usize) {
    method merge_from (line 698) | pub fn merge_from(&self, filename: &str) -> Result<()> {
  method as_str (line 147) | fn as_str(&self) -> String {
  method as_json (line 152) | fn as_json(&self) -> Result<String> {
  method serialize (line 160) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
  function statistics_handler_increments_requests (line 775) | async fn statistics_handler_increments_requests() -> Result<()> {
  function statistics_handler_increments_403_via_status_code (line 795) | async fn statistics_handler_increments_403_via_status_code() {
  function statistics_handler_increments_500_via_status_code (line 816) | async fn statistics_handler_increments_500_via_status_code() -> Result<(...
  function stats_increments_timeouts (line 838) | fn stats_increments_timeouts() {
  function stats_increments_wildcards (line 856) | fn stats_increments_wildcards() {
  function stats_increments_responses_filtered (line 872) | fn stats_increments_responses_filtered() {
  function stats_merge_from_alters_correct_fields (line 887) | fn stats_merge_from_alters_correct_fields() {
  function update_runtime_works (line 940) | fn update_runtime_works() {
  function status_403s_returns_correct_value (line 951) | fn status_403s_returns_correct_value() {
  function status_429s_returns_correct_value (line 960) | fn status_429s_returns_correct_value() {

FILE: src/statistics/error.rs
  type StatError (line 3) | pub enum StatError {

FILE: src/statistics/field.rs
  type StatField (line 4) | pub enum StatField {

FILE: src/statistics/tests.rs
  function setup_stats_test (line 14) | pub fn setup_stats_test() -> (Joiner, StatsHandle) {
  function teardown_stats_test (line 21) | pub async fn teardown_stats_test(sender: CommandSender, task: Joiner) {
  function statistics_handler_exits (line 29) | async fn statistics_handler_exits() -> Result<()> {
  function save_writes_stats_object_to_disk (line 42) | fn save_writes_stats_object_to_disk() {

FILE: src/sync/dynamic_semaphore.rs
  type DynamicSemaphore (line 40) | pub struct DynamicSemaphore {
    method new (line 98) | pub fn new(permits: usize) -> Self {
    method acquire (line 128) | pub async fn acquire(&self) -> Result<DynamicSemaphorePermit<'_>, toki...
    method try_acquire (line 188) | pub fn try_acquire(&self) -> Result<DynamicSemaphorePermit<'_>, tokio:...
    method reduce_capacity (line 254) | pub fn reduce_capacity(&self, new_capacity: usize) -> usize {
    method increase_capacity (line 304) | pub fn increase_capacity(&self, new_capacity: usize) -> usize {
    method current_capacity (line 329) | pub fn current_capacity(&self) -> usize {
    method available_permits (line 352) | pub fn available_permits(&self) -> usize {
    method close (line 376) | pub fn close(&self) {
    method is_closed (line 393) | pub fn is_closed(&self) -> bool {
    method permits_in_use (line 416) | pub fn permits_in_use(&self) -> usize {
  type DynamicSemaphorePermit (line 67) | pub struct DynamicSemaphorePermit<'a> {
  method drop (line 438) | fn drop(&mut self) {
  function test_basic_acquire_release (line 473) | async fn test_basic_acquire_release() {
  function test_capacity_reduction (line 498) | async fn test_capacity_reduction() {
  function test_capacity_increase (line 531) | async fn test_capacity_increase() {
  function test_try_acquire (line 544) | async fn test_try_acquire() {
  function test_close (line 555) | async fn test_close() {
  function test_over_capacity_acquisition_prevention (line 567) | async fn test_over_capacity_acquisition_prevention() {
  function test_concurrent_capacity_reduction (line 611) | async fn test_concurrent_capacity_reduction() {
  function test_stress_concurrent_operations (line 643) | async fn test_stress_concurrent_operations() {
  function test_feroxbuster_integration_scenario (line 684) | async fn test_feroxbuster_integration_scenario() {
  function test_edge_cases (line 720) | async fn test_edge_cases() {

FILE: src/traits.rs
  type FeroxFilter (line 20) | pub trait FeroxFilter: Debug + Send + Sync {
    method should_filter_response (line 22) | fn should_filter_response(&self, response: &FeroxResponse) -> bool;
    method box_eq (line 25) | fn box_eq(&self, other: &dyn Any) -> bool;
    method as_any (line 28) | fn as_any(&self) -> &dyn Any;
  method fmt (line 32) | fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), fmt::Error> {
  method eq (line 96) | fn eq(&self, other: &Box<dyn FeroxFilter>) -> bool {
  type FeroxSerialize (line 103) | pub trait FeroxSerialize: Serialize {
    method as_str (line 106) | fn as_str(&self) -> String;
    method as_json (line 109) | fn as_json(&self) -> Result<String>;

FILE: src/url.rs
  type UrlExt (line 9) | pub trait UrlExt {
    method is_in_scope (line 19) | fn is_in_scope(&self, scope: &[Url]) -> bool;
    method is_subdomain_of (line 22) | fn is_subdomain_of(&self, parent_url: &Url) -> bool;
    method is_in_scope (line 26) | fn is_in_scope(&self, scope: &[Url]) -> bool {
    method is_subdomain_of (line 51) | fn is_subdomain_of(&self, parent_url: &Url) -> bool {
  type FeroxUrl (line 86) | pub struct FeroxUrl {
    method from_string (line 97) | pub fn from_string(target: &str, handles: Arc<Handles>) -> Self {
    method from_url (line 105) | pub fn from_url(target: &Url, handles: Arc<Handles>) -> Self {
    method formatted_urls (line 118) | pub fn formatted_urls(
    method format (line 159) | pub fn format(&self, word: &str, extension: Option<&str>) -> Result<Ur...
    method normalize (line 240) | pub fn normalize(&self) -> String {
    method depth (line 264) | pub fn depth(&self) -> Result<usize> {
    method fmt (line 289) | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  function formatted_urls_no_extension_returns_base_url_with_word (line 301) | fn formatted_urls_no_extension_returns_base_url_with_word() {
  function formatted_urls_one_extension_returns_two_urls (line 310) | fn formatted_urls_one_extension_returns_two_urls() {
  function formatted_urls_multiple_extensions_returns_n_plus_one_urls (line 331) | fn formatted_urls_multiple_extensions_returns_n_plus_one_urls() {
  function depth_base_url_returns_1 (line 372) | fn depth_base_url_returns_1() {
  function depth_base_url_with_slash_returns_1 (line 382) | fn depth_base_url_with_slash_returns_1() {
  function depth_one_dir_returns_2 (line 392) | fn depth_one_dir_returns_2() {
  function depth_one_dir_with_slash_returns_2 (line 402) | fn depth_one_dir_with_slash_returns_2() {
  function format_url_normal (line 412) | fn format_url_normal() {
  function format_url_no_word (line 425) | fn format_url_no_word() {
  function format_url_joins_queries (line 434) | fn format_url_joins_queries() {
  function format_url_without_word_joins_queries (line 452) | fn format_url_without_word_joins_queries() {
  function format_url_no_url (line 471) | fn format_url_no_url() {
  function format_url_word_with_preslash (line 479) | fn format_url_word_with_preslash() {
  function format_url_word_with_postslash (line 492) | fn format_url_word_with_postslash() {
  function format_url_word_with_two_prepended_slashes (line 505) | fn format_url_word_with_two_prepended_slashes() {
  function format_url_word_with_two_prepended_slashes_and_extensions (line 518) | fn format_url_word_with_two_prepended_slashes_and_extensions() {
  function format_url_word_that_is_a_url (line 532) | fn format_url_word_that_is_a_url() {
  function formatted_urls_with_postslash_and_extensions (line 544) | fn formatted_urls_with_postslash_and_extensions() {
  function test_is_in_scope (line 571) | fn test_is_in_scope() {
  function test_is_in_scope_subdomain (line 584) | fn test_is_in_scope_subdomain() {
  function test_is_in_scope_not_in_scope (line 596) | fn test_is_in_scope_not_in_scope() {
  function test_is_in_scope_empty_scope (line 608) | fn test_is_in_scope_empty_scope() {
  function test_is_in_scope_domain_only_scope (line 617) | fn test_is_in_scope_domain_only_scope() {
  function test_is_in_scope_subdomain_domain_only_scope (line 626) | fn test_is_in_scope_subdomain_domain_only_scope() {
  function test_is_in_scope_no_domain (line 635) | fn test_is_in_scope_no_domain() {
  function test_is_subdomain_of_true (line 645) | fn test_is_subdomain_of_true() {
  function test_is_subdomain_of_same_domain (line 654) | fn test_is_subdomain_of_same_domain() {
  function test_is_subdomain_of_different_domain (line 663) | fn test_is_subdomain_of_different_domain() {
  function test_is_subdomain_of_multi_level (line 672) | fn test_is_subdomain_of_multi_level() {
  function test_is_subdomain_of_no_domain (line 681) | fn test_is_subdomain_of_no_domain() {
  function test_is_subdomain_of_parent_no_domain (line 690) | fn test_is_subdomain_of_parent_no_domain() {
  function test_is_not_in_empty_scope (line 699) | fn test_is_not_in_empty_scope() {
  function test_is_in_scope_subdomain_with_empty_scope (line 708) | fn test_is_in_scope_subdomain_with_empty_scope() {
  function test_is_in_scope_scope_match (line 717) | fn test_is_in_scope_scope_match() {
  function test_is_in_scope_not_allowed (line 726) | fn test_is_in_scope_not_allowed() {
  function test_is_in_scope_empty_scope_different_domain (line 735) | fn test_is_in_scope_empty_scope_different_domain() {
  function test_is_in_scope_subdomain_in_scope (line 744) | fn test_is_in_scope_subdomain_in_scope() {

FILE: src/utils.rs
  function is_certificate_error (line 37) | fn is_certificate_error(error: &reqwest::Error) -> bool {
  function open_file (line 95) | pub fn open_file(filename: &str) -> Result<BufWriter<fs::File>> {
  function status_colorizer (line 111) | pub fn status_colorizer(status: &str) -> String {
  function fmt_err (line 125) | pub fn fmt_err(msg: &str) -> String {
  function timestamp (line 131) | pub fn timestamp() -> f64 {
  function send_try_recursion_command (line 146) | pub(crate) async fn send_try_recursion_command(
  function module_colorizer (line 165) | pub fn module_colorizer(modname: &str) -> String {
  function ferox_print (line 179) | pub fn ferox_print(msg: &str, bar: &ProgressBar) {
  function logged_request (line 190) | pub async fn logged_request(
  function make_request (line 222) | pub async fn make_request(
  function create_report_string (line 335) | pub fn create_report_string(
  function set_open_file_limit (line 378) | pub fn set_open_file_limit(limit: u64) -> bool {
  function write_to (line 414) | pub fn write_to<T>(
  function should_deny_absolute (line 448) | fn should_deny_absolute(url_to_test: &Url, denier: &Url, handles: Arc<Ha...
  function should_deny_regex (line 543) | fn should_deny_regex(url_to_test: &Url, denier: &Regex) -> bool {
  function should_deny_url (line 558) | pub fn should_deny_url(url: &Url, handles: Arc<Handles>) -> Result<bool> {
  function slugify_filename (line 596) | pub fn slugify_filename(url: &str, prefix: &str, suffix: &str) -> String {
  function parse_url_with_raw_path (line 628) | pub fn parse_url_with_raw_path(url: &str) -> Result<Url> {
  function utils_parse_url_with_raw_path_javascript (line 814) | fn utils_parse_url_with_raw_path_javascript() {
  function utils_parse_url_with_raw_path (line 826) | fn utils_parse_url_with_raw_path() {
  function utils_set_open_file_limit_with_low_requested_limit (line 953) | fn utils_set_open_file_limit_with_low_requested_limit() {
  function utils_set_open_file_limit_with_high_requested_limit (line 961) | fn utils_set_open_file_limit_with_high_requested_limit() {
  function utils_set_open_file_limit_with_fails_when_both_limits_are_equal (line 972) | fn utils_set_open_file_limit_with_fails_when_both_limits_are_equal() {
  function status_colorizer_uses_red_for_500s (line 982) | fn status_colorizer_uses_red_for_500s() {
  function status_colorizer_uses_red_for_400s (line 988) | fn status_colorizer_uses_red_for_400s() {
  function status_colorizer_uses_red_for_errors (line 994) | fn status_colorizer_uses_red_for_errors() {
  function status_colorizer_uses_cyan_for_wildcards (line 1000) | fn status_colorizer_uses_cyan_for_wildcards() {
  function status_colorizer_uses_blue_for_100s (line 1006) | fn status_colorizer_uses_blue_for_100s() {
  function status_colorizer_uses_green_for_200s (line 1012) | fn status_colorizer_uses_green_for_200s() {
  function status_colorizer_uses_yellow_for_300s (line 1018) | fn status_colorizer_uses_yellow_for_300s() {
  function status_colorizer_returns_as_is (line 1024) | fn status_colorizer_returns_as_is() {
  function should_deny_url_blocks_when_denier_is_exact_match (line 1031) | fn should_deny_url_blocks_when_denier_is_exact_match() {
  function should_deny_url_doesnt_compare_mismatched_domains (line 1054) | fn should_deny_url_doesnt_compare_mismatched_domains() {
  function should_deny_url_doesnt_compare_non_domains (line 1077) | fn should_deny_url_doesnt_compare_non_domains() {
  function should_deny_url_doesnt_compare_mismatched_domains_in_scanned (line 1102) | fn should_deny_url_doesnt_compare_mismatched_domains_in_scanned() {
  function should_deny_url_doesnt_compare_non_domains_in_scanned (line 1134) | fn should_deny_url_doesnt_compare_non_domains_in_scanned() {
  function should_deny_url_blocks_child (line 1156) | fn should_deny_url_blocks_child() {
  function should_deny_url_doesnt_block_non_child (line 1179) | fn should_deny_url_doesnt_block_non_child() {
  function should_deny_url_blocks_child_when_scan_url_isnt_parent (line 1202) | fn should_deny_url_blocks_child_when_scan_url_isnt_parent() {
  function should_deny_url_doesnt_block_child_when_scan_url_is_parent (line 1225) | fn should_deny_url_doesnt_block_child_when_scan_url_is_parent() {
  function should_deny_url_blocks_urls_based_on_regex_in_path (line 1249) | fn should_deny_url_blocks_urls_based_on_regex_in_path() {
  function should_deny_url_blocks_urls_based_on_regex_in_scheme (line 1273) | fn should_deny_url_blocks_urls_based_on_regex_in_scheme() {

FILE: tests/policies/test_policies_with_deps.rs
  type DelayedHttpServer (line 39) | struct DelayedHttpServer {
    method new (line 56) | fn new() -> Result<Self, Box<dyn std::error::Error>> {
    method url (line 133) | fn url(&self, path: &str) -> String {
  function find_available_port (line 45) | fn find_available_port() -> Result<u16, Box<dyn std::error::Error>> {
  method drop (line 139) | fn drop(&mut self) {
  function auto_bail_cancels_scan_with_timeouts (line 148) | fn auto_bail_cancels_scan_with_timeouts() {
  function auto_bail_with_caddy (line 309) | fn auto_bail_with_caddy() {

FILE: tests/test_banner.rs
  function banner_prints_proxy (line 11) | fn banner_prints_proxy() -> Result<(), Box<dyn std::error::Error>> {
  function banner_prints_replay_proxy (line 49) | fn banner_prints_replay_proxy() -> Result<(), Box<dyn std::error::Error>> {
  function banner_prints_headers (line 87) | fn banner_prints_headers() {
  function banner_prints_denied_urls (line 118) | fn banner_prints_denied_urls() {
  function banner_prints_scope_urls (line 153) | fn banner_prints_scope_urls() {
  function banner_prints_random_agent (line 185) | fn banner_prints_random_agent() {
  function banner_prints_filter_sizes (line 211) | fn banner_prints_filter_sizes() {
  function banner_prints_queries (line 256) | fn banner_prints_queries() {
  function banner_prints_status_codes (line 287) | fn banner_prints_status_codes() {
  function banner_prints_replay_codes (line 314) | fn banner_prints_replay_codes() {
  function banner_prints_output_file (line 345) | fn banner_prints_output_file() {
  function banner_prints_insecure (line 376) | fn banner_prints_insecure() {
  function banner_prints_redirects (line 403) | fn banner_prints_redirects() {
  function banner_prints_extensions (line 430) | fn banner_prints_extensions() {
  function banner_prints_dont_filter (line 460) | fn banner_prints_dont_filter() {
  function banner_prints_verbosity_one (line 487) | fn banner_prints_verbosity_one() {
  function banner_prints_verbosity_two (line 514) | fn banner_prints_verbosity_two() {
  function banner_prints_verbosity_three (line 541) | fn banner_prints_verbosity_three() {
  function banner_prints_verbosity_four (line 568) | fn banner_prints_verbosity_four() {
  function banner_prints_add_slash (line 595) | fn banner_prints_add_slash() {
  function banner_prints_infinite_depth (line 622) | fn banner_prints_infinite_depth() {
  function banner_prints_recursion_depth (line 650) | fn banner_prints_recursion_depth() {
  function banner_prints_server_certs (line 678) | fn banner_prints_server_certs() {
  function banner_prints_client_cert_and_key (line 708) | fn banner_prints_client_cert_and_key() {
  function banner_prints_no_recursion (line 740) | fn banner_prints_no_recursion() {
  function banner_doesnt_print (line 767) | fn banner_doesnt_print() {
  function banner_prints_extract_links (line 784) | fn banner_prints_extract_links() {
  function banner_prints_scan_limit (line 811) | fn banner_prints_scan_limit() {
  function banner_prints_response_size_limit (line 839) | fn banner_prints_response_size_limit() {
  function banner_prints_filter_status (line 867) | fn banner_prints_filter_status() {
  function banner_prints_json (line 894) | fn banner_prints_json() {
  function banner_prints_debug_log (line 923) | fn banner_prints_debug_log() {
  function banner_prints_filter_regex (line 951) | fn banner_prints_filter_regex() {
  function banner_prints_time_limit (line 979) | fn banner_prints_time_limit() {
  function banner_prints_similarity_filter (line 1007) | fn banner_prints_similarity_filter() {
  function banner_prints_rate_limit (line 1035) | fn banner_prints_rate_limit() {
  function banner_prints_auto_tune (line 1063) | fn banner_prints_auto_tune() {
  function banner_prints_auto_bail (line 1090) | fn banner_prints_auto_bail() {
  function banner_doesnt_print_when_silent (line 1117) | fn banner_doesnt_print_when_silent() {
  function banner_doesnt_print_when_quiet (line 1142) | fn banner_doesnt_print_when_quiet() {
  function banner_prints_parallel (line 1167) | fn banner_prints_parallel() {
  function banner_prints_methods (line 1192) | fn banner_prints_methods() {
  function banner_prints_data (line 1222) | fn banner_prints_data() {
  function banner_prints_collect_extensions_and_dont_collect_default (line 1254) | fn banner_prints_collect_extensions_and_dont_collect_default() {
  function banner_prints_collect_extensions_and_dont_collect_with_input (line 1282) | fn banner_prints_collect_extensions_and_dont_collect_with_input() {
  function banner_prints_collect_backups (line 1313) | fn banner_prints_collect_backups() {
  function banner_prints_collect_words (line 1339) | fn banner_prints_collect_words() {
  function banner_prints_all_composite_settings_smart (line 1365) | fn banner_prints_all_composite_settings_smart() {
  function banner_prints_all_composite_settings_thorough (line 1394) | fn banner_prints_all_composite_settings_thorough() {
  function banner_prints_all_composite_settings_burp (line 1423) | fn banner_prints_all_composite_settings_burp() {
  function banner_prints_all_composite_settings_data_json_stdin (line 1450) | fn banner_prints_all_composite_settings_data_json_stdin() {
  function banner_prints_all_composite_settings_data_json_file (line 1476) | fn banner_prints_all_composite_settings_data_json_file() {
  function banner_prints_all_composite_settings_data_urlencoded_stdin (line 1505) | fn banner_prints_all_composite_settings_data_urlencoded_stdin() {
  function banner_prints_all_composite_settings_data_urlencoded_file (line 1539) | fn banner_prints_all_composite_settings_data_urlencoded_file() {
  function banner_prints_all_composite_settings_burp_replay (line 1570) | fn banner_prints_all_composite_settings_burp_replay() {
  function banner_prints_force_recursion (line 1597) | fn banner_prints_force_recursion() {
  function banner_prints_scan_dir_listings (line 1623) | fn banner_prints_scan_dir_listings() {
  function banner_prints_limit_dirs (line 1649) | fn banner_prints_limit_dirs() {
  function banner_prints_update_app (line 1676) | fn banner_prints_update_app() {
  function banner_prints_unique (line 1687) | fn banner_prints_unique() {

FILE: tests/test_config.rs
  function read_in_config_file_for_settings (line 11) | fn read_in_config_file_for_settings() -> Result<(), Box<dyn std::error::...

FILE: tests/test_deny_list.rs
  function deny_list_works_during_with_a_normal_scan (line 12) | fn deny_list_works_during_with_a_normal_scan() {
  function deny_list_works_during_extraction (line 41) | fn deny_list_works_during_extraction() {
  function deny_list_works_during_recursion (line 80) | fn deny_list_works_during_recursion() {
  function deny_list_works_during_recursion_with_inverted_parents (line 143) | fn deny_list_works_during_recursion_with_inverted_parents() {
  function deny_list_prevents_regex_that_denies_base_url (line 213) | fn deny_list_prevents_regex_that_denies_base_url() {
  function deny_list_prevents_url_that_denies_base_url (line 246) | fn deny_list_prevents_url_that_denies_base_url() {

FILE: tests/test_dynamic_semaphore.rs
  function test_basic_acquire_release (line 11) | async fn test_basic_acquire_release() {
  function test_capacity_reduction (line 36) | async fn test_capacity_reduction() {
  function test_capacity_increase (line 69) | async fn test_capacity_increase() {
  function test_try_acquire (line 82) | async fn test_try_acquire() {
  function test_close (line 93) | async fn test_close() {
  function test_over_capacity_acquisition_prevention (line 105) | async fn test_over_capacity_acquisition_prevention() {
  function test_concurrent_capacity_reduction (line 149) | async fn test_concurrent_capacity_reduction() {
  function test_stress_concurrent_operations (line 181) | async fn test_stress_concurrent_operations() {
  function test_feroxbuster_integration_scenario (line 222) | async fn test_feroxbuster_integration_scenario() {
  function test_edge_cases (line 258) | async fn test_edge_cases() {

FILE: tests/test_extractor.rs
  function extractor_finds_absolute_url (line 13) | fn extractor_finds_absolute_url() -> Result<(), Box<dyn std::error::Erro...
  function extractor_finds_absolute_url_to_different_domain (line 54) | fn extractor_finds_absolute_url_to_different_domain() -> Result<(), Box<...
  function extractor_finds_relative_url (line 88) | fn extractor_finds_relative_url() -> Result<(), Box<dyn std::error::Erro...
  function extractor_finds_same_relative_url_twice (line 129) | fn extractor_finds_same_relative_url_twice() {
  function extractor_finds_filtered_content (line 177) | fn extractor_finds_filtered_content() -> Result<(), Box<dyn std::error::...
  function extractor_finds_robots_txt_links_and_displays_files_or_scans_directories (line 223) | fn extractor_finds_robots_txt_links_and_displays_files_or_scans_director...
  function extractor_finds_robots_txt_links_and_displays_files_non_recursive (line 297) | fn extractor_finds_robots_txt_links_and_displays_files_non_recursive() {
  function extractor_finds_directory_listing_links_and_displays_files (line 370) | fn extractor_finds_directory_listing_links_and_displays_files() {
  function extractor_finds_directory_listing_links_and_displays_files_non_recursive (line 478) | fn extractor_finds_directory_listing_links_and_displays_files_non_recurs...
  function extractor_recurses_into_403_directories (line 588) | fn extractor_recurses_into_403_directories() -> Result<(), Box<dyn std::...
  function robots_text_extraction_doesnt_run_with_dont_extract_links (line 637) | fn robots_text_extraction_doesnt_run_with_dont_extract_links() {

FILE: tests/test_filters.rs
  function filters_status_code_should_filter_response (line 13) | fn filters_status_code_should_filter_response() {
  function filters_lines_should_filter_response (line 58) | fn filters_lines_should_filter_response() {
  function filters_words_should_filter_response (line 103) | fn filters_words_should_filter_response() {
  function filters_size_should_filter_response (line 148) | fn filters_size_should_filter_response() {
  function filters_similar_should_filter_response (line 193) | fn filters_similar_should_filter_response() {
  function collect_backups_should_be_filtered (line 250) | fn collect_backups_should_be_filtered() {
  function filters_regex_should_filter_response_based_on_headers (line 292) | fn filters_regex_should_filter_response_based_on_headers() {

FILE: tests/test_heuristics.rs
  function test_single_target_cannot_connect (line 13) | fn test_single_target_cannot_connect() -> Result<(), Box<dyn std::error:...
  function test_two_targets_cannot_connect (line 34) | fn test_two_targets_cannot_connect() -> Result<(), Box<dyn std::error::E...
  function test_one_good_and_one_bad_target_scan_succeeds (line 59) | fn test_one_good_and_one_bad_target_scan_succeeds() -> Result<(), Box<dy...
  function test_single_target_cannot_connect_due_to_ssl_errors (line 94) | fn test_single_target_cannot_connect_due_to_ssl_errors() -> Result<(), B...
  function test_two_good_targets_scan_succeeds (line 115) | fn test_two_good_targets_scan_succeeds() -> Result<(), Box<dyn std::erro...
  function test_static_wildcard_request_found (line 156) | fn test_static_wildcard_request_found() -> Result<(), Box<dyn std::error...
  function heuristics_static_wildcard_request_with_dont_filter (line 192) | fn heuristics_static_wildcard_request_with_dont_filter() -> Result<(), B...
  function heuristics_wildcard_test_with_two_static_wildcards_with_silent_enabled (line 266) | fn heuristics_wildcard_test_with_two_static_wildcards_with_silent_enabled(
  function heuristics_wildcard_test_that_auto_filtering_403s_still_allows_for_recursion_into_403_directories (line 309) | fn heuristics_wildcard_test_that_auto_filtering_403s_still_allows_for_re...

FILE: tests/test_main.rs
  function main_use_root_owned_file_as_wordlist (line 13) | fn main_use_root_owned_file_as_wordlist() {
  function main_use_empty_wordlist (line 36) | fn main_use_empty_wordlist() -> Result<(), Box<dyn std::error::Error>> {
  function main_use_empty_stdin_targets (line 63) | fn main_use_empty_stdin_targets() -> Result<(), Box<dyn std::error::Erro...
  function main_parallel_spawns_children (line 90) | fn main_parallel_spawns_children() -> Result<(), Box<dyn std::error::Err...
  function main_parallel_creates_output_directory (line 152) | fn main_parallel_creates_output_directory() -> Result<(), Box<dyn std::e...
  function main_download_wordlist_from_url (line 252) | fn main_download_wordlist_from_url() -> Result<(), Box<dyn std::error::E...

FILE: tests/test_parser.rs
  function parser_incorrect_param_with_tack_tack_help (line 18) | fn parser_incorrect_param_with_tack_tack_help() {
  function parser_incorrect_param_with_tack_h (line 39) | fn parser_incorrect_param_with_tack_h() {

FILE: tests/test_policies.rs
  function auto_bail_cancels_scan_with_403s (line 27) | fn auto_bail_cancels_scan_with_403s() {
  function auto_bail_cancels_scan_with_429s (line 108) | fn auto_bail_cancels_scan_with_429s() {
  function auto_tune_slows_scan_with_429s (line 189) | fn auto_tune_slows_scan_with_429s() {
  function auto_tune_slows_scan_with_403s (line 252) | fn auto_tune_slows_scan_with_403s() {
  function auto_tune_slows_scan_with_general_errors (line 315) | fn auto_tune_slows_scan_with_general_errors() {

FILE: tests/test_rate_limiting.rs
  function create_test_wordlist (line 13) | fn create_test_wordlist(
  function scenario_high_403_rate (line 46) | fn scenario_high_403_rate() {
  function scenario_high_429_rate (line 106) | fn scenario_high_429_rate() {
  function scenario_recovery_pattern (line 166) | fn scenario_recovery_pattern() {
  function scenario_mixed_steady_state (line 235) | fn scenario_mixed_steady_state() {
  function scenario_capped_auto_tune (line 308) | fn scenario_capped_auto_tune() {

FILE: tests/test_response_size_limit.rs
  function response_size_limit_small_response_not_truncated (line 12) | fn response_size_limit_small_response_not_truncated() {
  function response_size_limit_large_response_truncated (line 46) | fn response_size_limit_large_response_truncated() {
  function response_size_limit_mixed_response_sizes (line 80) | fn response_size_limit_mixed_response_sizes() {
  function response_size_limit_default_4mb (line 162) | fn response_size_limit_default_4mb() {
  function response_size_limit_very_small_limit (line 195) | fn response_size_limit_very_small_limit() {
  function response_size_limit_with_redirects (line 228) | fn response_size_limit_with_redirects() {
  function response_size_limit_with_error_responses (line 263) | fn response_size_limit_with_error_responses() {
  function response_size_limit_json_output_includes_truncated_field (line 303) | fn response_size_limit_json_output_includes_truncated_field() {
  function response_size_limit_shows_in_banner (line 343) | fn response_size_limit_shows_in_banner() {
  function response_size_limit_exact_limit (line 369) | fn response_size_limit_exact_limit() {
  function response_size_limit_from_config_file (line 402) | fn response_size_limit_from_config_file() {

FILE: tests/test_scan_manager.rs
  function resume_scan_works (line 17) | fn resume_scan_works() {
  function time_limit_enforced_when_specified (line 100) | fn time_limit_enforced_when_specified() {

FILE: tests/test_scanner.rs
  function scanner_single_request_scan (line 14) | fn scanner_single_request_scan() -> Result<(), Box<dyn std::error::Error...
  function scanner_recursive_request_scan (line 44) | fn scanner_recursive_request_scan() -> Result<(), Box<dyn std::error::Er...
  function scanner_recursive_request_scan_using_only_success_responses (line 105) | fn scanner_recursive_request_scan_using_only_success_responses(
  function scanner_single_request_scan_with_file_output (line 168) | fn scanner_single_request_scan_with_file_output() -> Result<(), Box<dyn ...
  function scanner_single_request_scan_with_file_output_and_tack_q (line 202) | fn scanner_single_request_scan_with_file_output_and_tack_q(
  function scanner_single_request_scan_with_invalid_file_output (line 237) | fn scanner_single_request_scan_with_invalid_file_output() -> Result<(), ...
  function scanner_single_request_quiet_scan (line 270) | fn scanner_single_request_quiet_scan() -> Result<(), Box<dyn std::error:...
  function scanner_single_request_returns_301_without_location_header (line 304) | fn scanner_single_request_returns_301_without_location_header(
  function scanner_single_request_replayed_to_proxy (line 339) | fn scanner_single_request_replayed_to_proxy() -> Result<(), Box<dyn std:...
  function scanner_single_request_scan_with_filtered_result (line 382) | fn scanner_single_request_scan_with_filtered_result() -> Result<(), Box<...
  function scanner_single_request_scan_with_debug_logging (line 426) | fn scanner_single_request_scan_with_debug_logging() {
  function scanner_single_request_scan_with_debug_logging_as_json (line 463) | fn scanner_single_request_scan_with_debug_logging_as_json() {
  function scanner_single_request_scan_with_regex_filtered_result (line 506) | fn scanner_single_request_scan_with_regex_filtered_result() {
  function scanner_recursion_works_with_403_directories (line 548) | fn scanner_recursion_works_with_403_directories() {
  function rate_limit_enforced_when_specified (line 600) | fn rate_limit_enforced_when_specified() {
  function add_discovered_extension_updates_bars_and_stats (line 637) | fn add_discovered_extension_updates_bars_and_stats() {
  function collect_backups_makes_appropriate_requests (line 679) | fn collect_backups_makes_appropriate_requests() {
  function collect_words_makes_appropriate_requests (line 755) | fn collect_words_makes_appropriate_requests() {
  function scanner_forced_recursion_ignores_normal_redirect_logic (line 847) | fn scanner_forced_recursion_ignores_normal_redirect_logic() -> Result<()...

FILE: tests/test_unique_responses.rs
  function word_and_status_makes_a_response_unique_and_isnt_seen (line 13) | fn word_and_status_makes_a_response_unique_and_isnt_seen() -> Result<(),...
  function bytes_and_status_makes_a_redirect_response_unique_and_isnt_seen (line 55) | fn bytes_and_status_makes_a_redirect_response_unique_and_isnt_seen(

FILE: tests/utils/mod.rs
  function setup_tmp_directory (line 7) | pub fn setup_tmp_directory(
  function teardown_tmp_directory (line 19) | pub fn teardown_tmp_directory(directory: TempDir) {
Condensed preview — 150 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,607K chars).
[
  {
    "path": ".all-contributorsrc",
    "chars": 27549,
    "preview": "{\n  \"files\": [\n    \"README.md\"\n  ],\n  \"imageSize\": 100,\n  \"commit\": false,\n  \"contributors\": [\n    {\n      \"login\": \"joo"
  },
  {
    "path": ".cargo/config.toml",
    "chars": 143,
    "preview": "[target.armv7-unknown-linux-gnueabihf]\nlinker = \"arm-linux-gnueabihf-gcc\"\n\n[target.aarch64-unknown-linux-gnu]\nlinker = \""
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 78,
    "preview": "# These are supported funding model platforms\n\ngithub: [epi052]\nko_fi: epi052\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 619,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: \"[BUG] \"\nlabels: bug\nassignees: ''\n\n---\n\n**Describ"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 622,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: \"[FEATURE REQUEST] \"\nlabels: enhancement\nassign"
  },
  {
    "path": ".github/actions-rs/grcov.yml",
    "chars": 185,
    "preview": "branch: false\nignore-not-existing: true\nllvm: true\noutput-type: lcov\noutput-path: ./lcov.info\n# excl-br-line: \"^\\\\s*((de"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 127,
    "preview": "version: 2\nupdates:\n- package-ecosystem: cargo\n  directory: \"/\"\n  schedule:\n    interval: daily\n  open-pull-requests-lim"
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 1497,
    "preview": "# Landing a Pull Request (PR)\n\nLong form explanations of most of the items below can be found in the [CONTRIBUTING](http"
  },
  {
    "path": ".github/stale.yml",
    "chars": 696,
    "preview": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 14\n# Number of days of inactivity before a "
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 7469,
    "preview": "name: CD Pipeline\n\non: [push]\n\njobs:\n  build-nix:\n    env:\n      IN_PIPELINE: true\n    runs-on: ${{ matrix.os }}\n    if:"
  },
  {
    "path": ".github/workflows/check.yml",
    "chars": 1407,
    "preview": "name: CI Pipeline\n\non: [push, pull_request]\n\njobs:\n  check:\n    name: Check\n    runs-on: ubuntu-latest\n    steps:\n      "
  },
  {
    "path": ".github/workflows/cicd-to-dockerhub.yml",
    "chars": 1886,
    "preview": "name: ci-to-dockerhub\n\non:\n  push:\n    branches: [ main ]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - "
  },
  {
    "path": ".github/workflows/coverage.yml",
    "chars": 755,
    "preview": "on: [push]\n\nname: Code Coverage Pipeline\n\njobs:\n  coverage:\n    name: LLVM Coverage\n    runs-on: ubuntu-latest\n    steps"
  },
  {
    "path": ".github/workflows/winget.yml",
    "chars": 565,
    "preview": "name: Publish to Winget\non:\n  release:\n    types: [released]\n  workflow_dispatch:\n    inputs:\n      tag_name:\n        de"
  },
  {
    "path": ".gitignore",
    "chars": 681,
    "preview": "# Generated by Cargo\n# will have compiled files and executables\ndebug/\ntarget/\n\n# These are backup files generated by ru"
  },
  {
    "path": ".rustfmt.toml",
    "chars": 24,
    "preview": "reorder_modules = false\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 12932,
    "preview": "# Contributor's guide\n\n<!-- this guide is a modified version of the guide that I already modified which was based on the"
  },
  {
    "path": "Cargo.toml",
    "chars": 2743,
    "preview": "[package]\nname = \"feroxbuster\"\nversion = \"2.13.1\"\nauthors = [\"Ben 'epi' Risher (@epi052)\"]\nlicense = \"MIT\"\nedition = \"20"
  },
  {
    "path": "Dockerfile",
    "chars": 870,
    "preview": "FROM alpine:3.17.1 AS build\nLABEL maintainer=\"wfnintr@null.net\"\n\nRUN apk upgrade --update-cache --available && apk add -"
  },
  {
    "path": "LICENSE",
    "chars": 1065,
    "preview": "MIT License\n\nCopyright (c) 2020-2026 epi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\no"
  },
  {
    "path": "Makefile",
    "chars": 2151,
    "preview": "default_prefix = /usr/local\nprefix ?= $(default_prefix)\nexec_prefix = $(prefix)\nbindir = $(exec_prefix)/bin\ndatarootdir "
  },
  {
    "path": "Makefile.toml",
    "chars": 955,
    "preview": "# composite tasks\n[tasks.upgrade]\ndependencies = [\"upgrade-deps\", \"update\"]\n\n[tasks.check]\ndependencies = [\"fmt\", \"clipp"
  },
  {
    "path": "README.md",
    "chars": 48963,
    "preview": "⚠️ **Security Notice – Domain Impersonation**\n\nThe domain **feroxbuster.com** is **NOT affiliated** with this project, i"
  },
  {
    "path": "build.rs",
    "chars": 3217,
    "preview": "use std::fs::{copy, create_dir_all, OpenOptions};\nuse std::io::{Read, Seek, Write};\n\nuse clap_complete::{generate_to, sh"
  },
  {
    "path": "choco_package/feroxbuster.nuspec",
    "chars": 3903,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd\">\n  <me"
  },
  {
    "path": "choco_package/legal/LICENSE.txt",
    "chars": 1139,
    "preview": "\nFrom: https://github.com/epi052/feroxbuster/blob/main/LICENSE\n\nLICENSE\n\nMIT License\n\nCopyright (c) 2020-2023 epi\n\nPerm"
  },
  {
    "path": "choco_package/legal/VERIFICATION.txt",
    "chars": 130,
    "preview": "\nVERIFICATION\n\nchecksum -t sha512 -f .\\x86-windows-feroxbuster.exe.zip\nchecksum -t sha512 -f .\\x86_64-windows-feroxbust"
  },
  {
    "path": "choco_package/tools/chocolateyinstall.ps1",
    "chars": 1344,
    "preview": "$ErrorActionPreference = 'Stop' \n\n$toolsDir   = \"$(Split-Path -parent $MyInvocation.MyCommand.Definition)\"\n$version    "
  },
  {
    "path": "choco_package/tools/chocolateyuninstall.ps1",
    "chars": 2691,
    "preview": "$ErrorActionPreference = 'Stop' # stop on all errors\n$packageArgs = @{\n  packageName   = $env:ChocolateyPackageName\n  s"
  },
  {
    "path": "docs/.nojekyll",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/index.html",
    "chars": 250,
    "preview": "<html>\n<head>\n   <meta http-equiv=\"refresh\"\n   content=\"0; url=https://epi052.github.io/feroxbuster-docs/\">\n</head>\n<bod"
  },
  {
    "path": "ferox-config.toml.example",
    "chars": 2743,
    "preview": "# Example configuration for feroxbuster\n#\n# If you wish to provide persistent settings to feroxbuster, rename this file "
  },
  {
    "path": "install-nix.sh",
    "chars": 1811,
    "preview": "#!/usr/bin/env bash\n\nBASE_URL=https://github.com/epi052/feroxbuster/releases/latest/download\n\nMAC_ZIP=x86_64-macos-ferox"
  },
  {
    "path": "shell_completions/_feroxbuster",
    "chars": 11283,
    "preview": "#compdef feroxbuster\n\nautoload -U is-at-least\n\n_feroxbuster() {\n    typeset -A opt_args\n    typeset -a _arguments_option"
  },
  {
    "path": "shell_completions/_feroxbuster.ps1",
    "chars": 19478,
    "preview": "\nusing namespace System.Management.Automation\nusing namespace System.Management.Automation.Language\n\nRegister-ArgumentCo"
  },
  {
    "path": "shell_completions/feroxbuster.bash",
    "chars": 15092,
    "preview": "_feroxbuster() {\n    local i cur prev opts cmd\n    COMPREPLY=()\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        c"
  },
  {
    "path": "shell_completions/feroxbuster.elv",
    "chars": 11015,
    "preview": "\nuse builtin;\nuse str;\n\nset edit:completion:arg-completer[feroxbuster] = {|@words|\n    fn spaces {|n|\n        builtin:re"
  },
  {
    "path": "shell_completions/feroxbuster.fish",
    "chars": 8216,
    "preview": "complete -c feroxbuster -s u -l url -d 'The target URL (required, unless [--stdin || --resume-from || --request-file] us"
  },
  {
    "path": "snapcraft.yaml",
    "chars": 1203,
    "preview": "name: feroxbuster\nversion: git\nsummary: A simple, fast, recursive content discovery tool written in Rust\ndescription: |\n"
  },
  {
    "path": "src/banner/container.rs",
    "chars": 27177,
    "preview": "use super::entry::BannerEntry;\nuse crate::{\n    client,\n    config::Configuration,\n    event_handlers::Handles,\n    util"
  },
  {
    "path": "src/banner/entry.rs",
    "chars": 1645,
    "preview": "use console::{measure_text_width, Emoji};\nuse std::fmt;\n\n/// Initial visual indentation size used in formatting banner e"
  },
  {
    "path": "src/banner/mod.rs",
    "chars": 175,
    "preview": "//! all logic related to building/printing the banner seen when scans start\nmod container;\nmod entry;\n\n#[cfg(test)]\nmod "
  },
  {
    "path": "src/banner/tests.rs",
    "chars": 6025,
    "preview": "use super::container::UpdateStatus;\nuse super::*;\nuse crate::{config::Configuration, event_handlers::Handles, scan_manag"
  },
  {
    "path": "src/client.rs",
    "chars": 9923,
    "preview": "use crate::url::UrlExt;\nuse anyhow::{Context, Result};\nuse reqwest::header::HeaderMap;\nuse reqwest::{redirect::Policy, C"
  },
  {
    "path": "src/config/container.rs",
    "chars": 60496,
    "preview": "use super::utils::{\n    backup_extensions, depth, determine_requester_policy, extract_links, ignored_extensions,\n    met"
  },
  {
    "path": "src/config/mod.rs",
    "chars": 232,
    "preview": "//! all logic related to instantiating a running configuration\n\nmod container;\nmod utils;\n#[cfg(test)]\nmod tests;\n\npub u"
  },
  {
    "path": "src/config/tests.rs",
    "chars": 18852,
    "preview": "use super::utils::*;\nuse super::*;\nuse crate::{traits::FeroxSerialize, DEFAULT_CONFIG_NAME};\nuse regex::Regex;\nuse reqwe"
  },
  {
    "path": "src/config/utils.rs",
    "chars": 39996,
    "preview": "use super::Configuration;\nuse crate::{\n    message::FeroxMessage,\n    traits::FeroxSerialize,\n    utils::{module_coloriz"
  },
  {
    "path": "src/event_handlers/command.rs",
    "chars": 3354,
    "preview": "use std::sync::Arc;\nuse std::time::Duration;\n\nuse reqwest::StatusCode;\nuse tokio::sync::oneshot::Sender;\n\nuse crate::res"
  },
  {
    "path": "src/event_handlers/container.rs",
    "chars": 5893,
    "preview": "use super::*;\nuse crate::config::Configuration;\nuse crate::event_handlers::scans::ScanHandle;\nuse crate::scan_manager::F"
  },
  {
    "path": "src/event_handlers/filters.rs",
    "chars": 4534,
    "preview": "use super::*;\nuse crate::filters::EmptyFilter;\nuse crate::{filters::FeroxFilters, CommandSender, FeroxChannel, Joiner};\n"
  },
  {
    "path": "src/event_handlers/inputs.rs",
    "chars": 6478,
    "preview": "use super::*;\nuse crate::{\n    progress::PROGRESS_PRINTER,\n    scan_manager::{FeroxState, PAUSE_SCAN},\n    scanner::RESP"
  },
  {
    "path": "src/event_handlers/mod.rs",
    "chars": 519,
    "preview": "//! collection of event handlers (typically long-running tokio spawned tasks)\nmod statistics;\nmod filters;\nmod container"
  },
  {
    "path": "src/event_handlers/outputs.rs",
    "chars": 21344,
    "preview": "use super::Command::AddToUsizeField;\nuse super::*;\n\nuse anyhow::{Context, Result};\nuse futures::future::{BoxFuture, Futu"
  },
  {
    "path": "src/event_handlers/scans.rs",
    "chars": 20243,
    "preview": "use std::sync::Arc;\n\nuse anyhow::{bail, Result};\nuse tokio::sync::mpsc;\n\nuse crate::{\n    response::FeroxResponse,\n    s"
  },
  {
    "path": "src/event_handlers/statistics.rs",
    "chars": 6046,
    "preview": "use super::*;\nuse crate::{\n    config::Configuration,\n    progress::{add_bar, BarType},\n    statistics::{StatField, Stat"
  },
  {
    "path": "src/extractor/builder.rs",
    "chars": 4879,
    "preview": "use super::*;\nuse crate::event_handlers::Handles;\nuse anyhow::{bail, Result};\n\n/// Regular expression used in [LinkFinde"
  },
  {
    "path": "src/extractor/container.rs",
    "chars": 28985,
    "preview": "use super::*;\nuse crate::{\n    client,\n    event_handlers::{\n        Command::{AddError, AddToUsizeField},\n        Handl"
  },
  {
    "path": "src/extractor/mod.rs",
    "chars": 296,
    "preview": "//! extract links from html source and robots.txt\nmod builder;\nmod container;\n#[cfg(test)]\nmod tests;\n\npub use self::bui"
  },
  {
    "path": "src/extractor/tests.rs",
    "chars": 14257,
    "preview": "use super::builder::{LINKFINDER_REGEX, ROBOTS_TXT_REGEX, URL_CHARS_REGEX};\nuse super::container::request_link;\nuse super"
  },
  {
    "path": "src/filters/container.rs",
    "chars": 5236,
    "preview": "use std::sync::RwLock;\n\nuse anyhow::Result;\nuse serde::{ser::SerializeSeq, Serialize, Serializer};\n\nuse crate::response:"
  },
  {
    "path": "src/filters/empty.rs",
    "chars": 560,
    "preview": "use super::*;\n\n/// Dummy filter for internal shenanigans\n#[derive(Default, Debug, PartialEq, Eq)]\npub struct EmptyFilter"
  },
  {
    "path": "src/filters/init.rs",
    "chars": 2689,
    "preview": "use super::{\n    utils::create_similarity_filter, LinesFilter, RegexFilter, SizeFilter, StatusCodeFilter,\n    WordsFilte"
  },
  {
    "path": "src/filters/lines.rs",
    "chars": 1083,
    "preview": "use super::*;\n\n/// Simple implementor of FeroxFilter; used to filter out responses based on the number of lines\n/// in a"
  },
  {
    "path": "src/filters/mod.rs",
    "chars": 811,
    "preview": "//! contains all of feroxbuster's filters\nuse serde::{Deserialize, Serialize};\nuse std::any::Any;\nuse std::fmt::Debug;\n\n"
  },
  {
    "path": "src/filters/regex.rs",
    "chars": 1927,
    "preview": "use super::*;\nuse ::regex::Regex;\n\n/// Simple implementor of FeroxFilter; used to filter out responses based on a given "
  },
  {
    "path": "src/filters/similarity.rs",
    "chars": 2216,
    "preview": "use super::*;\nuse crate::nlp::preprocess;\nuse crate::NEAR_DUPLICATE_DISTANCE;\nuse gaoya::simhash::{SimHash, SimHashBits,"
  },
  {
    "path": "src/filters/size.rs",
    "chars": 1081,
    "preview": "use super::*;\n\n/// Simple implementor of FeroxFilter; used to filter out responses based on the length of a\n/// Response"
  },
  {
    "path": "src/filters/status_code.rs",
    "chars": 1314,
    "preview": "use super::*;\n\n/// Simple implementor of FeroxFilter; used to filter out status codes specified using\n/// -C|--filter-st"
  },
  {
    "path": "src/filters/tests.rs",
    "chars": 8414,
    "preview": "use super::*;\nuse crate::nlp::preprocess;\nuse crate::DEFAULT_METHOD;\nuse crate::NEAR_DUPLICATE_DISTANCE;\nuse ::regex::Re"
  },
  {
    "path": "src/filters/utils.rs",
    "chars": 6408,
    "preview": "use super::FeroxFilter;\nuse super::SimilarityFilter;\nuse crate::event_handlers::Handles;\nuse crate::response::FeroxRespo"
  },
  {
    "path": "src/filters/wildcard.rs",
    "chars": 6696,
    "preview": "use console::style;\n\nuse super::*;\nuse crate::utils::create_report_string;\nuse crate::{config::OutputLevel, DEFAULT_METH"
  },
  {
    "path": "src/filters/words.rs",
    "chars": 1083,
    "preview": "use super::*;\n\n/// Simple implementor of FeroxFilter; used to filter out responses based on the number of words\n/// in a"
  },
  {
    "path": "src/heuristics.rs",
    "chars": 45378,
    "preview": "use std::collections::{HashMap, HashSet};\nuse std::sync::Arc;\n\nuse anyhow::{bail, Result};\nuse console::style;\nuse futur"
  },
  {
    "path": "src/lib.rs",
    "chars": 10578,
    "preview": "#![deny(clippy::all)]\n#![allow(clippy::mutex_atomic)]\nuse anyhow::Result;\nuse reqwest::StatusCode;\nuse std::collections:"
  },
  {
    "path": "src/logger.rs",
    "chars": 2653,
    "preview": "use std::env;\nuse std::fs::OpenOptions;\nuse std::io::BufWriter;\nuse std::sync::{Arc, RwLock};\nuse std::time::Instant;\n\nu"
  },
  {
    "path": "src/macros.rs",
    "chars": 537,
    "preview": "#![macro_use]\n\n#[macro_export]\n/// wrapper to improve code readability\nmacro_rules! send_command {\n    ($tx:expr, $value"
  },
  {
    "path": "src/main.rs",
    "chars": 26603,
    "preview": "use std::{\n    env::{\n        args,\n        consts::{ARCH, OS},\n    },\n    fs::{create_dir, remove_file, File},\n    io::"
  },
  {
    "path": "src/message.rs",
    "chars": 4723,
    "preview": "use anyhow::Context;\nuse console::{style, Color};\nuse serde::{Deserialize, Serialize};\n\nuse crate::traits::FeroxSerializ"
  },
  {
    "path": "src/nlp/constants.rs",
    "chars": 4631,
    "preview": "use lazy_static::lazy_static;\nuse regex::Regex;\n\nlazy_static! {\n    /// regular expression to match on words with number"
  },
  {
    "path": "src/nlp/document.rs",
    "chars": 7950,
    "preview": "use super::term::{Term, TermMetaData};\nuse super::utils::preprocess;\nuse scraper::{Html, Node, Selector};\nuse std::colle"
  },
  {
    "path": "src/nlp/mod.rs",
    "chars": 262,
    "preview": "//! small stand-alone tf-idf library, specifically designed for use in feroxbuster\n\nmod constants;\nmod document;\nmod mod"
  },
  {
    "path": "src/nlp/model.rs",
    "chars": 6633,
    "preview": "use super::document::Document;\nuse super::term::{Term, TermMetaData};\nuse super::utils::{inverse_document_frequency, tf_"
  },
  {
    "path": "src/nlp/term.rs",
    "chars": 3250,
    "preview": "use std::borrow::BorrowMut;\n\n/// single word term for text processing\n#[derive(Debug, Hash, Eq, PartialEq, Default, Clon"
  },
  {
    "path": "src/nlp/utils.rs",
    "chars": 5532,
    "preview": "use super::constants::{BOUNDED_WORD_REGEX, STOP_WORDS};\nuse regex::Captures;\nuse std::borrow::Cow;\n\n/// pre-processing p"
  },
  {
    "path": "src/parser.rs",
    "chars": 33280,
    "preview": "use clap::ArgAction;\nuse clap::{\n    crate_authors, crate_description, crate_name, crate_version, Arg, ArgGroup, Command"
  },
  {
    "path": "src/progress.rs",
    "chars": 3644,
    "preview": "use indicatif::{MultiProgress, ProgressBar, ProgressDrawTarget, ProgressStyle};\nuse lazy_static::lazy_static;\n\nlazy_stat"
  },
  {
    "path": "src/response.rs",
    "chars": 32517,
    "preview": "use std::{\n    collections::HashMap,\n    convert::{TryFrom, TryInto},\n    fmt,\n    str::FromStr,\n    sync::Arc,\n};\n\nuse "
  },
  {
    "path": "src/scan_manager/menu.rs",
    "chars": 12071,
    "preview": "use std::sync::Arc;\nuse std::time::Duration;\n\nuse crate::filters::filter_lookup;\nuse crate::progress::PROGRESS_BAR;\nuse "
  },
  {
    "path": "src/scan_manager/mod.rs",
    "chars": 427,
    "preview": "mod scan_container;\nmod response_container;\nmod scan;\nmod menu;\nmod utils;\nmod order;\nmod state;\n#[cfg(test)]\nmod tests;"
  },
  {
    "path": "src/scan_manager/order.rs",
    "chars": 272,
    "preview": "#[derive(Debug, Copy, Clone)]\n/// Simple enum to designate whether a URL was passed in by the user (Initial) or found du"
  },
  {
    "path": "src/scan_manager/response_container.rs",
    "chars": 2967,
    "preview": "use crate::response::FeroxResponse;\nuse serde::{ser::SerializeSeq, Serialize, Serializer};\nuse std::sync::{Arc, RwLock};"
  },
  {
    "path": "src/scan_manager/scan.rs",
    "chars": 23879,
    "preview": "use super::*;\nuse crate::{\n    config::OutputLevel,\n    event_handlers::Handles,\n    progress::update_style,\n    progres"
  },
  {
    "path": "src/scan_manager/scan_container.rs",
    "chars": 30563,
    "preview": "use super::scan::ScanType;\nuse super::*;\nuse crate::event_handlers::Handles;\nuse crate::filters::{\n    EmptyFilter, Line"
  },
  {
    "path": "src/scan_manager/state.rs",
    "chars": 1888,
    "preview": "use super::*;\nuse crate::filters::FeroxFilters;\nuse crate::{config::Configuration, statistics::Stats, traits::FeroxSeria"
  },
  {
    "path": "src/scan_manager/tests.rs",
    "chars": 28072,
    "preview": "use super::*;\nuse crate::filters::{\n    FeroxFilters, LinesFilter, RegexFilter, SimilarityFilter, SizeFilter, StatusCode"
  },
  {
    "path": "src/scan_manager/utils.rs",
    "chars": 5864,
    "preview": "#[cfg(not(test))]\nuse crate::event_handlers::TermInputHandler;\nuse crate::{\n    config::{Configuration, OutputLevel},\n  "
  },
  {
    "path": "src/scanner/ferox_scanner.rs",
    "chars": 16400,
    "preview": "use std::fmt::Write as _;\nuse std::sync::atomic::AtomicBool;\nuse std::{ops::Deref, sync::atomic::Ordering, sync::Arc, ti"
  },
  {
    "path": "src/scanner/init.rs",
    "chars": 1002,
    "preview": "use crate::{\n    event_handlers::{Command::AddToUsizeField, Handles},\n    statistics::StatField::ExpectedPerScan,\n};\nuse"
  },
  {
    "path": "src/scanner/limit_heap.rs",
    "chars": 7589,
    "preview": "use std::cmp::max;\nuse std::fmt::{Debug, Formatter, Result};\n\n/// bespoke variation on an array-backed max-heap\n///\n/// "
  },
  {
    "path": "src/scanner/mod.rs",
    "chars": 237,
    "preview": "mod ferox_scanner;\nmod utils;\nmod init;\n#[cfg(test)]\nmod tests;\nmod limit_heap;\nmod policy_data;\nmod requester;\n\npub use"
  },
  {
    "path": "src/scanner/policy_data.rs",
    "chars": 14231,
    "preview": "use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};\n\nuse crate::{atomic_load, atomic_store, config::RequesterPol"
  },
  {
    "path": "src/scanner/requester.rs",
    "chars": 67947,
    "preview": "use std::{\n    cmp::max,\n    collections::HashSet,\n    sync::{\n        self,\n        atomic::{AtomicBool, Ordering},\n   "
  },
  {
    "path": "src/scanner/tests.rs",
    "chars": 738,
    "preview": "use std::sync::Arc;\n\nuse crate::sync::DynamicSemaphore;\n\nuse crate::{\n    config::OutputLevel,\n    event_handlers::Handl"
  },
  {
    "path": "src/scanner/utils.rs",
    "chars": 821,
    "preview": "#[derive(Copy, Clone, PartialEq, Eq, Debug)]\n/// represents different situations where different criteria can trigger au"
  },
  {
    "path": "src/statistics/container.rs",
    "chars": 39433,
    "preview": "use std::{\n    collections::HashMap,\n    convert::TryFrom,\n    fs::File,\n    io::BufReader,\n    sync::{\n        atomic::"
  },
  {
    "path": "src/statistics/error.rs",
    "chars": 637,
    "preview": "#[derive(Debug, Copy, Clone)]\n/// Enum variants used to inform the `StatCommand` protocol what `Stats` fields should be "
  },
  {
    "path": "src/statistics/field.rs",
    "chars": 1040,
    "preview": "/// Enum representing fields whose updates need to be performed in batches instead of one at\n/// a time\n#[derive(Debug, "
  },
  {
    "path": "src/statistics/init.rs",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "src/statistics/macros.rs",
    "chars": 1059,
    "preview": "#![macro_use]\n\n/// Wrapper `Atomic*.fetch_add` to save me from writing Ordering::Relaxed a bajillion times\n///\n/// defau"
  },
  {
    "path": "src/statistics/mod.rs",
    "chars": 242,
    "preview": "mod error;\nmod macros;\nmod container;\nmod field;\n#[cfg(test)]\nmod tests;\n\npub use self::container::Stats;\npub use self::"
  },
  {
    "path": "src/statistics/tests.rs",
    "chars": 2125,
    "preview": "use super::*;\nuse crate::{\n    config::Configuration,\n    event_handlers::{Command, StatsHandle, StatsHandler},\n    trai"
  },
  {
    "path": "src/sync/dynamic_semaphore.rs",
    "chars": 27255,
    "preview": "use std::sync::atomic::{AtomicUsize, Ordering};\nuse std::sync::Arc;\nuse tokio::sync::{Semaphore, SemaphorePermit};\n\n/// "
  },
  {
    "path": "src/sync/mod.rs",
    "chars": 324,
    "preview": "//! Synchronization primitives for feroxbuster\n//!\n//! This module provides enhanced synchronization primitives that ext"
  },
  {
    "path": "src/traits.rs",
    "chars": 4716,
    "preview": "//! collection of all traits used\nuse crate::filters::{\n    LinesFilter, RegexFilter, SimilarityFilter, SizeFilter, Stat"
  },
  {
    "path": "src/url.rs",
    "chars": 26701,
    "preview": "use crate::utils::parse_url_with_raw_path;\nuse crate::{event_handlers::Handles, statistics::StatError::UrlFormat, Comman"
  },
  {
    "path": "src/utils.rs",
    "chars": 49320,
    "preview": "use anyhow::{bail, Context, Result};\nuse console::{strip_ansi_codes, style, user_attended};\nuse indicatif::ProgressBar;\n"
  },
  {
    "path": "tests/extra-words",
    "chars": 975967,
    "preview": "A\nA's\nAMD\nAMD's\nAOL\nAOL's\nAWS\nAWS's\nAachen\nAachen's\nAaliyah\nAaliyah's\nAaron\nAaron's\nAbbas\nAbbas's\nAbbasid\nAbbasid's\nAbbo"
  },
  {
    "path": "tests/mutual-auth/Caddyfile",
    "chars": 195,
    "preview": "(mTLS) {\n\ttls {\n\t\tclient_auth {\n\t\t\tmode require_and_verify\n\t\t\ttrusted_ca_cert_file certs/server/ca.crt\n\t\t}\n\t}\n}\n\nhttps:/"
  },
  {
    "path": "tests/mutual-auth/README.md",
    "chars": 221,
    "preview": "# Testing mTLS\n\n- run `gen-certs.sh`\n- run `sudo /path/to/caddy run`\n- expect listener on port 8001\n- run `feroxbuster -"
  },
  {
    "path": "tests/mutual-auth/certs/client/client.crt",
    "chars": 985,
    "preview": "-----BEGIN CERTIFICATE-----\nMIICqzCCAZMCFE22XDzrLwkJIkb3EdP333d4HoXQMA0GCSqGSIb3DQEBCwUAMBMx\nETAPBgNVBAMMCFNlcnZlckNBMB4"
  },
  {
    "path": "tests/mutual-auth/certs/client/client.key",
    "chars": 1704,
    "preview": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDPcQ9YyyH51891\nse2k2GLNlmz6vR2PN0ceCRuc1DU"
  },
  {
    "path": "tests/mutual-auth/certs/server/ca.crt",
    "chars": 1111,
    "preview": "-----BEGIN CERTIFICATE-----\nMIIDBzCCAe+gAwIBAgIUG3vb4pIbvaI/+LzOpu6Z4b6s4iIwDQYJKoZIhvcNAQEL\nBQAwEzERMA8GA1UEAwwIU2VydmV"
  },
  {
    "path": "tests/mutual-auth/certs/server/server.crt",
    "chars": 993,
    "preview": "-----BEGIN CERTIFICATE-----\nMIICrzCCAZcCFGMKRtmMLuut+sxC+TbWQfum7oXZMA0GCSqGSIb3DQEBCwUAMBQx\nEjAQBgNVBAMMCWxvY2FsaG9zdDA"
  },
  {
    "path": "tests/mutual-auth/certs/server/server.crt.1",
    "chars": 993,
    "preview": "-----BEGIN CERTIFICATE-----\nMIICrzCCAZcCFGMKRtmMLuut+sxC+TbWQfum7oXZMA0GCSqGSIb3DQEBCwUAMBQx\nEjAQBgNVBAMMCWxvY2FsaG9zdDA"
  },
  {
    "path": "tests/mutual-auth/certs/server/server.crt.2",
    "chars": 993,
    "preview": "-----BEGIN CERTIFICATE-----\nMIICrzCCAZcCFGMKRtmMLuut+sxC+TbWQfum7oXZMA0GCSqGSIb3DQEBCwUAMBQx\nEjAQBgNVBAMMCWxvY2FsaG9zdDA"
  },
  {
    "path": "tests/mutual-auth/certs/server/server.key",
    "chars": 1704,
    "preview": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCmszSj2h/Cw83G\nmUbwS6wzSZC9abpJgd+pm3M49O4"
  },
  {
    "path": "tests/mutual-auth/gen-certs.sh",
    "chars": 1240,
    "preview": "#!/bin/bash\n\n# Create server and client certificate directories\nmkdir -p certs/server\nmkdir -p certs/client\n\n# Generate "
  },
  {
    "path": "tests/payloads/simple.json",
    "chars": 39,
    "preview": "{\n    \"some\": \"payload\",\n    \"and\": 1\n}"
  },
  {
    "path": "tests/payloads/simple.key.value",
    "chars": 18,
    "preview": "some=payload\nand=1"
  },
  {
    "path": "tests/policies/README.md",
    "chars": 2728,
    "preview": "# Integration Tests for Feroxbuster\n\nThis directory contains integration tests for feroxbuster using real HTTP servers i"
  },
  {
    "path": "tests/policies/test_policies_with_deps.rs",
    "chars": 16298,
    "preview": "//! Integration tests for feroxbuster auto-bail functionality using real HTTP servers\n//!\n//! This module contains integ"
  },
  {
    "path": "tests/policy-test-words.shuffled",
    "chars": 117720,
    "preview": "HPyfiCnormalPnWnpM\ncCJiOOnormalUzGxsI\nMLhjbunormalQZhfqB\nlwbIOLnormalQvBJEu\nLWOuMrnormalMPgKXJ\nVtCRaYnormalUpzESK\nTLSmGt"
  },
  {
    "path": "tests/test_banner.rs",
    "chars": 70751,
    "preview": "mod utils;\nuse assert_cmd::cargo_bin;\nuse assert_cmd::prelude::*;\nuse predicates::prelude::*;\nuse std::process::Command;"
  },
  {
    "path": "tests/test_config.rs",
    "chars": 832,
    "preview": "mod utils;\nuse assert_cmd::cargo_bin;\nuse assert_cmd::prelude::*;\nuse httpmock::MockServer;\nuse predicates::prelude::*;\n"
  },
  {
    "path": "tests/test_deny_list.rs",
    "chars": 8375,
    "preview": "mod utils;\nuse assert_cmd::cargo_bin;\nuse assert_cmd::prelude::*;\nuse httpmock::Method::GET;\nuse httpmock::MockServer;\nu"
  },
  {
    "path": "tests/test_dynamic_semaphore.rs",
    "chars": 9568,
    "preview": "use feroxbuster::sync::DynamicSemaphore;\n/// Integration tests for DynamicSemaphore\n///\n/// These tests verify the compl"
  },
  {
    "path": "tests/test_extractor.rs",
    "chars": 23060,
    "preview": "mod utils;\nuse assert_cmd::cargo_bin;\nuse assert_cmd::prelude::*;\nuse httpmock::Method::GET;\nuse httpmock::MockServer;\nu"
  },
  {
    "path": "tests/test_filters.rs",
    "chars": 19555,
    "preview": "mod utils;\nuse assert_cmd::cargo_bin;\nuse assert_cmd::prelude::*;\nuse httpmock::Method::GET;\nuse httpmock::MockServer;\nu"
  },
  {
    "path": "tests/test_heuristics.rs",
    "chars": 16206,
    "preview": "mod utils;\nuse assert_cmd::cargo_bin;\nuse assert_cmd::prelude::*;\nuse httpmock::Method::GET;\nuse httpmock::{MockServer, "
  },
  {
    "path": "tests/test_main.rs",
    "chars": 9635,
    "preview": "mod utils;\nuse assert_cmd::cargo_bin;\nuse assert_cmd::prelude::*;\nuse httpmock::Method::GET;\nuse httpmock::{MockServer, "
  },
  {
    "path": "tests/test_parser.rs",
    "chars": 1896,
    "preview": "use assert_cmd::cargo_bin;\nuse assert_cmd::prelude::*;\nuse predicates::prelude::*;\nuse std::process::Command;\n\n#[test]\n/"
  },
  {
    "path": "tests/test_policies.rs",
    "chars": 13435,
    "preview": "mod utils;\nuse assert_cmd::cargo_bin;\nuse assert_cmd::prelude::*;\nuse httpmock::Method::GET;\nuse httpmock::MockServer;\nu"
  },
  {
    "path": "tests/test_rate_limiting.rs",
    "chars": 12133,
    "preview": "mod utils;\n\nuse assert_cmd::cargo_bin;\nuse assert_cmd::prelude::*;\nuse httpmock::prelude::*;\nuse httpmock::MockServer;\nu"
  },
  {
    "path": "tests/test_response_size_limit.rs",
    "chars": 13777,
    "preview": "mod utils;\nuse assert_cmd::cargo_bin;\nuse assert_cmd::prelude::*;\nuse httpmock::Method::GET;\nuse httpmock::MockServer;\nu"
  },
  {
    "path": "tests/test_scan_manager.rs",
    "chars": 5874,
    "preview": "mod utils;\nuse assert_cmd::cargo_bin;\nuse assert_cmd::prelude::*;\nuse httpmock::Method::GET;\nuse httpmock::MockServer;\nu"
  },
  {
    "path": "tests/test_scanner.rs",
    "chars": 27588,
    "preview": "mod utils;\nuse assert_cmd::cargo_bin;\nuse assert_cmd::prelude::*;\nuse httpmock::Method::GET;\nuse httpmock::MockServer;\nu"
  },
  {
    "path": "tests/test_unique_responses.rs",
    "chars": 2928,
    "preview": "mod utils;\nuse assert_cmd::cargo_bin;\nuse assert_cmd::prelude::*;\nuse httpmock::Method::GET;\nuse httpmock::MockServer;\nu"
  },
  {
    "path": "tests/utils/mod.rs",
    "chars": 723,
    "preview": "use std::fs::{remove_dir_all, write};\nuse std::path::PathBuf;\nuse tempfile::TempDir;\n\n/// integration test helper: creat"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the epi052/feroxbuster GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 150 files (2.3 MB), approximately 614.9k tokens, and a symbol index with 1092 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!