Full Code of gofiber/fiber for AI

main d6eb4973338e cached
382 files
3.6 MB
947.5k tokens
4208 symbols
1 requests
Download .txt
Showing preview only (3,784K chars total). Download the full file or copy to clipboard to get everything.
Repository: gofiber/fiber
Branch: main
Commit: d6eb4973338e
Files: 382
Total size: 3.6 MB

Directory structure:
gitextract_9m90gl79/

├── .cspell.json
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── .editorconfig
│   ├── .hound.yml
│   ├── CODEOWNERS
│   ├── CODE_OF_CONDUCT.md
│   ├── CONTRIBUTING.md
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.yaml
│   │   ├── config.yml
│   │   ├── feature-request.yaml
│   │   ├── maintenance-task.yaml
│   │   └── question.yaml
│   ├── README.md
│   ├── SECURITY.md
│   ├── codecov.yml
│   ├── config.yml
│   ├── copilot-instructions.md
│   ├── copilot-setup-steps.yml
│   ├── dependabot.yml
│   ├── index.html
│   ├── labeler.yml
│   ├── pull_request_template.md
│   ├── release-drafter.yml
│   ├── release.yml
│   ├── scripts/
│   │   └── sync_docs.sh
│   ├── testdata/
│   │   ├── ca-chain.cert.pem
│   │   ├── fs/
│   │   │   ├── css/
│   │   │   │   ├── style.css
│   │   │   │   └── test/
│   │   │   │       └── style2.css
│   │   │   ├── img/
│   │   │   │   ├── fiberpng
│   │   │   │   └── fiberpng.notvalidext
│   │   │   └── index.html
│   │   ├── hello_world.tmpl
│   │   ├── index.html
│   │   ├── index.tmpl
│   │   ├── main.tmpl
│   │   ├── ssl.key
│   │   ├── ssl.pem
│   │   ├── template-invalid.html
│   │   ├── template.tmpl
│   │   └── testRoutes.json
│   ├── testdata2/
│   │   └── bruh.tmpl
│   ├── testdata3/
│   │   └── hello_world.tmpl
│   └── workflows/
│       ├── auto-labeler.yml
│       ├── benchmark.yml
│       ├── codeql-analysis.yml
│       ├── dependabot_automerge.yml
│       ├── linter.yml
│       ├── manual-dependabot.yml
│       ├── markdown.yml
│       ├── modernize.yml
│       ├── move-closed-milestone-items.yml
│       ├── release-drafter.yml
│       ├── spell-check.yml
│       ├── sync-docs.yml
│       ├── test.yml
│       ├── v3-label-automation.yml
│       └── vulncheck.yml
├── .gitignore
├── .golangci.yml
├── .markdownlint.yml
├── AGENTS.md
├── LICENSE
├── Makefile
├── adapter.go
├── adapter_test.go
├── addon/
│   └── retry/
│       ├── README.md
│       ├── config.go
│       ├── config_test.go
│       ├── exponential_backoff.go
│       └── exponential_backoff_test.go
├── app.go
├── app_integration_test.go
├── app_test.go
├── bind.go
├── bind_test.go
├── binder/
│   ├── README.md
│   ├── binder.go
│   ├── binder_test.go
│   ├── cbor.go
│   ├── cbor_test.go
│   ├── cookie.go
│   ├── cookie_test.go
│   ├── form.go
│   ├── form_test.go
│   ├── header.go
│   ├── header_test.go
│   ├── json.go
│   ├── json_test.go
│   ├── mapping.go
│   ├── mapping_test.go
│   ├── msgpack.go
│   ├── msgpack_test.go
│   ├── query.go
│   ├── query_test.go
│   ├── resp_header.go
│   ├── resp_header_test.go
│   ├── uri.go
│   ├── uri_test.go
│   ├── xml.go
│   └── xml_test.go
├── client/
│   ├── README.md
│   ├── client.go
│   ├── client_test.go
│   ├── cookiejar.go
│   ├── cookiejar_test.go
│   ├── core.go
│   ├── core_test.go
│   ├── errors.go
│   ├── helper_test.go
│   ├── hooks.go
│   ├── hooks_test.go
│   ├── request.go
│   ├── request_bench_test.go
│   ├── request_test.go
│   ├── response.go
│   ├── response_test.go
│   ├── transport.go
│   └── transport_test.go
├── color.go
├── constants.go
├── ctx.go
├── ctx_interface.go
├── ctx_interface_gen.go
├── ctx_test.go
├── docs/
│   ├── addon/
│   │   ├── _category_.json
│   │   └── retry.md
│   ├── api/
│   │   ├── _category_.json
│   │   ├── app.md
│   │   ├── bind.md
│   │   ├── constants.md
│   │   ├── ctx.md
│   │   ├── fiber.md
│   │   ├── hooks.md
│   │   ├── log.md
│   │   ├── redirect.md
│   │   ├── services.md
│   │   └── state.md
│   ├── client/
│   │   ├── _category_.json
│   │   ├── examples.md
│   │   ├── hooks.md
│   │   ├── request.md
│   │   ├── response.md
│   │   └── rest.md
│   ├── extra/
│   │   ├── _category_.json
│   │   ├── benchmarks.md
│   │   ├── faq.md
│   │   ├── internal.md
│   │   └── learning-resources.md
│   ├── guide/
│   │   ├── _category_.json
│   │   ├── advance-format.md
│   │   ├── context.md
│   │   ├── error-handling.md
│   │   ├── extractors.md
│   │   ├── faster-fiber.md
│   │   ├── grouping.md
│   │   ├── reverse-proxy.md
│   │   ├── routing.md
│   │   ├── templates.md
│   │   ├── utils.md
│   │   └── validation.md
│   ├── intro.md
│   ├── middleware/
│   │   ├── _category_.json
│   │   ├── adaptor.md
│   │   ├── basicauth.md
│   │   ├── cache.md
│   │   ├── compress.md
│   │   ├── cors.md
│   │   ├── csrf.md
│   │   ├── earlydata.md
│   │   ├── encryptcookie.md
│   │   ├── envvar.md
│   │   ├── etag.md
│   │   ├── expvar.md
│   │   ├── favicon.md
│   │   ├── healthcheck.md
│   │   ├── helmet.md
│   │   ├── idempotency.md
│   │   ├── keyauth.md
│   │   ├── limiter.md
│   │   ├── logger.md
│   │   ├── paginate.md
│   │   ├── pprof.md
│   │   ├── proxy.md
│   │   ├── recover.md
│   │   ├── redirect.md
│   │   ├── requestid.md
│   │   ├── responsetime.md
│   │   ├── rewrite.md
│   │   ├── session.md
│   │   ├── skip.md
│   │   ├── static.md
│   │   └── timeout.md
│   ├── partials/
│   │   └── routing/
│   │       └── handler.md
│   └── whats_new.md
├── error.go
├── error_test.go
├── errors_internal.go
├── extractors/
│   ├── README.md
│   ├── extractors.go
│   └── extractors_test.go
├── go.mod
├── go.sum
├── group.go
├── helpers.go
├── helpers_fuzz_test.go
├── helpers_test.go
├── hooks.go
├── hooks_test.go
├── internal/
│   ├── memory/
│   │   ├── memory.go
│   │   └── memory_test.go
│   ├── storage/
│   │   └── memory/
│   │       ├── config.go
│   │       ├── memory.go
│   │       └── memory_test.go
│   └── tlstest/
│       └── tls.go
├── listen.go
├── listen_test.go
├── log/
│   ├── default.go
│   ├── default_test.go
│   ├── fiberlog.go
│   ├── fiberlog_test.go
│   └── log.go
├── middleware/
│   ├── adaptor/
│   │   ├── adaptor.go
│   │   └── adaptor_test.go
│   ├── basicauth/
│   │   ├── basicauth.go
│   │   ├── basicauth_test.go
│   │   └── config.go
│   ├── cache/
│   │   ├── cache.go
│   │   ├── cache_test.go
│   │   ├── config.go
│   │   ├── heap.go
│   │   ├── manager.go
│   │   ├── manager_msgp.go
│   │   ├── manager_msgp_test.go
│   │   └── manager_test.go
│   ├── compress/
│   │   ├── compress.go
│   │   ├── compress_test.go
│   │   └── config.go
│   ├── cors/
│   │   ├── config.go
│   │   ├── cors.go
│   │   ├── cors_test.go
│   │   ├── utils.go
│   │   └── utils_test.go
│   ├── csrf/
│   │   ├── config.go
│   │   ├── config_test.go
│   │   ├── csrf.go
│   │   ├── csrf_test.go
│   │   ├── helpers.go
│   │   ├── helpers_test.go
│   │   ├── session_manager.go
│   │   ├── storage_manager.go
│   │   ├── storage_manager_msgp.go
│   │   ├── storage_manager_msgp_test.go
│   │   └── token.go
│   ├── earlydata/
│   │   ├── config.go
│   │   ├── earlydata.go
│   │   └── earlydata_test.go
│   ├── encryptcookie/
│   │   ├── config.go
│   │   ├── config_test.go
│   │   ├── encryptcookie.go
│   │   ├── encryptcookie_test.go
│   │   └── utils.go
│   ├── envvar/
│   │   ├── config.go
│   │   ├── envvar.go
│   │   └── envvar_test.go
│   ├── etag/
│   │   ├── config.go
│   │   ├── etag.go
│   │   └── etag_test.go
│   ├── expvar/
│   │   ├── config.go
│   │   ├── expvar.go
│   │   └── expvar_test.go
│   ├── favicon/
│   │   ├── config.go
│   │   ├── favicon.go
│   │   └── favicon_test.go
│   ├── healthcheck/
│   │   ├── config.go
│   │   ├── healthcheck.go
│   │   └── healthcheck_test.go
│   ├── helmet/
│   │   ├── config.go
│   │   ├── helmet.go
│   │   └── helmet_test.go
│   ├── idempotency/
│   │   ├── config.go
│   │   ├── idempotency.go
│   │   ├── idempotency_test.go
│   │   ├── locker.go
│   │   ├── locker_test.go
│   │   ├── response.go
│   │   ├── response_msgp.go
│   │   ├── response_msgp_test.go
│   │   └── stub_test.go
│   ├── keyauth/
│   │   ├── config.go
│   │   ├── config_test.go
│   │   ├── keyauth.go
│   │   └── keyauth_test.go
│   ├── limiter/
│   │   ├── config.go
│   │   ├── limiter.go
│   │   ├── limiter_fixed.go
│   │   ├── limiter_sliding.go
│   │   ├── limiter_test.go
│   │   ├── manager.go
│   │   ├── manager_msgp.go
│   │   └── manager_msgp_test.go
│   ├── logger/
│   │   ├── config.go
│   │   ├── data.go
│   │   ├── default_logger.go
│   │   ├── errors.go
│   │   ├── format.go
│   │   ├── logger.go
│   │   ├── logger_test.go
│   │   ├── tags.go
│   │   ├── template_chain.go
│   │   └── utils.go
│   ├── paginate/
│   │   ├── config.go
│   │   ├── page_info.go
│   │   ├── paginate.go
│   │   └── paginate_test.go
│   ├── pprof/
│   │   ├── config.go
│   │   ├── pprof.go
│   │   └── pprof_test.go
│   ├── proxy/
│   │   ├── config.go
│   │   ├── proxy.go
│   │   └── proxy_test.go
│   ├── recover/
│   │   ├── config.go
│   │   ├── recover.go
│   │   └── recover_test.go
│   ├── redirect/
│   │   ├── config.go
│   │   ├── redirect.go
│   │   └── redirect_test.go
│   ├── requestid/
│   │   ├── config.go
│   │   ├── requestid.go
│   │   └── requestid_test.go
│   ├── responsetime/
│   │   ├── config.go
│   │   ├── responsetime.go
│   │   └── responsetime_test.go
│   ├── rewrite/
│   │   ├── config.go
│   │   ├── rewrite.go
│   │   └── rewrite_test.go
│   ├── session/
│   │   ├── config.go
│   │   ├── config_test.go
│   │   ├── data.go
│   │   ├── data_msgp.go
│   │   ├── data_msgp_test.go
│   │   ├── data_test.go
│   │   ├── middleware.go
│   │   ├── middleware_test.go
│   │   ├── session.go
│   │   ├── session_test.go
│   │   ├── store.go
│   │   └── store_test.go
│   ├── skip/
│   │   ├── skip.go
│   │   └── skip_test.go
│   ├── static/
│   │   ├── config.go
│   │   ├── static.go
│   │   └── static_test.go
│   └── timeout/
│       ├── config.go
│       ├── timeout.go
│       └── timeout_test.go
├── mount.go
├── mount_test.go
├── path.go
├── path_test.go
├── path_testcases_test.go
├── prefork.go
├── prefork_test.go
├── readonly.go
├── readonly_strict.go
├── redirect.go
├── redirect_msgp.go
├── redirect_msgp_test.go
├── redirect_test.go
├── register.go
├── req.go
├── req_interface_gen.go
├── res.go
├── res_interface_gen.go
├── router.go
├── router_test.go
├── services.go
├── services_test.go
├── state.go
├── state_test.go
└── storage_interface.go

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

================================================
FILE: .cspell.json
================================================
{
  "version": "0.2",
  "language": "en, en-gb, en-us",
  "useGitignore": true,
  "caseSensitive": false,
  "import": [
    "@cspell/dict-en_us/cspell-ext.json",
    "@cspell/dict-en-gb/cspell-ext.json",
    "@cspell/dict-software-terms/cspell-ext.json",
    "@cspell/dict-golang/cspell-ext.json",
    "@cspell/dict-fullstack/cspell-ext.json",
    "@cspell/dict-docker/cspell-ext.json",
    "@cspell/dict-k8s/cspell-ext.json",
    "@cspell/dict-node/cspell-ext.json",
    "@cspell/dict-npm/cspell-ext.json",
    "@cspell/dict-typescript/cspell-ext.json",
    "@cspell/dict-html/cspell-ext.json",
    "@cspell/dict-css/cspell-ext.json",
    "@cspell/dict-shell/cspell-ext.json",
    "@cspell/dict-python/cspell-ext.json",
    "@cspell/dict-redis/cspell-ext.json",
    "@cspell/dict-sql/cspell-ext.json",
    "@cspell/dict-filetypes/cspell-ext.json",
    "@cspell/dict-companies/cspell-ext.json",
    "@cspell/dict-markdown/cspell-ext.json",
    "@cspell/dict-en-common-misspellings/cspell-ext.json",
    "@cspell/dict-people-names/cspell-ext.json"
  ],
  "dictionaries": [
    "en_us",
    "en-gb",
    "softwareTerms",
    "web-services",
    "networking-terms",
    "software-term-suggestions",
    "software-services",
    "software-terms",
    "software-tools",
    "coding-compound-terms",
    "golang",
    "fullstack",
    "docker",
    "k8s",
    "node",
    "npm",
    "typescript",
    "html",
    "css",
    "shell",
    "python",
    "redis",
    "sql",
    "filetypes",
    "companies",
    "markdown",
    "en-common-misspellings",
    "people-names",
    "data-science",
    "data-science-models",
    "data-science-tools"
  ],
  "ignorePaths": [
    ".git",
    "node_modules",
    "vendor",
    "internal",
    ".github",
    "**/*.svg",
    "**/*.png",
    "**/*.jpg",
    "**/*.jpeg",
    "**/*.gif",
    "**/*.ico",
    "**/*.lock",
    "**/*_gen.go",
    "**/*_msgp.go",
    "**/*_msgp_test.go",
    "go.mod",
    "go.sum",
    ".golangci.yml",
    ".markdownlint.yml",
    "AGENTS.md"
  ]
}


================================================
FILE: .editorconfig
================================================
; This file is for unifying the coding style for different editors and IDEs.
; More information at http://editorconfig.org
; This style originates from https://github.com/fewagency/best-practices
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

[*.go]
indent_style = tab
indent_size = 4
tab_width = 4

[Makefile]
indent_style = tab

[*.{yml,yaml,json,md}]
indent_style = space
indent_size = 2


================================================
FILE: .gitattributes
================================================
# Handle line endings automatically for files detected as text
# and leave all files detected as binary untouched.
* text=auto eol=lf

# Force batch scripts to always use CRLF line endings so that if a repo is accessed
# in Windows via a file share from Linux, the scripts will work.
*.{cmd,[cC][mM][dD]} text eol=crlf
*.{bat,[bB][aA][tT]} text eol=crlf

# Force bash scripts to always use LF line endings so that if a repo is accessed
# in Unix via a file share from Windows, the scripts will work.
*.sh text eol=lf


================================================
FILE: .github/.editorconfig
================================================
; https://editorconfig.org/

root = true

[*]
insert_final_newline = true
charset = utf-8
trim_trailing_whitespace = true
indent_style = space
indent_size = 2

[{Makefile,go.mod,go.sum,*.go,.gitmodules}]
indent_style = tab
indent_size = 8

[*.md]
indent_size = 4
trim_trailing_whitespace = false

eclint_indent_style = unset

[Dockerfile]
indent_size = 4

================================================
FILE: .github/.hound.yml
================================================
golint:
  enabled: false

================================================
FILE: .github/CODEOWNERS
================================================
* @gofiber/maintainers


================================================
FILE: .github/CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our community include:

- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
- Focusing on what is best not just for us as individuals, but for the overall community

Examples of unacceptable behavior include:

- The use of sexualized language or imagery, and sexual attention or advances of any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email address, without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a professional setting

## Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at [Discord](https://gofiber.io/discord). All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

## Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

### 1. Correction

**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

### 2. Warning

**Community Impact**: A violation through a single incident or series of actions.

**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

### 3. Temporary Ban

**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.

**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

### 4. Permanent Ban

**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

**Consequence**: A permanent ban from any sort of public interaction within the community.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0,
available at [https://www.contributor-covenant.org/version/2/0/code_of_conduct.html](https://www.contributor-covenant.org/version/2/0/code_of_conduct.html).

Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity).

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq](https://www.contributor-covenant.org/faq). Translations are available at [https://www.contributor-covenant.org/translations](https://www.contributor-covenant.org/translations).


================================================
FILE: .github/CONTRIBUTING.md
================================================
# Contributing

Before making any changes to this repository, we kindly request you to initiate discussions for proposed changes that do not yet have an associated [issue](https://github.com/gofiber/fiber/issues). Please use our [Discord](https://gofiber.io/discord) server to initiate these discussions. For [issue](https://github.com/gofiber/fiber/issues) that already exist, you may proceed with discussions using our [issue](https://github.com/gofiber/fiber/issues) tracker or any other suitable method, in consultation with the repository owners. Your collaboration is greatly appreciated.

Please note: we have a [code of conduct](https://github.com/gofiber/fiber/blob/main/.github/CODE_OF_CONDUCT.md), please follow it in all your interactions with the `Fiber` project.

## Pull Requests or Commits

Titles always we must use prefix according to below:

> 🔥 Feature, ♻️ Refactor, 🩹 Fix, 🚨 Test, 📚 Doc, 🎨 Style

- 🔥 Feature: Add flow to add person
- ♻️ Refactor: Rename file X to Y
- 🩹 Fix: Improve flow
- 🚨 Test: Validate to add a new person
- 📚 Doc: Translate to Portuguese middleware redirect
- 🎨 Style: Respected pattern Golint

All pull requests that contain a feature or fix are mandatory to have unit tests. Your PR is only to be merged if you respect this flow.

## 👍 Contribute

If you want to say **thank you** and/or support the active development of `Fiber`:

1. Add a [GitHub Star](https://github.com/gofiber/fiber/stargazers) to the project.
2. Tweet about the project [on your 𝕏 (Twitter)](https://x.com/intent/tweet?text=%F0%9F%9A%80%20Fiber%20%E2%80%94%20is%20an%20Express.js%20inspired%20web%20framework%20build%20on%20Fasthttp%20for%20%23Go%20https%3A%2F%2Fgithub.com%2Fgofiber%2Ffiber).
3. Write a review or tutorial on [Medium](https://medium.com/), [Dev.to](https://dev.to/) or personal blog.
4. Support the project by donating a [cup of coffee](https://buymeacoff.ee/fenny).


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

github: [gofiber] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
custom: https://github.com/sponsors/gofiber


================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.yaml
================================================
name: "\U0001F41B Bug Report"
title: "\U0001F41B [Bug]: "
description: Create a bug report to help us fix it.
labels: ["☢️ Bug"]

body:
  - type: markdown
    id: notice
    attributes:
      value: |
        ### Notice
        **This repository is not related to external or third-part Fiber modules. If you have a problem with them, open an issue under their repos. If you think the problem is related to Fiber, open the issue here.**
        - Don't forget you can ask your questions in our [Discord server](https://gofiber.io/discord).
        - If you have a suggestion for a Fiber feature you would like to see, open the issue with the **✏️ Feature Request** template.
        - Write your issue with clear and understandable English.
  - type: textarea
    id: description
    attributes:
      label: "Bug Description"
      description: "A clear and detailed description of what the bug is."
      placeholder: "Explain your problem clearly and in detail."
    validations:
      required: true
  - type: textarea
    id: how-to-reproduce
    attributes:
      label: How to Reproduce
      description: "Steps to reproduce the behavior and what should be observed in the end."
      placeholder: "Tell us step by step how we can replicate your problem and what we should see in the end."
      value: |
          Steps to reproduce the behavior:
          1. Go to '....'
          2. Click on '....'
          3. Do '....'
          4. See '....'
    validations:
      required: true
  - type: textarea
    id: expected-behavior
    attributes:
      label: Expected Behavior
      description: "A clear and detailed description of what you think should happen."
      placeholder: "Tell us what Fiber should normally do."
    validations:
      required: true
  - type: input
    id: version
    attributes:
      label: "Fiber Version"
      description: "Some bugs may be fixed in future Fiber releases, so we have to know your Fiber version."
      placeholder: "Write your Fiber version. (v2.33.0, v2.34.1...)"
    validations:
      required: true
  - type: textarea
    id: snippet
    attributes:
      label: "Code Snippet (optional)"
      description: "For some issues, we need to know some parts of your code."
      placeholder: "Share a code snippet that you think is related to the issue."
      render: go
      value: |
        package main

        import "github.com/gofiber/fiber/v3"
        import "log"

        func main() {
          app := fiber.New()

          // Steps to reproduce

          log.Fatal(app.Listen(":3000"))
        }
  - type: checkboxes
    id: terms
    attributes:
      label: "Checklist:"
      description: "By submitting this issue, you confirm that:"
      options:
        - label: "I agree to follow Fiber's [Code of Conduct](https://github.com/gofiber/fiber/blob/main/.github/CODE_OF_CONDUCT.md)."
          required: true
        - label: "I have checked for existing issues that describe my problem prior to opening this one."
          required: true
        - label: "I understand that improperly formatted bug reports may be closed without explanation."
          required: true


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false


================================================
FILE: .github/ISSUE_TEMPLATE/feature-request.yaml
================================================
name: "📝 Feature Proposal"
title: "📝 [Proposal]: "
description: Propose a feature or improvement for Fiber.
labels: ["📝 Proposal", "✏️ Feature", "v3"]

body:
  - type: markdown
    id: notice
    attributes:
      value: |
        ### Notice
        - For questions, join our [Discord server](https://gofiber.io/discord).
        - Please write in clear, understandable English.
        - Ensure your proposal aligns with Express design principles and HTTP RFC standards.
        - Describe features expected to remain stable and not require changes in the foreseeable future.
  - type: textarea
    id: description
    attributes:
      label: "Feature Proposal Description"
      description: "A clear and detailed description of the feature you are proposing for Fiber v3. How should it work, and what API endpoints and methods would it involve?"
      placeholder: "Describe your feature proposal clearly and in detail, including API endpoints and methods."
    validations:
      required: true

  - type: textarea
    id: express-alignment
    attributes:
      label: "Alignment with Express API"
      description: "Explain how your proposal aligns with the design and API of Express.js. Provide comparative examples if possible."
      placeholder: "Outline how the feature aligns with Express.js design principles and API standards."
    validations:
      required: true

  - type: textarea
    id: standards-compliance
    attributes:
      label: "HTTP RFC Standards Compliance"
      description: "Confirm that the feature complies with HTTP RFC standards, and describe any relevant aspects."
      placeholder: "Detail how the feature adheres to HTTP RFC standards."
    validations:
      required: true
  - type: textarea
    id: stability
    attributes:
      label: "API Stability"
      description: "Discuss the expected stability of the feature and its API. How do you ensure that it will not require changes or deprecations in the near future?"
      placeholder: "Describe measures taken to ensure the feature's API stability over time."
    validations:
      required: true

  - type: textarea
    id: examples
    attributes:
      label: "Feature Examples"
      description: "Provide concrete examples and code snippets to illustrate how the proposed feature should function."
      placeholder: "Share code snippets that exemplify the proposed feature and its usage."
      render: go
    validations:
      required: true

  - type: checkboxes
    id: terms
    attributes:
      label: "Checklist:"
      description: "By submitting this issue, you confirm that:"
      options:
        - label: "I agree to follow Fiber's [Code of Conduct](https://github.com/gofiber/fiber/blob/main/.github/CODE_OF_CONDUCT.md)."
          required: true
        - label: "I have searched for existing issues that describe my proposal before opening this one."
          required: true
        - label: "I understand that a proposal that does not meet these guidelines may be closed without explanation."
          required: true


================================================
FILE: .github/ISSUE_TEMPLATE/maintenance-task.yaml
================================================
name: "🧹 Maintenance Task"
title: "🧹 [Maintenance]: "
description: Describe a maintenance task for the v3 of the Fiber project.
labels: ["🧹 Updates", "v3"]

body:
  - type: markdown
    id: notice
    attributes:
      value: |
        ### Notice
        - Before submitting a maintenance task, please check if a similar task has already been filed.
        - Clearly outline the purpose of the maintenance task and its impact on the project.
        - Use clear and understandable English.
  - type: textarea
    id: task-description
    attributes:
      label: "Maintenance Task Description"
      description: "Provide a detailed description of the maintenance task. Include any specific areas of the codebase that require attention, and the desired outcomes of this task."
      placeholder: "Detail the maintenance task, specifying what needs to be done and why it is necessary."
    validations:
      required: true

  - type: textarea
    id: impact
    attributes:
      label: "Impact on the Project"
      description: "Explain the impact this maintenance will have on the project. Include benefits and potential risks if applicable."
      placeholder: "Describe how completing this task will benefit the project, or the risks of not addressing it."
    validations:
      required: false

  - type: textarea
    id: additional-context
    attributes:
      label: "Additional Context (optional)"
      description: "Any additional information or context regarding the maintenance task that might be helpful."
      placeholder: "Provide any additional information that may be relevant to the task at hand."
    validations:
      required: false

  - type: checkboxes
    id: terms
    attributes:
      label: "Checklist:"
      description: "Please confirm the following:"
      options:
        - label: "I have confirmed that this maintenance task is currently not being addressed."
          required: true
        - label: "I understand that this task will be evaluated by the maintainers and prioritized accordingly."
          required: true
        - label: "I am available to provide further information if needed."
          required: true


================================================
FILE: .github/ISSUE_TEMPLATE/question.yaml
================================================
name: "🤔 Question"
title: "\U0001F917 [Question]: "
description: Ask a question so we can help you easily.
labels: ["🤔 Question"]

body:
  - type: markdown
    id: notice
    attributes:
      value: |
        ### Notice
        - Don't forget you can ask your questions in our [Discord server](https://gofiber.io/discord).
        - If you think this is just a bug, open the issue with the **☢️ Bug Report** template.
        - If you have a suggestion for a Fiber feature you would like to see, open the issue with the **✏️ Feature Request** template.
        - Write your issue with clear and understandable English.
  - type: textarea
    id: description
    attributes:
      label: "Question Description"
      description: "A clear and detailed description of the question."
      placeholder: "Explain your question clearly, and in detail."
    validations:
      required: true
  - type: textarea
    id: snippet
    attributes:
      label: "Code Snippet (optional)"
      description: "Code snippet may be really helpful to describe some features."
      placeholder: "Share a code snippet to explain the feature better."
      render: go
      value: |
        package main

        import "github.com/gofiber/fiber/v3"
        import "log"

        func main() {
          app := fiber.New()

          // An example to describe the question

          log.Fatal(app.Listen(":3000"))
        }
  - type: checkboxes
    id: terms
    attributes:
      label: "Checklist:"
      description: "By submitting this issue, you confirm that:"
      options:
        - label: "I agree to follow Fiber's [Code of Conduct](https://github.com/gofiber/fiber/blob/main/.github/CODE_OF_CONDUCT.md)."
          required: true
        - label: "I have checked for existing issues that describe my questions prior to opening this one."
          required: true
        - label: "I understand that improperly formatted questions may be closed without explanation."
          required: true


================================================
FILE: .github/README.md
================================================
<h1 align="center">
  <a href="https://gofiber.io">
    <picture>
      <source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/v3/logo-dark.svg">
      <img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/v3/logo.svg">
    </picture>
  </a>
  <br>
  <a href="https://pkg.go.dev/github.com/gofiber/fiber/v3#pkg-overview">
    <img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
  </a>
  <a href="https://goreportcard.com/report/github.com/gofiber/fiber/v3">
    <img src="https://img.shields.io/badge/%F0%9F%93%9D%20goreport-A%2B-75C46B?style=flat-square">
  </a>
  <a href="https://codecov.io/gh/gofiber/fiber" >
   <img alt="Codecov" src="https://img.shields.io/codecov/c/github/gofiber/fiber?token=3Cr92CwaPQ&style=flat-square&logo=codecov&label=codecov">
 </a>
  <a href="https://github.com/gofiber/fiber/actions?query=workflow%3ATest">
    <img src="https://img.shields.io/github/actions/workflow/status/gofiber/fiber/test.yml?branch=main&label=%F0%9F%A7%AA%20tests&style=flat-square&color=75C46B">
  </a>
    <a href="https://docs.gofiber.io">
    <img src="https://img.shields.io/badge/%F0%9F%92%A1%20fiber-docs-00ACD7.svg?style=flat-square">
  </a>
  <a href="https://gofiber.io/discord">
    <img src="https://img.shields.io/discord/704680098577514527?style=flat-square&label=%F0%9F%92%AC%20discord&color=00ACD7">
  </a>
</h1>
<p align="center">
  <em><b>Fiber</b> is an <a href="https://github.com/expressjs/express">Express</a> inspired <b>web framework</b> built on top of <a href="https://github.com/valyala/fasthttp">Fasthttp</a>, the <b>fastest</b> HTTP engine for <a href="https://go.dev/doc/">Go</a>. Designed to <b>ease</b> things up for <b>fast</b> development with <a href="https://docs.gofiber.io/#zero-allocation"><b>zero memory allocation</b></a> and <b>performance</b> in mind.</em>
</p>

---

## ⚙️ Installation

Fiber requires **Go version `1.25` or higher** to run. If you need to install or upgrade Go, visit the [official Go download page](https://go.dev/dl/). To start setting up your project, create a new directory for your project and navigate into it. Then, initialize your project with Go modules by executing the following command in your terminal:

```bash
go mod init github.com/your/repo
```

To learn more about Go modules and how they work, you can check out the [Using Go Modules](https://go.dev/blog/using-go-modules) blog post.

After setting up your project, you can install Fiber with the `go get` command:

```bash
go get -u github.com/gofiber/fiber/v3
```

This command fetches the Fiber package and adds it to your project's dependencies, allowing you to start building your web applications with Fiber.

## ⚡️ Quickstart

Getting started with Fiber is easy. Here's a basic example to create a simple web server that responds with "Hello, World 👋!" on the root path. This example demonstrates initializing a new Fiber app, setting up a route, and starting the server.

```go title="Example"
package main

import (
    "log"

    "github.com/gofiber/fiber/v3"
)

func main() {
    // Initialize a new Fiber app
    app := fiber.New()

    // Define a route for the GET method on the root path '/'
    app.Get("/", func(c fiber.Ctx) error {
        // Send a string response to the client
        return c.SendString("Hello, World 👋!")
    })

    // Start the server on port 3000
    log.Fatal(app.Listen(":3000"))
}
```

This simple server is easy to set up and run. It introduces the core concepts of Fiber: app initialization, route definition, and starting the server. Just run this Go program, and visit `http://localhost:3000` in your browser to see the message.

## Zero Allocation

Fiber is optimized for **high-performance**, meaning values returned from **fiber.Ctx** are **not** immutable by default and **will** be re-used across requests. As a rule of thumb, you **must** only use context values within the handler and **must not** keep any references. Once you return from the handler, any values obtained from the context will be re-used in future requests. Visit our [documentation](https://docs.gofiber.io/#zero-allocation) to learn more.

## 🤖 Benchmarks

These tests are performed by [TechEmpower](https://www.techempower.com/benchmarks/#section=data-r19&hw=ph&test=plaintext). If you want to see all the results, please visit our [Wiki](https://docs.gofiber.io/extra/benchmarks).

<p float="left" align="middle">
  <img src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/v3/plaintext.png" width="49%">
  <img src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/v3/json.png" width="49%">
</p>

## 🎯 Features

- Robust [Routing](https://docs.gofiber.io/guide/routing)
- Serve [Static Files](https://docs.gofiber.io/api/app#static)
- Extreme [Performance](https://docs.gofiber.io/extra/benchmarks)
- [Low Memory](https://docs.gofiber.io/extra/benchmarks) footprint
- [API Endpoints](https://docs.gofiber.io/api/ctx)
- [Middleware](https://docs.gofiber.io/category/-middleware) & [Next](https://docs.gofiber.io/api/ctx#next) support
- [Rapid](https://dev.to/koddr/welcome-to-fiber-an-express-js-styled-fastest-web-framework-written-with-on-golang-497) server-side programming
- [Template Engines](https://github.com/gofiber/template)
- [WebSocket Support](https://github.com/gofiber/contrib/tree/main/websocket)
- [Socket.io Support](https://github.com/gofiber/contrib/tree/main/socketio)
- [Server-Sent Events](https://github.com/gofiber/recipes/tree/master/sse)
- [Rate Limiter](https://docs.gofiber.io/api/middleware/limiter)
- And much more, [explore Fiber](https://docs.gofiber.io/)

## 💡 Philosophy

New gophers that make the switch from [Node.js](https://nodejs.org/en/about/) to [Go](https://go.dev/doc/) are dealing with a learning curve before they can start building their web applications or microservices. Fiber, as a **web framework**, was created with the idea of **minimalism** and follows the **UNIX way**, so that new gophers can quickly enter the world of Go with a warm and trusted welcome.

Fiber is **inspired** by Express, the most popular web framework on the Internet. We combined the **ease** of Express and **raw performance** of Go. If you have ever implemented a web application in Node.js (_using Express or similar_), then many methods and principles will seem **very common** to you.

We **listen** to our users in [issues](https://github.com/gofiber/fiber/issues), Discord [channel](https://gofiber.io/discord) _and all over the Internet_ to create a **fast**, **flexible** and **friendly** Go web framework for **any** task, **deadline** and developer **skill**! Just like Express does in the JavaScript world.

## ⚠️ Limitations

- Due to Fiber's usage of unsafe, the library may not always be compatible with the latest Go version. Fiber v3 has been tested with Go version 1.25 or higher.
- Fiber automatically adapts common `net/http` handler shapes when you register them on the router, and you can still use the [adaptor middleware](https://docs.gofiber.io/next/middleware/adaptor/) when you need to bridge entire apps or `net/http` middleware.

### net/http compatibility

Fiber can run side by side with the standard library. The router accepts existing `net/http` handlers directly and even works with native `fasthttp.RequestHandler` callbacks, so you can plug in legacy endpoints without wrapping them manually:

```go
package main

import (
    "log"
    "net/http"

    "github.com/gofiber/fiber/v3"
)

func main() {
    httpHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        if _, err := w.Write([]byte("served by net/http")); err != nil {
            panic(err)
        }
    })

    app := fiber.New()
    app.Get("/", httpHandler)

    // Start the server on port 3000
    log.Fatal(app.Listen(":3000"))
}
```

When you need to convert entire applications or re-use `net/http` middleware chains, rely on the [adaptor middleware](https://docs.gofiber.io/next/middleware/adaptor/). It converts handlers and middlewares in both directions and even lets you mount a Fiber app in a `net/http` server.

### Express-style handlers

Fiber also adapts Express-style callbacks that operate on the lightweight `fiber.Req` and `fiber.Res` helper interfaces. This lets you port middleware and route handlers from Express-inspired codebases while keeping Fiber's router features:

```go
// Request/response handlers (2-argument)
app.Get("/", func(req fiber.Req, res fiber.Res) error {
    return res.SendString("Hello from Express-style handlers!")
})

// Middleware with an error-returning next callback (3-argument)
app.Use(func(req fiber.Req, res fiber.Res, next func() error) error {
    if req.IP() == "192.168.1.254" {
        return res.SendStatus(fiber.StatusForbidden)
    }
    return next()
})

// Middleware with a no-arg next callback (3-argument)
app.Use(func(req fiber.Req, res fiber.Res, next func()) {
    if req.Get("X-Skip") == "true" {
        return // stop the chain without calling next
    }
    next()
})
```

> **Note:** Adapted `net/http` handlers continue to operate with the standard-library semantics. They don't get access to `fiber.Ctx` features and incur the overhead of the compatibility layer, so native `fiber.Handler` callbacks still provide the best performance.

## 👀 Examples

Listed below are some of the common examples. If you want to see more code examples, please visit our [Recipes repository](https://github.com/gofiber/recipes) or visit our hosted [API documentation](https://docs.gofiber.io).

### 📖 [**Basic Routing**](https://docs.gofiber.io/#basic-routing)

```go title="Example"
package main

import (
    "fmt"
    "log"

    "github.com/gofiber/fiber/v3"
)

func main() {
    app := fiber.New()

    // GET /api/register
    app.Get("/api/*", func(c fiber.Ctx) error {
        msg := fmt.Sprintf("✋ %s", c.Params("*"))
        return c.SendString(msg) // => ✋ register
    })

    // GET /flights/LAX-SFO
    app.Get("/flights/:from-:to", func(c fiber.Ctx) error {
        msg := fmt.Sprintf("💸 From: %s, To: %s", c.Params("from"), c.Params("to"))
        return c.SendString(msg) // => 💸 From: LAX, To: SFO
    })

    // GET /dictionary.txt
    app.Get("/:file.:ext", func(c fiber.Ctx) error {
        msg := fmt.Sprintf("📃 %s.%s", c.Params("file"), c.Params("ext"))
        return c.SendString(msg) // => 📃 dictionary.txt
    })

    // GET /john/75
    app.Get("/:name/:age/:gender?", func(c fiber.Ctx) error {
        msg := fmt.Sprintf("👴 %s is %s years old", c.Params("name"), c.Params("age"))
        return c.SendString(msg) // => 👴 john is 75 years old
    })

    // GET /john
    app.Get("/:name", func(c fiber.Ctx) error {
        msg := fmt.Sprintf("Hello, %s 👋!", c.Params("name"))
        return c.SendString(msg) // => Hello john 👋!
    })

    log.Fatal(app.Listen(":3000"))
}
```

#### 📖 [**Route Naming**](https://docs.gofiber.io/api/app#name)

```go title="Example"
package main

import (
    "encoding/json"
    "fmt"
    "log"

    "github.com/gofiber/fiber/v3"
)

func main() {
    app := fiber.New()

    app.Get("/api/*", func(c fiber.Ctx) error {
        msg := fmt.Sprintf("✋ %s", c.Params("*"))
        return c.SendString(msg) // => ✋ register
    }).Name("api")

    route := app.GetRoute("api")

    data, _ := json.MarshalIndent(route, "", "  ")
    fmt.Println(string(data))
    // Prints:
    // {
    //    "method": "GET",
    //    "name": "api",
    //    "path": "/api/*",
    //    "params": [
    //      "*1"
    //    ]
    // }

    log.Fatal(app.Listen(":3000"))
}
```

#### 📖 [**Serving Static Files**](https://docs.gofiber.io/api/app#static)

```go title="Example"
package main

import (
    "log"

    "github.com/gofiber/fiber/v3"
    "github.com/gofiber/fiber/v3/middleware/static"
)

func main() {
    app := fiber.New()

    // Serve static files from the "./public" directory
    app.Get("/*", static.New("./public"))
    // => http://localhost:3000/js/script.js
    // => http://localhost:3000/css/style.css

    app.Get("/prefix*", static.New("./public"))
    // => http://localhost:3000/prefix/js/script.js
    // => http://localhost:3000/prefix/css/style.css

    // Serve a single file for any unmatched routes
    app.Get("*", static.New("./public/index.html"))
    // => http://localhost:3000/any/path/shows/index.html

    log.Fatal(app.Listen(":3000"))
}
```

#### 📖 [**Middleware & Next**](https://docs.gofiber.io/api/ctx#next)

```go title="Example"
package main

import (
    "fmt"
    "log"

    "github.com/gofiber/fiber/v3"
)

func main() {
    app := fiber.New()

    // Middleware that matches any route
    app.Use(func(c fiber.Ctx) error {
        fmt.Println("🥇 First handler")
        return c.Next()
    })

    // Middleware that matches all routes starting with /api
    app.Use("/api", func(c fiber.Ctx) error {
        fmt.Println("🥈 Second handler")
        return c.Next()
    })

    // GET /api/list
    app.Get("/api/list", func(c fiber.Ctx) error {
        fmt.Println("🥉 Last handler")
        return c.SendString("Hello, World 👋!")
    })

    log.Fatal(app.Listen(":3000"))
}
```

<details>
  <summary>📚 Show more code examples</summary>

### Views Engines

📖 [Config](https://docs.gofiber.io/api/fiber#config)
📖 [Engines](https://github.com/gofiber/template)
📖 [Render](https://docs.gofiber.io/api/ctx#render)

Fiber defaults to the [html/template](https://pkg.go.dev/html/template/) when no view engine is set.

If you want to execute partials or use a different engine like [amber](https://github.com/eknkc/amber), [handlebars](https://github.com/aymerick/raymond), [mustache](https://github.com/cbroglie/mustache), or [pug](https://github.com/Joker/jade), etc., check out our [Template](https://github.com/gofiber/template) package that supports multiple view engines.

```go title="Example"
package main

import (
    "log"

    "github.com/gofiber/fiber/v3"
    "github.com/gofiber/template/pug"
)

func main() {
    // Initialize a new Fiber app with Pug template engine
    app := fiber.New(fiber.Config{
        Views: pug.New("./views", ".pug"),
    })

    // Define a route that renders the "home.pug" template
    app.Get("/", func(c fiber.Ctx) error {
        return c.Render("home", fiber.Map{
            "title": "Homepage",
            "year":  1999,
        })
    })

    log.Fatal(app.Listen(":3000"))
}
```

### Grouping Routes into Chains

📖 [Group](https://docs.gofiber.io/api/app#group)

```go title="Example"
package main

import (
    "log"

    "github.com/gofiber/fiber/v3"
)

func middleware(c fiber.Ctx) error {
    log.Println("Middleware executed")
    return c.Next()
}

func handler(c fiber.Ctx) error {
    return c.SendString("Handler response")
}

func main() {
    app := fiber.New()

    // Root API group with middleware
    api := app.Group("/api", middleware) // /api

    // API v1 routes
    v1 := api.Group("/v1", middleware) // /api/v1
    v1.Get("/list", handler)           // /api/v1/list
    v1.Get("/user", handler)           // /api/v1/user

    // API v2 routes
    v2 := api.Group("/v2", middleware) // /api/v2
    v2.Get("/list", handler)           // /api/v2/list
    v2.Get("/user", handler)           // /api/v2/user

    log.Fatal(app.Listen(":3000"))
}
```

### Middleware Logger

📖 [Logger](https://docs.gofiber.io/api/middleware/logger)

```go title="Example"
package main

import (
    "log"

    "github.com/gofiber/fiber/v3"
    "github.com/gofiber/fiber/v3/middleware/logger"
)

func main() {
    app := fiber.New()

    // Use Logger middleware
    app.Use(logger.New())

    // Define routes
    app.Get("/", func(c fiber.Ctx) error {
        return c.SendString("Hello, Logger!")
    })

    log.Fatal(app.Listen(":3000"))
}
```

### Cross-Origin Resource Sharing (CORS)

📖 [CORS](https://docs.gofiber.io/api/middleware/cors)

```go title="Example"
package main

import (
    "log"

    "github.com/gofiber/fiber/v3"
    "github.com/gofiber/fiber/v3/middleware/cors"
)

func main() {
    app := fiber.New()

    // Use CORS middleware with default settings
    app.Use(cors.New())

    // Define routes
    app.Get("/", func(c fiber.Ctx) error {
        return c.SendString("CORS enabled!")
    })

    log.Fatal(app.Listen(":3000"))
}
```

Check CORS by passing any domain in `Origin` header:

```bash
curl -H "Origin: http://example.com" --verbose http://localhost:3000
```

### Custom 404 Response

📖 [HTTP Methods](https://docs.gofiber.io/api/ctx#status)

```go title="Example"
package main

import (
    "log"

    "github.com/gofiber/fiber/v3"
)

func main() {
    app := fiber.New()

    // Define routes
    app.Get("/", static.New("./public"))

    app.Get("/demo", func(c fiber.Ctx) error {
        return c.SendString("This is a demo page!")
    })

    app.Post("/register", func(c fiber.Ctx) error {
        return c.SendString("Registration successful!")
    })

    // Middleware to handle 404 Not Found
    app.Use(func(c fiber.Ctx) error {
        return c.SendStatus(fiber.StatusNotFound) // => 404 "Not Found"
    })

    log.Fatal(app.Listen(":3000"))
}
```

### JSON Response

📖 [JSON](https://docs.gofiber.io/api/ctx#json)

```go title="Example"
package main

import (
    "log"

    "github.com/gofiber/fiber/v3"
)

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    app := fiber.New()

    // Route that returns a JSON object
    app.Get("/user", func(c fiber.Ctx) error {
        return c.JSON(&User{"John", 20})
        // => {"name":"John", "age":20}
    })

    // Route that returns a JSON map
    app.Get("/json", func(c fiber.Ctx) error {
        return c.JSON(fiber.Map{
            "success": true,
            "message": "Hi John!",
        })
        // => {"success":true, "message":"Hi John!"}
    })

    log.Fatal(app.Listen(":3000"))
}
```

### WebSocket Upgrade

📖 [Websocket](https://github.com/gofiber/websocket)

```go title="Example"
package main

import (
    "log"

    "github.com/gofiber/fiber/v3"
    "github.com/gofiber/fiber/v3/middleware/websocket"
)

func main() {
    app := fiber.New()

    // WebSocket route
    app.Get("/ws", websocket.New(func(c *websocket.Conn) {
        defer c.Close()
        for {
            // Read message from client
            mt, msg, err := c.ReadMessage()
            if err != nil {
                log.Println("read:", err)
                break
            }
            log.Printf("recv: %s", msg)

            // Write message back to client
            err = c.WriteMessage(mt, msg)
            if err != nil {
                log.Println("write:", err)
                break
            }
        }
    }))

    log.Fatal(app.Listen(":3000"))
    // Connect via WebSocket at ws://localhost:3000/ws
}
```

### Server-Sent Events

📖 [More Info](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)

```go title="Example"
package main

import (
    "bufio"
    "fmt"
    "log"
    "time"

    "github.com/gofiber/fiber/v3"
    "github.com/valyala/fasthttp"
)

func main() {
    app := fiber.New()

    // Server-Sent Events route
    app.Get("/sse", func(c fiber.Ctx) error {
        c.Set("Content-Type", "text/event-stream")
        c.Set("Cache-Control", "no-cache")
        c.Set("Connection", "keep-alive")
        c.Set("Transfer-Encoding", "chunked")

        c.Context().SetBodyStreamWriter(func(w *bufio.Writer) {
            var i int
            for {
                i++
                msg := fmt.Sprintf("%d - the time is %v", i, time.Now())
                fmt.Fprintf(w, "data: Message: %s\n\n", msg)
                fmt.Println(msg)

                w.Flush()
                time.Sleep(5 * time.Second)
            }
        })

        return nil
    })

    log.Fatal(app.Listen(":3000"))
}
```

### Recover Middleware

📖 [Recover](https://docs.gofiber.io/api/middleware/recover)

```go title="Example"
package main

import (
    "log"

    "github.com/gofiber/fiber/v3"
    "github.com/gofiber/fiber/v3/middleware/recover"
)

func main() {
    app := fiber.New()

    // Use Recover middleware to handle panics gracefully
    app.Use(recover.New())

    // Route that intentionally panics
    app.Get("/", func(c fiber.Ctx) error {
        panic("normally this would crash your app")
    })

    log.Fatal(app.Listen(":3000"))
}
```

### Using Trusted Proxy

📖 [Config](https://docs.gofiber.io/api/fiber#config)

```go title="Example"
package main

import (
    "log"

    "github.com/gofiber/fiber/v3"
)

func main() {
    app := fiber.New(fiber.Config{
        // Configure trusted proxies - WARNING: Only trust proxies you control
        // Using TrustProxy: true with unrestricted IPs can lead to IP spoofing
        TrustProxy: true,
        TrustProxyConfig: fiber.TrustProxyConfig{
            Proxies: []string{"10.0.0.0/8", "172.16.0.0/12"}, // Example: Internal network ranges only
        },
        ProxyHeader: fiber.HeaderXForwardedFor,
    })

    // Define routes
    app.Get("/", func(c fiber.Ctx) error {
        return c.SendString("Trusted Proxy Configured!")
    })

    log.Fatal(app.Listen(":3000"))
}
```

</details>

## 🧬 Internal Middleware

Here is a list of middleware that are included within the Fiber framework.

| Middleware                                                                           | Description                                                                                                                                                             |
|--------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [adaptor](https://github.com/gofiber/fiber/tree/main/middleware/adaptor)             | Converter for net/http handlers to/from Fiber request handlers.                                                                                                         |
| [basicauth](https://github.com/gofiber/fiber/tree/main/middleware/basicauth)         | Provides HTTP basic authentication. It calls the next handler for valid credentials and 401 Unauthorized for missing or invalid credentials.                            |
| [cache](https://github.com/gofiber/fiber/tree/main/middleware/cache)                 | Intercept and cache HTTP responses.                                                                                                                                     |
| [compress](https://github.com/gofiber/fiber/tree/main/middleware/compress)           | Compression middleware for Fiber, with support for `deflate`, `gzip`, `brotli` and `zstd`.                                                                             |
| [cors](https://github.com/gofiber/fiber/tree/main/middleware/cors)                   | Enable cross-origin resource sharing (CORS) with various options.                                                                                                       |
| [csrf](https://github.com/gofiber/fiber/tree/main/middleware/csrf)                   | Protect from CSRF exploits.                                                                                                                                             |
| [earlydata](https://github.com/gofiber/fiber/tree/main/middleware/earlydata)         | Adds support for TLS 1.3's early data ("0-RTT") feature.                                                                                                                |
| [encryptcookie](https://github.com/gofiber/fiber/tree/main/middleware/encryptcookie) | Encrypt middleware which encrypts cookie values.                                                                                                                        |
| [envvar](https://github.com/gofiber/fiber/tree/main/middleware/envvar)               | Expose environment variables with providing an optional config.                                                                                                         |
| [etag](https://github.com/gofiber/fiber/tree/main/middleware/etag)                   | Allows for caches to be more efficient and save bandwidth, as a web server does not need to resend a full response if the content has not changed.                      |
| [expvar](https://github.com/gofiber/fiber/tree/main/middleware/expvar)               | Serves via its HTTP server runtime exposed variables in the JSON format.                                                                                                 |
| [favicon](https://github.com/gofiber/fiber/tree/main/middleware/favicon)             | Ignore favicon from logs or serve from memory if a file path is provided.                                                                                               |
| [healthcheck](https://github.com/gofiber/fiber/tree/main/middleware/healthcheck)     | Liveness and Readiness probes for Fiber.                                                                                                                                |
| [helmet](https://github.com/gofiber/fiber/tree/main/middleware/helmet)               | Helps secure your apps by setting various HTTP headers.                                                                                                                 |
| [idempotency](https://github.com/gofiber/fiber/tree/main/middleware/idempotency)     | Allows for fault-tolerant APIs where duplicate requests do not erroneously cause the same action performed multiple times on the server-side.                           |
| [keyauth](https://github.com/gofiber/fiber/tree/main/middleware/keyauth)             | Adds support for key based authentication.                                                                                                                              |
| [limiter](https://github.com/gofiber/fiber/tree/main/middleware/limiter)             | Adds Rate-limiting support to Fiber. Use to limit repeated requests to public APIs and/or endpoints such as password reset.                                             |
| [logger](https://github.com/gofiber/fiber/tree/main/middleware/logger)               | HTTP request/response logger.                                                                                                                                           |
| [paginate](https://github.com/gofiber/fiber/tree/main/middleware/paginate)           | Extracts pagination parameters from query strings. Supports page-based, offset-based, and cursor-based pagination with multi-field sorting.                             |
| [pprof](https://github.com/gofiber/fiber/tree/main/middleware/pprof)                 | Serves runtime profiling data in pprof format.                                                                                                                          |
| [proxy](https://github.com/gofiber/fiber/tree/main/middleware/proxy)                 | Allows you to proxy requests to multiple servers.                                                                                                                       |
| [recover](https://github.com/gofiber/fiber/tree/main/middleware/recover)             | Recovers from panics anywhere in the stack chain and handles the control to the centralized ErrorHandler.                                                               |
| [redirect](https://github.com/gofiber/fiber/tree/main/middleware/redirect)           | Redirect middleware.                                                                                                                                                    |
| [requestid](https://github.com/gofiber/fiber/tree/main/middleware/requestid)         | Adds a request ID to every request.                                                                                                                                     |
| [responsetime](https://github.com/gofiber/fiber/tree/main/middleware/responsetime)   | Measures request handling duration and writes it to a configurable response header.                          |
| [rewrite](https://github.com/gofiber/fiber/tree/main/middleware/rewrite)             | Rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links.                        |
| [session](https://github.com/gofiber/fiber/tree/main/middleware/session)             | Session middleware. NOTE: This middleware uses our Storage package.                                                                                                     |
| [skip](https://github.com/gofiber/fiber/tree/main/middleware/skip)                   | Skip middleware that skips a wrapped handler if a predicate is true.                                                                                                    |
| [static](https://github.com/gofiber/fiber/tree/main/middleware/static)               | Static middleware for Fiber that serves static files such as **images**, **CSS**, and **JavaScript**.                                                                    |
| [timeout](https://github.com/gofiber/fiber/tree/main/middleware/timeout)             | Adds a max time for a request and forwards to ErrorHandler if it is exceeded.                                                                                           |

## 🧬 External Middleware

List of externally hosted middleware modules and maintained by the [Fiber team](https://github.com/orgs/gofiber/people).

| Middleware                                        | Description                                                                                                           |
| :------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------- |
| [contrib](https://github.com/gofiber/contrib)   | Third-party middlewares                                                                                               |
| [storage](https://github.com/gofiber/storage)   | Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares.     |
| [template](https://github.com/gofiber/template) | This package contains 9 template engines that can be used with Fiber.      |

## 🕶️ Awesome List

For more articles, middlewares, examples, or tools, check our [awesome list](https://github.com/gofiber/awesome-fiber).

## 👍 Contribute

If you want to say **Thank You** and/or support the active development of `Fiber`:

1. Add a [GitHub Star](https://github.com/gofiber/fiber/stargazers) to the project.
2. Tweet about the project [on your 𝕏 (Twitter)](https://x.com/intent/tweet?text=Fiber%20is%20an%20Express%20inspired%20%23web%20%23framework%20built%20on%20top%20of%20Fasthttp%2C%20the%20fastest%20HTTP%20engine%20for%20%23Go.%20Designed%20to%20ease%20things%20up%20for%20%23fast%20development%20with%20zero%20memory%20allocation%20and%20%23performance%20in%20mind%20%F0%9F%9A%80%20https%3A%2F%2Fgithub.com%2Fgofiber%2Ffiber).
3. Write a review or tutorial on [Medium](https://medium.com/), [Dev.to](https://dev.to/) or your personal blog.
4. Support the project by donating a [cup of coffee](https://buymeacoff.ee/fenny).

## 💻 Development

To ensure your contributions are ready for a Pull Request, please use the following `Makefile` commands. These tools help maintain code quality and consistency.

- **make help**: Display available commands.
- **make audit**: Conduct quality checks.
- **make benchmark**: Benchmark code performance.
- **make coverage**: Generate test coverage report.
- **make format**: Automatically format code.
- **make lint**: Run lint checks.
- **make test**: Execute all tests.
- **make tidy**: Tidy dependencies.

Run these commands to ensure your code adheres to project standards and best practices.

## ☕ Supporters

Fiber is an open-source project that runs on donations to pay the bills, e.g., our domain name, GitBook, Netlify, and serverless hosting. If you want to support Fiber, you can ☕ [**buy a coffee here**](https://buymeacoff.ee/fenny).

|                                                            | User                                             | Donation |
| ---------------------------------------------------------- | ------------------------------------------------ | -------- |
| ![](https://avatars.githubusercontent.com/u/204341?s=25)   | [@destari](https://github.com/destari)           | ☕ x 10   |
| ![](https://avatars.githubusercontent.com/u/63164982?s=25) | [@dembygenesis](https://github.com/dembygenesis) | ☕ x 5    |
| <img src="https://avatars.githubusercontent.com/u/56607882?s=25" alt="thomasvvugt" style="width: 25px; height: 25px;"> | [@thomasvvugt](https://github.com/thomasvvugt)   | ☕ x 5    |
| ![](https://avatars.githubusercontent.com/u/27820675?s=25) | [@hendratommy](https://github.com/hendratommy)   | ☕ x 5    |
| ![](https://avatars.githubusercontent.com/u/1094221?s=25)  | [@ekaputra07](https://github.com/ekaputra07)     | ☕ x 5    |
| ![](https://avatars.githubusercontent.com/u/194590?s=25)   | [@jorgefuertes](https://github.com/jorgefuertes) | ☕ x 5    |
| ![](https://avatars.githubusercontent.com/u/186637?s=25)   | [@candidosales](https://github.com/candidosales) | ☕ x 5    |
| ![](https://avatars.githubusercontent.com/u/29659953?s=25) | [@l0nax](https://github.com/l0nax)               | ☕ x 3    |
| ![](https://avatars.githubusercontent.com/u/635852?s=25)   | [@bihe](https://github.com/bihe)                 | ☕ x 3    |
| ![](https://avatars.githubusercontent.com/u/307334?s=25)   | [@justdave](https://github.com/justdave)         | ☕ x 3    |
| ![](https://avatars.githubusercontent.com/u/11155743?s=25) | [@koddr](https://github.com/koddr)               | ☕ x 1    |
| ![](https://avatars.githubusercontent.com/u/29042462?s=25) | [@lapolinar](https://github.com/lapolinar)       | ☕ x 1    |
| ![](https://avatars.githubusercontent.com/u/2978730?s=25)  | [@diegowifi](https://github.com/diegowifi)       | ☕ x 1   |
| ![](https://avatars.githubusercontent.com/u/44171355?s=25) | [@ssimk0](https://github.com/ssimk0)             | ☕ x 1   |
| ![](https://avatars.githubusercontent.com/u/5638101?s=25)  | [@raymayemir](https://github.com/raymayemir)     | ☕ x 1   |
| ![](https://avatars.githubusercontent.com/u/619996?s=25)   | [@melkorm](https://github.com/melkorm)           | ☕ x 1   |
| ![](https://avatars.githubusercontent.com/u/31022056?s=25) | [@marvinjwendt](https://github.com/marvinjwendt) | ☕ x 1   |
| ![](https://avatars.githubusercontent.com/u/31921460?s=25) | [@toishy](https://github.com/toishy)             | ☕ x 1   |

## 💻 Code Contributors

<img src="https://opencollective.com/fiber/contributors.svg?width=890&button=false" alt="Code Contributors" style="max-width:100%;">

## ⭐️ Stargazers

<picture>
  <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=gofiber/fiber&type=Date&theme=dark" />
  <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=gofiber/fiber&type=Date" />
  <img src="https://api.star-history.com/svg?repos=gofiber/fiber&type=Date" />
</picture>

## 🧾 License

Copyright (c) 2019-present [Fenny](https://github.com/fenny) and [Contributors](https://github.com/gofiber/fiber/graphs/contributors). `Fiber` is free and open-source software licensed under the [MIT License](https://github.com/gofiber/fiber/blob/main/LICENSE). Official logo was created by [Vic Shóstak](https://github.com/koddr) and distributed under [Creative Commons](https://creativecommons.org/licenses/by-sa/4.0/) license (CC BY-SA 4.0 International).


================================================
FILE: .github/SECURITY.md
================================================
# Security Policy

1. [Supported Versions](#versions)
2. [Reporting security problems to Fiber](#reporting)
3. [Security Points of Contact](#contact)
4. [Incident Response Process](#process)

<a name="versions"></a>

## Supported Versions

The table below shows the supported versions for Fiber which include security updates.

| Version   | Supported          |
| --------- | ------------------ |
| >= 1.12.6 | :white_check_mark: |
| < 1.12.6  | :x:                |

<a name="reporting"></a>

## Reporting security problems to Fiber

**DO NOT CREATE AN ISSUE** to report a security problem. Instead, please
send us an e-mail at `team@gofiber.io` or join our discord server via
[this invite link](https://gofiber.io/discord) and send a private message
to any of the maintainers.

<a name="contact"></a>

## Security Points of Contact

For security-related matters, please contact any of the
[@maintainers](https://github.com/orgs/gofiber/teams/maintainers).

The maintainers are the only persons with administrative access to Fiber's source code
and respond to security incident reports as fast as possible, within one business day
at the latest.

<a name="process"></a>

## Incident Response Process

In case an incident is discovered or reported, we will follow the following
process to contain, respond and remediate:

### 1. Containment

The first step is to find out the root cause, nature and scope of the incident.

- Is still ongoing? If yes, first priority is to stop it.
- Is the incident outside of our influence? If yes, first priority is to contain it.
- Find out knows about the incident and who is affected.
- Find out what data was potentially exposed.

### 2. Response

After the initial assessment and containment to our best abilities, we will
document all actions taken in a response plan.

We will create a comment in the official `#announcements` channel to inform users about
the incident and what actions we took to contain it.

### 3. Remediation

Once the incident is confirmed to be resolved, we will summarize the lessons
learned from the incident and create a list of actions we will take to prevent
it from happening again.

### Secure accounts with access

The [Fiber Organization](https://github.com/gofiber) requires 2FA authorization
for all of it's members.

### Critical Updates And Security Notices

We learn about critical software updates and security threats from these sources

1. GitHub Security Alerts
2. GitHub: [https://status.github.com/](https://status.github.com/) & [@githubstatus](https://twitter.com/githubstatus)


================================================
FILE: .github/codecov.yml
================================================
coverage:
  status:
    project:
      default:
        target: auto
        threshold: 0.5%
        base: auto
    patch:
      default:
        target: auto
        threshold: 0.5%
        base: auto
ignore:
  # Ignore generated root files
  - "*_msgp.go"
  - "*_msgp_test.go"
  - "*_gen.go"
  # Ignore generated files below root
  - "**/*_msgp.go"
  - "**/*_msgp_test.go"
  - "**/*_gen.go"
  # Ignore internal and docs
  - "internal/**"
  - "docs/**"


================================================
FILE: .github/config.yml
================================================
# Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome
# Comment to be posted to on first time issues
newIssueWelcomeComment: >
  Thanks for opening your first issue here! 🎉 Be sure to follow the issue template!
  If you need help or want to chat with us, join us on Discord https://gofiber.io/discord

# Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome
# Comment to be posted to on PRs from first time contributors in your repository
newPRWelcomeComment: >
  Thanks for opening this pull request! 🎉 Please check out our contributing guidelines.
  If you need help or want to chat with us, join us on Discord https://gofiber.io/discord

# Configuration for first-pr-merge - https://github.com/behaviorbot/first-pr-merge
# Comment to be posted to on pull requests merged by a first time user
firstPRMergeComment: >
  Congrats on merging your first pull request! 🎉 We here at Fiber are proud of you!
  If you need help or want to chat with us, join us on Discord https://gofiber.io/discord


================================================
FILE: .github/copilot-instructions.md
================================================
# Copilot Usage

When modifying code, always perform these steps:

1. **Ensure code quality**
   - `make format` to format the project.
   - `make lint` for static analysis.
   - `make test` to run the test suite.

2. **Maintain documentation**
   Review and update the contents of the `docs` folder if necessary.

3. **Check Markdown**
   - Finish by running `make markdown` to lint all Markdown files.


================================================
FILE: .github/copilot-setup-steps.yml
================================================
steps:
  - run: |
      if [ -d vendor ] || go list -m -mod=readonly all; then
        echo "Dependencies already present"
      else
        go mod tidy && go mod download && go mod vendor
      fi
  - run: |
      go install gotest.tools/gotestsum@latest
      go install golang.org/x/vuln/cmd/govulncheck@latest
      go install mvdan.cc/gofumpt@latest
      go install github.com/tinylib/msgp@latest
      go install github.com/vburenin/ifacemaker@975a95966976eeb2d4365a7fb236e274c54da64c
      go install github.com/dkorunic/betteralign/cmd/betteralign@latest
  - run: go mod tidy


================================================
FILE: .github/dependabot.yml
================================================
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates

version: 2
updates:
  - package-ecosystem: "gomod"
    directory: "/" # Location of package manifests
    labels:
      - "🤖 Dependencies"
    schedule:
      interval: "daily"
    allow:
      # Allow both direct and indirect updates for all packages.
      - dependency-type: "all"
    groups:
      fasthttp-modules:
          patterns:
              - "github.com/valyala/fasthttp"
              - "github.com/valyala/fasthttp/**"
      golang-modules:
          patterns:
              - "golang.org/x/**"
      valyala-utils-modules:
          patterns:
              - "github.com/valyala/bytebufferpool"
              - "github.com/valyala/tcplisten"
      google-modules:
          patterns:
              - "github.com/google/**"
              - "google.golang.org/**"
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule: 
      interval: daily
    labels: 
     - "🤖 Dependencies"


================================================
FILE: .github/index.html
================================================
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Test file</title>
</head>

<body>
  Hello, World!
</body>

</html>

================================================
FILE: .github/labeler.yml
================================================
_extends: .github
labels:
  - label: 'v3'
    matcher:
      baseBranch: 'main'
      title: '/(v3)/i'
      body: '/(v3)/i'
  - label: 'v2'
    matcher:
      baseBranch: 'v2'
      title: '/(v2)/i'




================================================
FILE: .github/pull_request_template.md
================================================
# Description

Please provide a clear and concise description of the changes you've made and the problem they address. Include the purpose of the change, any relevant issues it solves, and the benefits it brings to the project. If this change introduces new features or adjustments, highlight them here.

Fixes # (issue)

## Changes introduced

List the new features or adjustments introduced in this pull request. Provide details on benchmarks, documentation updates, changelog entries, and if applicable, the migration guide.

- [ ] Benchmarks: Describe any performance benchmarks and improvements related to the changes.
- [ ] Documentation Update: Detail the updates made to the documentation and links to the changed files.
- [ ] Changelog/What's New: Include a summary of the additions for the upcoming release notes.
- [ ] Migration Guide: If necessary, provide a guide or steps for users to migrate their existing code to accommodate these changes.
- [ ] API Alignment with Express: Explain how the changes align with the Express API.
- [ ] API Longevity: Discuss the steps taken to ensure that the new or updated APIs are consistent and not prone to breaking changes.
- [ ] Examples: Provide examples demonstrating the new features or changes in action.

## Type of change

Please delete options that are not relevant.

- [ ] New feature (non-breaking change which adds functionality)
- [ ] Enhancement (improvement to existing features and functionality)
- [ ] Documentation update (changes to documentation)
- [ ] Performance improvement (non-breaking change which improves efficiency)
- [ ] Code consistency (non-breaking change which improves code reliability and robustness)

## Checklist

Before you submit your pull request, please make sure you meet these requirements:

- [ ] Followed the inspiration of the Express.js framework for new functionalities, making them similar in usage.
- [ ] Conducted a self-review of the code and provided comments for complex or critical parts.
- [ ] Updated the documentation in the `/docs/` directory for [Fiber's documentation](https://docs.gofiber.io/).
- [ ] Added or updated unit tests to validate the effectiveness of the changes or new features.
- [ ] Ensured that new and existing unit tests pass locally with the changes.
- [ ] Verified that any new dependencies are essential and have been agreed upon by the maintainers/community.
- [ ] Aimed for optimal performance with minimal allocations in the new code.
- [ ] Provided benchmarks for the new code to analyze and improve upon.

## Commit formatting

Please use emojis in commit messages for an easy way to identify the purpose or intention of a commit. Check out the emoji cheatsheet here: [CONTRIBUTING.md](https://github.com/gofiber/fiber/blob/main/.github/CONTRIBUTING.md#pull-requests-or-commits)


================================================
FILE: .github/release-drafter.yml
================================================
name-template: 'v$RESOLVED_VERSION'
tag-template: 'v$RESOLVED_VERSION'
commitish: main
filter-by-commitish: true
include-labels:
  - 'v3'
exclude-labels:
  - 'v2'
categories:
  - title: '❗ Breaking Changes'
    labels:
      - '❗ BreakingChange'
  - title: '🚀 New'
    labels:
      - '✏️ Feature'
      - '📝 Proposal'
  - title: '🧹 Updates'
    labels:
      - '🧹 Updates'
      - '⚡️ Performance'
  - title: '🐛 Fixes'
    labels:
      - '☢️ Bug'
  - title: '🛠️ Maintenance'
    labels:
      - '🤖 Dependencies'
  - title: '📚 Documentation'
    labels:
      - '📒 Documentation'
change-template: '- $TITLE (#$NUMBER)'
change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks.
exclude-contributors:
  - dependabot
  - dependabot[bot]
version-resolver:
  major:
    labels:
      - '❗ BreakingChange'
  minor:
    labels:
      - '✏️ Feature'
  patch:
    labels:
      - '📒 Documentation'
      - '☢️ Bug'
      - '🤖 Dependencies'
      - '🧹 Updates'
      - '⚡️ Performance'
  default: patch
template: |
    $CHANGES

    **📒 Documentation**: https://docs.gofiber.io/next/

    **💬 Discord**: https://gofiber.io/discord

    **Full Changelog**: https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...v$RESOLVED_VERSION

    Thank you $CONTRIBUTORS for making this release possible.


================================================
FILE: .github/release.yml
================================================
# .github/release.yml

changelog:
  categories:
    - title: '❗ Breaking Changes'
      labels:
        - '❗ BreakingChange'
    - title: '🚀 New Features'
      labels:
        - '✏️ Feature'
        - '📝 Proposal'
    - title: '🧹 Updates'
      labels:
        - '🧹 Updates'
        - '⚡️ Performance'
    - title: '🐛 Bug Fixes'
      labels:
        - '☢️ Bug'
    - title: '🛠️ Maintenance'
      labels:
        - '🤖 Dependencies'
    - title: '📚 Documentation'
      labels:
        - '📒 Documentation'
    - title: 'Other Changes'
      labels:
        - '*'


================================================
FILE: .github/scripts/sync_docs.sh
================================================
#!/usr/bin/env bash
set -e

# Some env variables
BRANCH="main"
REPO_URL="github.com/gofiber/docs.git"
AUTHOR_EMAIL="github-actions[bot]@users.noreply.github.com"
AUTHOR_USERNAME="github-actions[bot]"
VERSION_FILE="versions.json"
REPO_DIR="core"
COMMIT_URL="https://github.com/gofiber/fiber"
DOCUSAURUS_COMMAND="npm run docusaurus -- docs:version"

# Set commit author
git config --global user.email "${AUTHOR_EMAIL}"
git config --global user.name "${AUTHOR_USERNAME}"

git clone https://${TOKEN}@${REPO_URL} fiber-docs

# Handle push event
if [ "$EVENT" == "push" ]; then
  latest_commit=$(git rev-parse --short HEAD)
  #log_output=$(git log --oneline ${BRANCH} HEAD~1..HEAD --name-status -- docs/)
  #if [[ $log_output != "" ]]; then
    cp -a docs/* fiber-docs/docs/${REPO_DIR}
  #fi

# Handle release event
elif [ "$EVENT" == "release" ]; then
  major_version="${TAG_NAME%%.*}"
  echo "Major version: $major_version"

  # Form new version name
  new_version="${major_version}.x"
  echo "New version: $new_version"

  cd fiber-docs/ || true
  npm ci

  # Check if contrib_versions.json exists and modify it if required
  if [[ -f $VERSION_FILE ]]; then
    echo "Modifying version file: $VERSION_FILE"
    jq --arg new_version "$new_version" 'del(.[] | select(. == $new_version))' $VERSION_FILE > temp.json && mv temp.json $VERSION_FILE
  fi

  # Run docusaurus versioning command
  $DOCUSAURUS_COMMAND "${new_version}"

  if [[ -f $VERSION_FILE ]]; then
    echo "Sorting version file: $VERSION_FILE"
    jq 'sort | reverse' ${VERSION_FILE} > temp.json && mv temp.json ${VERSION_FILE}
  fi
fi

# Push changes
cd fiber-docs/ || true
git add .
if [[ $EVENT == "push" ]]; then
  git commit -m "Add docs from ${COMMIT_URL}/commit/${latest_commit}"
elif [[ $EVENT == "release" ]]; then
  git commit -m "Sync docs for release ${COMMIT_URL}/releases/tag/${TAG_NAME}"
fi

MAX_RETRIES=5
DELAY=5
retry=0

while ((retry < MAX_RETRIES)); do
  git push https://${TOKEN}@${REPO_URL} && break
  retry=$((retry + 1))
  git pull --rebase
  sleep $DELAY
done

if ((retry == MAX_RETRIES)); then
  echo "Failed to push after $MAX_RETRIES attempts. Exiting with 1."
  exit 1
fi


================================================
FILE: .github/testdata/ca-chain.cert.pem
================================================
-----BEGIN CERTIFICATE-----
MIIFeTCCA2GgAwIBAgIDEAISMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNVBAYTAlVT
MQ8wDQYDVQQIDAZEZW5pYWwxFDASBgNVBAcMC1NwcmluZ2ZpZWxkMQwwCgYDVQQK
DANEaXMxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0yMjAyMDgyMDA3MjlaFw0zMjAy
MDYyMDA3MjlaMEAxCzAJBgNVBAYTAlVTMQ8wDQYDVQQIDAZEZW5pYWwxDDAKBgNV
BAoMA0RpczESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEFAAOC
Ag8AMIICCgKCAgEA5Cho0kbBDi1cy8bURStc95hK2RzjBQMd2hN5gFxZdF5knBfC
LSiPMxtAn9zJYzYc9+Cq7hIOK19cgG4yKk9GFZaUe+mU4yWxRg1ViSu/jzQ04sVc
JRSbSklXY1RNyxpUtGelxnluUvdvuXXlCPmKob4IsUtI1FTcumG1mzIO+cAzBd1J
KQtNTUO9XfSHYusV/FQO2hIbaXcFgSAg50JJfYZaUw51J07j3vdb6lb1x4rRmIaq
8txrdHo0Y2tXHsq6jry1QrOZfoz4WbYcoID3JU1MC5f1HyR5uYiCA1RJVGnQ3iSX
3yM+gRy3SFPeaASs2useSzGkMr/pDlbcSVmsbXsasBxZq85T1FE8vuY6K4XlU2sN
PyiPrNjDgVkQ8Lbj1B9oKEYKkmSieBx9YwRLarfru1kt+g3kdXuel7DyHpm+j/13
vqjyF9DAyx4wAEZC+DzeqBsbuiDdRkzwFMcKPxYpgSTLawnCjlFapPvE5kGN+O/j
To2qWbWUU/upzBvHu4tnICSapJJ0VqA+7M7yaBAsIWK/yjNTzpHfx0oHudl8wBOG
ySfOE52uouFsp2vs06YpEg2nGn/7Iu0Rbbwt4iFcSZlEnSk0cQlyMZxdj3M2fMKa
/nrRQm7guPbVmBJOFHZuTTiilNSduSsDwCjJkGdJkSVYbj3+eJzKwYstnT8CAwEA
AaNmMGQwHQYDVR0OBBYEFHwli1hTCVJLHPTHWW8O8BCaHci9MB8GA1UdIwQYMBaA
FDlb/7rpDA2ZzsLZmqbW/krUtmGOMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0P
AQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBtMxa2/w6kGF9cmqpTdQ1La8nY
R4Zoewnn+SCmcSOwCyBC32g0Ry6nKKUpJBpJEid5lBzWveIw4K7pdWvmuqmeMuWI
ilvlCLzqYPigmnEIW96hc6XiQvl9NC5j+SAZSC+4uCNhEUx5pEbE1FU1gIX+szdJ
tLdPwwg63Ce/us6QZ7Tx8qLIr+XU+DrCgjIheQFShtoNYDw0GxEtjeo8vHynj8EZ
+p0OZgqoNlnRbQbllruDFPXDJVI23DVhNpJhT86iQDMtMV53ypMu62LXmdQIKa7l
ITnEMGO626RKqw2kDHt7yinBlt1nHskaeeLya6K/08uJkqRCjzOshJgsjQ3e62vQ
Mht9QvGBCAoY09fIGxRihtTWCFDe7MEnbh1PPYB7cZTOMnL3wxRPzLLYhclX+pt0
bBf7Dn84b3tdC5BFXBJeZMs5QSCvn4yrTew+NvvX3oL6Ny1JDZYaG5PhKf00J6iy
TkXzK2n9U9RX+krPk8fU9Ae1nayD0vrmGaVcBdRQPn4XUuS3LhdlkHfr28z1nF9m
ffd0WBrJlNX9SoKtsMj8VJFZ/nJ0EcCcY1mG3k/IGAY1HUeo4A+C5E/UO3h4+tOL
uqUa8rkl9HoE4fIWdQVxtQjEdATSuJusaK7CFpWH8A0w9VchDx74saiwwGhVyXYk
yBwSA5U88ymkQ7qNJg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFnTCCA4WgAwIBAgIUQnfvDIm6z+973AYRTLorZHEQA30wDQYJKoZIhvcNAQEL
BQAwVjELMAkGA1UEBhMCVVMxDzANBgNVBAgMBkRlbmlhbDEUMBIGA1UEBwwLU3By
aW5nZmllbGQxDDAKBgNVBAoMA0RpczESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIy
MDIwODIwMDcyOVoXDTQyMDIwMzIwMDcyOVowVjELMAkGA1UEBhMCVVMxDzANBgNV
BAgMBkRlbmlhbDEUMBIGA1UEBwwLU3ByaW5nZmllbGQxDDAKBgNVBAoMA0RpczES
MBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC
AgEA+Cf/fKPvI5+Nh81wpxghLrpAjM1MyhdHUDXc8bu7NTNYZ+6ArMqDeKSszTWT
gLV9EeJs57KwjwXIoYZDTcLvpjanrZ2s7JDEqsGl7S6Xr67qzYghlF/GaB3f3lAi
GsvhmDgC4jkdCvkVBKOB4tE0dy6fnNCmIKhhJDje51p90LWFuX5sIKO2trgte6b/
P1PW8rOjedPd5Z+QCG4Mi8JnbJicX1YaOySGMcXHm/eM2wy5I3pEdUreZDFbjB7l
CKa1kFAnDXBiQAoErggMlcXe6C+avB13wYCfi+R+9m2X0svmerSz+oHDCOhvnD52
EE7fBv89VS6pR8mykz1eHiBKkVT1qdmONThUQ8mqwxlo06bZyoykKSxG6ffJnGbM
GkTWlaNEdZuY0pITQLxEX2SwLJuZKfTPFheno83bLCqTOTuWo7h1mLe0ogJMxl//
NHzyoMJ0b1bbrRgsLcMaDn1MsI+gVdRY89+cZ2uedEgrr7fl3KFWiF2S57bxX1fJ
P8HC0bzMny4jMtIf6YUqDtpGDPjZq3PGqcrcO0dVYkuaC96H3xLcvQxgkMDK0sm0
pUbWlECzAag/lxeeC22VnedqgCpiq/9z1b4j884ZkhIJyht0HR7L4I0gO/R/mWUY
8bO9XCMYmP0CjO7u93IlzQ7aSIpWprTHxjpiPelmcO001jkCAwEAAaNjMGEwHQYD
VR0OBBYEFDlb/7rpDA2ZzsLZmqbW/krUtmGOMB8GA1UdIwQYMBaAFDlb/7rpDA2Z
zsLZmqbW/krUtmGOMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0G
CSqGSIb3DQEBCwUAA4ICAQDk02Tu0ypqnS897WBx98l2nYIrEhcrJg8ZMmSwEa9J
7TANofzsP9931YoQMh6BI6hB3OkyL6FYTUDykpGMMasojtL/F2iXEsjema2ilZ/7
hNAZ+j5mBemMwXfkfmRguXvnl7EWaZETgEoxhcOTYoYUYqDcyzuwK63fOs+YA5ke
O8E3F1aLHzLpqVpiG7t740L7LdibNPko9JOd31Gqcq3nhXMf6/rOdL8VSj/F+4BG
opgJBruJV9NxWRI/b0G6eImvaYL/Ljfd8wzwNpmYkNkHbhAiaHeXJQ05mebmr2Dr
wne9QeSJkXCs/K5A/8+0CYNN4homt8xNNN02SnJ5e6nv1A1ntMW9n6n2KYo87tz9
VmqWXg7Y1BqXj287WRaWPJsBa2RBP1W2d3BQfHKJfu15blyXaczTi87WayEsBnQq
TXy+1QP0IwQerSTOxdW25UoJmH18SRbLEIQs9Htvcpz2AncTYjeiLFa15FO2r5hP
LYc9QOKn6yIZP9lYztleEqOLTmHnRnFcupDol+/x88d+kVLqmXDiKmWbVIz7C735
xgImsyrCPPYYiEA7/yaP5G1o5XU93kRPrtg/7jjyF+uBZ70fcbED3prpuiJYrL0O
gvQUgmGUU30mPHjAKkEACeRXtoqucRDxvIkBb5zUvZG8RmSFae5siAWwLD7D7VJa
IA==
-----END CERTIFICATE-----


================================================
FILE: .github/testdata/fs/css/style.css
================================================
h1 {
    color: red;
    text-align: center;
}

================================================
FILE: .github/testdata/fs/css/test/style2.css
================================================
h1 {
  color: black;
}


================================================
FILE: .github/testdata/fs/index.html
================================================
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="/css/style.css">
    <title>Document</title>
</head>
<body>
    <img src="/img/fiber.png" alt="">
    <h1>Hello, World!</h1>
</body>
</html>

================================================
FILE: .github/testdata/hello_world.tmpl
================================================
<h1>Hello {{ .Name }}!</h1>

================================================
FILE: .github/testdata/index.html
================================================
<p>Hello, Fiber!</p>

================================================
FILE: .github/testdata/index.tmpl
================================================
<h1>{{.Title}}</h1>

================================================
FILE: .github/testdata/main.tmpl
================================================
<h1>I'm main</h1>

================================================
FILE: .github/testdata/ssl.key
================================================
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD4IQusAs8PJdnG
3mURt/AXtgC+ceqLOatJ49JJE1VPTkMAy+oE1f1XvkMrYsHqmDf6GWVzgVXryL4U
wq2/nJSm56ddhN55nI8oSN3dtywUB8/ShelEN73nlN77PeD9tl6NksPwWaKrqxq0
FlabRPZSQCfmgZbhDV8Sa8mfCkFU0G0lit6kLGceCKMvmW+9Bz7ebsYmVdmVMxmf
IJStFD44lWFTdUc65WISKEdW2ELcUefb0zOLw+0PCbXFGJH5x5ktksW8+BBk2Hkg
GeQRL/qPCccthbScO0VgNj3zJ3ZZL0ObSDAbvNDG85joeNjDNq5DT/BAZ0bOSbEF
sh+f9BAzAgMBAAECggEBAJWv2cq7Jw6MVwSRxYca38xuD6TUNBopgBvjREixURW2
sNUaLuMb9Omp7fuOaE2N5rcJ+xnjPGIxh/oeN5MQctz9gwn3zf6vY+15h97pUb4D
uGvYPRDaT8YVGS+X9NMZ4ZCmqW2lpWzKnCFoGHcy8yZLbcaxBsRdvKzwOYGoPiFb
K2QuhXZ/1UPmqK9i2DFKtj40X6vBszTNboFxOVpXrPu0FJwLVSDf2hSZ4fMM0DH3
YqwKcYf5te+hxGKgrqRA3tn0NCWii0in6QIwXMC+kMw1ebg/tZKqyDLMNptAK8J+
DVw9m5X1seUHS5ehU/g2jrQrtK5WYn7MrFK4lBzlRwECgYEA/d1TeANYECDWRRDk
B0aaRZs87Rwl/J9PsvbsKvtU/bX+OfSOUjOa9iQBqn0LmU8GqusEET/QVUfocVwV
Bggf/5qDLxz100Rj0ags/yE/kNr0Bb31kkkKHFMnCT06YasR7qKllwrAlPJvQv9x
IzBKq+T/Dx08Wep9bCRSFhzRCnsCgYEA+jdeZXTDr/Vz+D2B3nAw1frqYFfGnEVY
wqmoK3VXMDkGuxsloO2rN+SyiUo3JNiQNPDub/t7175GH5pmKtZOlftePANsUjBj
wZ1D0rI5Bxu/71ibIUYIRVmXsTEQkh/ozoh3jXCZ9+bLgYiYx7789IUZZSokFQ3D
FICUT9KJ36kCgYAGoq9Y1rWJjmIrYfqj2guUQC+CfxbbGIrrwZqAsRsSmpwvhZ3m
tiSZxG0quKQB+NfSxdvQW5ulbwC7Xc3K35F+i9pb8+TVBdeaFkw+yu6vaZmxQLrX
fQM/pEjD7A7HmMIaO7QaU5SfEAsqdCTP56Y8AftMuNXn/8IRfo2KuGwaWwKBgFpU
ILzJoVdlad9E/Rw7LjYhZfkv1uBVXIyxyKcfrkEXZSmozDXDdxsvcZCEfVHM6Ipk
K/+7LuMcqp4AFEAEq8wTOdq6daFaHLkpt/FZK6M4TlruhtpFOPkoNc3e45eM83OT
6mziKINJC1CQ6m65sQHpBtjxlKMRG8rL/D6wx9s5AoGBAMRlqNPMwglT3hvDmsAt
9Lf9pdmhERUlHhD8bj8mDaBj2Aqv7f6VRJaYZqP403pKKQexuqcn80mtjkSAPFkN
Cj7BVt/RXm5uoxDTnfi26RF9F6yNDEJ7UU9+peBr99aazF/fTgW/1GcMkQnum8uV
c257YgaWmjK9uB0Y2r2VxS0G
-----END PRIVATE KEY-----

================================================
FILE: .github/testdata/ssl.pem
================================================
-----BEGIN CERTIFICATE-----
MIICujCCAaKgAwIBAgIJAMbXnKZ/cikUMA0GCSqGSIb3DQEBCwUAMBUxEzARBgNV
BAMTCnVidW50dS5uYW4wHhcNMTUwMjA0MDgwMTM5WhcNMjUwMjAxMDgwMTM5WjAV
MRMwEQYDVQQDEwp1YnVudHUubmFuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEA+CELrALPDyXZxt5lEbfwF7YAvnHqizmrSePSSRNVT05DAMvqBNX9V75D
K2LB6pg3+hllc4FV68i+FMKtv5yUpuenXYTeeZyPKEjd3bcsFAfP0oXpRDe955Te
+z3g/bZejZLD8Fmiq6satBZWm0T2UkAn5oGW4Q1fEmvJnwpBVNBtJYrepCxnHgij
L5lvvQc+3m7GJlXZlTMZnyCUrRQ+OJVhU3VHOuViEihHVthC3FHn29Mzi8PtDwm1
xRiR+ceZLZLFvPgQZNh5IBnkES/6jwnHLYW0nDtFYDY98yd2WS9Dm0gwG7zQxvOY
6HjYwzauQ0/wQGdGzkmxBbIfn/QQMwIDAQABow0wCzAJBgNVHRMEAjAAMA0GCSqG
SIb3DQEBCwUAA4IBAQBQjKm/4KN/iTgXbLTL3i7zaxYXFLXsnT1tF+ay4VA8aj98
L3JwRTciZ3A5iy/W4VSCt3eASwOaPWHKqDBB5RTtL73LoAqsWmO3APOGQAbixcQ2
45GXi05OKeyiYRi1Nvq7Unv9jUkRDHUYVPZVSAjCpsXzPhFkmZoTRxmx5l0ZF7Li
K91lI5h+eFq0dwZwrmlPambyh1vQUi70VHv8DNToVU29kel7YLbxGbuqETfhrcy6
X+Mha6RYITkAn5FqsZcKMsc9eYGEF4l3XV+oS7q6xfTxktYJMFTI18J0lQ2Lv/CI
whdMnYGntDQBE/iFCrJEGNsKGc38796GBOb5j+zd
-----END CERTIFICATE-----

================================================
FILE: .github/testdata/template-invalid.html
================================================
<h1>{{.Title}</h1>


================================================
FILE: .github/testdata/template.tmpl
================================================
<h1>{{.Title}} {{.Summary}}</h1>

================================================
FILE: .github/testdata/testRoutes.json
================================================
{
  "test_routes": [{
      "method": "GET",
      "path": "/authorizations"
    },
    {
      "method": "GET",
      "path": "/authorizations/1337"
    },
    {
      "method": "POST",
      "path": "/authorizations"
    },
    {
      "method": "PUT",
      "path": "/authorizations/clients/inf1nd873nf8912g9t"
    },
    {
      "method": "PATCH",
      "path": "/authorizations/1337"
    },
    {
      "method": "DELETE",
      "path": "/authorizations/1337"
    },
    {
      "method": "GET",
      "path": "/applications/2nds981mng6azl127y/tokens/sn108hbe1geheibf13f"
    },
    {
      "method": "DELETE",
      "path": "/applications/2nds981mng6azl127y/tokens"
    },
    {
      "method": "DELETE",
      "path": "/applications/2nds981mng6azl127y/tokens/sn108hbe1geheibf13f"
    },
    {
      "method": "GET",
      "path": "/events"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/events"
    },
    {
      "method": "GET",
      "path": "/networks/fenny/fiber/events"
    },
    {
      "method": "GET",
      "path": "/orgs/gofiber/events"
    },
    {
      "method": "GET",
      "path": "/users/fenny/received_events"
    },
    {
      "method": "GET",
      "path": "/users/fenny/received_events/public"
    },
    {
      "method": "GET",
      "path": "/users/fenny/events"
    },
    {
      "method": "GET",
      "path": "/users/fenny/events/public"
    },
    {
      "method": "GET",
      "path": "/users/fenny/events/orgs/gofiber"
    },
    {
      "method": "GET",
      "path": "/feeds"
    },
    {
      "method": "GET",
      "path": "/notifications"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/notifications"
    },
    {
      "method": "PUT",
      "path": "/notifications"
    },
    {
      "method": "PUT",
      "path": "/repos/fenny/fiber/notifications"
    },
    {
      "method": "GET",
      "path": "/notifications/threads/1337"
    },
    {
      "method": "PATCH",
      "path": "/notifications/threads/1337"
    },
    {
      "method": "GET",
      "path": "/notifications/threads/1337/subscription"
    },
    {
      "method": "PUT",
      "path": "/notifications/threads/1337/subscription"
    },
    {
      "method": "DELETE",
      "path": "/notifications/threads/1337/subscription"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/stargazers"
    },
    {
      "method": "GET",
      "path": "/users/fenny/starred"
    },
    {
      "method": "GET",
      "path": "/user/starred"
    },
    {
      "method": "GET",
      "path": "/user/starred/fenny/fiber"
    },
    {
      "method": "PUT",
      "path": "/user/starred/fenny/fiber"
    },
    {
      "method": "DELETE",
      "path": "/user/starred/fenny/fiber"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/subscribers"
    },
    {
      "method": "GET",
      "path": "/users/fenny/subscriptions"
    },
    {
      "method": "GET",
      "path": "/user/subscriptions"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/subscription"
    },
    {
      "method": "PUT",
      "path": "/repos/fenny/fiber/subscription"
    },
    {
      "method": "DELETE",
      "path": "/repos/fenny/fiber/subscription"
    },
    {
      "method": "GET",
      "path": "/user/subscriptions/fenny/fiber"
    },
    {
      "method": "PUT",
      "path": "/user/subscriptions/fenny/fiber"
    },
    {
      "method": "DELETE",
      "path": "/user/subscriptions/fenny/fiber"
    },
    {
      "method": "GET",
      "path": "/users/fenny/gists"
    },
    {
      "method": "GET",
      "path": "/gists"
    },
    {
      "method": "GET",
      "path": "/gists/public"
    },
    {
      "method": "GET",
      "path": "/gists/starred"
    },
    {
      "method": "GET",
      "path": "/gists/1337"
    },
    {
      "method": "POST",
      "path": "/gists"
    },
    {
      "method": "PATCH",
      "path": "/gists/1337"
    },
    {
      "method": "PUT",
      "path": "/gists/1337/star"
    },
    {
      "method": "DELETE",
      "path": "/gists/1337/star"
    },
    {
      "method": "GET",
      "path": "/gists/1337/star"
    },
    {
      "method": "POST",
      "path": "/gists/1337/forks"
    },
    {
      "method": "DELETE",
      "path": "/gists/1337"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/git/blobs/v948b24g98ubngw9082bn02giub"
    },
    {
      "method": "POST",
      "path": "/repos/fenny/fiber/git/blobs"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/git/commits/v948b24g98ubngw9082bn02giub"
    },
    {
      "method": "POST",
      "path": "/repos/fenny/fiber/git/commits"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/git/refs/im/a/wildcard"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/git/refs"
    },
    {
      "method": "POST",
      "path": "/repos/fenny/fiber/git/refs"
    },
    {
      "method": "PATCH",
      "path": "/repos/fenny/fiber/git/refs/im/a/wildcard"
    },
    {
      "method": "DELETE",
      "path": "/repos/fenny/fiber/git/refs/im/a/wildcard"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/git/tags/v948b24g98ubngw9082bn02giub"
    },
    {
      "method": "POST",
      "path": "/repos/fenny/fiber/git/tags"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/git/trees/v948b24g98ubngw9082bn02giub"
    },
    {
      "method": "POST",
      "path": "/repos/fenny/fiber/git/trees"
    },
    {
      "method": "GET",
      "path": "/issues"
    },
    {
      "method": "GET",
      "path": "/user/issues"
    },
    {
      "method": "GET",
      "path": "/orgs/gofiber/issues"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/issues"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/issues/1000"
    },
    {
      "method": "POST",
      "path": "/repos/fenny/fiber/issues"
    },
    {
      "method": "PATCH",
      "path": "/repos/fenny/fiber/issues/1000"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/assignees"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/assignees/nic"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/issues/1000/comments"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/issues/comments"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/issues/comments/1337"
    },
    {
      "method": "POST",
      "path": "/repos/fenny/fiber/issues/1000/comments"
    },
    {
      "method": "PATCH",
      "path": "/repos/fenny/fiber/issues/comments/1337"
    },
    {
      "method": "DELETE",
      "path": "/repos/fenny/fiber/issues/comments/1337"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/issues/1000/events"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/issues/events"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/issues/events/1337"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/labels"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/labels/john"
    },
    {
      "method": "POST",
      "path": "/repos/fenny/fiber/labels"
    },
    {
      "method": "PATCH",
      "path": "/repos/fenny/fiber/labels/john"
    },
    {
      "method": "DELETE",
      "path": "/repos/fenny/fiber/labels/john"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/issues/1000/labels"
    },
    {
      "method": "POST",
      "path": "/repos/fenny/fiber/issues/1000/labels"
    },
    {
      "method": "DELETE",
      "path": "/repos/fenny/fiber/issues/1000/labels/john"
    },
    {
      "method": "PUT",
      "path": "/repos/fenny/fiber/issues/1000/labels"
    },
    {
      "method": "DELETE",
      "path": "/repos/fenny/fiber/issues/1000/labels"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/milestones/1000/labels"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/milestones"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/milestones/1000"
    },
    {
      "method": "POST",
      "path": "/repos/fenny/fiber/milestones"
    },
    {
      "method": "PATCH",
      "path": "/repos/fenny/fiber/milestones/1000"
    },
    {
      "method": "DELETE",
      "path": "/repos/fenny/fiber/milestones/1000"
    },
    {
      "method": "GET",
      "path": "/emojis"
    },
    {
      "method": "GET",
      "path": "/gitignore/templates"
    },
    {
      "method": "GET",
      "path": "/gitignore/templates/john"
    },
    {
      "method": "POST",
      "path": "/markdown"
    },
    {
      "method": "POST",
      "path": "/markdown/raw"
    },
    {
      "method": "GET",
      "path": "/meta"
    },
    {
      "method": "GET",
      "path": "/rate_limit"
    },
    {
      "method": "GET",
      "path": "/users/fenny/orgs"
    },
    {
      "method": "GET",
      "path": "/user/orgs"
    },
    {
      "method": "GET",
      "path": "/orgs/gofiber"
    },
    {
      "method": "PATCH",
      "path": "/orgs/gofiber"
    },
    {
      "method": "GET",
      "path": "/orgs/gofiber/members"
    },
    {
      "method": "GET",
      "path": "/orgs/gofiber/members/fenny"
    },
    {
      "method": "DELETE",
      "path": "/orgs/gofiber/members/fenny"
    },
    {
      "method": "GET",
      "path": "/orgs/gofiber/public_members"
    },
    {
      "method": "GET",
      "path": "/orgs/gofiber/public_members/fenny"
    },
    {
      "method": "PUT",
      "path": "/orgs/gofiber/public_members/fenny"
    },
    {
      "method": "DELETE",
      "path": "/orgs/gofiber/public_members/fenny"
    },
    {
      "method": "GET",
      "path": "/orgs/gofiber/teams"
    },
    {
      "method": "GET",
      "path": "/teams/1337"
    },
    {
      "method": "POST",
      "path": "/orgs/gofiber/teams"
    },
    {
      "method": "PATCH",
      "path": "/teams/1337"
    },
    {
      "method": "DELETE",
      "path": "/teams/1337"
    },
    {
      "method": "GET",
      "path": "/teams/1337/members"
    },
    {
      "method": "GET",
      "path": "/teams/1337/members/fenny"
    },
    {
      "method": "PUT",
      "path": "/teams/1337/members/fenny"
    },
    {
      "method": "DELETE",
      "path": "/teams/1337/members/fenny"
    },
    {
      "method": "GET",
      "path": "/teams/1337/repos"
    },
    {
      "method": "GET",
      "path": "/teams/1337/repos/fenny/fiber"
    },
    {
      "method": "PUT",
      "path": "/teams/1337/repos/fenny/fiber"
    },
    {
      "method": "DELETE",
      "path": "/teams/1337/repos/fenny/fiber"
    },
    {
      "method": "GET",
      "path": "/user/teams"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/pulls"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/pulls/1000"
    },
    {
      "method": "POST",
      "path": "/repos/fenny/fiber/pulls"
    },
    {
      "method": "PATCH",
      "path": "/repos/fenny/fiber/pulls/1000"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/pulls/1000/commits"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/pulls/1000/files"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/pulls/1000/merge"
    },
    {
      "method": "PUT",
      "path": "/repos/fenny/fiber/pulls/1000/merge"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/pulls/1000/comments"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/pulls/comments"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/pulls/comments/1000"
    },
    {
      "method": "PUT",
      "path": "/repos/fenny/fiber/pulls/1000/comments"
    },
    {
      "method": "PATCH",
      "path": "/repos/fenny/fiber/pulls/comments/1000"
    },
    {
      "method": "DELETE",
      "path": "/repos/fenny/fiber/pulls/comments/1000"
    },
    {
      "method": "GET",
      "path": "/user/repos"
    },
    {
      "method": "GET",
      "path": "/users/fenny/repos"
    },
    {
      "method": "GET",
      "path": "/orgs/gofiber/repos"
    },
    {
      "method": "GET",
      "path": "/repositories"
    },
    {
      "method": "POST",
      "path": "/user/repos"
    },
    {
      "method": "POST",
      "path": "/orgs/gofiber/repos"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber"
    },
    {
      "method": "PATCH",
      "path": "/repos/fenny/fiber"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/contributors"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/languages"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/teams"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/tags"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/branches"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/branches/master"
    },
    {
      "method": "DELETE",
      "path": "/repos/fenny/fiber"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/collaborators"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/collaborators/fenny"
    },
    {
      "method": "PUT",
      "path": "/repos/fenny/fiber/collaborators/fenny"
    },
    {
      "method": "DELETE",
      "path": "/repos/fenny/fiber/collaborators/fenny"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/comments"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/commits/v948b24g98ubngw9082bn02giub/comments"
    },
    {
      "method": "POST",
      "path": "/repos/fenny/fiber/commits/v948b24g98ubngw9082bn02giub/comments"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/comments/1337"
    },
    {
      "method": "PATCH",
      "path": "/repos/fenny/fiber/comments/1337"
    },
    {
      "method": "DELETE",
      "path": "/repos/fenny/fiber/comments/1337"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/commits"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/commits/v948b24g98ubngw9082bn02giub"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/readme"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/contents/im/a/wildcard"
    },
    {
      "method": "PUT",
      "path": "/repos/fenny/fiber/contents/im/a/wildcard"
    },
    {
      "method": "DELETE",
      "path": "/repos/fenny/fiber/contents/im/a/wildcard"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/gzip/google"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/keys"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/keys/1337"
    },
    {
      "method": "POST",
      "path": "/repos/fenny/fiber/keys"
    },
    {
      "method": "PATCH",
      "path": "/repos/fenny/fiber/keys/1337"
    },
    {
      "method": "DELETE",
      "path": "/repos/fenny/fiber/keys/1337"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/downloads"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/downloads/1337"
    },
    {
      "method": "DELETE",
      "path": "/repos/fenny/fiber/downloads/1337"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/forks"
    },
    {
      "method": "POST",
      "path": "/repos/fenny/fiber/forks"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/hooks"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/hooks/1337"
    },
    {
      "method": "POST",
      "path": "/repos/fenny/fiber/hooks"
    },
    {
      "method": "PATCH",
      "path": "/repos/fenny/fiber/hooks/1337"
    },
    {
      "method": "POST",
      "path": "/repos/fenny/fiber/hooks/1337/tests"
    },
    {
      "method": "DELETE",
      "path": "/repos/fenny/fiber/hooks/1337"
    },
    {
      "method": "POST",
      "path": "/repos/fenny/fiber/merges"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/releases"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/releases/1337"
    },
    {
      "method": "POST",
      "path": "/repos/fenny/fiber/releases"
    },
    {
      "method": "PATCH",
      "path": "/repos/fenny/fiber/releases/1337"
    },
    {
      "method": "DELETE",
      "path": "/repos/fenny/fiber/releases/1337"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/releases/1337/assets"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/stats/contributors"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/stats/commit_activity"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/stats/code_frequency"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/stats/participation"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/stats/punch_card"
    },
    {
      "method": "GET",
      "path": "/repos/fenny/fiber/statuses/google"
    },
    {
      "method": "POST",
      "path": "/repos/fenny/fiber/statuses/google"
    },
    {
      "method": "GET",
      "path": "/search/repositories"
    },
    {
      "method": "GET",
      "path": "/search/code"
    },
    {
      "method": "GET",
      "path": "/search/issues"
    },
    {
      "method": "GET",
      "path": "/search/users"
    },
    {
      "method": "GET",
      "path": "/legacy/issues/search/fenny/fibersitory/locked/finish"
    },
    {
      "method": "GET",
      "path": "/legacy/repos/search/finish"
    },
    {
      "method": "GET",
      "path": "/legacy/user/search/finish"
    },
    {
      "method": "GET",
      "path": "/legacy/user/email/info@gofiber.io"
    },
    {
      "method": "GET",
      "path": "/users/fenny"
    },
    {
      "method": "GET",
      "path": "/user"
    },
    {
      "method": "PATCH",
      "path": "/user"
    },
    {
      "method": "GET",
      "path": "/users"
    },
    {
      "method": "GET",
      "path": "/user/emails"
    },
    {
      "method": "POST",
      "path": "/user/emails"
    },
    {
      "method": "DELETE",
      "path": "/user/emails"
    },
    {
      "method": "GET",
      "path": "/users/fenny/followers"
    },
    {
      "method": "GET",
      "path": "/user/followers"
    },
    {
      "method": "GET",
      "path": "/users/fenny/following"
    },
    {
      "method": "GET",
      "path": "/user/following"
    },
    {
      "method": "GET",
      "path": "/user/following/fenny"
    },
    {
      "method": "GET",
      "path": "/users/fenny/following/renan"
    },
    {
      "method": "PUT",
      "path": "/user/following/fenny"
    },
    {
      "method": "DELETE",
      "path": "/user/following/fenny"
    },
    {
      "method": "GET",
      "path": "/users/fenny/keys"
    },
    {
      "method": "GET",
      "path": "/user/keys"
    },
    {
      "method": "GET",
      "path": "/user/keys/1337"
    },
    {
      "method": "POST",
      "path": "/user/keys"
    },
    {
      "method": "PATCH",
      "path": "/user/keys/1337"
    },
    {
      "method": "DELETE",
      "path": "/user/keys/1337"
    }
  ],
  "github_api": [{
      "method": "GET",
      "path": "/authorizations"
    },
    {
      "method": "GET",
      "path": "/authorizations/:id"
    },
    {
      "method": "POST",
      "path": "/authorizations"
    },
    {
      "method": "PUT",
      "path": "/authorizations/clients/:client_id"
    },
    {
      "method": "PATCH",
      "path": "/authorizations/:id"
    },
    {
      "method": "DELETE",
      "path": "/authorizations/:id"
    },
    {
      "method": "GET",
      "path": "/applications/:client_id/tokens/:access_token"
    },
    {
      "method": "DELETE",
      "path": "/applications/:client_id/tokens"
    },
    {
      "method": "DELETE",
      "path": "/applications/:client_id/tokens/:access_token"
    },
    {
      "method": "GET",
      "path": "/events"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/events"
    },
    {
      "method": "GET",
      "path": "/networks/:owner/:repo/events"
    },
    {
      "method": "GET",
      "path": "/orgs/:org/events"
    },
    {
      "method": "GET",
      "path": "/users/:user/received_events"
    },
    {
      "method": "GET",
      "path": "/users/:user/received_events/public"
    },
    {
      "method": "GET",
      "path": "/users/:user/events"
    },
    {
      "method": "GET",
      "path": "/users/:user/events/public"
    },
    {
      "method": "GET",
      "path": "/users/:user/events/orgs/:org"
    },
    {
      "method": "GET",
      "path": "/feeds"
    },
    {
      "method": "GET",
      "path": "/notifications"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/notifications"
    },
    {
      "method": "PUT",
      "path": "/notifications"
    },
    {
      "method": "PUT",
      "path": "/repos/:owner/:repo/notifications"
    },
    {
      "method": "GET",
      "path": "/notifications/threads/:id"
    },
    {
      "method": "PATCH",
      "path": "/notifications/threads/:id"
    },
    {
      "method": "GET",
      "path": "/notifications/threads/:id/subscription"
    },
    {
      "method": "PUT",
      "path": "/notifications/threads/:id/subscription"
    },
    {
      "method": "DELETE",
      "path": "/notifications/threads/:id/subscription"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/stargazers"
    },
    {
      "method": "GET",
      "path": "/users/:user/starred"
    },
    {
      "method": "GET",
      "path": "/user/starred"
    },
    {
      "method": "GET",
      "path": "/user/starred/:owner/:repo"
    },
    {
      "method": "PUT",
      "path": "/user/starred/:owner/:repo"
    },
    {
      "method": "DELETE",
      "path": "/user/starred/:owner/:repo"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/subscribers"
    },
    {
      "method": "GET",
      "path": "/users/:user/subscriptions"
    },
    {
      "method": "GET",
      "path": "/user/subscriptions"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/subscription"
    },
    {
      "method": "PUT",
      "path": "/repos/:owner/:repo/subscription"
    },
    {
      "method": "DELETE",
      "path": "/repos/:owner/:repo/subscription"
    },
    {
      "method": "GET",
      "path": "/user/subscriptions/:owner/:repo"
    },
    {
      "method": "PUT",
      "path": "/user/subscriptions/:owner/:repo"
    },
    {
      "method": "DELETE",
      "path": "/user/subscriptions/:owner/:repo"
    },
    {
      "method": "GET",
      "path": "/users/:user/gists"
    },
    {
      "method": "GET",
      "path": "/gists"
    },
    {
      "method": "GET",
      "path": "/gists/public"
    },
    {
      "method": "GET",
      "path": "/gists/starred"
    },
    {
      "method": "GET",
      "path": "/gists/:id"
    },
    {
      "method": "POST",
      "path": "/gists"
    },
    {
      "method": "PATCH",
      "path": "/gists/:id"
    },
    {
      "method": "PUT",
      "path": "/gists/:id/star"
    },
    {
      "method": "DELETE",
      "path": "/gists/:id/star"
    },
    {
      "method": "GET",
      "path": "/gists/:id/star"
    },
    {
      "method": "POST",
      "path": "/gists/:id/forks"
    },
    {
      "method": "DELETE",
      "path": "/gists/:id"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/git/blobs/:sha"
    },
    {
      "method": "POST",
      "path": "/repos/:owner/:repo/git/blobs"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/git/commits/:sha"
    },
    {
      "method": "POST",
      "path": "/repos/:owner/:repo/git/commits"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/git/refs/*"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/git/refs"
    },
    {
      "method": "POST",
      "path": "/repos/:owner/:repo/git/refs"
    },
    {
      "method": "PATCH",
      "path": "/repos/:owner/:repo/git/refs/*"
    },
    {
      "method": "DELETE",
      "path": "/repos/:owner/:repo/git/refs/*"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/git/tags/:sha"
    },
    {
      "method": "POST",
      "path": "/repos/:owner/:repo/git/tags"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/git/trees/:sha"
    },
    {
      "method": "POST",
      "path": "/repos/:owner/:repo/git/trees"
    },
    {
      "method": "GET",
      "path": "/issues"
    },
    {
      "method": "GET",
      "path": "/user/issues"
    },
    {
      "method": "GET",
      "path": "/orgs/:org/issues"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/issues"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/issues/:number"
    },
    {
      "method": "POST",
      "path": "/repos/:owner/:repo/issues"
    },
    {
      "method": "PATCH",
      "path": "/repos/:owner/:repo/issues/:number"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/assignees"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/assignees/:assignee"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/issues/:number/comments"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/issues/comments"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/issues/comments/:id"
    },
    {
      "method": "POST",
      "path": "/repos/:owner/:repo/issues/:number/comments"
    },
    {
      "method": "PATCH",
      "path": "/repos/:owner/:repo/issues/comments/:id"
    },
    {
      "method": "DELETE",
      "path": "/repos/:owner/:repo/issues/comments/:id"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/issues/:number/events"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/issues/events"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/issues/events/:id"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/labels"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/labels/:name"
    },
    {
      "method": "POST",
      "path": "/repos/:owner/:repo/labels"
    },
    {
      "method": "PATCH",
      "path": "/repos/:owner/:repo/labels/:name"
    },
    {
      "method": "DELETE",
      "path": "/repos/:owner/:repo/labels/:name"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/issues/:number/labels"
    },
    {
      "method": "POST",
      "path": "/repos/:owner/:repo/issues/:number/labels"
    },
    {
      "method": "DELETE",
      "path": "/repos/:owner/:repo/issues/:number/labels/:name"
    },
    {
      "method": "PUT",
      "path": "/repos/:owner/:repo/issues/:number/labels"
    },
    {
      "method": "DELETE",
      "path": "/repos/:owner/:repo/issues/:number/labels"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/milestones/:number/labels"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/milestones"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/milestones/:number"
    },
    {
      "method": "POST",
      "path": "/repos/:owner/:repo/milestones"
    },
    {
      "method": "PATCH",
      "path": "/repos/:owner/:repo/milestones/:number"
    },
    {
      "method": "DELETE",
      "path": "/repos/:owner/:repo/milestones/:number"
    },
    {
      "method": "GET",
      "path": "/emojis"
    },
    {
      "method": "GET",
      "path": "/gitignore/templates"
    },
    {
      "method": "GET",
      "path": "/gitignore/templates/:name"
    },
    {
      "method": "POST",
      "path": "/markdown"
    },
    {
      "method": "POST",
      "path": "/markdown/raw"
    },
    {
      "method": "GET",
      "path": "/meta"
    },
    {
      "method": "GET",
      "path": "/rate_limit"
    },
    {
      "method": "GET",
      "path": "/users/:user/orgs"
    },
    {
      "method": "GET",
      "path": "/user/orgs"
    },
    {
      "method": "GET",
      "path": "/orgs/:org"
    },
    {
      "method": "PATCH",
      "path": "/orgs/:org"
    },
    {
      "method": "GET",
      "path": "/orgs/:org/members"
    },
    {
      "method": "GET",
      "path": "/orgs/:org/members/:user"
    },
    {
      "method": "DELETE",
      "path": "/orgs/:org/members/:user"
    },
    {
      "method": "GET",
      "path": "/orgs/:org/public_members"
    },
    {
      "method": "GET",
      "path": "/orgs/:org/public_members/:user"
    },
    {
      "method": "PUT",
      "path": "/orgs/:org/public_members/:user"
    },
    {
      "method": "DELETE",
      "path": "/orgs/:org/public_members/:user"
    },
    {
      "method": "GET",
      "path": "/orgs/:org/teams"
    },
    {
      "method": "GET",
      "path": "/teams/:id"
    },
    {
      "method": "POST",
      "path": "/orgs/:org/teams"
    },
    {
      "method": "PATCH",
      "path": "/teams/:id"
    },
    {
      "method": "DELETE",
      "path": "/teams/:id"
    },
    {
      "method": "GET",
      "path": "/teams/:id/members"
    },
    {
      "method": "GET",
      "path": "/teams/:id/members/:user"
    },
    {
      "method": "PUT",
      "path": "/teams/:id/members/:user"
    },
    {
      "method": "DELETE",
      "path": "/teams/:id/members/:user"
    },
    {
      "method": "GET",
      "path": "/teams/:id/repos"
    },
    {
      "method": "GET",
      "path": "/teams/:id/repos/:owner/:repo"
    },
    {
      "method": "PUT",
      "path": "/teams/:id/repos/:owner/:repo"
    },
    {
      "method": "DELETE",
      "path": "/teams/:id/repos/:owner/:repo"
    },
    {
      "method": "GET",
      "path": "/user/teams"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/pulls"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/pulls/:number"
    },
    {
      "method": "POST",
      "path": "/repos/:owner/:repo/pulls"
    },
    {
      "method": "PATCH",
      "path": "/repos/:owner/:repo/pulls/:number"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/pulls/:number/commits"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/pulls/:number/files"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/pulls/:number/merge"
    },
    {
      "method": "PUT",
      "path": "/repos/:owner/:repo/pulls/:number/merge"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/pulls/:number/comments"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/pulls/comments"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/pulls/comments/:number"
    },
    {
      "method": "PUT",
      "path": "/repos/:owner/:repo/pulls/:number/comments"
    },
    {
      "method": "PATCH",
      "path": "/repos/:owner/:repo/pulls/comments/:number"
    },
    {
      "method": "DELETE",
      "path": "/repos/:owner/:repo/pulls/comments/:number"
    },
    {
      "method": "GET",
      "path": "/user/repos"
    },
    {
      "method": "GET",
      "path": "/users/:user/repos"
    },
    {
      "method": "GET",
      "path": "/orgs/:org/repos"
    },
    {
      "method": "GET",
      "path": "/repositories"
    },
    {
      "method": "POST",
      "path": "/user/repos"
    },
    {
      "method": "POST",
      "path": "/orgs/:org/repos"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo"
    },
    {
      "method": "PATCH",
      "path": "/repos/:owner/:repo"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/contributors"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/languages"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/teams"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/tags"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/branches"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/branches/:branch"
    },
    {
      "method": "DELETE",
      "path": "/repos/:owner/:repo"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/collaborators"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/collaborators/:user"
    },
    {
      "method": "PUT",
      "path": "/repos/:owner/:repo/collaborators/:user"
    },
    {
      "method": "DELETE",
      "path": "/repos/:owner/:repo/collaborators/:user"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/comments"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/commits/:sha/comments"
    },
    {
      "method": "POST",
      "path": "/repos/:owner/:repo/commits/:sha/comments"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/comments/:id"
    },
    {
      "method": "PATCH",
      "path": "/repos/:owner/:repo/comments/:id"
    },
    {
      "method": "DELETE",
      "path": "/repos/:owner/:repo/comments/:id"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/commits"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/commits/:sha"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/readme"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/contents/*"
    },
    {
      "method": "PUT",
      "path": "/repos/:owner/:repo/contents/*"
    },
    {
      "method": "DELETE",
      "path": "/repos/:owner/:repo/contents/*"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/:archive_format/:ref"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/keys"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/keys/:id"
    },
    {
      "method": "POST",
      "path": "/repos/:owner/:repo/keys"
    },
    {
      "method": "PATCH",
      "path": "/repos/:owner/:repo/keys/:id"
    },
    {
      "method": "DELETE",
      "path": "/repos/:owner/:repo/keys/:id"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/downloads"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/downloads/:id"
    },
    {
      "method": "DELETE",
      "path": "/repos/:owner/:repo/downloads/:id"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/forks"
    },
    {
      "method": "POST",
      "path": "/repos/:owner/:repo/forks"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/hooks"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/hooks/:id"
    },
    {
      "method": "POST",
      "path": "/repos/:owner/:repo/hooks"
    },
    {
      "method": "PATCH",
      "path": "/repos/:owner/:repo/hooks/:id"
    },
    {
      "method": "POST",
      "path": "/repos/:owner/:repo/hooks/:id/tests"
    },
    {
      "method": "DELETE",
      "path": "/repos/:owner/:repo/hooks/:id"
    },
    {
      "method": "POST",
      "path": "/repos/:owner/:repo/merges"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/releases"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/releases/:id"
    },
    {
      "method": "POST",
      "path": "/repos/:owner/:repo/releases"
    },
    {
      "method": "PATCH",
      "path": "/repos/:owner/:repo/releases/:id"
    },
    {
      "method": "DELETE",
      "path": "/repos/:owner/:repo/releases/:id"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/releases/:id/assets"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/stats/contributors"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/stats/commit_activity"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/stats/code_frequency"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/stats/participation"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/stats/punch_card"
    },
    {
      "method": "GET",
      "path": "/repos/:owner/:repo/statuses/:ref"
    },
    {
      "method": "POST",
      "path": "/repos/:owner/:repo/statuses/:ref"
    },
    {
      "method": "GET",
      "path": "/search/repositories"
    },
    {
      "method": "GET",
      "path": "/search/code"
    },
    {
      "method": "GET",
      "path": "/search/issues"
    },
    {
      "method": "GET",
      "path": "/search/users"
    },
    {
      "method": "GET",
      "path": "/legacy/issues/search/:owner/:repository/:state/:keyword"
    },
    {
      "method": "GET",
      "path": "/legacy/repos/search/:keyword"
    },
    {
      "method": "GET",
      "path": "/legacy/user/search/:keyword"
    },
    {
      "method": "GET",
      "path": "/legacy/user/email/:email"
    },
    {
      "method": "GET",
      "path": "/users/:user"
    },
    {
      "method": "GET",
      "path": "/user"
    },
    {
      "method": "PATCH",
      "path": "/user"
    },
    {
      "method": "GET",
      "path": "/users"
    },
    {
      "method": "GET",
      "path": "/user/emails"
    },
    {
      "method": "POST",
      "path": "/user/emails"
    },
    {
      "method": "DELETE",
      "path": "/user/emails"
    },
    {
      "method": "GET",
      "path": "/users/:user/followers"
    },
    {
      "method": "GET",
      "path": "/user/followers"
    },
    {
      "method": "GET",
      "path": "/users/:user/following"
    },
    {
      "method": "GET",
      "path": "/user/following"
    },
    {
      "method": "GET",
      "path": "/user/following/:user"
    },
    {
      "method": "GET",
      "path": "/users/:user/following/:target_user"
    },
    {
      "method": "PUT",
      "path": "/user/following/:user"
    },
    {
      "method": "DELETE",
      "path": "/user/following/:user"
    },
    {
      "method": "GET",
      "path": "/users/:user/keys"
    },
    {
      "method": "GET",
      "path": "/user/keys"
    },
    {
      "method": "GET",
      "path": "/user/keys/:id"
    },
    {
      "method": "POST",
      "path": "/user/keys"
    },
    {
      "method": "PATCH",
      "path": "/user/keys/:id"
    },
    {
      "method": "DELETE",
      "path": "/user/keys/:id"
    }
  ]
}


================================================
FILE: .github/testdata2/bruh.tmpl
================================================
<h1>I'm Bruh</h1>

================================================
FILE: .github/testdata3/hello_world.tmpl
================================================
<h1>Hello {{ .Name }}!</h1>

================================================
FILE: .github/workflows/auto-labeler.yml
================================================
name: auto-labeler

on:
  issues:
    types: [opened, edited, milestoned]
  pull_request_target:
    types: [opened, edited, reopened, synchronize]

jobs:
  auto-labeler:
    uses: gofiber/.github/.github/workflows/auto-labeler.yml@main
    secrets:
      github-token: ${{ secrets.ISSUE_PR_TOKEN }}
    with:
      config-path: .github/labeler.yml
      config-repository: gofiber/fiber


================================================
FILE: .github/workflows/benchmark.yml
================================================
on:
  workflow_dispatch:
  push:
    branches:
      - main
    paths-ignore:
      - "**/*.md"
  pull_request:
    paths-ignore:
      - "**/*.md"

permissions:
  # deployments permission to deploy GitHub pages website
  deployments: write
  # contents permission to update benchmark contents in gh-pages branch
  contents: write
  # allow posting comments to pull request
  pull-requests: write

name: Benchmark
jobs:
  Compare:
    runs-on: ubuntu-latest
    steps:
      - name: Fetch Repository
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          fetch-depth: 0 # to be able to retrieve the last commit in main

      - name: Install Go
        uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
        with:
          # NOTE: Keep this in sync with the version from go.mod
          go-version: "1.25.x"

      - name: Run Benchmark
        run: set -o pipefail; go test ./... -benchmem -run=^$ -bench . | tee output.txt

      - name: Remove _Parallel Benchmarks
        run: |
          awk '!/^Benchmark.*_Parallel/' output.txt > output_filtered.txt
          mv output_filtered.txt output.txt

      # NOTE: Benchmarks could change with different CPU types
      - name: Get GitHub Runner System Information
        uses: kenchan0130/actions-system-info@59699597e84e80085a750998045983daa49274c4 # v1.4.0
        id: system-info

      - name: Get Main branch SHA
        id: get-main-branch-sha
        run: |
          SHA=$(git rev-parse origin/main)
          echo "sha=$SHA" >> $GITHUB_OUTPUT

      - name: Get Benchmark Results from main branch
        id: cache
        uses: actions/cache/restore@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
        with:
          path: ./cache
          key: ${{ steps.get-main-branch-sha.outputs.sha }}-${{ runner.os }}-${{ steps.system-info.outputs.cpu-model }}-benchmark

      # This will only run if we have Benchmark Results from main branch
      - name: Compare PR Benchmark Results with main branch
        uses: benchmark-action/github-action-benchmark@a7bc2366eda11037936ea57d811a43b3418d3073 # v1.21.0
        if: steps.cache.outputs.cache-hit == 'true'
        with:
          tool: 'go'
          output-file-path: output.txt
          external-data-json-path: ./cache/benchmark-data.json
          # Do not save the data (This allows comparing benchmarks)
          save-data-file: false
          fail-on-alert: true
          # Comment on the PR if the branch is not a fork
          comment-on-alert: ${{ github.event.pull_request.head.repo.fork == false }}
          github-token: ${{ secrets.GITHUB_TOKEN }}
          summary-always: true
          alert-threshold: "150%"
          go-force-package-suffix: true

      - name: Store Benchmark Results for main branch
        uses: benchmark-action/github-action-benchmark@a7bc2366eda11037936ea57d811a43b3418d3073 # v1.21.0
        if: ${{ github.ref_name == 'main' }}
        with:
          tool: 'go'
          output-file-path: output.txt
          external-data-json-path: ./cache/benchmark-data.json
          # Save the data to external file (cache)
          save-data-file: true
          fail-on-alert: false
          github-token: ${{ secrets.GITHUB_TOKEN }}
          summary-always: true
          alert-threshold: "150%"
          go-force-package-suffix: true

      - name: Publish Benchmark Results to GitHub Pages
        uses: benchmark-action/github-action-benchmark@a7bc2366eda11037936ea57d811a43b3418d3073 # v1.21.0
        if: ${{ github.ref_name == 'main' }}
        with:
          tool: 'go'
          output-file-path: output.txt
          benchmark-data-dir-path: "benchmarks"
          fail-on-alert: false
          github-token: ${{ secrets.GITHUB_TOKEN }}
          comment-on-alert: true
          summary-always: true
          # Save the data to external file (GitHub Pages)
          save-data-file: true
          alert-threshold: "150%"
          auto-push: ${{ github.event_name == 'push' || github.event_name == 'workflow_dispatch' }}
          go-force-package-suffix: true

      - name: Update Benchmark Results cache
        uses: actions/cache/save@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
        if: ${{ github.ref_name == 'main' }}
        with:
          path: ./cache
          key: ${{ steps.get-main-branch-sha.outputs.sha }}-${{ runner.os }}-${{ steps.system-info.outputs.cpu-model }}-benchmark


================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
name: "CodeQL"

on:
  workflow_dispatch:
  push:
    branches:
      - main
    paths-ignore:
      - "**/*.md"
  pull_request:
    paths-ignore:
      - "**/*.md"
  schedule:
    - cron: "0 3 * * 6"

jobs:
  analyse:
    name: Analyse
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          # We must fetch at least the immediate parents so that if this is
          # a pull request then we can checkout the head.
          fetch-depth: 2

      # If this run was triggered by a pull request event, then checkout
      # the head of the pull request instead of the merge commit.
      - run: git checkout HEAD^2
        if: ${{ github.event_name == 'pull_request' }}

      # Initializes the CodeQL tools for scanning.
      - name: Initialize CodeQL
        uses: github/codeql-action/init@b1bff81932f5cdfc8695c7752dcee935dcd061c8 # v4.33.0
        # Override language selection by uncommenting this and choosing your languages
        with:
          languages: go

      # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
      # If this step fails, then you should remove it and run the build manually (see below)
      - name: Autobuild
        uses: github/codeql-action/autobuild@b1bff81932f5cdfc8695c7752dcee935dcd061c8 # v4.33.0

      # ℹ️ Command-line programs to run using the OS shell.
      # 📚 https://git.io/JvXDl

      # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
      #    and modify them (or add more) to build your code if your project
      #    uses a compiled language

      #- run: |
      #   make bootstrap
      #   make release

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@b1bff81932f5cdfc8695c7752dcee935dcd061c8 # v4.33.0


================================================
FILE: .github/workflows/dependabot_automerge.yml
================================================
name: Dependabot auto-merge
on:
  workflow_dispatch:
  pull_request_target:
permissions:
  contents: write
  pull-requests: write
jobs:
  wait_for_checks:
    runs-on: ubuntu-latest
    if: ${{ github.actor == 'dependabot[bot]' }}
    steps:
      - name: Wait for check is finished
        uses: lewagon/wait-on-check-action@v1.5.0
        id: wait_for_checks
        with:
          ref: ${{ github.event.pull_request.head.sha || github.sha }}
          running-workflow-name: wait_for_checks
          check-regexp: unit
          repo-token: ${{ secrets.PR_TOKEN }}
          wait-interval: 10
  dependabot:
    needs: [wait_for_checks]
    name: Dependabot auto-merge
    runs-on: ubuntu-latest
    if: ${{ github.actor == 'dependabot[bot]' }}
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v2.5.0
        with:
          github-token: "${{ secrets.PR_TOKEN }}"
      - name: Enable auto-merge for Dependabot PRs
        if: ${{steps.metadata.outputs.update-type == 'version-update:semver-minor' || steps.metadata.outputs.update-type == 'version-update:semver-patch'}}
        run: |
          gh pr review --approve "$PR_URL"
          gh pr merge --auto --merge "$PR_URL"
        env:
          PR_URL: ${{github.event.pull_request.html_url}}
          GITHUB_TOKEN: ${{secrets.PR_TOKEN}}


================================================
FILE: .github/workflows/linter.yml
================================================
name: golangci-lint

on:
  workflow_dispatch:
  push:
    branches:
      - main
    paths-ignore:
      - "**/*.md"
  pull_request:
    paths-ignore:
      - "**/*.md"

permissions:
  # Required: allow read access to the content for analysis.
  contents: read
  # Optional: allow read access to pull request. Use with `only-new-issues` option.
  pull-requests: read
  # Optional: Allow write access to checks to allow the action to annotate code in the PR.
  checks: write

jobs:
  golangci:
    name: lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
        with:
          # NOTE: Keep this in sync with the version from go.mod
          go-version: "1.25.x"
          cache: false

      - name: golangci-lint
        uses: golangci/golangci-lint-action@1e7e51e771db61008b38414a730f564565cf7c20 # v9.2.0
        with:
          # NOTE: Keep this in sync with the version from .golangci.yml
          version: v2.5.0
          install-mode: goinstall


================================================
FILE: .github/workflows/manual-dependabot.yml
================================================
# https://github.com/dependabot/dependabot-script/blob/main/manual-github-actions.yaml
# https://github.com/dependabot/dependabot-script?tab=readme-ov-file#github-actions-standalone
name: ManualDependabot

on:
  workflow_dispatch:
    inputs:
      package-manager:
        description: 'The package manager to use'
        required: true
        default: 'gomod'
      directory:
        description: 'The directory to scan'
        required: true
        default: '/'

permissions:
  contents: read

jobs:
  dependabot:
    permissions:
      contents: write  # for Git to git push
      pull-requests: write  # for repo-sync/pull-request to create pull requests
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repo
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - name: Checkout dependabot
        run: |
          cd /tmp/
          git clone https://github.com/dependabot/dependabot-script

      - name: Build image
        run: |
          cd /tmp/dependabot-script
          docker build -t "dependabot/dependabot-script" -f Dockerfile .

      - name: Run dependabot
        env:
          PACKAGE_MANAGER: ${{ github.event.inputs.package-manager }}
          DIRECTORY: ${{ github.event.inputs.directory }}
          GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          docker run -v $PWD:/src -e PROJECT_PATH=$GITHUB_REPOSITORY -e PACKAGE_MANAGER=$PACKAGE_MANAGER -e DIRECTORY=$DIRECTORY -e GITHUB_ACCESS_TOKEN=$GITHUB_ACCESS_TOKEN -e OPTIONS="$OPTIONS" dependabot/dependabot-script


================================================
FILE: .github/workflows/markdown.yml
================================================
name: markdownlint

on:
  workflow_dispatch:
  push:
    branches:
      - main
    paths:
      - "**/*.md"
  pull_request:
    paths:
      - "**/*.md"

jobs:
  markdownlint:
    runs-on: ubuntu-latest
    steps:
      - name: Fetch Repository
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - name: Run markdownlint-cli2
        uses: DavidAnson/markdownlint-cli2-action@07035fd053f7be764496c0f8d8f9f41f98305101 # v22.0.0
        with:
          globs: |
            **/*.md
            #vendor


================================================
FILE: .github/workflows/modernize.yml
================================================
name: Modernize Lint

on:
  workflow_dispatch:
  push:
    branches:
      - main
    paths-ignore:
      - "**/*.md"
      - "**/*_msgp*.go"
  pull_request:
    paths-ignore:
      - "**/*.md"
      - "**/*_msgp*.go"

permissions:
  contents: read
  pull-requests: write
  checks: write

jobs:
  modernize:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
        with:
          # NOTE: Keep this in sync with the version from go.mod
          go-version: "1.25.x"
          cache: false

      - name: modernize
        run: go run golang.org/x/tools/gopls/internal/analysis/modernize/cmd/modernize@latest -test=false ./...


================================================
FILE: .github/workflows/move-closed-milestone-items.yml
================================================
name: Move closed milestone items

on:
  workflow_dispatch:
    inputs:
      source_milestone:
        description: Milestone that currently owns the closed items
        required: true
        type: string
      target_milestone:
        description: Milestone that should receive the closed items
        required: true
        type: string

permissions:
  contents: read
  issues: write
  pull-requests: write

jobs:
  move-closed-items:
    runs-on: ubuntu-latest
    steps:
      - name: Move closed items to target milestone
        uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
        with:
          github-token: ${{ secrets.ISSUE_PR_TOKEN }}
          script: |
            const dispatchInputs = context.payload.inputs ?? {};
            const sourceTitle = (dispatchInputs.source_milestone ?? '').trim();
            const targetTitle = (dispatchInputs.target_milestone ?? '').trim();

            if (sourceTitle.length === 0 || targetTitle.length === 0) {
              throw new Error('Both source_milestone and target_milestone must be non-empty.');
            }

            if (sourceTitle === targetTitle) {
              throw new Error('source_milestone and target_milestone must be different.');
            }

            const owner = context.repo.owner;
            const repo = context.repo.repo;

            async function listMilestones() {
              return github.paginate(github.rest.issues.listMilestones, {
                owner,
                repo,
                state: 'all',
                per_page: 100,
              });
            }

            function findMilestoneByTitle(milestones, title) {
              return milestones.find((milestone) => milestone.title === title);
            }

            let milestones = await listMilestones();

            const sourceMilestone = findMilestoneByTitle(milestones, sourceTitle);
            if (!sourceMilestone) {
              throw new Error(`Source milestone "${sourceTitle}" was not found.`);
            }

            let targetMilestone = findMilestoneByTitle(milestones, targetTitle);
            if (!targetMilestone) {
              const createdMilestone = await github.rest.issues.createMilestone({
                owner,
                repo,
                title: targetTitle,
              });
              targetMilestone = createdMilestone.data;
              core.info(`Created target milestone "${targetTitle}" (#${targetMilestone.number}).`);
            } else if (targetMilestone.state !== 'open') {
              const reopenedMilestone = await github.rest.issues.updateMilestone({
                owner,
                repo,
                milestone_number: targetMilestone.number,
                state: 'open',
              });
              targetMilestone = reopenedMilestone.data;
              core.info(`Reopened target milestone "${targetTitle}" (#${targetMilestone.number}).`);
            }

            const closedItems = await github.paginate(github.rest.issues.listForRepo, {
              owner,
              repo,
              state: 'closed',
              milestone: String(sourceMilestone.number),
              per_page: 100,
            });

            if (closedItems.length === 0) {
              core.notice(`No closed items were found in milestone "${sourceTitle}".`);
              return;
            }

            for (const item of closedItems) {
              await github.rest.issues.update({
                owner,
                repo,
                issue_number: item.number,
                milestone: targetMilestone.number,
              });

              const itemType = item.pull_request ? 'pull request' : 'issue';
              core.info(`Moved ${itemType} #${item.number} to milestone "${targetTitle}".`);
            }

            core.notice(
              `Moved ${closedItems.length} closed item(s) from "${sourceTitle}" to "${targetTitle}".`,
            );


================================================
FILE: .github/workflows/release-drafter.yml
================================================
name: Release Drafter

on:
  push:
    branches:
      - main
  workflow_dispatch:

permissions:
  contents: read

jobs:
  update_release_draft:
    permissions:
      # write permission is required to create a github release
      contents: write
      # write permission is required for autolabeler
      # otherwise, read permission is required at least
      pull-requests: read
    runs-on: ubuntu-latest
    steps:
      - uses: release-drafter/release-drafter@139054aeaa9adc52ab36ddf67437541f039b88e2 # v7.1.1
        with:
          disable-autolabeler: true
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/spell-check.yml
================================================
name: Spell check

on:
  workflow_dispatch:
  pull_request:
    types:
      - opened
      - synchronize
      - reopened
      - ready_for_review
  push:
    branches:
      - main

permissions:
  contents: read
  pull-requests: read

jobs:
  cspell:
    name: cspell
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - name: Set up Node.js
        uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
        with:
          node-version: "20.x"

      - name: Install cspell dictionaries
        run: |
          npm install --no-save \
            @cspell/dict-en_us \
            @cspell/dict-en-gb \
            @cspell/dict-software-terms \
            @cspell/dict-golang \
            @cspell/dict-fullstack \
            @cspell/dict-docker \
            @cspell/dict-k8s \
            @cspell/dict-node \
            @cspell/dict-npm \
            @cspell/dict-typescript \
            @cspell/dict-html \
            @cspell/dict-css \
            @cspell/dict-shell \
            @cspell/dict-python \
            @cspell/dict-redis \
            @cspell/dict-sql \
            @cspell/dict-filetypes \
            @cspell/dict-companies \
            @cspell/dict-markdown \
            @cspell/dict-en-common-misspellings \
            @cspell/dict-people-names \
            @cspell/dict-data-science

      - name: Run cspell
        uses: streetsidesoftware/cspell-action@9cd41bb518a24fefdafd9880cbab8f0ceba04d28 # v8.3.0
        with:
          incremental_files_only: false
          check_dot_files: explicit
          report: typos
          verbose: true

      - name: Run codespell
        uses: codespell-project/actions-codespell@8f01853be192eb0f849a5c7d721450e7a467c579 # v2.2
        with:
          skip: ./.git,./node_modules,./**/*.go,./*.go,./.github/workflows/spell-check.yml
          ignore_words_list: TE,te


================================================
FILE: .github/workflows/sync-docs.yml
================================================
name: "Sync docs"

on:
  workflow_dispatch:
  push:
    branches:
      - main
    paths:
      - "docs/**"
  release:
    types: [published]

jobs:
  sync-docs:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          ref: ${{ github.event.pull_request.head.sha }}
          fetch-depth: 2

      - name: Setup Node.js environment
        uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
        with:
          node-version: "22.x"

      - name: Sync docs
        run: ./.github/scripts/sync_docs.sh
        env:
          EVENT: ${{ github.event_name }}
          TAG_NAME: ${{ github.ref_name }}
          TOKEN: ${{ secrets.DOC_SYNC_TOKEN }}


================================================
FILE: .github/workflows/test.yml
================================================
name: Test

on:
  workflow_dispatch:
  push:
    branches:
      - main
    paths-ignore:
      - "**/*.md"
  pull_request:
    paths-ignore:
      - "**/*.md"

jobs:
  unit:
    strategy:
      matrix:
        go-version: [1.25.x, 1.26.x]
        platform: [ubuntu-latest, windows-latest, macos-latest]
    runs-on: ${{ matrix.platform }}
    steps:
      - name: Fetch Repository
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - name: Install Go
        uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
        with:
          go-version: ${{ matrix.go-version }}

      - name: Test
        run: go run gotest.tools/gotestsum@latest -f testname -- ./... -race -count=1 -coverprofile=coverage.txt -covermode=atomic -shuffle=on

      - name: Upload coverage reports to Codecov
        if: ${{ matrix.platform == 'ubuntu-latest' && matrix.go-version == '1.25.x' }}
        uses: codecov/codecov-action@1af58845a975a7985b0beb0cbe6fbbb71a41dbad # v5.5.3
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          flags: unittests
          slug: gofiber/fiber
          verbose: true

  repeated:
    runs-on: ubuntu-latest
    steps:
      - name: Fetch Repository
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - name: Install Go
        uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
        with:
          go-version: stable

      - name: Test
        run: go run gotest.tools/gotestsum@latest -f testname -- ./... -race -count=15 -shuffle=on


================================================
FILE: .github/workflows/v3-label-automation.yml
================================================
name: Assign v3 project and milestone

on:
  issues:
    types:
      - labeled
  pull_request_target:
    types:
      - labeled

permissions:
  contents: read
  issues: write
  pull-requests: write

jobs:
  assign-v3:
    if: ${{ github.event.label && github.event.label.name == 'v3' }}
    runs-on: ubuntu-latest
    steps:
      - name: Add item to v3 project
        uses: actions/add-to-project@244f685bbc3b7adfa8466e08b698b5577571133e # v1.0.2
        with:
          project-url: https://github.com/orgs/gofiber/projects/1
          github-token: ${{ secrets.ISSUE_PR_TOKEN }}
      - name: Assign v3 milestone
        uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
        with:
          github-token: ${{ secrets.ISSUE_PR_TOKEN }}
          script: |
            const payload = context.eventName === 'issues' ? context.payload.issue : context.payload.pull_request;
            const issueNumber = payload.number;
            const milestones = await github.paginate(github.rest.issues.listMilestones, {
              owner: context.repo.owner,
              repo: context.repo.repo,
              state: 'open',
              per_page: 100,
            });
            const milestone = milestones.find((item) => item.title === 'v3');
            if (!milestone) {
              throw new Error('Milestone "v3" was not found.');
            }
            await github.rest.issues.update({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: issueNumber,
              milestone: milestone.number,
            });


================================================
FILE: .github/workflows/vulncheck.yml
================================================
name: Run govulncheck

on:
  workflow_dispatch:
  push:
    branches:
      - main
    paths-ignore:
      - "**/*.md"
  pull_request:
    paths-ignore:
      - "**/*.md"

jobs:
  govulncheck-check:
    runs-on: ubuntu-latest
    env:
      GO111MODULE: on
    steps:
      - name: Fetch Repository
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - name: Install Go
        uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
        with:
          go-version: "stable"
          check-latest: true
          cache: false

      - name: Install Govulncheck
        run: go install golang.org/x/vuln/cmd/govulncheck@latest

      - name: Run Govulncheck
        run: govulncheck ./...


================================================
FILE: .gitignore
================================================
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib

# Test binary, built with `go test -c`
*.test
*.tmp

# Output of the go coverage tool
**/*.out

.cache
.gocache

# IDE files
.vscode
.DS_Store
.idea
.claude

# Misc
*.fiber.gz
*.fiber.zst
*.fiber.br
*.fasthttp.gz
*.fasthttp.zst
*.fasthttp.br
*.test.gz
*.test.zst
*.test.br
*.pprof
*.workspace

# Dependencies
/vendor/
vendor/
vendor
/Godeps/

# Local tools
bin/


================================================
FILE: .golangci.yml
================================================
version: "2"
run:
  modules-download-mode: readonly
  allow-serial-runners: true
linters:
  enable:
    - asasalint
    - asciicheck
    - bidichk
    - bodyclose
    - containedctx
    - contextcheck
    - copyloopvar
    - decorder
    - depguard
    - dogsled
    - dupword
    - durationcheck
    - err113
    - errchkjson
    - errname
    - errorlint
    - exhaustive
    - forbidigo
    - forcetypeassert
    - ginkgolinter
    - gochecksumtype
    - goconst
    - gocritic
    - gomoddirectives
    - goprintffuncname
    - gosec
    - grouper
    - loggercheck
    - makezero
    - mirror
    - misspell
    - musttag
    - nakedret
    - nilerr
    - nilnil
    # - noctx # TODO: enable this once the codebase is migrated to context aware APIs
    - nolintlint
    - nonamedreturns
    - nosprintfhostport
    - perfsprint
    - predeclared
    - promlinter
    - protogetter
    - reassign
    - revive
    - rowserrcheck
    - sloglint
    - spancheck
    - sqlclosecheck
    - staticcheck
    - tagliatelle
    - testableexamples
    - testifylint
    - thelper
    - tparallel
    - unconvert
    - unparam
    - usestdlibvars
    - whitespace
    - wrapcheck
    - zerologlint
  settings:
    depguard:
      rules:
        all:
          list-mode: lax
          deny:
            - pkg: flag
              desc: "`flag` package is only allowed in main.go"
            - pkg: log
              desc: logging is provided by `pkg/log`
            - pkg: io/ioutil
              desc: "`io/ioutil` package is deprecated, use the `io` and `os` package instead"
    errcheck:
      disable-default-exclusions: true
      check-type-assertions: true
      check-blank: true
      exclude-functions:
        - (*bytes.Buffer).Write
        - (*github.com/valyala/bytebufferpool.ByteBuffer).Write
        - (*github.com/valyala/bytebufferpool.ByteBuffer).WriteByte
        - (*github.com/valyala/bytebufferpool.ByteBuffer).WriteString
    errchkjson:
      report-no-exported: true
    exhaustive:
      default-signifies-exhaustive: true
    forbidigo:
      forbid:
        - pattern: ^print(ln)?$
        - pattern: ^fmt\.Print(f|ln)?$
        - pattern: ^http\.Default(Client|ServeMux|Transport)$
      analyze-types: true
    goconst:
      numbers: true
    gocritic:
      enabled-tags:
        - diagnostic
        - style
        - performance
      settings:
        captLocal:
          paramsOnly: false
        elseif:
          skipBalanced: false
        underef:
          skipRecvDeref: false
    gosec:
      excludes:
        - G104
      config:
        global:
          audit: true
    govet:
      enable-all: true
    grouper:
      import-require-single-import: true
      import-require-grouping: true
    loggercheck:
      require-string-key: true
      no-printf-like: true
    misspell:
      locale: US
    nolintlint:
      require-explanation: true
      require-specific: true
    nonamedreturns:
      report-error-in-defer: true
    perfsprint:
      err-error: true
    predeclared:
      qualified-name: true
    promlinter:
      strict: true
    revive:
      enable-all-rules: true
      rules:
        - name: add-constant
          disabled: true
        - name: argument-limit
          disabled: true
        - name: banned-characters
          disabled: true
        - name: cognitive-complexity
          disabled: true
        - name: confusing-results
          disabled: true
        - name: comment-spacings
          arguments:
            - nolint
          disabled: true
        - name: cyclomatic
          disabled: true
        - name: enforce-slice-style
          arguments:
            - make
          disabled: true
        - name: exported
          disabled: true
        - name: file-header
          disabled: true
        - name: function-result-limit
          arguments:
            - 3
        - name: function-length
          disabled: true
        - name: line-length-limit
          disabled: true
        - name: max-public-structs
          disabled: true
        - name: modifies-parameter
          disabled: true
        - name: nested-structs
          disabled: true
        - name: package-comments
          disabled: true
        - name: optimize-operands-order
          disabled: true
        - name: unchecked-type-assertion
          disabled: true
        - name: unhandled-error
          disabled: true
    staticcheck:
      checks:
        - all
        - -ST1000
        - -ST1020
        - -ST1021
        - -ST1022
    tagalign:
      strict: true
    tagliatelle:
      case:
        rules:
          json: snake
    testifylint:
      enable-all: true
    testpackage:
      skip-regexp: ^$
    unparam:
      check-exported: false
    unused:
      field-writes-are-uses: true
      exported-fields-are-used: true
    usestdlibvars:
      http-method: true
      http-status-code: true
      time-weekday: false
      time-month: false
      time-layout: false
      crypto-hash: true
      default-rpc-path: true
      sql-isolation-level: true
      tls-signature-scheme: true
      constant-kind: true
    wrapcheck:
      ignore-package-globs:
        - github.com/gofiber/fiber/*
        - github.com/valyala/fasthttp
  exclusions:
    generated: lax
    rules:
      - text: (?i)do not define dynamic errors, use wrapped static errors instead*
        linters:
          - err113
      - path: log/.*\.go
        linters:
          - depguard
      - path: _test\.go
        linters:
          - bodyclose
          - err113
          - goconst # disabling goconst in test files only
      - source: (?i)fmt.Fprintf?
        linters:
          - errcheck
          - revive
    paths:
      - _msgp\.go
      - _msgp_test\.go
      - third_party$
      - builtin$
      - examples$
issues:
  max-issues-per-linter: 0
  max-same-issues: 0
formatters:
  enable:
    - gofmt
    - gofumpt
    - goimports
  settings:
    gci:
      sections:
        - standard
        - prefix(github.com/gofiber/fiber)
        - default
        - blank
        - dot
      custom-order: true
    gofumpt:
      module-path: github.com/gofiber/fiber
      extra-rules: true
  exclusions:
    generated: lax
    paths:
      - _msgp\.go
      - _msgp_test\.go
      - third_party$
      - builtin$
      - examples$


================================================
FILE: .markdownlint.yml
================================================
# Example markdownlint configuration with all properties set to their default value

# Default state for all rules
default: true

# Path to configuration file to extend
extends: null

# MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md001.md
# NOTE: The docs intentionally jump heading levels for anchor stability, so skip this rule globally.
MD001: false

# MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md003.md
MD003:
  # Heading style
  style: "consistent"

# MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md004.md
MD004:
  # List style
  style: "consistent"

# MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md005.md
MD005: true

# MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md007.md
MD007:
  # Spaces for indent
  indent: 
  # Whether to indent the first level of the list
  start_indented: false
  # Spaces for first level indent (when start_indented is set)
  start_indent: 2

# MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md009.md
MD009:
  # Spaces for line break
  br_spaces: 2
  # Allow spaces for empty lines in list items
  list_item_empty_lines: false
  # Include unnecessary breaks
  strict: true

# MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md010.md
MD010:
  # Include code blocks
  code_blocks: true
  # Fenced code languages to ignore
  ignore_code_languages: []
  # Number of spaces for each hard tab
  spaces_per_tab: 4

# MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md011.md
MD011: true

# MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md012.md
MD012:
  # Consecutive blank lines
  maximum: 1

# MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md013.md
MD013: false

# MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md014.md
MD014: true

# MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md018.md
MD018: true

# MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md019.md
MD019: true

# MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md020.md
MD020: true

# MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md021.md
MD021: true

# MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md022.md
MD022:
  # Blank lines above heading
  lines_above: 1
  # Blank lines below heading
  lines_below: 1

# MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md023.md
MD023: true

# MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md024.md
MD024: false

# MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md025.md
MD025:
  # Heading level
  level: 1
  # RegExp for matching title in front matter
  front_matter_title: "^\\s*title\\s*[:=]"

# MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md026.md
MD026:
  # Punctuation characters
  punctuation: ".,;:!。,;:!"

# MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md027.md
MD027: true

# MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md028.md
MD028: true

# MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md029.md
MD029:
  # List style
  style: "one_or_ordered"

# MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md030.md
MD030:
  # Spaces for single-line unordered list items
  ul_single: 1
  # Spaces for single-line ordered list items
  ol_single: 1
  # Spaces for multi-line unordered list items
  ul_multi: 1
  # Spaces for multi-line ordered list items
  ol_multi: 1

# MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md031.md
MD031:
  # Include list items
  list_items: true

# MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md032.md
MD032: true

# MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md033.md
MD033: false

# MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md034.md
MD034: true

# MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md035.md
MD035:
  # Horizontal rule style
  style: "consistent"

# MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md036.md
MD036:
  # Punctuation characters
  punctuation: ".,;:!?。,;:!?"

# MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md037.md
MD037: true

# MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md038.md
MD038: true

# MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md039.md
MD039: true

# MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md040.md
MD040:
  # List of languages
  allowed_languages: []
  # Require language only
  language_only: false

# MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md041.md
MD041:
  # Heading level
  level: 1
  # RegExp for matching title in front matter
  front_matter_title: "^\\s*title\\s*[:=]"

# MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md042.md
MD042: true

# MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md043.md
MD043: false

# MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md044.md
MD044:
  # List of proper names
  names: []
  # Include code blocks
  code_blocks: true
  # Include HTML elements
  html_elements: true

# MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md045.md
MD045: false

# MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md046.md
MD046:
  # Block style
  style: "fenced"

# MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md047.md
MD047: true

# MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md048.md
MD048:
  # Code fence style
  style: "backtick"

# MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md049.md
MD049:
  # Emphasis style
  style: "consistent"

# MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md050.md
MD050:
  # Strong style
  style: "consistent"

# MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md051.md
MD051: true

# MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md052.md
MD052:
  # Include shortcut syntax
  shortcut_syntax: false

# MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md053.md
MD053:
  # Ignored definitions
  ignored_definitions:
    - "//"

# MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md054.md
MD054:
  # Allow autolinks
  autolink: false
  # Allow inline links and images
  inline: true
  # Allow full reference links and images
  full: true
  # Allow collapsed reference links and images
  collapsed: true
  # Allow shortcut reference links and images
  shortcut: true
  # Allow URLs as inline links
  url_inline: true

# MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md055.md
MD055:
  # Table pipe style
  style: "consistent"

# MD060/table-column-style : Table column style : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md060.md
# NOTE: Legacy docs rely on hand-crafted alignment, so disable this rule to avoid noisy warnings.
MD060: false

# MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md056.md
MD056: true


================================================
FILE: AGENTS.md
================================================
# AGENTS.md

## Agent Instructions

> **Note for the AI agent:** Before running the startup script, verify that all dependencies and CLI tools are already available. If a `vendor/` directory exists **or** `go list -m -mod=readonly all` succeeds (indicating modules are cached), you may skip the entire startup script—including all `go mod` commands and `go install` steps. Otherwise, run the script as listed below.

### General coding practices

- When adding Go tests, always invoke `t.Parallel()` at the start of each test and subtest to maximize concurrency.
- Prefer `github.com/gofiber/utils/v2` helpers (for example, `utils.Trim`) when performing common operations such as string manipulation, whenever it is practical and appropriate for the surrounding code.
- Keep all protocol behavior RFC-compliant (e.g., HTTP/1.1 requirements) and document any intentional deviations.
- Protect hot paths from regressions: profile changes.
- Apply secure-by-default choices (validation, timeouts, sanitization) and ensure new code hardens attack surfaces.

---

## Startup script (reference only – do not run)

- Fetch dependencies:

  ```bash
  go mod tidy && go mod download && go mod vendor
  ```

- Install CLI tools referenced in Makefile:

  ```bash
  go install gotest.tools/gotestsum@latest                 # test runner
  go install golang.org/x/vuln/cmd/govulncheck@latest      # vulnerability scanner
  go install mvdan.cc/gofumpt@latest                       # code formatter
  go install github.com/tinylib/msgp@latest                # msgp codegen
  go install github.com/vburenin/ifacemaker@f30b6f9bdbed4b5c4804ec9ba4a04a999525c202  # interface impls
  go install github.com/dkorunic/betteralign/cmd/betteralign@latest  # struct alignment
  go install golang.org/x/tools/gopls/internal/analysis/modernize/cmd/modernize@latest
  go mod tidy                                              # clean up go.mod & go.sum
  ```

## Makefile commands

Use `make help` to list all available commands. Common targets include:

- **audit**: run `go mod verify`, `go vet`, and `govulncheck` for quality checks.
- **benchmark**: run benchmarks with `go test`.
- **coverage**: generate a coverage report.
- **format**: apply formatting using `gofumpt`.
- **lint**: execute `golangci-lint`.
- **test**: run the test suite with `gotestsum`.
- **longtest**: run the test suite 15 times with shuffling enabled.
- **tidy**: clean and tidy dependencies.
- **betteralign**: optimize struct field alignment.
- **generate**: run `go generate` after installing msgp and ifacemaker.
- **modernize**: run golps modernize

These targets can be invoked via `make <target>` as needed during development and testing.

## Pull request guidelines

- PR titles must start with a category prefix describing the change: `🐛 bug:`, `🔥 feat:`, `📒 docs:`, or `🧹 chore:`.
- Generated PR titles and bodies must summarize the *entire* set of changes on the branch (for example, based on `git log --oneline <base>..HEAD` or the full diff), **not** just the latest commit. The Summary section should reflect all modifications that will be merged.

## Programmatic checks

Before presenting final changes or submitting a pull request, run each of the
following commands and ensure they succeed. Include the command outputs in your
final response to confirm they were executed:

```bash
make audit
make generate
make betteralign
make modernize
make format
make lint
make test
```

All checks must pass before the generated code can be merged.

After completing the programmatic checks above, confirm that any relevant
documentation has been updated to reflect the changes made, including PR
instructions when applicable.


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

Copyright (c) 2019-present Fenny and Contributors

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
================================================
GOVERSION ?= $(shell go env GOVERSION)

## help: 💡 Display available commands
.PHONY: help
help:
	@echo '⚡️ GoFiber/Fiber Development:'
	@sed -n 's/^##//p' ${MAKEFILE_LIST} | column -t -s ':' |  sed -e 's/^/ /'

## audit: 🚀 Conduct quality checks
.PHONY: audit
audit:
	go mod verify
	go vet ./...
	GOTOOLCHAIN=$(GOVERSION) go run golang.org/x/vuln/cmd/govulncheck@latest ./...

## benchmark: 📈 Benchmark code performance
.PHONY: benchmark
benchmark:
	go test ./... -benchmem -bench=. -run=^Benchmark_$

## coverage: ☂️  Generate coverage report
.PHONY: coverage
coverage:
	GOTOOLCHAIN=$(GOVERSION) go run gotest.tools/gotestsum@latest -f testname -- ./... -race -count=1 -coverprofile=/tmp/coverage.out -covermode=atomic
	go tool cover -html=/tmp/coverage.out

## format: 🎨 Fix code format issues
.PHONY: format
format:
	GOTOOLCHAIN=$(GOVERSION) go run mvdan.cc/gofumpt@latest -w -l .

## markdown: 🎨 Find markdown format issues (Requires markdownlint-cli2)
.PHONY: markdown
markdown:
	@which markdownlint-cli2 > /dev/null || npm install -g markdownlint-cli2
	markdownlint-cli2 "**/*.md" "#vendor"

## lint: 🚨 Run lint checks
.PHONY: lint
lint:
	GOTOOLCHAIN=$(GOVERSION) go run github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.5.0 run ./...

## modernize: 🛠 Run gopls modernize
.PHONY: modernize
modernize:
	GOTOOLCHAIN=$(GOVERSION) go run golang.org/x/tools/gopls/internal/analysis/modernize/cmd/modernize@latest -fix -test=false ./...

## test: 🚦 Execute all tests
.PHONY: test
test:
	GOTOOLCHAIN=$(GOVERSION) go run gotest.tools/gotestsum@latest -f testname -- ./... -race -count=1 -shuffle=on

## longtest: 🚦 Execute all tests 10x
.PHONY: longtest
longtest:
	GOTOOLCHAIN=$(GOVERSION) go run gotest.tools/gotestsum@latest -f testname -- ./... -race -count=15 -shuffle=on

## tidy: 📌 Clean and tidy dependencies
.PHONY: tidy
tidy:
	go mod tidy -v

## betteralign: 📐 Optimize alignment of fields in structs
.PHONY: betteralign
betteralign:
	GOTOOLCHAIN=$(GOVERSION) go run github.com/dkorunic/betteralign/cmd/betteralign@v0.8.0 -test_files -generated_files -apply ./...

## generate: ⚡️ Generate msgp && interface implementations
.PHONY: generate
generate:
	go install github.com/tinylib/msgp@latest
	go install github.com/vburenin/ifacemaker@f30b6f9bdbed4b5c4804ec9ba4a04a999525c202
	go generate ./...

# actionspin: 🤖 Bulk replace GitHub actions references from version tags to commit hashes
.PHONY: actionspin
actionspin:
	GOTOOLCHAIN=$(GOVERSION) go run github.com/mashiike/actionspin/cmd/actionspin@latest


================================================
FILE: adapter.go
================================================
package fiber

import (
	"fmt"
	"net/http"
	"reflect"

	"github.com/valyala/fasthttp"
	"github.com/valyala/fasthttp/fasthttpadaptor"
)

// toFiberHandler converts a supported handler type to a Fiber handler.
func toFiberHandler(handler any) (Handler, bool) {
	if handler == nil {
		return nil, false
	}

	switch handler.(type) {
	case Handler, func(Ctx): // (1)-(2) Fiber handlers
		return adaptFiberHandler(handler)
	case func(Req, Res) error, func(Req, Res), func(Req, Res, func() error) error, func(Req, Res, func() error), func(Req, Res, func()) error, func(Req, Res, func()), func(Req, Res, func(error)), func(Req, Res, func(error)) error, func(Req, Res, func(error) error), func(Req, Res, func(error) error) error: // (3)-(12) Express-style request handlers
		return adaptExpressHandler(handler)
	case http.HandlerFunc, http.Handler, func(http.ResponseWriter, *http.Request): // (13)-(15) net/http handlers
		return adaptHTTPHandler(handler)
	case fasthttp.RequestHandler, func(*fasthttp.RequestCtx) error: // (16)-(17) fasthttp handlers
		return adaptFastHTTPHandler(handler)
	default: // (18) unsupported handler type
		return nil, false
	}
}

func adaptFiberHandler(handler any) (Handler, bool) {
	switch h := handler.(type) {
	case Handler: // (1) direct Fiber handler
		if h == nil {
			return nil, false
		}
		return h, true
	case func(Ctx): // (2) Fiber handler without error return
		if h == nil {
			return nil, false
		}
		return func(c Ctx) error {
			h(c)
			return nil
		}, true
	default:
		return nil, false
	}
}

func adaptExpressHandler(handler any) (Handler, bool) {
	switch h := handler.(type) {
	case func(Req, Res) error: // (3) Express-style handler with error return
		if h == nil {
			return nil, false
		}
		return func(c Ctx) error {
			return h(c.Req(), c.Res())
		}, true
	case func(Req, Res): // (4) Express-style handler without error return
		if h == nil {
			return nil, false
		}
		return func(c Ctx) error {
			h(c.Req(), c.Res())
			return nil
		}, true
	case func(Req, Res, func() error) error: // (5) Express-style handler with error-returning next callback and error return
		if h == nil {
			return nil, false
		}
		return func(c Ctx) error {
			return h(c.Req(), c.Res(), func() error {
				return c.Next()
			})
		}, true
	case func(Req, Res, func() error): // (6) Express-style handler with error-returning next callback
		if h == nil {
			return nil, false
		}
		return func(c Ctx) error {
			var nextErr error
			h(c.Req(), c.Res(), func() error {
				nextErr = c.Next()
				return nextErr
			})
			return nextErr
		}, true
	case func(Req, Res, func()) error: // (7) Express-style handler with no-arg next callback and error return
		if h == nil {
			return nil, false
		}
		return func(c Ctx) error {
			var nextErr error
			err := h(c.Req(), c.Res(), func() {
				nextErr = c.Next()
			})
			if err != nil {
				return err
			}
			return nextErr
		}, true
	case func(Req, Res, func()): // (8) Express-style handler with no-arg next callback
		if h == nil {
			return nil, false
		}
		return func(c Ctx) error {
			var nextErr error
			h(c.Req(), c.Res(), func() {
				nextErr = c.Next()
			})
			return nextErr
		}, true
	case func(Req, Res, func(error)): // (9) Express-style handler with error-accepting next callback
		if h == nil {
			return nil, false
		}
		return func(c Ctx) error {
			var nextErr error
			h(c.Req(), c.Res(), func(err error) {
				if err != nil {
					nextErr = err
					return
				}
				nextErr = c.Next()
			})
			return nextErr
		}, true
	case func(Req, Res, func(error)) error: // (10) Express-style handler with error-accepting next callback and error return
		if h == nil {
			return nil, false
		}
		return func(c Ctx) error {
			var nextErr error
			err := h(c.Req(), c.Res(), func(nextErrArg error) {
				if nextErrArg != nil {
					nextErr = nextErrArg
					return
				}
				nextErr = c.Next()
			})
			if err != nil {
				return err
			}
			return nextErr
		}, true
	case func(Req, Res, func(error) error): // (11) Express-style handler with error-accepting next callback that returns an error
		if h == nil {
			return nil, false
		}
		return func(c Ctx) error {
			var nextErr error
			h(c.Req(), c.Res(), func(nextErrArg error) error {
				if nextErrArg != nil {
					nextErr = nextErrArg
					return nextErrArg
				}
				nextErr = c.Next()
				return nextErr
			})
			return nextErr
		}, true
	case func(Req, Res, func(error) error) error: // (12) Express-style handler with error-accepting next callback that returns an error and error return
		if h == nil {
			return nil, false
		}
		return func(c Ctx) error {
			var nextErr error
			err := h(c.Req(), c.Res(), func(nextErrArg error) error {
				if nextErrArg != nil {
					nextErr = nextErrArg
					return nextErrArg
				}
				nextErr = c.Next()
				return nextErr
			})
			if err != nil {
				return err
			}
			return nextErr
		}, true
	default:
		return nil, false
	}
}

func adaptHTTPHandler(handler any) (Handler, bool) {
	switch h := handler.(type) {
	case http.HandlerFunc: // (13) net/http HandlerFunc
		if h == nil {
			return nil, false
		}
		return wrapHTTPHandler(h), true
	case http.Handler: // (14) net/http Handler implementation
		if h == nil {
			return nil, false
		}
		hv := reflect.ValueOf(h)
		if isNilableKind(hv.Kind()) && hv.IsNil() {
			return nil, false
		}
		return wrapHTTPHandler(h), true
	case func(http.ResponseWriter, *http.Request): // (15) net/http function handler
		if h == nil {
			return nil, false
		}
		return wrapHTTPHandler(http.HandlerFunc(h)), true
	default:
		return nil, false
	}
}

func isNilableKind(kind reflect.Kind) bool {
	switch kind {
	case reflect.Chan, reflect.Func, reflect.Map, reflect.Pointer, reflect.Interface, reflect.Slice, reflect.UnsafePointer:
		return true
	default:
		return false
	}
}

func adaptFastHTTPHandler(handler any) (Handler, bool) {
	switch h := handler.(type) {
	case fasthttp.RequestHandler: // (16) fasthttp handler
		if h == nil {
			return nil, false
		}
		return func(c Ctx) error {
			h(c.RequestCtx())
			return nil
		}, true
	case func(*fasthttp.RequestCtx) error: // (17) fasthttp handler with error return
		if h == nil {
			return nil, false
		}
		return func(c Ctx) error {
			return h(c.RequestCtx())
		}, true
	default:
		return nil, false
	}
}

// wrapHTTPHandler adapts a net/http handler to a Fiber handler.
func wrapHTTPHandler(handler http.Handler) Handler {
	if handler == nil {
		return nil
	}

	adapted := fasthttpadaptor.NewFastHTTPHandler(handler)

	return func(c Ctx) error {
		adapted(c.RequestCtx())
		return nil
	}
}

// collectHandlers converts a slice of handler arguments to Fiber handlers.
// The context string is used to provide informative panic messages when an
// unsupported handler type is encountered.
func collectHandlers(context string, args ...any) []Handler {
	handlers := make([]Handler, 0, len(args))

	for i, arg := range args {
		handler, ok := toFiberHandler(arg)

		if !ok {
			panic(fmt.Sprintf("%s: invalid handler #%d (%T)\n", context, i, arg))
		}
		handlers = append(handlers, handler)
	}

	return handlers
}


================================================
FILE: adapter_test.go
================================================
package fiber

import (
	"errors"
	"fmt"
	"io"
	"net/http"
	"net/http/httptest"
	"os"
	"reflect"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	"github.com/valyala/fasthttp"
)

func TestToFiberHandler_Nil(t *testing.T) {
	t.Parallel()

	var handler Handler
	converted, ok := toFiberHandler(handler)
	require.False(t, ok)
	require.Nil(t, converted)
}

func TestToFiberHandler_FiberHandler(t *testing.T) {
	t.Parallel()

	fiberHandler := func(c Ctx) error { return c.SendStatus(http.StatusAccepted) }

	converted, ok := toFiberHandler(fiberHandler)
	require.True(t, ok)
	require.NotNil(t, converted)
	require.Equal(t, reflect.ValueOf(fiberHandler).Pointer(), reflect.ValueOf(converted).Pointer())
}

func TestToFiberHandler_FiberHandlerNoErrorReturn(t *testing.T) {
	t.Parallel()

	app, ctx := newTestCtx(t)

	handler := func(c Ctx) {
		require.Equal(t, app, c.App())
		c.Set("X-Handler", "ok")
	}

	converted, ok := toFiberHandler(handler)
	require.True(t, ok)
	require.NotNil(t, converted)

	require.NoError(t, converted(ctx))
	require.Equal(t, "ok", string(ctx.Response().Header.Peek("X-Handler")))
}

func TestNewTestCtx_ReturnsDefaultCtx(t *testing.T) {
	t.Parallel()

	app, ctx := newTestCtx(t)
	require.NotNil(t, app)
	require.NotNil(t, ctx)
	require.Equal(t, app, ctx.App())
}

func newTestCtx(t *testing.T) (*App, *DefaultCtx) {
	t.Helper()

	app := New()
	fasthttpCtx := &fasthttp.RequestCtx{}
	customCtx := app.AcquireCtx(fasthttpCtx)
	ctx, ok := customCtx.(*DefaultCtx)
	require.True(t, ok)

	t.Cleanup(func() {
		app.ReleaseCtx(customCtx)
	})

	return app, ctx
}

func withRouteHandlers(t *testing.T, ctx *DefaultCtx, handlers ...Handler) {
	t.Helper()

	ctx.route = &Route{Handlers: handlers}
	ctx.indexHandler = 0
	t.Cleanup(func() {
		ctx.route = nil
		ctx.indexHandler = 0
	})
}

func TestToFiberHandler_ExpressTwoParamsWithError(t *testing.T) {
	t.Parallel()

	app, ctx := newTestCtx(t)

	handler := func(req Req, res Res) error {
		assert.Equal(t, app, req.App())
		assert.Equal(t, app, res.App())
		return res.SendString("express")
	}

	converted, ok := toFiberHandler(handler)
	require.True(t, ok)

	require.NoError(t, converted(ctx))
	require.Equal(t, "express", string(ctx.Response().Body()))
}

func TestToFiberHandler_ExpressTwoParamsWithoutError(t *testing.T) {
	t.Parallel()

	app, ctx := newTestCtx(t)

	handler := func(req Req, res Res) {
		assert.Equal(t, app, req.App())
		require.NoError(t, res.SendStatus(http.StatusCreated))
	}

	converted, ok := toFiberHandler(handler)
	require.True(t, ok)

	require.NoError(t, converted(ctx))
	require.Equal(t, http.StatusCreated, ctx.Response().StatusCode())
}

func TestToFiberHandler_ExpressThreeParamsWithError(t *testing.T) {
	t.Parallel()

	app, ctx := newTestCtx(t)

	handler := func(req Req, res Res, next func() error) error {
		assert.Equal(t, app, req.App())
		assert.Equal(t, app, res.App())
		return next()
	}

	converted, ok := toFiberHandler(handler)
	require.True(t, ok)

	nextErr := errors.New("next")
	nextCalled := false
	nextHandler := func(_ Ctx) error {
		nextCalled = true
		return nextErr
	}

	withRouteHandlers(t, ctx, converted, nextHandler)

	err := converted(ctx)
	require.ErrorIs(t, err, nextErr)
	require.True(t, nextCalled)
}

func TestToFiberHandler_ExpressThreeParamsWithoutError(t *testing.T) {
	t.Parallel()

	app, ctx := newTestCtx(t)

	handler := func(req Req, _ Res, next func() error) {
		assert.Equal(t, app, req.App())
		err := next()
		require.Error(t, err)
		assert.EqualError(t, err, "next without error")
	}

	converted, ok := toFiberHandler(handler)
	require.True(t, ok)

	nextHandler := func(_ Ctx) error {
		return errors.New("next without error")
	}

	withRouteHandlers(t, ctx, converted, nextHandler)

	err := converted(ctx)
	require.EqualError(t, err, "next without error")
}

func TestToFiberHandler_ExpressNextNoArgWithErrorReturn(t *testing.T) {
	t.Parallel()

	app, ctx := newTestCtx(t)

	handler := func(req Req, res Res, next func()) error {
		assert.Equal(t, app, req.App())
		assert.Equal(t, app, res.App())
		next()
		return nil
	}

	converted, ok := toFiberHandler(handler)
	require.True(t, ok)

	nextErr := errors.New("next without return value")
	nextCalled := false
	nextHandler := func(_ Ctx) error {
		nextCalled = true
		return nextErr
	}

	withRouteHandlers(t, ctx, converted, nextHandler)

	err := converted(ctx)
	require.ErrorIs(t, err, nextErr)
	require.True(t, nextCalled)
}

func TestToFiberHandler_ExpressNextWithErrorContinuesOnNil(t *testing.T) {
	t.Parallel()

	app, ctx := newTestCtx(t)

	handler := func(req Req, res Res, next func(error)) {
		assert.Equal(t, app, req.App())
		assert.Equal(t, app, res.App())
		next(nil)
	}

	converted, ok := toFiberHandler(handler)
	require.True(t, ok)

	nextCalled := false
	nextHandler := func(_ Ctx) error {
		nextCalled = true
		return nil
	}

	withRouteHandlers(t, ctx, converted, nextHandler)

	err := converted(ctx)
	require.NoError(t, err)
	require.True(t, nextCalled)
}

func TestToFiberHandler_ExpressNextWithErrorShortCircuitsOnError(t *testing.T) {
	t.Parallel()

	app, ctx := newTestCtx(t)

	handler := func(req Req, res Res, next func(error)) {
		assert.Equal(t, app, req.App())
		assert.Equal(t, app, res.App())
		next(errors.New("next error"))
	}

	converted, ok := toFiberHandler(handler)
	require.True(t, ok)

	nextCalled := false
	nextHandler := func(_ Ctx) error {
		nextCalled = true
		return nil
	}

	withRouteHandlers(t, ctx, converted, nextHandler)

	err := converted(ctx)
	require.EqualError(t, err, "next error")
	require.False(t, nextCalled)
}

func TestToFiberHandler_ExpressNextWithErrorReturn_ShortCircuitsOnNextError(t *testing.T) {
	t.Parallel()

	app, ctx := newTestCtx(t)

	handler := func(req Req, res Res, next func(error)) error {
		assert.Equal(t, app, req.App())
		assert.Equal(t, app, res.App())
		next(errors.New("next error"))
		return nil
	}

	converted, ok := toFiberHandler(handler)
	require.True(t, ok)

	nextCalled := false
	nextHandler := func(_ Ctx) error {
		nextCalled = true
		return nil
	}

	withRouteHandlers(t, ctx, converted, nextHandler)

	err := converted(ctx)
	require.EqualError(t, err, "next error")
	require.False(t, nextCalled)
}

func TestToFiberHandler_ExpressNextWithErrorReturnCallback_PropagatesNextError(t *testing.T) {
	t.Parallel()

	app, ctx := newTestCtx(t)

	handler := func(req Req, res Res, next func(error) error) {
		assert.Equal(t, app, req.App())
		assert.Equal(t, app, res.App())
		require.EqualError(t, next(nil), "next error")
	}

	converted, ok := toFiberHandler(handler)
	require.True(t, ok)

	nextErr := errors.New("next error")
	nextCalled := false
	nextHandler := func(_ Ctx) error {
		nextCalled = true
		return nextErr
	}

	withRouteHandlers(t, ctx, converted, nextHandler)

	err := converted(ctx)
	require.ErrorIs(t, err, nextErr)
	require.True(t, nextCalled)
}

func TestToFiberHandler_ExpressNextWithErrorReturnCallback_ShortCircuitsOnNextError(t *testing.T) {
	t.Parallel()

	app, ctx := newTestCtx(t)

	handler := func(req Req, res Res, next func(error) error) {
		assert.Equal(t, app, req.App())
		assert.Equal(t, app, res.App())
		require.EqualError(t, next(errors.New("next error")), "next error")
	}

	converted, ok := toFiberHandler(handler)
	require.True(t, ok)

	nextCalled := false
	nextHandler := func(_ Ctx) error {
		nextCalled = true
		return nil
	}

	withRouteHandlers(t, ctx, converted, nextHandler)

	err := converted(ctx)
	require.EqualError(t, err, "next error")
	require.False(t, nextCalled)
}

func TestToFiberHandler_ExpressNextWithErrorReturn_PrefersHandlerErrorOverNextError(t *testing.T) {
	t.Parallel()

	app, ctx := newTestCtx(t)

	handler := func(req Req, res Res, next func(error) error) error {
		assert.Equal(t, app, req.App())
		assert.Equal(t, app, res.App())
		require.EqualError(t, next(errors.New("next error")), "next error")
		return errors.New("handler error")
	}

	converted, ok := toFiberHandler(handler)
	require.True(t, ok)

	nextCalled := false
	nextHandler := func(_ Ctx) error {
		nextCalled = true
		return nil
	}

	withRouteHandlers(t, ctx, converted, nextHandler)

	err := converted(ctx)
	require.EqualError(t, err, "handler error")
	require.False(t, nextCalled)
}

func TestToFiberHandler_ExpressNextWithErrorReturn_PropagatesNextErrorWhenNoReturnError(t *testing.T) {
	t.Parallel()

	app, ctx := newTestCtx(t)

	handler := func(req Req, res Res, next func(error) error) error {
		assert.Equal(t, app, req.App())
		assert.Equal(t, app, res.App())
		return next(errors.New("next error"))
	}

	converted, ok := toFiberHandler(handler)
	require.True(t, ok)

	nextCalled := false
	nextHandler := func(_ Ctx) error {
		nextCalled = true
		return nil
	}

	withRouteHandlers(t, ctx, converted, nextHandler)

	err := converted(ctx)
	require.EqualError(t, err, "next error")
	require.False(t, nextCalled)
}

func TestToFiberHandler_ExpressNextWithErrorReturnCallback_StopsChainWithoutNextCall(t *testing.T) {
	t.Parallel()

	app, ctx := newTestCtx(t)

	handler := func(req Req, res Res, _ func(error) error) {
		assert.Equal(t, app, req.App())
		assert.Equal(t, app, res.App())
		// Intentionally do not call next.
	}

	converted, ok := toFiberHandler(handler)
	require.True(t, ok)

	nextCalled := false
	nextHandler := func(_ Ctx) error {
		nextCalled = true
		return errors.New("should not be called")
	}

	withRouteHandlers(t, ctx, converted, nextHandler)

	err := converted(ctx)
	require.NoError(t, err)
	require.False(t, nextCalled)
}

func TestAdapter_MixedHandlerIntegration(t *testing.T) {
	app := New()

	app.Use(func(c Ctx) error {
		c.Set("X-Middleware", "fiber")
		return c.Next()
	})

	app.Use(func(_ Req, res Res, next func() error) error {
		res.Set("X-Express", "middleware")
		return next()
	})

	app.Get("/fiber", func(c Ctx) error {
		c.Set("X-Route", "fiber")
		return c.SendString("fiber handler")
	})

	app.Post("/express", func(_ Req, res Res) error {
		res.Set("X-Route", "express")
		return res.SendString("express handler")
	})

	var httpHandlerWriteErr error
	app.Put("/http", func(w http.ResponseWriter, _ *http.Request) {
		w.Header().Set("X-Route", "http")
		w.WriteHeader(http.StatusAccepted)
		_, httpHandlerWriteErr = w.Write([]byte("http handler"))
	})

	app.Delete("/fasthttp", func(ctx *fasthttp.RequestCtx) error {
		ctx.Response.Header.Set("X-Route", "fasthttp")
		ctx.SetStatusCode(http.StatusCreated)
		ctx.SetBodyString("fasthttp handler")
		return nil
	})

	run := func(name string, buildRequest func() *http.Request, expectStatus int, expectBody, expectRoute string) {
		t.Run(name, func(t *testing.T) {
			req := buildRequest()

			resp, err := app.Test(req)
			require.NoError(t, err)
			t.Cleanup(func() {
				require.NoError(t, resp.Body.Close())
			})

			body, err := io.ReadAll(resp.Body)
			require.NoError(t, err)

			require.Equal(t, expectStatus, resp.StatusCode)
			require.Equal(t, expectBody, string(body))
			require.Equal(t, "fiber", resp.Header.Get("X-Middleware"))
			require.Equal(t, "middleware", resp.Header.Get("X-Express"))
			require.Equal(t, expectRoute, resp.Header.Get("X-Route"))
		})
	}

	run("fiber", func() *http.Request {
		return httptest.NewRequest(http.MethodGet, "/fiber", http.NoBody)
	}, http.StatusOK, "fiber handler", "fiber")

	run("express", func() *http.Request {
		return httptest.NewRequest(http.MethodPost, "/express", http.NoBody)
	}, http.StatusOK, "express handler", "express")

	run("net/http", func() *http.Request {
		return httptest.NewRequest(http.MethodPut, "/http", http.NoBody)
	}, http.StatusAccepted, "http handler", "http")

	require.NoError(t, httpHandlerWriteErr)

	run("fasthttp", func() *http.Request {
		return httptest.NewRequest(http.MethodDelete, "/fasthttp", http.NoBody)
	}, http.StatusCreated, "fasthttp handler", "fasthttp")
}

func TestToFiberHandler_ExpressNextNoArgPropagatesError(t *testing.T) {
	t.Parallel()

	app, ctx := newTestCtx(t)

	handler := func(req Req, res Res, next func()) {
		assert.Equal(t, app, req.App())
		assert.Equal(t, app, res.App())
		next()
	}

	converted, ok := toFiberHandler(handler)
	require.True(t, ok)

	nextErr := errors.New("next without return value")
	nextCalled := false
	nextHandler := func(_ Ctx) error {
		nextCalled = true
		return nextErr
	}

	withRouteHandlers(t, ctx, converted, nextHandler)

	err := converted(ctx)
	require.ErrorIs(t, err, nextErr)
	require.True(t, nextCalled)
}

func TestToFiberHandler_ExpressNextNoArgStopsChain(t *testing.T) {
	t.Parallel()

	app, ctx := newTestCtx(t)

	handler := func(req Req, res Res, _ func()) {
		assert.Equal(t, app, req.App())
		assert.Equal(t, app, res.App())
		// Intentionally do not call next().
	}

	converted, ok := toFiberHandler(handler)
	require.True(t, ok)

	nextCalled := false
	nextHandler := func(_ Ctx) error {
		nextCalled = true
		return errors.New("should not be called")
	}

	withRouteHandlers(t, ctx, converted, nextHandler)

	err := converted(ctx)
	require.NoError(t, err)
	require.False(t, nextCalled)
}

func TestToFiberHandler_ExpressNextNoArgMiddleware(t *testing.T) {
	t.Parallel()

	app := New()
	t.Cleanup(func() {
		require.NoError(t, app.Shutdown())
	})

	callOrder := make([]string, 0, 2)

	app.Use(func(req Req, res Res, next func()) {
		callOrder = append(callOrder, "middleware")
		next()
		assert.Equal(t, app, req.App())
		assert.Equal(t, app, res.App())
	})

	app.Get("/", func(c Ctx) error {
		callOrder = append(callOrder, "handler")
		return c.SendStatus(http.StatusOK)
	})

	req := httptest.NewRequest(http.MethodGet, "/", http.NoBody)
	resp, err := app.Test(req)
	require.NoError(t, err)
	require.Equal(t, http.StatusOK, resp.StatusCode)
	require.NoError(t, resp.Body.Close())

	require.Equal(t, []string{"middleware", "handler"}, callOrder)
}

func TestCollectHandlers_HTTPHandler(t *testing.T) {
	t.Parallel()

	var writeErr error
	httpHandler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
		w.Header().Set("X-HTTP", "ok")
		w.WriteHeader(http.StatusTeapot)
		_, writeErr = w.Write([]byte("http"))
	})

	handlers := collectHandlers("test", httpHandler)
	require.Len(t, handlers, 1)
	converted := handlers[0]
	require.NotNil(t, converted)

	app := New()
	ctx := app.AcquireCtx(&fasthttp.RequestCtx{})
	t.Cleanup(func() {
		app.ReleaseCtx(ctx)
	})

	err := converted(ctx)
	require.NoError(t, err)
	require.Equal(t, http.StatusTeapot, ctx.Response().StatusCode())
	require.Equal(t, "ok", string(ctx.Response().Header.Peek("X-HTTP")))
	require.Equal(t, "http", string(ctx.Response().Body()))
	require.NoError(t, writeErr)
}

func TestToFiberHandler_HTTPHandler(t *testing.T) {
	t.Parallel()

	var writeErr error
	var handler http.Handler = http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
		w.Header().Set("X-HTTP", "handler")
		_, writeErr = w.Write([]byte("through"))
	})

	converted, ok := toFiberHandler(handler)
	require.True(t, ok)
	require.NotNil(t, converted)

	app := New()
	ctx := app.AcquireCtx(&fasthttp.RequestCtx{})
	t.Cleanup(func() {
		app.ReleaseCtx(ctx)
	})

	err := converted(ctx)
	require.NoError(t, err)
	require.Equal(t, "handler", string(ctx.Response().Header.Peek("X-HTTP")))
	require.Equal(t, "through", string(ctx.Response().Body()))
	require.NoError(t, writeErr)
}

func TestToFiberHandler_FasthttpHandlerWithError(t *testing.T) {
	t.Parallel()

	_, ctx := newTestCtx(t)

	fasthttpHandler := func(fctx *fasthttp.RequestCtx) error {
		fctx.Response.Header.Set("X-FASTHTTP", "error")
		return errors.New("fasthttp error")
	}

	converted, ok := toFiberHandler(fasthttpHandler)
	require.True(t, ok)
	require.NotNil(t, converted)

	err := converted(ctx)
	require.EqualError(t, err, "fasthttp error")
	require.Equal(t, "error", string(ctx.Response().Header.Peek("X-FASTHTTP")))
}

func TestToFiberHandler_HTTPHandler_Flush(t *testing.T) {
	t.Parallel()

	var handler http.Handler = http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
		w.Header().Set("X-HTTP", "handler")
		_, err := w.Write([]byte("through"))
		flusher, ok := w.(http.Flusher)
		assert.True(t, ok, "w does not implement http.Flusher")
		flusher.Flush()
		assert.NoError(t, err)
	})

	converted, ok := toFiberHandler(handler)
	require.True(t, ok)
	require.NotNil(t, converted)

	app := New()
	ctx := app.AcquireCtx(&fasthttp.RequestCtx{})
	t.Cleanup(func() {
		app.ReleaseCtx(ctx)
	})

	err := converted(ctx)
	require.NoError(t, err)
	require.Equal(t, "handler", string(ctx.Response().Header.Peek("X-HTTP")))
	require.Equal(t, "through", string(ctx.Response().Body()))
}

func TestWrapHTTPHandler_Flush_App_Test(t *testing.T) {
	t.Parallel()

	app := New()

	app.Get("/", func(w http.ResponseWriter, _ *http.Request) {
		flusher, ok := w.(http.Flusher)
		if !ok {
			t.Fatal("w does not implement http.Flusher")
		}
		w.WriteHeader(StatusOK)
		fmt.Fprintf(w, "Hello ")
		flusher.Flush()
		fmt.Fprintf(w, "World!")
	})

	resp, err := app.Test(httptest.NewRequest(MethodGet, "/", http.NoBody))
	require.NoError(t, err)
	defer resp.Body.Close() //nolint:errcheck // not needed

	require.Equal(t, StatusOK, resp.StatusCode)

	body, err := io.ReadAll(resp.Body)
	require.NoError(t, err)
	require.Equal(t, "Hello World!", string(body))
}

func Test_HTTPHandler_App_Test_Interrupted(t *testing.T) {
	t.Parallel()

	app := New()

	app.Get("/", func(w http.ResponseWriter, _ *http.Request) {
		flusher, ok := w.(http.Flusher)
		if !ok {
			t.Fatal("w does not implement http.Flusher")
		}
		w.WriteHeader(StatusOK)
		fmt.Fprintf(w, "Hello ")
		flusher.Flush()
		time.Sleep(500 * time.Millisecond)
		fmt.Fprintf(w, "World!")
	})

	resp, err := app.Test(httptest.NewRequest(MethodGet, "/", http.NoBody), TestConfig{
		Timeout:       200 * time.Millisecond,
		FailOnTimeout: true, // Changed to true to test interrupted behavior
	})
	// With FailOnTimeout: true, we should get a timeout error
	require.ErrorIs(t, err, os.ErrDeadlineExceeded)
	require.Nil(t, resp)
}

func TestToFiberHandler_HTTPHandlerFunc(t *testing.T) {
	t.Parallel()

	httpFunc := func(w http.ResponseWriter, _ *http.Request) {
		w.WriteHeader(http.StatusNoContent)
	}

	converted, ok := toFiberHandler(httpFunc)
	require.True(t, ok)
	require.NotNil(t, converted)

	app := New()
	ctx := app.AcquireCtx(&fasthttp.RequestCtx{})
	t.Cleanup(func() {
		app.ReleaseCtx(ctx)
	})

	err := converted(ctx)
	require.NoError(t, err)
	require.Equal(t, http.StatusNoContent, ctx.Response().StatusCode())
}

func TestWrapHTTPHandler_Nil(t *testing.T) {
	t.Parallel()

	require.Nil(t, wrapHTTPHandler(nil))
}

func TestCollectHandlers_InvalidType(t *testing.T) {
	t.Parallel()

	require.PanicsWithValue(t, "context: invalid handler #0 (int)\n", func() {
		collectHandlers("context", 42)
	})
}

func TestCollectHandlers_TypedNilHTTPHandlers(t *testing.T) {
	t.Parallel()

	var handlerFunc http.HandlerFunc
	var handler http.Handler
	var raw func(http.ResponseWriter, *http.Request)

	tests := []struct {
		handler any
		name    string
	}{
		{
			name:    "HandlerFunc",
			handler: handlerFunc,
		},
		{
			name:    "Handler",
			handler: handler,
		},
		{
			name:    "Function",
			handler: raw,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			t.Parallel()

			expected := fmt.Sprintf("context: invalid handler #0 (%T)\n", tt.handler)

			require.PanicsWithValue(t, expected, func() {
				collectHandlers("context", tt.handler)
			})
		})
	}
}

type dummyHandler struct{}

func (dummyHandler) ServeHTTP(http.ResponseWriter, *http.Request) {}

type dummyFuncHandler func(http.ResponseWriter, *http.Request)

func (handler dummyFuncHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	if handler == nil {
		return
	}
	handler(w, r)
}

func TestCollectHandlers_TypedNilPointerHTTPHandler(t *testing.T) {
	t.Parallel()

	var handler http.Handler = (*dummyHandler)(nil)

	require.PanicsWithValue(t, "context: invalid handler #0 (*fiber.dummyHandler)\n", func() {
		collectHandlers("context", handler)
	})
}

func TestCollectHandlers_TypedNilFuncHTTPHandler(t *testing.T) {
	t.Parallel()

	var handler http.Handler = dummyFuncHandler(nil)
	expected := fmt.Sprintf("context: invalid handler #0 (%T)\n", handler)

	require.PanicsWithValue(t, expected, func() {
		collectHandlers("context", handler)
	})
}

func TestCollectHandlers_TypedNilFasthttpHandlers(t *test
Download .txt
gitextract_9m90gl79/

├── .cspell.json
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── .editorconfig
│   ├── .hound.yml
│   ├── CODEOWNERS
│   ├── CODE_OF_CONDUCT.md
│   ├── CONTRIBUTING.md
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.yaml
│   │   ├── config.yml
│   │   ├── feature-request.yaml
│   │   ├── maintenance-task.yaml
│   │   └── question.yaml
│   ├── README.md
│   ├── SECURITY.md
│   ├── codecov.yml
│   ├── config.yml
│   ├── copilot-instructions.md
│   ├── copilot-setup-steps.yml
│   ├── dependabot.yml
│   ├── index.html
│   ├── labeler.yml
│   ├── pull_request_template.md
│   ├── release-drafter.yml
│   ├── release.yml
│   ├── scripts/
│   │   └── sync_docs.sh
│   ├── testdata/
│   │   ├── ca-chain.cert.pem
│   │   ├── fs/
│   │   │   ├── css/
│   │   │   │   ├── style.css
│   │   │   │   └── test/
│   │   │   │       └── style2.css
│   │   │   ├── img/
│   │   │   │   ├── fiberpng
│   │   │   │   └── fiberpng.notvalidext
│   │   │   └── index.html
│   │   ├── hello_world.tmpl
│   │   ├── index.html
│   │   ├── index.tmpl
│   │   ├── main.tmpl
│   │   ├── ssl.key
│   │   ├── ssl.pem
│   │   ├── template-invalid.html
│   │   ├── template.tmpl
│   │   └── testRoutes.json
│   ├── testdata2/
│   │   └── bruh.tmpl
│   ├── testdata3/
│   │   └── hello_world.tmpl
│   └── workflows/
│       ├── auto-labeler.yml
│       ├── benchmark.yml
│       ├── codeql-analysis.yml
│       ├── dependabot_automerge.yml
│       ├── linter.yml
│       ├── manual-dependabot.yml
│       ├── markdown.yml
│       ├── modernize.yml
│       ├── move-closed-milestone-items.yml
│       ├── release-drafter.yml
│       ├── spell-check.yml
│       ├── sync-docs.yml
│       ├── test.yml
│       ├── v3-label-automation.yml
│       └── vulncheck.yml
├── .gitignore
├── .golangci.yml
├── .markdownlint.yml
├── AGENTS.md
├── LICENSE
├── Makefile
├── adapter.go
├── adapter_test.go
├── addon/
│   └── retry/
│       ├── README.md
│       ├── config.go
│       ├── config_test.go
│       ├── exponential_backoff.go
│       └── exponential_backoff_test.go
├── app.go
├── app_integration_test.go
├── app_test.go
├── bind.go
├── bind_test.go
├── binder/
│   ├── README.md
│   ├── binder.go
│   ├── binder_test.go
│   ├── cbor.go
│   ├── cbor_test.go
│   ├── cookie.go
│   ├── cookie_test.go
│   ├── form.go
│   ├── form_test.go
│   ├── header.go
│   ├── header_test.go
│   ├── json.go
│   ├── json_test.go
│   ├── mapping.go
│   ├── mapping_test.go
│   ├── msgpack.go
│   ├── msgpack_test.go
│   ├── query.go
│   ├── query_test.go
│   ├── resp_header.go
│   ├── resp_header_test.go
│   ├── uri.go
│   ├── uri_test.go
│   ├── xml.go
│   └── xml_test.go
├── client/
│   ├── README.md
│   ├── client.go
│   ├── client_test.go
│   ├── cookiejar.go
│   ├── cookiejar_test.go
│   ├── core.go
│   ├── core_test.go
│   ├── errors.go
│   ├── helper_test.go
│   ├── hooks.go
│   ├── hooks_test.go
│   ├── request.go
│   ├── request_bench_test.go
│   ├── request_test.go
│   ├── response.go
│   ├── response_test.go
│   ├── transport.go
│   └── transport_test.go
├── color.go
├── constants.go
├── ctx.go
├── ctx_interface.go
├── ctx_interface_gen.go
├── ctx_test.go
├── docs/
│   ├── addon/
│   │   ├── _category_.json
│   │   └── retry.md
│   ├── api/
│   │   ├── _category_.json
│   │   ├── app.md
│   │   ├── bind.md
│   │   ├── constants.md
│   │   ├── ctx.md
│   │   ├── fiber.md
│   │   ├── hooks.md
│   │   ├── log.md
│   │   ├── redirect.md
│   │   ├── services.md
│   │   └── state.md
│   ├── client/
│   │   ├── _category_.json
│   │   ├── examples.md
│   │   ├── hooks.md
│   │   ├── request.md
│   │   ├── response.md
│   │   └── rest.md
│   ├── extra/
│   │   ├── _category_.json
│   │   ├── benchmarks.md
│   │   ├── faq.md
│   │   ├── internal.md
│   │   └── learning-resources.md
│   ├── guide/
│   │   ├── _category_.json
│   │   ├── advance-format.md
│   │   ├── context.md
│   │   ├── error-handling.md
│   │   ├── extractors.md
│   │   ├── faster-fiber.md
│   │   ├── grouping.md
│   │   ├── reverse-proxy.md
│   │   ├── routing.md
│   │   ├── templates.md
│   │   ├── utils.md
│   │   └── validation.md
│   ├── intro.md
│   ├── middleware/
│   │   ├── _category_.json
│   │   ├── adaptor.md
│   │   ├── basicauth.md
│   │   ├── cache.md
│   │   ├── compress.md
│   │   ├── cors.md
│   │   ├── csrf.md
│   │   ├── earlydata.md
│   │   ├── encryptcookie.md
│   │   ├── envvar.md
│   │   ├── etag.md
│   │   ├── expvar.md
│   │   ├── favicon.md
│   │   ├── healthcheck.md
│   │   ├── helmet.md
│   │   ├── idempotency.md
│   │   ├── keyauth.md
│   │   ├── limiter.md
│   │   ├── logger.md
│   │   ├── paginate.md
│   │   ├── pprof.md
│   │   ├── proxy.md
│   │   ├── recover.md
│   │   ├── redirect.md
│   │   ├── requestid.md
│   │   ├── responsetime.md
│   │   ├── rewrite.md
│   │   ├── session.md
│   │   ├── skip.md
│   │   ├── static.md
│   │   └── timeout.md
│   ├── partials/
│   │   └── routing/
│   │       └── handler.md
│   └── whats_new.md
├── error.go
├── error_test.go
├── errors_internal.go
├── extractors/
│   ├── README.md
│   ├── extractors.go
│   └── extractors_test.go
├── go.mod
├── go.sum
├── group.go
├── helpers.go
├── helpers_fuzz_test.go
├── helpers_test.go
├── hooks.go
├── hooks_test.go
├── internal/
│   ├── memory/
│   │   ├── memory.go
│   │   └── memory_test.go
│   ├── storage/
│   │   └── memory/
│   │       ├── config.go
│   │       ├── memory.go
│   │       └── memory_test.go
│   └── tlstest/
│       └── tls.go
├── listen.go
├── listen_test.go
├── log/
│   ├── default.go
│   ├── default_test.go
│   ├── fiberlog.go
│   ├── fiberlog_test.go
│   └── log.go
├── middleware/
│   ├── adaptor/
│   │   ├── adaptor.go
│   │   └── adaptor_test.go
│   ├── basicauth/
│   │   ├── basicauth.go
│   │   ├── basicauth_test.go
│   │   └── config.go
│   ├── cache/
│   │   ├── cache.go
│   │   ├── cache_test.go
│   │   ├── config.go
│   │   ├── heap.go
│   │   ├── manager.go
│   │   ├── manager_msgp.go
│   │   ├── manager_msgp_test.go
│   │   └── manager_test.go
│   ├── compress/
│   │   ├── compress.go
│   │   ├── compress_test.go
│   │   └── config.go
│   ├── cors/
│   │   ├── config.go
│   │   ├── cors.go
│   │   ├── cors_test.go
│   │   ├── utils.go
│   │   └── utils_test.go
│   ├── csrf/
│   │   ├── config.go
│   │   ├── config_test.go
│   │   ├── csrf.go
│   │   ├── csrf_test.go
│   │   ├── helpers.go
│   │   ├── helpers_test.go
│   │   ├── session_manager.go
│   │   ├── storage_manager.go
│   │   ├── storage_manager_msgp.go
│   │   ├── storage_manager_msgp_test.go
│   │   └── token.go
│   ├── earlydata/
│   │   ├── config.go
│   │   ├── earlydata.go
│   │   └── earlydata_test.go
│   ├── encryptcookie/
│   │   ├── config.go
│   │   ├── config_test.go
│   │   ├── encryptcookie.go
│   │   ├── encryptcookie_test.go
│   │   └── utils.go
│   ├── envvar/
│   │   ├── config.go
│   │   ├── envvar.go
│   │   └── envvar_test.go
│   ├── etag/
│   │   ├── config.go
│   │   ├── etag.go
│   │   └── etag_test.go
│   ├── expvar/
│   │   ├── config.go
│   │   ├── expvar.go
│   │   └── expvar_test.go
│   ├── favicon/
│   │   ├── config.go
│   │   ├── favicon.go
│   │   └── favicon_test.go
│   ├── healthcheck/
│   │   ├── config.go
│   │   ├── healthcheck.go
│   │   └── healthcheck_test.go
│   ├── helmet/
│   │   ├── config.go
│   │   ├── helmet.go
│   │   └── helmet_test.go
│   ├── idempotency/
│   │   ├── config.go
│   │   ├── idempotency.go
│   │   ├── idempotency_test.go
│   │   ├── locker.go
│   │   ├── locker_test.go
│   │   ├── response.go
│   │   ├── response_msgp.go
│   │   ├── response_msgp_test.go
│   │   └── stub_test.go
│   ├── keyauth/
│   │   ├── config.go
│   │   ├── config_test.go
│   │   ├── keyauth.go
│   │   └── keyauth_test.go
│   ├── limiter/
│   │   ├── config.go
│   │   ├── limiter.go
│   │   ├── limiter_fixed.go
│   │   ├── limiter_sliding.go
│   │   ├── limiter_test.go
│   │   ├── manager.go
│   │   ├── manager_msgp.go
│   │   └── manager_msgp_test.go
│   ├── logger/
│   │   ├── config.go
│   │   ├── data.go
│   │   ├── default_logger.go
│   │   ├── errors.go
│   │   ├── format.go
│   │   ├── logger.go
│   │   ├── logger_test.go
│   │   ├── tags.go
│   │   ├── template_chain.go
│   │   └── utils.go
│   ├── paginate/
│   │   ├── config.go
│   │   ├── page_info.go
│   │   ├── paginate.go
│   │   └── paginate_test.go
│   ├── pprof/
│   │   ├── config.go
│   │   ├── pprof.go
│   │   └── pprof_test.go
│   ├── proxy/
│   │   ├── config.go
│   │   ├── proxy.go
│   │   └── proxy_test.go
│   ├── recover/
│   │   ├── config.go
│   │   ├── recover.go
│   │   └── recover_test.go
│   ├── redirect/
│   │   ├── config.go
│   │   ├── redirect.go
│   │   └── redirect_test.go
│   ├── requestid/
│   │   ├── config.go
│   │   ├── requestid.go
│   │   └── requestid_test.go
│   ├── responsetime/
│   │   ├── config.go
│   │   ├── responsetime.go
│   │   └── responsetime_test.go
│   ├── rewrite/
│   │   ├── config.go
│   │   ├── rewrite.go
│   │   └── rewrite_test.go
│   ├── session/
│   │   ├── config.go
│   │   ├── config_test.go
│   │   ├── data.go
│   │   ├── data_msgp.go
│   │   ├── data_msgp_test.go
│   │   ├── data_test.go
│   │   ├── middleware.go
│   │   ├── middleware_test.go
│   │   ├── session.go
│   │   ├── session_test.go
│   │   ├── store.go
│   │   └── store_test.go
│   ├── skip/
│   │   ├── skip.go
│   │   └── skip_test.go
│   ├── static/
│   │   ├── config.go
│   │   ├── static.go
│   │   └── static_test.go
│   └── timeout/
│       ├── config.go
│       ├── timeout.go
│       └── timeout_test.go
├── mount.go
├── mount_test.go
├── path.go
├── path_test.go
├── path_testcases_test.go
├── prefork.go
├── prefork_test.go
├── readonly.go
├── readonly_strict.go
├── redirect.go
├── redirect_msgp.go
├── redirect_msgp_test.go
├── redirect_test.go
├── register.go
├── req.go
├── req_interface_gen.go
├── res.go
├── res_interface_gen.go
├── router.go
├── router_test.go
├── services.go
├── services_test.go
├── state.go
├── state_test.go
└── storage_interface.go
Download .txt
Showing preview only (396K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4208 symbols across 235 files)

FILE: adapter.go
  function toFiberHandler (line 13) | func toFiberHandler(handler any) (Handler, bool) {
  function adaptFiberHandler (line 32) | func adaptFiberHandler(handler any) (Handler, bool) {
  function adaptExpressHandler (line 52) | func adaptExpressHandler(handler any) (Handler, bool) {
  function adaptHTTPHandler (line 188) | func adaptHTTPHandler(handler any) (Handler, bool) {
  function isNilableKind (line 214) | func isNilableKind(kind reflect.Kind) bool {
  function adaptFastHTTPHandler (line 223) | func adaptFastHTTPHandler(handler any) (Handler, bool) {
  function wrapHTTPHandler (line 246) | func wrapHTTPHandler(handler http.Handler) Handler {
  function collectHandlers (line 262) | func collectHandlers(context string, args ...any) []Handler {

FILE: adapter_test.go
  function TestToFiberHandler_Nil (line 19) | func TestToFiberHandler_Nil(t *testing.T) {
  function TestToFiberHandler_FiberHandler (line 28) | func TestToFiberHandler_FiberHandler(t *testing.T) {
  function TestToFiberHandler_FiberHandlerNoErrorReturn (line 39) | func TestToFiberHandler_FiberHandlerNoErrorReturn(t *testing.T) {
  function TestNewTestCtx_ReturnsDefaultCtx (line 57) | func TestNewTestCtx_ReturnsDefaultCtx(t *testing.T) {
  function newTestCtx (line 66) | func newTestCtx(t *testing.T) (*App, *DefaultCtx) {
  function withRouteHandlers (line 82) | func withRouteHandlers(t *testing.T, ctx *DefaultCtx, handlers ...Handle...
  function TestToFiberHandler_ExpressTwoParamsWithError (line 93) | func TestToFiberHandler_ExpressTwoParamsWithError(t *testing.T) {
  function TestToFiberHandler_ExpressTwoParamsWithoutError (line 111) | func TestToFiberHandler_ExpressTwoParamsWithoutError(t *testing.T) {
  function TestToFiberHandler_ExpressThreeParamsWithError (line 128) | func TestToFiberHandler_ExpressThreeParamsWithError(t *testing.T) {
  function TestToFiberHandler_ExpressThreeParamsWithoutError (line 156) | func TestToFiberHandler_ExpressThreeParamsWithoutError(t *testing.T) {
  function TestToFiberHandler_ExpressNextNoArgWithErrorReturn (line 181) | func TestToFiberHandler_ExpressNextNoArgWithErrorReturn(t *testing.T) {
  function TestToFiberHandler_ExpressNextWithErrorContinuesOnNil (line 210) | func TestToFiberHandler_ExpressNextWithErrorContinuesOnNil(t *testing.T) {
  function TestToFiberHandler_ExpressNextWithErrorShortCircuitsOnError (line 237) | func TestToFiberHandler_ExpressNextWithErrorShortCircuitsOnError(t *test...
  function TestToFiberHandler_ExpressNextWithErrorReturn_ShortCircuitsOnNextError (line 264) | func TestToFiberHandler_ExpressNextWithErrorReturn_ShortCircuitsOnNextEr...
  function TestToFiberHandler_ExpressNextWithErrorReturnCallback_PropagatesNextError (line 292) | func TestToFiberHandler_ExpressNextWithErrorReturnCallback_PropagatesNex...
  function TestToFiberHandler_ExpressNextWithErrorReturnCallback_ShortCircuitsOnNextError (line 320) | func TestToFiberHandler_ExpressNextWithErrorReturnCallback_ShortCircuits...
  function TestToFiberHandler_ExpressNextWithErrorReturn_PrefersHandlerErrorOverNextError (line 347) | func TestToFiberHandler_ExpressNextWithErrorReturn_PrefersHandlerErrorOv...
  function TestToFiberHandler_ExpressNextWithErrorReturn_PropagatesNextErrorWhenNoReturnError (line 375) | func TestToFiberHandler_ExpressNextWithErrorReturn_PropagatesNextErrorWh...
  function TestToFiberHandler_ExpressNextWithErrorReturnCallback_StopsChainWithoutNextCall (line 402) | func TestToFiberHandler_ExpressNextWithErrorReturnCallback_StopsChainWit...
  function TestAdapter_MixedHandlerIntegration (line 429) | func TestAdapter_MixedHandlerIntegration(t *testing.T) {
  function TestToFiberHandler_ExpressNextNoArgPropagatesError (line 506) | func TestToFiberHandler_ExpressNextNoArgPropagatesError(t *testing.T) {
  function TestToFiberHandler_ExpressNextNoArgStopsChain (line 534) | func TestToFiberHandler_ExpressNextNoArgStopsChain(t *testing.T) {
  function TestToFiberHandler_ExpressNextNoArgMiddleware (line 561) | func TestToFiberHandler_ExpressNextNoArgMiddleware(t *testing.T) {
  function TestCollectHandlers_HTTPHandler (line 592) | func TestCollectHandlers_HTTPHandler(t *testing.T) {
  function TestToFiberHandler_HTTPHandler (line 621) | func TestToFiberHandler_HTTPHandler(t *testing.T) {
  function TestToFiberHandler_FasthttpHandlerWithError (line 647) | func TestToFiberHandler_FasthttpHandlerWithError(t *testing.T) {
  function TestToFiberHandler_HTTPHandler_Flush (line 666) | func TestToFiberHandler_HTTPHandler_Flush(t *testing.T) {
  function TestWrapHTTPHandler_Flush_App_Test (line 694) | func TestWrapHTTPHandler_Flush_App_Test(t *testing.T) {
  function Test_HTTPHandler_App_Test_Interrupted (line 721) | func Test_HTTPHandler_App_Test_Interrupted(t *testing.T) {
  function TestToFiberHandler_HTTPHandlerFunc (line 747) | func TestToFiberHandler_HTTPHandlerFunc(t *testing.T) {
  function TestWrapHTTPHandler_Nil (line 769) | func TestWrapHTTPHandler_Nil(t *testing.T) {
  function TestCollectHandlers_InvalidType (line 775) | func TestCollectHandlers_InvalidType(t *testing.T) {
  function TestCollectHandlers_TypedNilHTTPHandlers (line 783) | func TestCollectHandlers_TypedNilHTTPHandlers(t *testing.T) {
  type dummyHandler (line 821) | type dummyHandler struct
    method ServeHTTP (line 823) | func (dummyHandler) ServeHTTP(http.ResponseWriter, *http.Request) {}
  type dummyFuncHandler (line 825) | type dummyFuncHandler
    method ServeHTTP (line 827) | func (handler dummyFuncHandler) ServeHTTP(w http.ResponseWriter, r *ht...
  function TestCollectHandlers_TypedNilPointerHTTPHandler (line 834) | func TestCollectHandlers_TypedNilPointerHTTPHandler(t *testing.T) {
  function TestCollectHandlers_TypedNilFuncHTTPHandler (line 844) | func TestCollectHandlers_TypedNilFuncHTTPHandler(t *testing.T) {
  function TestCollectHandlers_TypedNilFasthttpHandlers (line 855) | func TestCollectHandlers_TypedNilFasthttpHandlers(t *testing.T) {
  function TestCollectHandlers_FasthttpHandler (line 888) | func TestCollectHandlers_FasthttpHandler(t *testing.T) {
  function TestCollectHandlers_FiberHandlerNoErrorReturn (line 919) | func TestCollectHandlers_FiberHandlerNoErrorReturn(t *testing.T) {
  function TestCollectHandlers_MixedHandlers (line 939) | func TestCollectHandlers_MixedHandlers(t *testing.T) {
  function TestCollectHandlers_Nil (line 972) | func TestCollectHandlers_Nil(t *testing.T) {

FILE: addon/retry/config.go
  type Config (line 8) | type Config struct
  function configDefault (line 47) | func configDefault(config ...Config) Config {

FILE: addon/retry/config_test.go
  function TestConfigDefault_NoConfig (line 10) | func TestConfigDefault_NoConfig(t *testing.T) {
  function TestConfigDefault_Custom (line 16) | func TestConfigDefault_Custom(t *testing.T) {
  function TestConfigDefault_PartialAndNegative (line 29) | func TestConfigDefault_PartialAndNegative(t *testing.T) {
  function TestConfigDefault_CustomInitialInterval (line 35) | func TestConfigDefault_CustomInitialInterval(t *testing.T) {
  function TestConfigDefault_CustomCurrentInterval (line 44) | func TestConfigDefault_CustomCurrentInterval(t *testing.T) {
  function TestConfigDefault_CurrentIntervalAndInitialDiffer (line 53) | func TestConfigDefault_CurrentIntervalAndInitialDiffer(t *testing.T) {
  function TestNewExponentialBackoff_Config (line 62) | func TestNewExponentialBackoff_Config(t *testing.T) {

FILE: addon/retry/exponential_backoff.go
  type ExponentialBackoff (line 10) | type ExponentialBackoff struct
    method Retry (line 43) | func (e *ExponentialBackoff) Retry(f func() error) error {
    method next (line 62) | func (e *ExponentialBackoff) next() time.Duration {
  function NewExponentialBackoff (line 29) | func NewExponentialBackoff(config ...Config) *ExponentialBackoff {

FILE: addon/retry/exponential_backoff_test.go
  function Test_ExponentialBackoff_Retry (line 12) | func Test_ExponentialBackoff_Retry(t *testing.T) {
  function Test_ExponentialBackoff_Retry_NoSleepAfterLastAttempt (line 63) | func Test_ExponentialBackoff_Retry_NoSleepAfterLastAttempt(t *testing.T) {
  function Test_ExponentialBackoff_Next (line 88) | func Test_ExponentialBackoff_Next(t *testing.T) {
  function Test_ExponentialBackoff_NextRandFailure (line 149) | func Test_ExponentialBackoff_NextRandFailure(t *testing.T) {
  type failingReader (line 168) | type failingReader struct
    method Read (line 170) | func (failingReader) Read(_ []byte) (int, error) { return 0, errors.Ne...

FILE: app.go
  constant Version (line 37) | Version = "3.1.0"
  type Map (line 43) | type Map
  type Error (line 62) | type Error struct
    method Error (line 1012) | func (e *Error) Error() string {
  type App (line 68) | type App struct
    method GetString (line 675) | func (app *App) GetString(s string) string {
    method GetBytes (line 687) | func (app *App) GetBytes(b []byte) []byte {
    method handleTrustedProxy (line 698) | func (app *App) handleTrustedProxy(ipAddress string) {
    method setCtxFunc (line 719) | func (app *App) setCtxFunc(function func(app *App) CustomCtx) {
    method RegisterCustomConstraint (line 729) | func (app *App) RegisterCustomConstraint(constraint CustomConstraint) {
    method RegisterCustomBinder (line 735) | func (app *App) RegisterCustomBinder(customBinder CustomBinder) {
    method ReloadViews (line 741) | func (app *App) ReloadViews() error {
    method SetTLSHandler (line 775) | func (app *App) SetTLSHandler(tlsHandler *TLSHandler) {
    method Name (line 783) | func (app *App) Name(name string) Router {
    method GetRoute (line 809) | func (app *App) GetRoute(name string) Route {
    method GetRoutes (line 822) | func (app *App) GetRoutes(filterUseOption ...bool) []Route {
    method Use (line 860) | func (app *App) Use(args ...any) Router {
    method Get (line 900) | func (app *App) Get(path string, handler any, handlers ...any) Router {
    method Head (line 906) | func (app *App) Head(path string, handler any, handlers ...any) Router {
    method Post (line 912) | func (app *App) Post(path string, handler any, handlers ...any) Router {
    method Put (line 918) | func (app *App) Put(path string, handler any, handlers ...any) Router {
    method Delete (line 923) | func (app *App) Delete(path string, handler any, handlers ...any) Rout...
    method Connect (line 929) | func (app *App) Connect(path string, handler any, handlers ...any) Rou...
    method Options (line 935) | func (app *App) Options(path string, handler any, handlers ...any) Rou...
    method Trace (line 941) | func (app *App) Trace(path string, handler any, handlers ...any) Router {
    method Patch (line 947) | func (app *App) Patch(path string, handler any, handlers ...any) Router {
    method Add (line 953) | func (app *App) Add(methods []string, path string, handler any, handle...
    method All (line 961) | func (app *App) All(path string, handler any, handlers ...any) Router {
    method Group (line 969) | func (app *App) Group(prefix string, handlers ...any) Router {
    method RouteChain (line 985) | func (app *App) RouteChain(path string) Register {
    method Route (line 995) | func (app *App) Route(prefix string, fn func(router Router), name ...s...
    method Config (line 1062) | func (app *App) Config() Config {
    method Handler (line 1067) | func (app *App) Handler() fasthttp.RequestHandler { //revive:disable-l...
    method Stack (line 1074) | func (app *App) Stack() [][]*Route {
    method HandlersCount (line 1079) | func (app *App) HandlersCount() uint32 {
    method Shutdown (line 1096) | func (app *App) Shutdown() error {
    method ShutdownWithTimeout (line 1107) | func (app *App) ShutdownWithTimeout(timeout time.Duration) error {
    method ShutdownWithContext (line 1118) | func (app *App) ShutdownWithContext(ctx context.Context) error {
    method Server (line 1137) | func (app *App) Server() *fasthttp.Server {
    method Hooks (line 1142) | func (app *App) Hooks() *Hooks {
    method State (line 1147) | func (app *App) State() *State {
    method Test (line 1170) | func (app *App) Test(req *http.Request, config ...TestConfig) (*http.R...
    method init (line 1286) | func (app *App) init() *App {
    method ErrorHandler (line 1347) | func (app *App) ErrorHandler(ctx Ctx, err error) error {
    method serverErrorHandler (line 1382) | func (app *App) serverErrorHandler(fctx *fasthttp.RequestCtx, err erro...
    method startupProcess (line 1435) | func (app *App) startupProcess() {
    method runOnListenHooks (line 1453) | func (app *App) runOnListenHooks(listenData *ListenData) {
  type Config (line 115) | type Config struct
  type TrustProxyConfig (line 446) | type TrustProxyConfig struct
  type RouteMessage (line 479) | type RouteMessage struct
  constant DefaultBodyLimit (line 488) | DefaultBodyLimit       = 4 * 1024 * 1024
  constant DefaultMaxRanges (line 489) | DefaultMaxRanges       = 16
  constant DefaultConcurrency (line 490) | DefaultConcurrency     = 256 * 1024
  constant DefaultReadBufferSize (line 491) | DefaultReadBufferSize  = 4096
  constant DefaultWriteBufferSize (line 492) | DefaultWriteBufferSize = 4096
  constant methodGet (line 496) | methodGet = iota
  constant methodHead (line 497) | methodHead
  constant methodPost (line 498) | methodPost
  constant methodPut (line 499) | methodPut
  constant methodDelete (line 500) | methodDelete
  constant methodConnect (line 501) | methodConnect
  constant methodOptions (line 502) | methodOptions
  constant methodTrace (line 503) | methodTrace
  constant methodPatch (line 504) | methodPatch
  function DefaultErrorHandler (line 524) | func DefaultErrorHandler(c Ctx, err error) error {
  function New (line 543) | func New(config ...Config) *App {
  function NewWithCustomCtx (line 667) | func NewWithCustomCtx(newCtxFunc func(app *App) CustomCtx, config ...Con...
  function NewError (line 1017) | func NewError(code int, message ...string) *Error {
  function NewErrorf (line 1032) | func NewErrorf(code int, message ...any) *Error {
  type TestConfig (line 1154) | type TestConfig struct
  type disableLogger (line 1280) | type disableLogger struct
    method Printf (line 1283) | func (*disableLogger) Printf(string, ...any) {

FILE: app_integration_test.go
  type integrationCustomCtx (line 34) | type integrationCustomCtx struct
  function newIntegrationCustomCtx (line 38) | func newIntegrationCustomCtx(app *fiber.App) fiber.CustomCtx {
  function performOversizedRequest (line 42) | func performOversizedRequest(t *testing.T, app *fiber.App, configure fun...
  type middlewareCombinationTestCase (line 110) | type middlewareCombinationTestCase struct
    method statusOrDefault (line 119) | func (tc middlewareCombinationTestCase) statusOrDefault() int {
    method handlerOrDefault (line 126) | func (tc middlewareCombinationTestCase) handlerOrDefault() func(fiber....
  function Test_Integration_RequestID_ContextPropagationFlag (line 136) | func Test_Integration_RequestID_ContextPropagationFlag(t *testing.T) {
  function Test_Integration_App_ServerErrorHandler_MiddlewareCombinationHeaders (line 174) | func Test_Integration_App_ServerErrorHandler_MiddlewareCombinationHeader...
  function Test_Integration_App_ServerErrorHandler_PreservesCORSHeadersOnBodyLimit (line 544) | func Test_Integration_App_ServerErrorHandler_PreservesCORSHeadersOnBodyL...
  function Test_Integration_App_ServerErrorHandler_PreservesHelmetHeadersOnBodyLimit (line 564) | func Test_Integration_App_ServerErrorHandler_PreservesHelmetHeadersOnBod...
  function Test_Integration_App_ServerErrorHandler_PreservesRequestID (line 580) | func Test_Integration_App_ServerErrorHandler_PreservesRequestID(t *testi...
  function Test_Integration_App_ServerErrorHandler_GroupMiddlewareChain (line 597) | func Test_Integration_App_ServerErrorHandler_GroupMiddlewareChain(t *tes...
  function Test_Integration_App_ServerErrorHandler_RetainsHeadersFromSubsequentMiddleware (line 621) | func Test_Integration_App_ServerErrorHandler_RetainsHeadersFromSubsequen...
  function Test_Integration_App_ServerErrorHandler_WithCustomCtx (line 639) | func Test_Integration_App_ServerErrorHandler_WithCustomCtx(t *testing.T) {

FILE: app_test.go
  type fileView (line 40) | type fileView struct
    method Load (line 46) | func (v *fileView) Load() error {
    method Render (line 57) | func (*fileView) Render(io.Writer, string, any, ...string) error { ret...
  function testEmptyHandler (line 59) | func testEmptyHandler(_ Ctx) error {
  function testStatus200 (line 63) | func testStatus200(t *testing.T, app *App, url, method string) {
  function testErrorResponse (line 73) | func testErrorResponse(t *testing.T, err error, resp *http.Response, exp...
  function Test_App_Test_Goroutine_Leak_Compare (line 84) | func Test_App_Test_Goroutine_Leak_Compare(t *testing.T) {
  function Test_App_MethodNotAllowed (line 177) | func Test_App_MethodNotAllowed(t *testing.T) {
  function Test_App_RegisterNetHTTPHandler (line 229) | func Test_App_RegisterNetHTTPHandler(t *testing.T) {
  function Test_App_Custom_Middleware_404_Should_Not_SetMethodNotAllowed (line 352) | func Test_App_Custom_Middleware_404_Should_Not_SetMethodNotAllowed(t *te...
  function Test_App_ServerErrorHandler_SmallReadBuffer (line 387) | func Test_App_ServerErrorHandler_SmallReadBuffer(t *testing.T) {
  function Test_App_Errors (line 409) | func Test_App_Errors(t *testing.T) {
  function Test_App_BodyLimit_Negative (line 433) | func Test_App_BodyLimit_Negative(t *testing.T) {
  function Test_App_BodyLimit_Zero (line 457) | func Test_App_BodyLimit_Zero(t *testing.T) {
  function Test_App_BodyLimit_LargerThanDefault (line 478) | func Test_App_BodyLimit_LargerThanDefault(t *testing.T) {
  type customConstraint (line 502) | type customConstraint struct
    method Name (line 504) | func (*customConstraint) Name() string {
    method Execute (line 508) | func (*customConstraint) Execute(param string, args ...string) bool {
  function Test_App_CustomConstraint (line 520) | func Test_App_CustomConstraint(t *testing.T) {
  function Test_App_ErrorHandler_Custom (line 558) | func Test_App_ErrorHandler_Custom(t *testing.T) {
  function Test_App_ErrorHandler_HandlerStack (line 579) | func Test_App_ErrorHandler_HandlerStack(t *testing.T) {
  function Test_App_ErrorHandler_RouteStack (line 609) | func Test_App_ErrorHandler_RouteStack(t *testing.T) {
  function Test_App_serverErrorHandler_Internal_Error (line 635) | func Test_App_serverErrorHandler_Internal_Error(t *testing.T) {
  function Test_App_serverErrorHandler_Network_Error (line 646) | func Test_App_serverErrorHandler_Network_Error(t *testing.T) {
  function Test_App_serverErrorHandler_Unsupported_Method_Error (line 660) | func Test_App_serverErrorHandler_Unsupported_Method_Error(t *testing.T) {
  function Test_App_serverErrorHandler_Unsupported_Method_Request (line 670) | func Test_App_serverErrorHandler_Unsupported_Method_Request(t *testing.T) {
  function Test_App_Nested_Params (line 715) | func Test_App_Nested_Params(t *testing.T) {
  function Test_App_Use_Params (line 739) | func Test_App_Use_Params(t *testing.T) {
  function Test_App_Use_UnescapedPath (line 778) | func Test_App_Use_UnescapedPath(t *testing.T) {
  function Test_App_Use_CaseSensitive (line 807) | func Test_App_Use_CaseSensitive(t *testing.T) {
  function Test_App_Not_Use_StrictRouting (line 838) | func Test_App_Not_Use_StrictRouting(t *testing.T) {
  function Test_App_Use_MultiplePrefix (line 872) | func Test_App_Use_MultiplePrefix(t *testing.T) {
  function Test_Group_Use_NoBoundary (line 918) | func Test_Group_Use_NoBoundary(t *testing.T) {
  function Test_App_Use_StrictRouting (line 937) | func Test_App_Use_StrictRouting(t *testing.T) {
  function Test_App_Add_Method_Test (line 971) | func Test_App_Add_Method_Test(t *testing.T) {
  function Test_App_All_Method_Test (line 999) | func Test_App_All_Method_Test(t *testing.T) {
  function Test_App_GETOnly (line 1021) | func Test_App_GETOnly(t *testing.T) {
  function Test_App_Use_Params_Group (line 1037) | func Test_App_Use_Params_Group(t *testing.T) {
  function Test_App_Chaining (line 1056) | func Test_App_Chaining(t *testing.T) {
  function Test_App_Order (line 1085) | func Test_App_Order(t *testing.T) {
  function Test_App_AutoHead_Compliance (line 1120) | func Test_App_AutoHead_Compliance(t *testing.T) {
  function Test_App_AutoHead_Compliance_SendFile (line 1159) | func Test_App_AutoHead_Compliance_SendFile(t *testing.T) {
  function Test_App_Methods (line 1207) | func Test_App_Methods(t *testing.T) {
  function Test_App_Route_Naming (line 1247) | func Test_App_Route_Naming(t *testing.T) {
  function Test_App_New (line 1278) | func Test_App_New(t *testing.T) {
  function Test_App_Config (line 1289) | func Test_App_Config(t *testing.T) {
  function Test_App_GetString (line 1297) | func Test_App_GetString(t *testing.T) {
  function Test_App_GetBytes (line 1320) | func Test_App_GetBytes(t *testing.T) {
  function Test_App_Shutdown (line 1347) | func Test_App_Shutdown(t *testing.T) {
  function Test_App_ShutdownWithTimeout (line 1364) | func Test_App_ShutdownWithTimeout(t *testing.T) {
  function Test_App_ShutdownWithContext (line 1413) | func Test_App_ShutdownWithContext(t *testing.T) {
  function Test_App_OptionsAsterisk (line 1542) | func Test_App_OptionsAsterisk(t *testing.T) {
  function Test_App_Mixed_Routes_WithSameLen (line 1615) | func Test_App_Mixed_Routes_WithSameLen(t *testing.T) {
  function Test_App_Group_Invalid (line 1661) | func Test_App_Group_Invalid(t *testing.T) {
  function Test_App_Group (line 1669) | func Test_App_Group(t *testing.T) {
  function Test_App_RouteChain (line 1728) | func Test_App_RouteChain(t *testing.T) {
  function Test_App_Route (line 1776) | func Test_App_Route(t *testing.T) {
  function Test_App_Route_nilFuncPanics (line 1799) | func Test_App_Route_nilFuncPanics(t *testing.T) {
  function Test_Group_Route_nilFuncPanics (line 1809) | func Test_Group_Route_nilFuncPanics(t *testing.T) {
  function Test_Group_RouteChain_All (line 1820) | func Test_Group_RouteChain_All(t *testing.T) {
  function Test_App_Deep_Group (line 1841) | func Test_App_Deep_Group(t *testing.T) {
  function Test_App_Next_Method (line 1862) | func Test_App_Next_Method(t *testing.T) {
  function Benchmark_NewError (line 1879) | func Benchmark_NewError(b *testing.B) {
  function Benchmark_NewError_Parallel (line 1885) | func Benchmark_NewError_Parallel(b *testing.B) {
  function Test_NewError (line 1894) | func Test_NewError(t *testing.T) {
  function Test_NewErrorf_Format (line 1902) | func Test_NewErrorf_Format(t *testing.T) {
  function Test_Test_Timeout (line 1968) | func Test_Test_Timeout(t *testing.T) {
  type errorReader (line 1992) | type errorReader
    method Read (line 1996) | func (errorReader) Read([]byte) (int, error) {
  function Test_Test_DumpError (line 2001) | func Test_Test_DumpError(t *testing.T) {
  function Test_App_Handler (line 2013) | func Test_App_Handler(t *testing.T) {
  type invalidView (line 2019) | type invalidView struct
    method Load (line 2021) | func (invalidView) Load() error { return errors.New("invalid view") }
    method Render (line 2023) | func (invalidView) Render(io.Writer, string, any, ...string) error { p...
  type countingView (line 2025) | type countingView struct
    method Load (line 2030) | func (v *countingView) Load() error {
    method Render (line 2035) | func (*countingView) Render(io.Writer, string, any, ...string) error {...
  function Test_App_ReloadViews_Success (line 2037) | func Test_App_ReloadViews_Success(t *testing.T) {
  function Test_App_ReloadViews_Error (line 2050) | func Test_App_ReloadViews_Error(t *testing.T) {
  function Test_App_ReloadViews_NoEngine (line 2061) | func Test_App_ReloadViews_NoEngine(t *testing.T) {
  function Test_App_ReloadViews_InterfaceNilPointer (line 2069) | func Test_App_ReloadViews_InterfaceNilPointer(t *testing.T) {
  function Test_App_ReloadViews_MountedViews (line 2078) | func Test_App_ReloadViews_MountedViews(t *testing.T) {
  function Test_App_ReloadViews_MountedViews_Error (line 2101) | func Test_App_ReloadViews_MountedViews_Error(t *testing.T) {
  function Test_App_ReloadViews_MountedViews_MultipleApps (line 2113) | func Test_App_ReloadViews_MountedViews_MultipleApps(t *testing.T) {
  function Test_App_ReloadViews_MountedViews_WithParentViews (line 2132) | func Test_App_ReloadViews_MountedViews_WithParentViews(t *testing.T) {
  function Test_App_Init_Error_View (line 2150) | func Test_App_Init_Error_View(t *testing.T) {
  function Test_App_Stack (line 2161) | func Test_App_Stack(t *testing.T) {
  function Test_App_HandlersCount (line 2187) | func Test_App_HandlersCount(t *testing.T) {
  function Test_App_ReadTimeout (line 2202) | func Test_App_ReadTimeout(t *testing.T) {
  function Test_App_BadRequest (line 2245) | func Test_App_BadRequest(t *testing.T) {
  function Test_App_SmallReadBuffer (line 2282) | func Test_App_SmallReadBuffer(t *testing.T) {
  function Test_App_Server (line 2310) | func Test_App_Server(t *testing.T) {
  function Test_App_Error_In_Fasthttp_Server (line 2317) | func Test_App_Error_In_Fasthttp_Server(t *testing.T) {
  function Test_App_New_Test_Parallel (line 2330) | func Test_App_New_Test_Parallel(t *testing.T) {
  function Test_App_ReadBodyStream (line 2346) | func Test_App_ReadBodyStream(t *testing.T) {
  function Test_App_DisablePreParseMultipartForm (line 2361) | func Test_App_DisablePreParseMultipartForm(t *testing.T) {
  function Test_App_Test_no_timeout_infinitely (line 2409) | func Test_App_Test_no_timeout_infinitely(t *testing.T) {
  function Test_App_Test_timeout (line 2444) | func Test_App_Test_timeout(t *testing.T) {
  function Test_App_Test_timeout_empty_response (line 2460) | func Test_App_Test_timeout_empty_response(t *testing.T) {
  function Test_App_Test_drop_empty_response (line 2479) | func Test_App_Test_drop_empty_response(t *testing.T) {
  function Test_App_Test_response_error (line 2494) | func Test_App_Test_response_error(t *testing.T) {
  type errorReadCloser (line 2520) | type errorReadCloser
    method Read (line 2524) | func (errorReadCloser) Read(_ []byte) (int, error) {
    method Close (line 2528) | func (errorReadCloser) Close() error {
  function Test_App_Test_ReadFail (line 2532) | func Test_App_Test_ReadFail(t *testing.T) {
  type doubleCloseBody (line 2566) | type doubleCloseBody struct
    method Read (line 2570) | func (b *doubleCloseBody) Read(_ []byte) (int, error) {
    method Close (line 2580) | func (b *doubleCloseBody) Close() error {
  function Test_App_Test_CloseFail (line 2589) | func Test_App_Test_CloseFail(t *testing.T) {
  function Test_App_SetTLSHandler (line 2621) | func Test_App_SetTLSHandler(t *testing.T) {
  function Test_App_AddCustomRequestMethod (line 2636) | func Test_App_AddCustomRequestMethod(t *testing.T) {
  function Test_App_GetRoutes (line 2649) | func Test_App_GetRoutes(t *testing.T) {
  function Test_Middleware_Route_Naming_With_Use (line 2679) | func Test_Middleware_Route_Naming_With_Use(t *testing.T) {
  function Test_Route_Naming_Issue_2671_2685 (line 2739) | func Test_Route_Naming_Issue_2671_2685(t *testing.T) {
  function Test_App_State (line 2816) | func Test_App_State(t *testing.T) {
  function Benchmark_Communication_Flow (line 2827) | func Benchmark_Communication_Flow(b *testing.B) {
  function Benchmark_Communication_Flow_Parallel (line 2850) | func Benchmark_Communication_Flow_Parallel(b *testing.B) {
  function Benchmark_Ctx_AcquireReleaseFlow (line 2879) | func Benchmark_Ctx_AcquireReleaseFlow(b *testing.B) {
  function acquireDefaultCtxForAppBenchmark (line 2903) | func acquireDefaultCtxForAppBenchmark(b *testing.B, app *App, fctx *fast...
  function Benchmark_Ctx_AcquireReleaseFlow_Parallel (line 2914) | func Benchmark_Ctx_AcquireReleaseFlow_Parallel(b *testing.B) {
  function TestErrorHandler_PicksRightOne (line 2941) | func TestErrorHandler_PicksRightOne(t *testing.T) {
  type groupIDResponse (line 3012) | type groupIDResponse struct
  function Test_App_Test_SmallTimeout_WithFailOnTimeoutFalse (line 3019) | func Test_App_Test_SmallTimeout_WithFailOnTimeoutFalse(t *testing.T) {
  function Test_App_Test_SmallTimeout_WithFailOnTimeoutTrue (line 3055) | func Test_App_Test_SmallTimeout_WithFailOnTimeoutTrue(t *testing.T) {

FILE: bind.go
  type CustomBinder (line 18) | type CustomBinder interface
  type StructValidator (line 25) | type StructValidator interface
  type Bind (line 40) | type Bind struct
    method release (line 129) | func (b *Bind) release() {
    method WithoutAutoHandling (line 137) | func (b *Bind) WithoutAutoHandling() *Bind {
    method WithAutoHandling (line 146) | func (b *Bind) WithAutoHandling() *Bind {
    method SkipValidation (line 153) | func (b *Bind) SkipValidation(skip bool) *Bind {
    method returnErr (line 160) | func (b *Bind) returnErr(err error) error {
    method returnBindErr (line 171) | func (b *Bind) returnBindErr(err error, source string) error {
    method validateStruct (line 183) | func (b *Bind) validateStruct(out any) error {
    method Custom (line 214) | func (b *Bind) Custom(name string, dest any) error {
    method Header (line 230) | func (b *Bind) Header(out any) error {
    method RespHeader (line 245) | func (b *Bind) RespHeader(out any) error {
    method Cookie (line 261) | func (b *Bind) Cookie(out any) error {
    method Query (line 276) | func (b *Bind) Query(out any) error {
    method JSON (line 291) | func (b *Bind) JSON(out any) error {
    method CBOR (line 306) | func (b *Bind) CBOR(out any) error {
    method XML (line 320) | func (b *Bind) XML(out any) error {
    method Form (line 337) | func (b *Bind) Form(out any) error {
    method URI (line 352) | func (b *Bind) URI(out any) error {
    method MsgPack (line 366) | func (b *Bind) MsgPack(out any) error {
    method Body (line 385) | func (b *Bind) Body(out any) error {
    method All (line 422) | func (b *Bind) All(out any) error {
  constant BindSourceURI (line 48) | BindSourceURI        = "uri"
  constant BindSourceQuery (line 49) | BindSourceQuery      = "query"
  constant BindSourceHeader (line 50) | BindSourceHeader     = "header"
  constant BindSourceCookie (line 51) | BindSourceCookie     = "cookie"
  constant BindSourceBody (line 52) | BindSourceBody       = "body"
  constant BindSourceRespHeader (line 53) | BindSourceRespHeader = "respHeader"
  type BindError (line 59) | type BindError struct
    method Error (line 65) | func (e *BindError) Error() string {
    method Unwrap (line 72) | func (e *BindError) Unwrap() error {
  function extractFieldFromError (line 76) | func extractFieldFromError(err error) string {
  function newBindError (line 102) | func newBindError(source string, raw error) *BindError {
  function AcquireBind (line 107) | func AcquireBind() *Bind {
  function ReleaseBind (line 117) | func ReleaseBind(b *Bind) {
  function releasePooledBinder (line 124) | func releasePooledBinder[T interface{ Reset() }](pool *sync.Pool, bind T) {
  function mergeStruct (line 459) | func mergeStruct(dst, src reflect.Value) {
  function isZero (line 474) | func isZero(value any) bool {

FILE: bind_test.go
  constant helloWorld (line 26) | helloWorld = "hello world"
  function Test_returnErr (line 29) | func Test_returnErr(t *testing.T) {
  function Test_AcquireReleaseBind (line 38) | func Test_AcquireReleaseBind(t *testing.T) {
  function Test_BindError_Unwrap (line 54) | func Test_BindError_Unwrap(t *testing.T) {
  function Test_BindError_ErrorFormat (line 66) | func Test_BindError_ErrorFormat(t *testing.T) {
  function Test_BindError_FieldExtraction (line 84) | func Test_BindError_FieldExtraction(t *testing.T) {
  function Test_BindError_Sources (line 229) | func Test_BindError_Sources(t *testing.T) {
  function Test_BindError_All (line 322) | func Test_BindError_All(t *testing.T) {
  function Test_Bind_Query (line 350) | func Test_Bind_Query(t *testing.T) {
  function Test_Bind_Query_Map (line 433) | func Test_Bind_Query_Map(t *testing.T) {
  function Test_Bind_Query_WithSetParserDecoder (line 474) | func Test_Bind_Query_WithSetParserDecoder(t *testing.T) {
  function Test_Bind_Query_Schema (line 526) | func Test_Bind_Query_Schema(t *testing.T) {
  function Test_Bind_Header (line 642) | func Test_Bind_Header(t *testing.T) {
  function Test_Bind_Header_Map (line 717) | func Test_Bind_Header_Map(t *testing.T) {
  function Test_Bind_Header_WithSetParserDecoder (line 746) | func Test_Bind_Header_WithSetParserDecoder(t *testing.T) {
  function Test_Bind_Header_Schema (line 801) | func Test_Bind_Header_Schema(t *testing.T) {
  function Test_Bind_RespHeader (line 898) | func Test_Bind_RespHeader(t *testing.T) {
  function Test_Bind_RespHeader_Map (line 975) | func Test_Bind_RespHeader_Map(t *testing.T) {
  function Benchmark_Bind_Query (line 1004) | func Benchmark_Bind_Query(b *testing.B) {
  function Benchmark_Bind_Query_Default (line 1031) | func Benchmark_Bind_Query_Default(b *testing.B) {
  function Benchmark_Bind_Query_Map (line 1059) | func Benchmark_Bind_Query_Map(b *testing.B) {
  function Benchmark_Bind_Query_WithParseParam (line 1077) | func Benchmark_Bind_Query_WithParseParam(b *testing.B) {
  function Benchmark_Bind_Query_Comma (line 1106) | func Benchmark_Bind_Query_Comma(b *testing.B) {
  function Benchmark_Bind_Header (line 1131) | func Benchmark_Bind_Header(b *testing.B) {
  function Benchmark_Bind_Header_Map (line 1158) | func Benchmark_Bind_Header_Map(b *testing.B) {
  function Benchmark_Bind_RespHeader (line 1179) | func Benchmark_Bind_RespHeader(b *testing.B) {
  function Benchmark_Bind_RespHeader_Map (line 1206) | func Benchmark_Bind_RespHeader_Map(b *testing.B) {
  function Test_Bind_Body (line 1227) | func Test_Bind_Body(t *testing.T) {
  function Test_Bind_Body_WithSetParserDecoder (line 1446) | func Test_Bind_Body_WithSetParserDecoder(t *testing.T) {
  function Benchmark_Bind_Body_JSON (line 1497) | func Benchmark_Bind_Body_JSON(b *testing.B) {
  function Benchmark_Bind_Body_MsgPack (line 1525) | func Benchmark_Bind_Body_MsgPack(b *testing.B) {
  function Benchmark_Bind_Body_XML (line 1557) | func Benchmark_Bind_Body_XML(b *testing.B) {
  function Benchmark_Bind_Body_CBOR (line 1582) | func Benchmark_Bind_Body_CBOR(b *testing.B) {
  function Benchmark_Bind_Body_Form (line 1613) | func Benchmark_Bind_Body_Form(b *testing.B) {
  function Benchmark_Bind_Body_MultipartForm (line 1638) | func Benchmark_Bind_Body_MultipartForm(b *testing.B) {
  function Benchmark_Bind_Body_MultipartForm_Nested (line 1670) | func Benchmark_Bind_Body_MultipartForm_Nested(b *testing.B) {
  function Benchmark_Bind_Body_Form_Map (line 1716) | func Benchmark_Bind_Body_Form_Map(b *testing.B) {
  function Test_Bind_URI (line 1738) | func Test_Bind_URI(t *testing.T) {
  function Test_Bind_URI_Map (line 1762) | func Test_Bind_URI_Map(t *testing.T) {
  function Benchmark_Bind_URI (line 1783) | func Benchmark_Bind_URI(b *testing.B) {
  function Benchmark_Bind_URI_Map (line 1819) | func Benchmark_Bind_URI_Map(b *testing.B) {
  function Test_Bind_Cookie (line 1850) | func Test_Bind_Cookie(t *testing.T) {
  function Test_Bind_Cookie_Map (line 1928) | func Test_Bind_Cookie_Map(t *testing.T) {
  function Test_Bind_Cookie_WithSetParserDecoder (line 1959) | func Test_Bind_Cookie_WithSetParserDecoder(t *testing.T) {
  function Test_Bind_Cookie_Schema (line 2014) | func Test_Bind_Cookie_Schema(t *testing.T) {
  function Benchmark_Bind_Cookie (line 2112) | func Benchmark_Bind_Cookie(b *testing.B) {
  function Benchmark_Bind_Cookie_Map (line 2140) | func Benchmark_Bind_Cookie_Map(b *testing.B) {
  type customBinder (line 2163) | type customBinder struct
    method Name (line 2165) | func (*customBinder) Name() string {
    method MIMETypes (line 2169) | func (*customBinder) MIMETypes() []string {
    method Parse (line 2173) | func (*customBinder) Parse(c Ctx, out any) error {
  type customBinderReturningError (line 2178) | type customBinderReturningError struct
    method Name (line 2183) | func (*customBinderReturningError) Name() string {
    method MIMETypes (line 2187) | func (b *customBinderReturningError) MIMETypes() []string {
    method Parse (line 2194) | func (b *customBinderReturningError) Parse(_ Ctx, _ any) error {
  function Test_Bind_CustomBinder (line 2199) | func Test_Bind_CustomBinder(t *testing.T) {
  function Test_Bind_CustomBinder_Source (line 2223) | func Test_Bind_CustomBinder_Source(t *testing.T) {
  function Test_Bind_CustomBinder_Validation (line 2246) | func Test_Bind_CustomBinder_Validation(t *testing.T) {
  function Test_Bind_WithAutoHandling (line 2314) | func Test_Bind_WithAutoHandling(t *testing.T) {
  type structValidator (line 2329) | type structValidator struct
    method Validate (line 2331) | func (*structValidator) Validate(out any) error {
  type simpleQuery (line 2345) | type simpleQuery struct
  type countingStructValidator (line 2349) | type countingStructValidator struct
    method Validate (line 2353) | func (v *countingStructValidator) Validate(_ any) error {
  function Test_Bind_Form_Map_SkipsStructValidator (line 2360) | func Test_Bind_Form_Map_SkipsStructValidator(t *testing.T) {
  function Test_Bind_SkipValidation (line 2404) | func Test_Bind_SkipValidation(t *testing.T) {
  function Test_Bind_SkipValidation_Usage (line 2438) | func Test_Bind_SkipValidation_Usage(t *testing.T) {
  function Test_Bind_ValidateStruct_NilTarget (line 2501) | func Test_Bind_ValidateStruct_NilTarget(t *testing.T) {
  function Test_Bind_StructValidator (line 2516) | func Test_Bind_StructValidator(t *testing.T) {
  function Test_Bind_RepeatParserWithSameStruct (line 2530) | func Test_Bind_RepeatParserWithSameStruct(t *testing.T) {
  type RequestConfig (line 2587) | type RequestConfig struct
    method ApplyTo (line 2595) | func (rc *RequestConfig) ApplyTo(ctx Ctx) {
  function Test_Bind_All (line 2615) | func Test_Bind_All(t *testing.T) {
  function Test_Bind_All_Uri_Precedence (line 2764) | func Test_Bind_All_Uri_Precedence(t *testing.T) {
  function Test_Bind_All_Query_Precedence (line 2795) | func Test_Bind_All_Query_Precedence(t *testing.T) {
  function Test_Bind_All_StructValidator (line 2813) | func Test_Bind_All_StructValidator(t *testing.T) {
  function BenchmarkBind_All (line 2835) | func BenchmarkBind_All(b *testing.B) {

FILE: binder/binder.go
  function GetFromThePool (line 81) | func GetFromThePool[T any](pool *sync.Pool) T {
  function PutToThePool (line 91) | func PutToThePool[T any](pool *sync.Pool, binder T) {

FILE: binder/binder_test.go
  function Test_GetAndPutToThePool (line 13) | func Test_GetAndPutToThePool(t *testing.T) {
  function Test_Binders_ErrorPaths (line 35) | func Test_Binders_ErrorPaths(t *testing.T) {
  function Test_GetFieldCache_Panic (line 67) | func Test_GetFieldCache_Panic(t *testing.T) {
  function Test_parseToMap_defaultCase (line 72) | func Test_parseToMap_defaultCase(t *testing.T) {
  function Test_parse_function_maps (line 90) | func Test_parse_function_maps(t *testing.T) {
  function Test_SetParserDecoder_UnknownKeys (line 114) | func Test_SetParserDecoder_UnknownKeys(t *testing.T) {
  function Test_SetParserDecoder_CustomConverter (line 126) | func Test_SetParserDecoder_CustomConverter(t *testing.T) {
  function Test_formatBindData_typeMismatch (line 146) | func Test_formatBindData_typeMismatch(t *testing.T) {

FILE: binder/cbor.go
  type CBORBinding (line 8) | type CBORBinding struct
    method Name (line 13) | func (*CBORBinding) Name() string {
    method Bind (line 18) | func (b *CBORBinding) Bind(body []byte, out any) error {
    method Reset (line 23) | func (b *CBORBinding) Reset() {
  function UnimplementedCborMarshal (line 29) | func UnimplementedCborMarshal(_ any) ([]byte, error) {
  function UnimplementedCborUnmarshal (line 35) | func UnimplementedCborUnmarshal(_ []byte, _ any) error {

FILE: binder/cbor_test.go
  function Test_CBORBinder_Bind (line 10) | func Test_CBORBinder_Bind(t *testing.T) {
  function Benchmark_CBORBinder_Bind (line 63) | func Benchmark_CBORBinder_Bind(b *testing.B) {
  function Test_UnimplementedCborMarshal_Panics (line 93) | func Test_UnimplementedCborMarshal_Panics(t *testing.T) {
  function Test_UnimplementedCborUnmarshal_Panics (line 101) | func Test_UnimplementedCborUnmarshal_Panics(t *testing.T) {
  function Test_UnimplementedCborMarshal_PanicMessage (line 110) | func Test_UnimplementedCborMarshal_PanicMessage(t *testing.T) {
  function Test_UnimplementedCborUnmarshal_PanicMessage (line 121) | func Test_UnimplementedCborUnmarshal_PanicMessage(t *testing.T) {

FILE: binder/cookie.go
  type CookieBinding (line 9) | type CookieBinding struct
    method Name (line 14) | func (*CookieBinding) Name() string {
    method Bind (line 19) | func (b *CookieBinding) Bind(req *fasthttp.Request, out any) error {
    method Reset (line 34) | func (b *CookieBinding) Reset() {

FILE: binder/cookie_test.go
  function Test_CookieBinder_Bind (line 10) | func Test_CookieBinder_Bind(t *testing.T) {
  function Benchmark_CookieBinder_Bind (line 52) | func Benchmark_CookieBinder_Bind(b *testing.B) {
  function Test_CookieBinder_Bind_ParseError (line 89) | func Test_CookieBinder_Bind_ParseError(t *testing.T) {

FILE: binder/form.go
  constant MIMEMultipartForm (line 11) | MIMEMultipartForm string = "multipart/form-data"
  type FormBinding (line 27) | type FormBinding struct
    method Name (line 32) | func (*FormBinding) Name() string {
    method Bind (line 37) | func (b *FormBinding) Bind(req *fasthttp.Request, out any) error {
    method bindMultipart (line 58) | func (b *FormBinding) bindMultipart(req *fasthttp.Request, out any) er...
    method Reset (line 88) | func (b *FormBinding) Reset() {
  function acquireFormMap (line 92) | func acquireFormMap() map[string][]string {
  function releaseFormMap (line 100) | func releaseFormMap(m map[string][]string) {
  function acquireFileHeaderMap (line 105) | func acquireFileHeaderMap() map[string][]*multipart.FileHeader {
  function releaseFileHeaderMap (line 113) | func releaseFileHeaderMap(m map[string][]*multipart.FileHeader) {
  function clearFormMap (line 118) | func clearFormMap(m map[string][]string) {
  function clearFileHeaderMap (line 122) | func clearFileHeaderMap(m map[string][]*multipart.FileHeader) {

FILE: binder/form_test.go
  function Test_FormBinder_Bind (line 13) | func Test_FormBinder_Bind(t *testing.T) {
  function Test_FormBinder_Bind_ParseError (line 57) | func Test_FormBinder_Bind_ParseError(t *testing.T) {
  function Benchmark_FormBinder_Bind (line 71) | func Benchmark_FormBinder_Bind(b *testing.B) {
  function Test_FormBinder_BindMultipart (line 100) | func Test_FormBinder_BindMultipart(t *testing.T) {
  function Test_FormBinder_BindMultipart_ValueError (line 208) | func Test_FormBinder_BindMultipart_ValueError(t *testing.T) {
  function Test_FormBinder_BindMultipart_FileError (line 223) | func Test_FormBinder_BindMultipart_FileError(t *testing.T) {
  function Test_FormBinder_Bind_MapClearedBetweenRequests (line 241) | func Test_FormBinder_Bind_MapClearedBetweenRequests(t *testing.T) {
  function Test_FormBinder_BindMultipart_MapsClearedBetweenRequests (line 272) | func Test_FormBinder_BindMultipart_MapsClearedBetweenRequests(t *testing...
  function Benchmark_FormBinder_BindMultipart (line 324) | func Benchmark_FormBinder_BindMultipart(b *testing.B) {

FILE: binder/header.go
  type HeaderBinding (line 9) | type HeaderBinding struct
    method Name (line 14) | func (*HeaderBinding) Name() string {
    method Bind (line 19) | func (b *HeaderBinding) Bind(req *fasthttp.Request, out any) error {
    method Reset (line 33) | func (b *HeaderBinding) Reset() {

FILE: binder/header_test.go
  function Test_HeaderBinder_Bind (line 10) | func Test_HeaderBinder_Bind(t *testing.T) {
  function Benchmark_HeaderBinder_Bind (line 52) | func Benchmark_HeaderBinder_Bind(b *testing.B) {
  function Test_HeaderBinder_Bind_ParseError (line 89) | func Test_HeaderBinder_Bind_ParseError(t *testing.T) {

FILE: binder/json.go
  type JSONBinding (line 8) | type JSONBinding struct
    method Name (line 13) | func (*JSONBinding) Name() string {
    method Bind (line 18) | func (b *JSONBinding) Bind(body []byte, out any) error {
    method Reset (line 23) | func (b *JSONBinding) Reset() {

FILE: binder/json_test.go
  function Test_JSON_Binding_Bind (line 10) | func Test_JSON_Binding_Bind(t *testing.T) {
  function Benchmark_JSON_Binding_Bind (line 42) | func Benchmark_JSON_Binding_Bind(b *testing.B) {

FILE: binder/mapping.go
  type ParserConfig (line 18) | type ParserConfig struct
  type ParserType (line 27) | type ParserType struct
  function getDecoderPool (line 40) | func getDecoderPool(tag string) *sync.Pool {
  function SetParserDecoder (line 53) | func SetParserDecoder(parserConfig ParserConfig) {
  function decoderBuilder (line 64) | func decoderBuilder(parserConfig ParserConfig) any {
  function init (line 77) | func init() {
  function parse (line 92) | func parse(aliasTag string, out any, data map[string][]string, files ......
  function parseToStruct (line 110) | func parseToStruct(aliasTag string, out any, data map[string][]string, f...
  function parseToMap (line 128) | func parseToMap(target reflect.Value, data map[string][]string) error {
  function parseParamSquareBrackets (line 180) | func parseParamSquareBrackets(k string) (string, error) {
  function isStringKeyMap (line 218) | func isStringKeyMap(t reflect.Type) bool {
  function isExported (line 222) | func isExported(f *reflect.StructField) bool {
  function fieldName (line 229) | func fieldName(f *reflect.StructField, aliasTag string) string {
  type fieldInfo (line 244) | type fieldInfo struct
  function unwrapType (line 249) | func unwrapType(t reflect.Type) reflect.Type {
  function getFieldCache (line 266) | func getFieldCache(aliasTag string) *sync.Map {
  function buildFieldInfo (line 285) | func buildFieldInfo(t reflect.Type, aliasTag string) fieldInfo {
  function equalFieldType (line 314) | func equalFieldType(out any, kind reflect.Kind, key, aliasTag string) bo...
  function FilterFlags (line 349) | func FilterFlags(content string) string {
  function formatBindData (line 356) | func formatBindData[T, K any](aliasTag string, out any, data map[string]...
  function assignBindData (line 397) | func assignBindData(aliasTag string, out any, data map[string][]string, ...

FILE: binder/mapping_test.go
  function Test_EqualFieldType (line 15) | func Test_EqualFieldType(t *testing.T) {
  function Test_ParseParamSquareBrackets (line 76) | func Test_ParseParamSquareBrackets(t *testing.T) {
  function Test_parseToMap (line 146) | func Test_parseToMap(t *testing.T) {
  function Test_FilterFlags (line 195) | func Test_FilterFlags(t *testing.T) {
  function Benchmark_FilterFlags (line 231) | func Benchmark_FilterFlags(b *testing.B) {
  function TestFormatBindData (line 246) | func TestFormatBindData(t *testing.T) {
  function TestAssignBindData (line 313) | func TestAssignBindData(t *testing.T) {
  function Test_parseToStruct_MismatchedData (line 337) | func Test_parseToStruct_MismatchedData(t *testing.T) {
  function Test_formatBindData_ErrorCases (line 355) | func Test_formatBindData_ErrorCases(t *testing.T) {
  function Test_decoderBuilder (line 399) | func Test_decoderBuilder(t *testing.T) {
  function Test_parseToMap_Extended (line 429) | func Test_parseToMap_Extended(t *testing.T) {
  function Test_decoderPoolMapInit (line 450) | func Test_decoderPoolMapInit(t *testing.T) {
  function TestSetParserDecoderConcurrentAccess (line 462) | func TestSetParserDecoderConcurrentAccess(t *testing.T) {
  function Test_getFieldCache (line 534) | func Test_getFieldCache(t *testing.T) {
  function Test_EqualFieldType_Map (line 545) | func Test_EqualFieldType_Map(t *testing.T) {
  function Test_equalFieldType_CacheTypeMismatch (line 551) | func Test_equalFieldType_CacheTypeMismatch(t *testing.T) {
  function Test_buildFieldInfo_Unexported (line 563) | func Test_buildFieldInfo_Unexported(t *testing.T) {
  function Test_formatBindData_BracketNotationSuccess (line 580) | func Test_formatBindData_BracketNotationSuccess(t *testing.T) {
  function Test_formatBindData_FileHeaderTypeMismatch (line 589) | func Test_formatBindData_FileHeaderTypeMismatch(t *testing.T) {
  function Benchmark_equalFieldType (line 598) | func Benchmark_equalFieldType(b *testing.B) {

FILE: binder/msgpack.go
  type MsgPackBinding (line 8) | type MsgPackBinding struct
    method Name (line 13) | func (*MsgPackBinding) Name() string {
    method Bind (line 18) | func (b *MsgPackBinding) Bind(body []byte, out any) error {
    method Reset (line 23) | func (b *MsgPackBinding) Reset() {
  function UnimplementedMsgpackMarshal (line 29) | func UnimplementedMsgpackMarshal(_ any) ([]byte, error) {
  function UnimplementedMsgpackUnmarshal (line 35) | func UnimplementedMsgpackUnmarshal(_ []byte, _ any) error {

FILE: binder/msgpack_test.go
  function Test_Msgpack_Binding_Bind (line 10) | func Test_Msgpack_Binding_Bind(t *testing.T) {
  function Benchmark_Msgpack_Binding_Bind (line 55) | func Benchmark_Msgpack_Binding_Bind(b *testing.B) {
  function Test_UnimplementedMsgpackMarshal_Panics (line 89) | func Test_UnimplementedMsgpackMarshal_Panics(t *testing.T) {
  function Test_UnimplementedMsgpackUnmarshal_Panics (line 98) | func Test_UnimplementedMsgpackUnmarshal_Panics(t *testing.T) {
  function Test_UnimplementedMsgpackMarshal_PanicMessage (line 108) | func Test_UnimplementedMsgpackMarshal_PanicMessage(t *testing.T) {
  function Test_UnimplementedMsgpackUnmarshal_PanicMessage (line 121) | func Test_UnimplementedMsgpackUnmarshal_PanicMessage(t *testing.T) {

FILE: binder/query.go
  type QueryBinding (line 9) | type QueryBinding struct
    method Name (line 14) | func (*QueryBinding) Name() string {
    method Bind (line 19) | func (b *QueryBinding) Bind(reqCtx *fasthttp.Request, out any) error {
    method Reset (line 33) | func (b *QueryBinding) Reset() {

FILE: binder/query_test.go
  function Test_QueryBinder_Bind (line 10) | func Test_QueryBinder_Bind(t *testing.T) {
  function Benchmark_QueryBinder_Bind (line 53) | func Benchmark_QueryBinder_Bind(b *testing.B) {
  function Test_QueryBinder_Bind_PointerSlices (line 88) | func Test_QueryBinder_Bind_PointerSlices(t *testing.T) {

FILE: binder/resp_header.go
  type RespHeaderBinding (line 9) | type RespHeaderBinding struct
    method Name (line 14) | func (*RespHeaderBinding) Name() string {
    method Bind (line 19) | func (b *RespHeaderBinding) Bind(resp *fasthttp.Response, out any) err...
    method Reset (line 34) | func (b *RespHeaderBinding) Reset() {

FILE: binder/resp_header_test.go
  function Test_RespHeaderBinder_Bind (line 10) | func Test_RespHeaderBinder_Bind(t *testing.T) {
  function Benchmark_RespHeaderBinder_Bind (line 45) | func Benchmark_RespHeaderBinder_Bind(b *testing.B) {
  function Test_RespHeaderBinder_Bind_ParseError (line 79) | func Test_RespHeaderBinder_Bind_ParseError(t *testing.T) {

FILE: binder/uri.go
  type URIBinding (line 4) | type URIBinding struct
    method Name (line 7) | func (*URIBinding) Name() string {
    method Bind (line 12) | func (b *URIBinding) Bind(params []string, paramsFunc func(key string,...
    method Reset (line 22) | func (*URIBinding) Reset() {

FILE: binder/uri_test.go
  function Test_URIBinding_Bind (line 9) | func Test_URIBinding_Bind(t *testing.T) {
  function Benchmark_URIBinding_Bind (line 43) | func Benchmark_URIBinding_Bind(b *testing.B) {

FILE: binder/xml.go
  type XMLBinding (line 10) | type XMLBinding struct
    method Name (line 15) | func (*XMLBinding) Name() string {
    method Bind (line 20) | func (b *XMLBinding) Bind(body []byte, out any) error {
    method Reset (line 29) | func (b *XMLBinding) Reset() {

FILE: binder/xml_test.go
  function Test_XMLBinding_Bind (line 10) | func Test_XMLBinding_Bind(t *testing.T) {
  function Test_XMLBinding_Bind_error (line 59) | func Test_XMLBinding_Bind_error(t *testing.T) {
  function Benchmark_XMLBinding_Bind (line 82) | func Benchmark_XMLBinding_Bind(b *testing.B) {

FILE: client/client.go
  type Client (line 37) | type Client struct
    method Do (line 73) | func (c *Client) Do(req *fasthttp.Request, resp *fasthttp.Response) er...
    method DoTimeout (line 79) | func (c *Client) DoTimeout(req *fasthttp.Request, resp *fasthttp.Respo...
    method DoDeadline (line 85) | func (c *Client) DoDeadline(req *fasthttp.Request, resp *fasthttp.Resp...
    method DoRedirects (line 90) | func (c *Client) DoRedirects(req *fasthttp.Request, resp *fasthttp.Res...
    method CloseIdleConnections (line 95) | func (c *Client) CloseIdleConnections() {
    method currentTLSConfig (line 99) | func (c *Client) currentTLSConfig() *tls.Config {
    method applyTLSConfig (line 103) | func (c *Client) applyTLSConfig(config *tls.Config) {
    method applyDial (line 107) | func (c *Client) applyDial(dial fasthttp.DialFunc) {
    method FasthttpClient (line 112) | func (c *Client) FasthttpClient() *fasthttp.Client {
    method HostClient (line 120) | func (c *Client) HostClient() *fasthttp.HostClient {
    method LBClient (line 128) | func (c *Client) LBClient() *fasthttp.LBClient {
    method R (line 136) | func (c *Client) R() *Request {
    method RequestHook (line 141) | func (c *Client) RequestHook() []RequestHook {
    method AddRequestHook (line 146) | func (c *Client) AddRequestHook(h ...RequestHook) *Client {
    method ResponseHook (line 155) | func (c *Client) ResponseHook() []ResponseHook {
    method AddResponseHook (line 160) | func (c *Client) AddResponseHook(h ...ResponseHook) *Client {
    method JSONMarshal (line 169) | func (c *Client) JSONMarshal() utils.JSONMarshal {
    method SetJSONMarshal (line 174) | func (c *Client) SetJSONMarshal(f utils.JSONMarshal) *Client {
    method JSONUnmarshal (line 180) | func (c *Client) JSONUnmarshal() utils.JSONUnmarshal {
    method SetJSONUnmarshal (line 185) | func (c *Client) SetJSONUnmarshal(f utils.JSONUnmarshal) *Client {
    method XMLMarshal (line 191) | func (c *Client) XMLMarshal() utils.XMLMarshal {
    method SetXMLMarshal (line 196) | func (c *Client) SetXMLMarshal(f utils.XMLMarshal) *Client {
    method XMLUnmarshal (line 202) | func (c *Client) XMLUnmarshal() utils.XMLUnmarshal {
    method SetXMLUnmarshal (line 207) | func (c *Client) SetXMLUnmarshal(f utils.XMLUnmarshal) *Client {
    method CBORMarshal (line 213) | func (c *Client) CBORMarshal() utils.CBORMarshal {
    method SetCBORMarshal (line 218) | func (c *Client) SetCBORMarshal(f utils.CBORMarshal) *Client {
    method CBORUnmarshal (line 224) | func (c *Client) CBORUnmarshal() utils.CBORUnmarshal {
    method SetCBORUnmarshal (line 229) | func (c *Client) SetCBORUnmarshal(f utils.CBORUnmarshal) *Client {
    method TLSConfig (line 236) | func (c *Client) TLSConfig() *tls.Config {
    method SetTLSConfig (line 249) | func (c *Client) SetTLSConfig(config *tls.Config) *Client {
    method SetCertificates (line 258) | func (c *Client) SetCertificates(certs ...tls.Certificate) *Client {
    method SetRootCertificate (line 265) | func (c *Client) SetRootCertificate(path string) *Client {
    method SetRootCertificateFromString (line 295) | func (c *Client) SetRootCertificateFromString(pem string) *Client {
    method SetProxyURL (line 310) | func (c *Client) SetProxyURL(proxyURL string) error {
    method RetryConfig (line 319) | func (c *Client) RetryConfig() *RetryConfig {
    method SetRetryConfig (line 324) | func (c *Client) SetRetryConfig(config *RetryConfig) *Client {
    method BaseURL (line 333) | func (c *Client) BaseURL() string {
    method SetBaseURL (line 338) | func (c *Client) SetBaseURL(url string) *Client {
    method Header (line 344) | func (c *Client) Header(key string) []string {
    method AddHeader (line 349) | func (c *Client) AddHeader(key, val string) *Client {
    method SetHeader (line 355) | func (c *Client) SetHeader(key, val string) *Client {
    method AddHeaders (line 361) | func (c *Client) AddHeaders(h map[string][]string) *Client {
    method SetHeaders (line 369) | func (c *Client) SetHeaders(h map[string]string) *Client {
    method Param (line 375) | func (c *Client) Param(key string) []string {
    method AddParam (line 387) | func (c *Client) AddParam(key, val string) *Client {
    method SetParam (line 393) | func (c *Client) SetParam(key, val string) *Client {
    method AddParams (line 399) | func (c *Client) AddParams(m map[string][]string) *Client {
    method SetParams (line 405) | func (c *Client) SetParams(m map[string]string) *Client {
    method SetParamsWithStruct (line 411) | func (c *Client) SetParamsWithStruct(v any) *Client {
    method DelParams (line 417) | func (c *Client) DelParams(key ...string) *Client {
    method SetUserAgent (line 425) | func (c *Client) SetUserAgent(ua string) *Client {
    method SetReferer (line 431) | func (c *Client) SetReferer(r string) *Client {
    method DisablePathNormalizing (line 437) | func (c *Client) DisablePathNormalizing() bool {
    method SetDisablePathNormalizing (line 442) | func (c *Client) SetDisablePathNormalizing(disable bool) *Client {
    method PathParam (line 448) | func (c *Client) PathParam(key string) string {
    method SetPathParam (line 456) | func (c *Client) SetPathParam(key, val string) *Client {
    method SetPathParams (line 462) | func (c *Client) SetPathParams(m map[string]string) *Client {
    method SetPathParamsWithStruct (line 468) | func (c *Client) SetPathParamsWithStruct(v any) *Client {
    method DelPathParams (line 474) | func (c *Client) DelPathParams(key ...string) *Client {
    method Cookie (line 480) | func (c *Client) Cookie(key string) string {
    method SetCookie (line 488) | func (c *Client) SetCookie(key, val string) *Client {
    method SetCookies (line 494) | func (c *Client) SetCookies(m map[string]string) *Client {
    method SetCookiesWithStruct (line 500) | func (c *Client) SetCookiesWithStruct(v any) *Client {
    method DelCookies (line 506) | func (c *Client) DelCookies(key ...string) *Client {
    method SetTimeout (line 512) | func (c *Client) SetTimeout(t time.Duration) *Client {
    method Debug (line 518) | func (c *Client) Debug() *Client {
    method DisableDebug (line 524) | func (c *Client) DisableDebug() *Client {
    method StreamResponseBody (line 530) | func (c *Client) StreamResponseBody() bool {
    method SetStreamResponseBody (line 538) | func (c *Client) SetStreamResponseBody(enable bool) *Client {
    method SetCookieJar (line 544) | func (c *Client) SetCookieJar(cookieJar *CookieJar) *Client {
    method Get (line 550) | func (c *Client) Get(url string, cfg ...Config) (*Response, error) {
    method Post (line 557) | func (c *Client) Post(url string, cfg ...Config) (*Response, error) {
    method Head (line 564) | func (c *Client) Head(url string, cfg ...Config) (*Response, error) {
    method Put (line 571) | func (c *Client) Put(url string, cfg ...Config) (*Response, error) {
    method Delete (line 578) | func (c *Client) Delete(url string, cfg ...Config) (*Response, error) {
    method Options (line 585) | func (c *Client) Options(url string, cfg ...Config) (*Response, error) {
    method Patch (line 592) | func (c *Client) Patch(url string, cfg ...Config) (*Response, error) {
    method Custom (line 599) | func (c *Client) Custom(url, method string, cfg ...Config) (*Response,...
    method SetDial (line 606) | func (c *Client) SetDial(dial fasthttp.DialFunc) *Client {
    method SetLogger (line 615) | func (c *Client) SetLogger(logger log.CommonLogger) *Client {
    method Logger (line 624) | func (c *Client) Logger() log.CommonLogger {
    method Reset (line 631) | func (c *Client) Reset() {
  type Config (line 655) | type Config struct
  function setConfigToRequest (line 672) | func setConfigToRequest(req *Request, config ...Config) {
  function init (line 747) | func init() {
  function New (line 752) | func New() *Client {
  function NewWithClient (line 760) | func NewWithClient(c *fasthttp.Client) *Client {
  function NewWithHostClient (line 768) | func NewWithHostClient(c *fasthttp.HostClient) *Client {
  function NewWithLBClient (line 776) | func NewWithLBClient(c *fasthttp.LBClient) *Client {
  function newClient (line 783) | func newClient(transport httpClientTransport) *Client {
  function C (line 810) | func C() *Client {
  function Replace (line 815) | func Replace(c *Client) func() {
  function Get (line 831) | func Get(url string, cfg ...Config) (*Response, error) {
  function Post (line 836) | func Post(url string, cfg ...Config) (*Response, error) {
  function Head (line 841) | func Head(url string, cfg ...Config) (*Response, error) {
  function Put (line 846) | func Put(url string, cfg ...Config) (*Response, error) {
  function Delete (line 851) | func Delete(url string, cfg ...Config) (*Response, error) {
  function Options (line 856) | func Options(url string, cfg ...Config) (*Response, error) {
  function Patch (line 861) | func Patch(url string, cfg ...Config) (*Response, error) {

FILE: client/client_test.go
  function startTestServerWithPort (line 29) | func startTestServerWithPort(t *testing.T, beforeStarting func(app *fibe...
  function Test_New_With_Client (line 62) | func Test_New_With_Client(t *testing.T) {
  function Test_New_With_HostClient (line 85) | func Test_New_With_HostClient(t *testing.T) {
  function Test_New_With_LBClient (line 108) | func Test_New_With_LBClient(t *testing.T) {
  function TestClientUnderlyingTransports (line 137) | func TestClientUnderlyingTransports(t *testing.T) {
  function TestClientCBORUnmarshalOverride (line 158) | func TestClientCBORUnmarshalOverride(t *testing.T) {
  function TestClientSetRootCertificateErrors (line 182) | func TestClientSetRootCertificateErrors(t *testing.T) {
  function TestClientSetRootCertificateFromStringError (line 199) | func TestClientSetRootCertificateFromStringError(t *testing.T) {
  function TestClientLoggerAccessors (line 208) | func TestClientLoggerAccessors(t *testing.T) {
  function TestClientResetClearsState (line 218) | func TestClientResetClearsState(t *testing.T) {
  function Test_Client_Add_Hook (line 259) | func Test_Client_Add_Hook(t *testing.T) {
  function Test_Client_HostClient_Behavior (line 306) | func Test_Client_HostClient_Behavior(t *testing.T) {
  function Test_Client_LBClient_Behavior (line 464) | func Test_Client_LBClient_Behavior(t *testing.T) {
  function Test_Client_Add_Hook_CheckOrder (line 653) | func Test_Client_Add_Hook_CheckOrder(t *testing.T) {
  function Test_Client_Marshal (line 680) | func Test_Client_Marshal(t *testing.T) {
  function Test_Client_SetBaseURL (line 805) | func Test_Client_SetBaseURL(t *testing.T) {
  function Test_Client_Invalid_URL (line 813) | func Test_Client_Invalid_URL(t *testing.T) {
  function Test_Client_Unsupported_Protocol (line 831) | func Test_Client_Unsupported_Protocol(t *testing.T) {
  function Test_Client_ConcurrencyRequests (line 841) | func Test_Client_ConcurrencyRequests(t *testing.T) {
  function Test_Get (line 867) | func Test_Get(t *testing.T) {
  function Test_Head (line 907) | func Test_Head(t *testing.T) {
  function Test_Post (line 949) | func Test_Post(t *testing.T) {
  function Test_Put (line 1006) | func Test_Put(t *testing.T) {
  function Test_Delete (line 1062) | func Test_Delete(t *testing.T) {
  function Test_Options (line 1121) | func Test_Options(t *testing.T) {
  function Test_Patch (line 1172) | func Test_Patch(t *testing.T) {
  function Test_Client_UserAgent (line 1230) | func Test_Client_UserAgent(t *testing.T) {
  function Test_Client_Header (line 1281) | func Test_Client_Header(t *testing.T) {
  function Test_Client_Header_With_Server (line 1356) | func Test_Client_Header_With_Server(t *testing.T) {
  function Test_Client_Cookie (line 1382) | func Test_Client_Cookie(t *testing.T) {
  function Test_Client_Cookie_With_Server (line 1444) | func Test_Client_Cookie_With_Server(t *testing.T) {
  function Test_Client_CookieJar (line 1464) | func Test_Client_CookieJar(t *testing.T) {
  function Test_Client_CookieJar_Response (line 1483) | func Test_Client_CookieJar_Response(t *testing.T) {
  function Test_Client_Referer (line 1589) | func Test_Client_Referer(t *testing.T) {
  function Test_Client_QueryParam (line 1601) | func Test_Client_QueryParam(t *testing.T) {
  function Test_Client_QueryParam_With_Server (line 1726) | func Test_Client_QueryParam_With_Server(t *testing.T) {
  function Test_Client_PathParam (line 1742) | func Test_Client_PathParam(t *testing.T) {
  function Test_Client_PathParam_With_Server (line 1804) | func Test_Client_PathParam_With_Server(t *testing.T) {
  function Test_Client_TLS (line 1822) | func Test_Client_TLS(t *testing.T) {
  function Test_Client_TLS_Error (line 1855) | func Test_Client_TLS_Error(t *testing.T) {
  function Test_Client_TLS_Empty_TLSConfig (line 1889) | func Test_Client_TLS_Empty_TLSConfig(t *testing.T) {
  function Test_Client_SetCertificates (line 1920) | func Test_Client_SetCertificates(t *testing.T) {
  function Test_Client_SetRootCertificate (line 1930) | func Test_Client_SetRootCertificate(t *testing.T) {
  function Test_Client_SetRootCertificateFromString (line 1937) | func Test_Client_SetRootCertificateFromString(t *testing.T) {
  function Test_Client_R (line 1951) | func Test_Client_R(t *testing.T) {
  function Test_Replace (line 1961) | func Test_Replace(t *testing.T) {
  function Test_Set_Config_To_Request (line 1996) | func Test_Set_Config_To_Request(t *testing.T) {
  function Test_Client_SetProxyURL (line 2156) | func Test_Client_SetProxyURL(t *testing.T) {
  function Test_Client_SetRetryConfig (line 2241) | func Test_Client_SetRetryConfig(t *testing.T) {
  function Benchmark_Client_Request (line 2258) | func Benchmark_Client_Request(b *testing.B) {
  function Benchmark_Client_Request_Parallel (line 2279) | func Benchmark_Client_Request_Parallel(b *testing.B) {
  function Benchmark_Client_Request_Send_ContextCancel (line 2303) | func Benchmark_Client_Request_Send_ContextCancel(b *testing.B) {
  function Test_Client_StreamResponseBody (line 2349) | func Test_Client_StreamResponseBody(t *testing.T) {

FILE: client/cookiejar.go
  function AcquireCookieJar (line 24) | func AcquireCookieJar() *CookieJar {
  function ReleaseCookieJar (line 34) | func ReleaseCookieJar(c *CookieJar) {
  type CookieJar (line 40) | type CookieJar struct
    method Get (line 50) | func (cj *CookieJar) Get(uri *fasthttp.URI) []*fasthttp.Cookie {
    method getByHostAndPath (line 60) | func (cj *CookieJar) getByHostAndPath(host, path []byte, secure bool) ...
    method getCookiesByHost (line 79) | func (cj *CookieJar) getCookiesByHost(host string) []*fasthttp.Cookie {
    method cookiesForRequest (line 103) | func (cj *CookieJar) cookiesForRequest(host string, path []byte, secur...
    method Set (line 143) | func (cj *CookieJar) Set(uri *fasthttp.URI, cookies ...*fasthttp.Cooki...
    method SetByHost (line 154) | func (cj *CookieJar) SetByHost(host []byte, cookies ...*fasthttp.Cooki...
    method SetKeyValue (line 195) | func (cj *CookieJar) SetKeyValue(host, key, value string) {
    method SetKeyValueBytes (line 206) | func (cj *CookieJar) SetKeyValueBytes(host string, key, value []byte) {
    method dumpCookiesToReq (line 215) | func (cj *CookieJar) dumpCookiesToReq(req *fasthttp.Request) {
    method parseCookiesFromResp (line 226) | func (cj *CookieJar) parseCookiesFromResp(host, _ []byte, resp *fastht...
    method Release (line 281) | func (cj *CookieJar) Release() {
  function searchCookieByKeyAndPath (line 294) | func searchCookieByKeyAndPath(key, path []byte, cookies []*fasthttp.Cook...
  function pathMatch (line 307) | func pathMatch(reqPath, cookiePath []byte) bool {
  function domainMatch (line 327) | func domainMatch(host, domain string) bool {

FILE: client/cookiejar_test.go
  function checkKeyValue (line 12) | func checkKeyValue(t *testing.T, cj *CookieJar, cookie *fasthttp.Cookie,...
  function Test_CookieJarGet (line 25) | func Test_CookieJarGet(t *testing.T) {
  function Test_CookieJarGetExpired (line 92) | func Test_CookieJarGetExpired(t *testing.T) {
  function Test_CookieJarSet (line 111) | func Test_CookieJarSet(t *testing.T) {
  function Test_CookieJarSetRepeatedCookieKeys (line 128) | func Test_CookieJarSetRepeatedCookieKeys(t *testing.T) {
  function Test_CookieJarSetKeyValue (line 156) | func Test_CookieJarSetKeyValue(t *testing.T) {
  function Test_CookieJarGetFromResponse (line 174) | func Test_CookieJarGetFromResponse(t *testing.T) {
  function Test_CookieJar_HostPort (line 215) | func Test_CookieJar_HostPort(t *testing.T) {
  function Test_CookieJar_Domain (line 238) | func Test_CookieJar_Domain(t *testing.T) {
  function Test_CookieJar_Secure (line 262) | func Test_CookieJar_Secure(t *testing.T) {
  function Test_CookieJar_PathMatch (line 289) | func Test_CookieJar_PathMatch(t *testing.T) {

FILE: client/core.go
  constant boundary (line 20) | boundary = "FiberFormBoundary"
  type RequestHook (line 24) | type RequestHook
  type ResponseHook (line 29) | type ResponseHook
  function addMissingPort (line 36) | func addMissingPort(addr string, isTLS bool) string { //revive:disable-l...
  type core (line 48) | type core struct
    method getRetryConfig (line 55) | func (c *core) getRetryConfig() *RetryConfig {
    method execFunc (line 74) | func (c *core) execFunc() (*Response, error) {
    method preHooks (line 156) | func (c *core) preHooks() error {
    method afterHooks (line 176) | func (c *core) afterHooks(resp *Response) error {
    method timeout (line 196) | func (c *core) timeout() context.CancelFunc {
    method execute (line 209) | func (c *core) execute(ctx context.Context, client *Client, req *Reque...
  function acquireResponseChan (line 249) | func acquireResponseChan() chan *Response {
  function releaseResponseChan (line 262) | func releaseResponseChan(ch chan *Response) {
  function acquireErrChan (line 274) | func acquireErrChan() chan error {
  function releaseErrChan (line 287) | func releaseErrChan(ch chan error) {
  function newCore (line 292) | func newCore() *core {

FILE: client/core_test.go
  function Test_AddMissing_Port (line 21) | func Test_AddMissing_Port(t *testing.T) {
  function Test_Exec_Func (line 64) | func Test_Exec_Func(t *testing.T) {
  function Test_Execute (line 216) | func Test_Execute(t *testing.T) {
  type blockingErrTransport (line 330) | type blockingErrTransport struct
    method Do (line 351) | func (b *blockingErrTransport) Do(_ *fasthttp.Request, _ *fasthttp.Res...
    method DoTimeout (line 358) | func (b *blockingErrTransport) DoTimeout(req *fasthttp.Request, resp *...
    method DoDeadline (line 362) | func (b *blockingErrTransport) DoDeadline(req *fasthttp.Request, resp ...
    method DoRedirects (line 366) | func (b *blockingErrTransport) DoRedirects(req *fasthttp.Request, resp...
    method CloseIdleConnections (line 370) | func (*blockingErrTransport) CloseIdleConnections() {
    method TLSConfig (line 373) | func (*blockingErrTransport) TLSConfig() *tls.Config {
    method SetTLSConfig (line 377) | func (*blockingErrTransport) SetTLSConfig(_ *tls.Config) {
    method SetDial (line 380) | func (*blockingErrTransport) SetDial(_ fasthttp.DialFunc) {
    method Client (line 383) | func (*blockingErrTransport) Client() any {
    method StreamResponseBody (line 387) | func (*blockingErrTransport) StreamResponseBody() bool {
    method SetStreamResponseBody (line 391) | func (*blockingErrTransport) SetStreamResponseBody(_ bool) {
    method release (line 394) | func (b *blockingErrTransport) release() {
  function newBlockingErrTransport (line 342) | func newBlockingErrTransport(err error) *blockingErrTransport {
  function Test_Core_RequestBodyStream (line 398) | func Test_Core_RequestBodyStream(t *testing.T) {

FILE: client/helper_test.go
  type testServer (line 15) | type testServer struct
    method stop (line 51) | func (ts *testServer) stop() {
    method dial (line 65) | func (ts *testServer) dial() func(addr string) (net.Conn, error) {
  function startTestServer (line 22) | func startTestServer(tb testing.TB, beforeStarting func(app *fiber.App))...
  function createHelperServer (line 73) | func createHelperServer(tb testing.TB) (app *fiber.App, dial func(addr s...
  function testRequest (line 90) | func testRequest(t *testing.T, handler fiber.Handler, wrapAgent func(age...
  function testRequestFail (line 117) | func testRequestFail(t *testing.T, handler fiber.Handler, wrapAgent func...
  function testClient (line 141) | func testClient(t *testing.T, handler fiber.Handler, wrapAgent func(agen...

FILE: client/hooks.go
  constant headerAccept (line 29) | headerAccept      = "Accept"
  constant applicationJSON (line 30) | applicationJSON   = "application/json"
  constant applicationCBOR (line 31) | applicationCBOR   = "application/cbor"
  constant applicationXML (line 32) | applicationXML    = "application/xml"
  constant applicationForm (line 33) | applicationForm   = "application/x-www-form-urlencoded"
  constant multipartFormData (line 34) | multipartFormData = "multipart/form-data"
  constant letterBytes (line 36) | letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234...
  function unsafeRandString (line 41) | func unsafeRandString(n int) (string, error) {
  function parserRequestURL (line 72) | func parserRequestURL(c *Client, req *Request) error {
  function parserRequestHeader (line 122) | func parserRequestHeader(c *Client, req *Request) error {
  function parserRequestBody (line 196) | func parserRequestBody(c *Client, req *Request) error {
  function parserRequestBodyFile (line 236) | func parserRequestBodyFile(req *Request) error {
  function addFormFile (line 293) | func addFormFile(mw *multipart.Writer, f *File, fileBuf *[]byte) error {
  function parserResponseCookie (line 320) | func parserResponseCookie(c *Client, resp *Response, req *Request) error {
  function logger (line 345) | func logger(c *Client, resp *Response, req *Request) error {

FILE: client/hooks_test.go
  function Test_Rand_String (line 21) | func Test_Rand_String(t *testing.T) {
  function Test_Parser_Request_URL (line 59) | func Test_Parser_Request_URL(t *testing.T) {
  function Test_Parser_Request_Header (line 246) | func Test_Parser_Request_Header(t *testing.T) {
  function Test_Parser_Request_Body (line 469) | func Test_Parser_Request_Body(t *testing.T) {
  type dummyLogger (line 638) | type dummyLogger struct
    method Trace (line 642) | func (*dummyLogger) Trace(_ ...any) {}
    method Debug (line 644) | func (*dummyLogger) Debug(_ ...any) {}
    method Info (line 646) | func (*dummyLogger) Info(_ ...any) {}
    method Warn (line 648) | func (*dummyLogger) Warn(_ ...any) {}
    method Error (line 650) | func (*dummyLogger) Error(_ ...any) {}
    method Fatal (line 652) | func (*dummyLogger) Fatal(_ ...any) {}
    method Panic (line 654) | func (*dummyLogger) Panic(_ ...any) {}
    method Tracef (line 656) | func (*dummyLogger) Tracef(_ string, _ ...any) {}
    method Debugf (line 658) | func (l *dummyLogger) Debugf(format string, v ...any) {
    method Infof (line 662) | func (*dummyLogger) Infof(_ string, _ ...any) {}
    method Warnf (line 664) | func (*dummyLogger) Warnf(_ string, _ ...any) {}
    method Errorf (line 666) | func (*dummyLogger) Errorf(_ string, _ ...any) {}
    method Fatalf (line 668) | func (*dummyLogger) Fatalf(_ string, _ ...any) {}
    method Panicf (line 670) | func (*dummyLogger) Panicf(_ string, _ ...any) {}
    method Tracew (line 672) | func (*dummyLogger) Tracew(_ string, _ ...any) {}
    method Debugw (line 674) | func (*dummyLogger) Debugw(_ string, _ ...any) {}
    method Infow (line 676) | func (*dummyLogger) Infow(_ string, _ ...any) {}
    method Warnw (line 678) | func (*dummyLogger) Warnw(_ string, _ ...any) {}
    method Errorw (line 680) | func (*dummyLogger) Errorw(_ string, _ ...any) {}
    method Fatalw (line 682) | func (*dummyLogger) Fatalw(_ string, _ ...any) {}
    method Panicw (line 684) | func (*dummyLogger) Panicw(_ string, _ ...any) {}
  function Test_Client_Logger_Debug (line 686) | func Test_Client_Logger_Debug(t *testing.T) {
  function Test_Client_Logger_DisableDebug (line 723) | func Test_Client_Logger_DisableDebug(t *testing.T) {
  function Benchmark_Parser_Request_Body_File (line 759) | func Benchmark_Parser_Request_Body_File(b *testing.B) {
  function newBenchmarkRequest (line 793) | func newBenchmarkRequest(formValues map[string]string, fileContents [][]...
  function releaseBenchmarkRequest (line 818) | func releaseBenchmarkRequest(req *Request) {

FILE: client/request.go
  type WithStruct (line 24) | type WithStruct interface
  type bodyType (line 30) | type bodyType
  constant noBody (line 34) | noBody bodyType = iota
  constant jsonBody (line 35) | jsonBody
  constant xmlBody (line 36) | xmlBody
  constant formBody (line 37) | formBody
  constant filesBody (line 38) | filesBody
  constant rawBody (line 39) | rawBody
  constant cborBody (line 40) | cborBody
  type Request (line 46) | type Request struct
    method Method (line 76) | func (r *Request) Method() string {
    method SetMethod (line 82) | func (r *Request) SetMethod(method string) *Request {
    method URL (line 88) | func (r *Request) URL() string {
    method SetURL (line 93) | func (r *Request) SetURL(url string) *Request {
    method Client (line 99) | func (r *Request) Client() *Client {
    method SetClient (line 104) | func (r *Request) SetClient(c *Client) *Request {
    method Context (line 115) | func (r *Request) Context() context.Context {
    method SetContext (line 124) | func (r *Request) SetContext(ctx context.Context) *Request {
    method Header (line 130) | func (r *Request) Header(key string) []string {
    method Headers (line 160) | func (r *Request) Headers() iter.Seq2[string, []string] {
    method AddHeader (line 185) | func (r *Request) AddHeader(key, val string) *Request {
    method SetHeader (line 191) | func (r *Request) SetHeader(key, val string) *Request {
    method AddHeaders (line 198) | func (r *Request) AddHeaders(h map[string][]string) *Request {
    method SetHeaders (line 204) | func (r *Request) SetHeaders(h map[string]string) *Request {
    method Param (line 210) | func (r *Request) Param(key string) []string {
    method Params (line 224) | func (r *Request) Params() iter.Seq2[string, []string] {
    method AddParam (line 254) | func (r *Request) AddParam(key, val string) *Request {
    method SetParam (line 260) | func (r *Request) SetParam(key, val string) *Request {
    method AddParams (line 266) | func (r *Request) AddParams(m map[string][]string) *Request {
    method SetParams (line 272) | func (r *Request) SetParams(m map[string]string) *Request {
    method SetParamsWithStruct (line 278) | func (r *Request) SetParamsWithStruct(v any) *Request {
    method DelParams (line 284) | func (r *Request) DelParams(key ...string) *Request {
    method UserAgent (line 292) | func (r *Request) UserAgent() string {
    method SetUserAgent (line 297) | func (r *Request) SetUserAgent(ua string) *Request {
    method Boundary (line 303) | func (r *Request) Boundary() string {
    method SetBoundary (line 308) | func (r *Request) SetBoundary(b string) *Request {
    method Referer (line 314) | func (r *Request) Referer() string {
    method SetReferer (line 319) | func (r *Request) SetReferer(referer string) *Request {
    method Cookie (line 326) | func (r *Request) Cookie(key string) string {
    method Cookies (line 335) | func (r *Request) Cookies() iter.Seq2[string, string] {
    method SetCookie (line 340) | func (r *Request) SetCookie(key, val string) *Request {
    method SetCookies (line 346) | func (r *Request) SetCookies(m map[string]string) *Request {
    method SetCookiesWithStruct (line 352) | func (r *Request) SetCookiesWithStruct(v any) *Request {
    method DelCookies (line 358) | func (r *Request) DelCookies(key ...string) *Request {
    method PathParam (line 365) | func (r *Request) PathParam(key string) string {
    method PathParams (line 374) | func (r *Request) PathParams() iter.Seq2[string, string] {
    method SetPathParam (line 379) | func (r *Request) SetPathParam(key, val string) *Request {
    method SetPathParams (line 385) | func (r *Request) SetPathParams(m map[string]string) *Request {
    method SetPathParamsWithStruct (line 391) | func (r *Request) SetPathParamsWithStruct(v any) *Request {
    method DelPathParams (line 397) | func (r *Request) DelPathParams(key ...string) *Request {
    method ResetPathParams (line 403) | func (r *Request) ResetPathParams() *Request {
    method SetJSON (line 409) | func (r *Request) SetJSON(v any) *Request {
    method SetXML (line 416) | func (r *Request) SetXML(v any) *Request {
    method SetCBOR (line 423) | func (r *Request) SetCBOR(v any) *Request {
    method SetRawBody (line 430) | func (r *Request) SetRawBody(v []byte) *Request {
    method resetBody (line 438) | func (r *Request) resetBody(t bodyType) {
    method FormData (line 449) | func (r *Request) FormData(key string) []string {
    method AllFormData (line 463) | func (r *Request) AllFormData() iter.Seq2[string, []string] {
    method AddFormData (line 493) | func (r *Request) AddFormData(key, val string) *Request {
    method SetFormData (line 500) | func (r *Request) SetFormData(key, val string) *Request {
    method AddFormDataWithMap (line 507) | func (r *Request) AddFormDataWithMap(m map[string][]string) *Request {
    method SetFormDataWithMap (line 514) | func (r *Request) SetFormDataWithMap(m map[string]string) *Request {
    method SetFormDataWithStruct (line 521) | func (r *Request) SetFormDataWithStruct(v any) *Request {
    method DelFormData (line 528) | func (r *Request) DelFormData(key ...string) *Request {
    method File (line 536) | func (r *Request) File(name string) *File {
    method Files (line 556) | func (r *Request) Files() []*File {
    method FileByPath (line 561) | func (r *Request) FileByPath(path string) *File {
    method AddFile (line 571) | func (r *Request) AddFile(path string) *Request {
    method AddFileWithReader (line 578) | func (r *Request) AddFileWithReader(name string, reader io.ReadCloser)...
    method AddFiles (line 585) | func (r *Request) AddFiles(files ...*File) *Request {
    method Timeout (line 592) | func (r *Request) Timeout() time.Duration {
    method SetTimeout (line 597) | func (r *Request) SetTimeout(t time.Duration) *Request {
    method MaxRedirects (line 603) | func (r *Request) MaxRedirects() int {
    method SetMaxRedirects (line 608) | func (r *Request) SetMaxRedirects(count int) *Request {
    method DisablePathNormalizing (line 614) | func (r *Request) DisablePathNormalizing() bool {
    method SetDisablePathNormalizing (line 619) | func (r *Request) SetDisablePathNormalizing(disable bool) *Request {
    method checkClient (line 626) | func (r *Request) checkClient() {
    method Get (line 633) | func (r *Request) Get(url string) (*Response, error) {
    method Post (line 638) | func (r *Request) Post(url string) (*Response, error) {
    method Head (line 643) | func (r *Request) Head(url string) (*Response, error) {
    method Put (line 648) | func (r *Request) Put(url string) (*Response, error) {
    method Delete (line 653) | func (r *Request) Delete(url string) (*Response, error) {
    method Options (line 658) | func (r *Request) Options(url string) (*Response, error) {
    method Patch (line 663) | func (r *Request) Patch(url string) (*Response, error) {
    method Custom (line 668) | func (r *Request) Custom(url, method string) (*Response, error) {
    method Send (line 673) | func (r *Request) Send() (*Response, error) {
    method Reset (line 680) | func (r *Request) Reset() {
  type pair (line 134) | type pair struct
    method Len (line 140) | func (p *pair) Len() int {
    method Swap (line 145) | func (p *pair) Swap(i, j int) {
    method Less (line 151) | func (p *pair) Less(i, j int) bool {
  type Header (line 708) | type Header struct
    method PeekMultiple (line 713) | func (h *Header) PeekMultiple(key string) []string {
    method AddHeaders (line 725) | func (h *Header) AddHeaders(r map[string][]string) {
    method SetHeaders (line 734) | func (h *Header) SetHeaders(r map[string]string) {
  type QueryParam (line 742) | type QueryParam struct
    method Keys (line 747) | func (p *QueryParam) Keys() []string {
    method AddParams (line 756) | func (p *QueryParam) AddParams(r map[string][]string) {
    method SetParams (line 765) | func (p *QueryParam) SetParams(r map[string]string) {
    method SetParamsWithStruct (line 773) | func (p *QueryParam) SetParamsWithStruct(v any) {
  type Cookie (line 778) | type Cookie
    method Add (line 781) | func (c Cookie) Add(key, val string) {
    method Del (line 786) | func (c Cookie) Del(key string) {
    method SetCookie (line 791) | func (c Cookie) SetCookie(key, val string) {
    method SetCookies (line 796) | func (c Cookie) SetCookies(m map[string]string) {
    method SetCookiesWithStruct (line 802) | func (c Cookie) SetCookiesWithStruct(v any) {
    method DelCookies (line 807) | func (c Cookie) DelCookies(key ...string) {
    method All (line 816) | func (c Cookie) All() iter.Seq2[string, string] {
    method Reset (line 821) | func (c Cookie) Reset() {
  type PathParam (line 826) | type PathParam
    method Add (line 829) | func (p PathParam) Add(key, val string) {
    method Del (line 834) | func (p PathParam) Del(key string) {
    method SetParam (line 839) | func (p PathParam) SetParam(key, val string) {
    method SetParams (line 844) | func (p PathParam) SetParams(m map[string]string) {
    method SetParamsWithStruct (line 850) | func (p PathParam) SetParamsWithStruct(v any) {
    method DelParams (line 855) | func (p PathParam) DelParams(key ...string) {
    method All (line 864) | func (p PathParam) All() iter.Seq2[string, string] {
    method Reset (line 869) | func (p PathParam) Reset() {
  type FormData (line 874) | type FormData struct
    method Keys (line 879) | func (f *FormData) Keys() []string {
    method Add (line 888) | func (f *FormData) Add(key, val string) {
    method Set (line 893) | func (f *FormData) Set(key, val string) {
    method AddWithMap (line 898) | func (f *FormData) AddWithMap(m map[string][]string) {
    method SetWithMap (line 907) | func (f *FormData) SetWithMap(m map[string]string) {
    method SetWithStruct (line 915) | func (f *FormData) SetWithStruct(v any) {
    method DelData (line 920) | func (f *FormData) DelData(key ...string) {
    method Reset (line 927) | func (f *FormData) Reset() {
  type File (line 932) | type File struct
    method SetName (line 940) | func (f *File) SetName(n string) {
    method SetFieldName (line 945) | func (f *File) SetFieldName(n string) {
    method SetPath (line 950) | func (f *File) SetPath(p string) {
    method SetReader (line 955) | func (f *File) SetReader(r io.ReadCloser) {
    method Reset (line 960) | func (f *File) Reset() {
  function AcquireRequest (line 983) | func AcquireRequest() *Request {
  function ReleaseRequest (line 993) | func ReleaseRequest(req *Request) {
  type SetFileFunc (line 1001) | type SetFileFunc
  function SetFileName (line 1004) | func SetFileName(n string) SetFileFunc {
  function SetFileFieldName (line 1011) | func SetFileFieldName(p string) SetFileFunc {
  function SetFilePath (line 1018) | func SetFilePath(p string) SetFileFunc {
  function SetFileReader (line 1025) | func SetFileReader(r io.ReadCloser) SetFileFunc {
  function AcquireFile (line 1032) | func AcquireFile(setter ...SetFileFunc) *File {
  function ReleaseFile (line 1053) | func ReleaseFile(f *File) {
  function SetValWithStruct (line 1066) | func SetValWithStruct(p WithStruct, tagName string, v any) {

FILE: client/request_bench_test.go
  function BenchmarkRequestHeapScan (line 12) | func BenchmarkRequestHeapScan(b *testing.B) {

FILE: client/request_test.go
  function Test_Request_Method (line 25) | func Test_Request_Method(t *testing.T) {
  function Test_Request_URL (line 57) | func Test_Request_URL(t *testing.T) {
  function Test_Request_Client (line 69) | func Test_Request_Client(t *testing.T) {
  function Test_Request_Context (line 79) | func Test_Request_Context(t *testing.T) {
  function Test_Request_Header (line 98) | func Test_Request_Header(t *testing.T) {
  function Test_Request_Headers (line 161) | func Test_Request_Headers(t *testing.T) {
  function Benchmark_Request_Headers (line 179) | func Benchmark_Request_Headers(b *testing.B) {
  function Test_Request_QueryParam (line 196) | func Test_Request_QueryParam(t *testing.T) {
  function Test_Request_Params (line 321) | func Test_Request_Params(t *testing.T) {
  function Benchmark_Request_Params (line 364) | func Benchmark_Request_Params(b *testing.B) {
  function Test_Request_UA (line 381) | func Test_Request_UA(t *testing.T) {
  function Test_Request_Referer (line 391) | func Test_Request_Referer(t *testing.T) {
  function Test_Request_Cookie (line 401) | func Test_Request_Cookie(t *testing.T) {
  function Test_Request_Cookies (line 463) | func Test_Request_Cookies(t *testing.T) {
  function Benchmark_Request_Cookies (line 488) | func Benchmark_Request_Cookies(b *testing.B) {
  function Test_Request_PathParam (line 505) | func Test_Request_PathParam(t *testing.T) {
  function Test_Request_PathParams (line 582) | func Test_Request_PathParams(t *testing.T) {
  function Benchmark_Request_PathParams (line 607) | func Benchmark_Request_PathParams(b *testing.B) {
  function Test_Request_FormData (line 624) | func Test_Request_FormData(t *testing.T) {
  function Test_Request_File (line 755) | func Test_Request_File(t *testing.T) {
  function Test_Request_Files (line 793) | func Test_Request_Files(t *testing.T) {
  function Benchmark_Request_Files (line 811) | func Benchmark_Request_Files(b *testing.B) {
  function Test_Request_Timeout (line 826) | func Test_Request_Timeout(t *testing.T) {
  function Test_Request_Invalid_URL (line 834) | func Test_Request_Invalid_URL(t *testing.T) {
  function Test_Request_Unsupported_Protocol (line 844) | func Test_Request_Unsupported_Protocol(t *testing.T) {
  function Test_Request_Get (line 853) | func Test_Request_Get(t *testing.T) {
  function Test_Request_Post (line 877) | func Test_Request_Post(t *testing.T) {
  function Test_Request_Head (line 904) | func Test_Request_Head(t *testing.T) {
  function Test_Request_Put (line 929) | func Test_Request_Put(t *testing.T) {
  function Test_Request_Delete (line 956) | func Test_Request_Delete(t *testing.T) {
  function Test_Request_Options (line 984) | func Test_Request_Options(t *testing.T) {
  function Test_Request_Send (line 1012) | func Test_Request_Send(t *testing.T) {
  function Test_Request_Patch (line 1042) | func Test_Request_Patch(t *testing.T) {
  function Test_Request_Header_With_Server (line 1070) | func Test_Request_Header_With_Server(t *testing.T) {
  function Test_Request_UserAgent_With_Server (line 1099) | func Test_Request_UserAgent_With_Server(t *testing.T) {
  function Test_Request_Cookie_With_Server (line 1119) | func Test_Request_Cookie_With_Server(t *testing.T) {
  function Test_Request_Referer_With_Server (line 1138) | func Test_Request_Referer_With_Server(t *testing.T) {
  function Test_Request_QueryString_With_Server (line 1151) | func Test_Request_QueryString_With_Server(t *testing.T) {
  function checkFormFile (line 1167) | func checkFormFile(t *testing.T, fh *multipart.FileHeader, filename stri...
  function Test_Request_Body_With_Server (line 1185) | func Test_Request_Body_With_Server(t *testing.T) {
  function Test_Request_AllFormData (line 1397) | func Test_Request_AllFormData(t *testing.T) {
  function Benchmark_Request_AllFormData (line 1440) | func Benchmark_Request_AllFormData(b *testing.B) {
  function Test_Request_Error_Body_With_Server (line 1457) | func Test_Request_Error_Body_With_Server(t *testing.T) {
  function Test_Request_Timeout_With_Server (line 1505) | func Test_Request_Timeout_With_Server(t *testing.T) {
  function Test_Request_MaxRedirects (line 1525) | func Test_Request_MaxRedirects(t *testing.T) {
  function Test_SetValWithStruct (line 1590) | func Test_SetValWithStruct(t *testing.T) {
  function Benchmark_SetValWithStruct (line 1743) | func Benchmark_SetValWithStruct(b *testing.B) {

FILE: client/response.go
  type Response (line 19) | type Response struct
    method setClient (line 28) | func (r *Response) setClient(c *Client) {
    method setRequest (line 33) | func (r *Response) setRequest(req *Request) {
    method Status (line 38) | func (r *Response) Status() string {
    method StatusCode (line 43) | func (r *Response) StatusCode() int {
    method Protocol (line 48) | func (r *Response) Protocol() string {
    method Header (line 53) | func (r *Response) Header(key string) string {
    method Headers (line 62) | func (r *Response) Headers() iter.Seq2[string, []string] {
    method Cookies (line 83) | func (r *Response) Cookies() []*fasthttp.Cookie {
    method Body (line 88) | func (r *Response) Body() []byte {
    method BodyStream (line 95) | func (r *Response) BodyStream() io.Reader {
    method IsStreaming (line 104) | func (r *Response) IsStreaming() bool {
    method String (line 109) | func (r *Response) String() string {
    method JSON (line 114) | func (r *Response) JSON(v any) error {
    method CBOR (line 123) | func (r *Response) CBOR(v any) error {
    method XML (line 132) | func (r *Response) XML(v any) error {
    method Save (line 144) | func (r *Response) Save(v any) error {
    method Reset (line 193) | func (r *Response) Reset() {
    method Close (line 208) | func (r *Response) Close() {
  function AcquireResponse (line 228) | func AcquireResponse() *Response {
  function ReleaseResponse (line 238) | func ReleaseResponse(resp *Response) {

FILE: client/response_test.go
  function Test_Response_Status (line 22) | func Test_Response_Status(t *testing.T) {
  function Test_Response_Status_Code (line 73) | func Test_Response_Status_Code(t *testing.T) {
  function Test_Response_Protocol (line 124) | func Test_Response_Protocol(t *testing.T) {
  function Test_Response_Header (line 183) | func Test_Response_Header(t *testing.T) {
  function Test_Response_Headers (line 205) | func Test_Response_Headers(t *testing.T) {
  function Benchmark_Headers (line 243) | func Benchmark_Headers(b *testing.B) {
  function Test_Response_Cookie (line 283) | func Test_Response_Cookie(t *testing.T) {
  function Test_Response_Body (line 308) | func Test_Response_Body(t *testing.T) {
  function Test_Response_DecodeHelpers_ClientNilSafety (line 455) | func Test_Response_DecodeHelpers_ClientNilSafety(t *testing.T) {
  function Test_Response_Save (line 575) | func Test_Response_Save(t *testing.T) {
  function Test_Response_BodyStream (line 689) | func Test_Response_BodyStream(t *testing.T) {
  function Test_Response_BodyStream_Fallback (line 750) | func Test_Response_BodyStream_Fallback(t *testing.T) {
  function Test_Response_IsStreaming (line 773) | func Test_Response_IsStreaming(t *testing.T) {
  function Test_Response_Save_Streaming (line 827) | func Test_Response_Save_Streaming(t *testing.T) {
  type mockWriteCloser (line 928) | type mockWriteCloser struct
    method Write (line 949) | func (m *mockWriteCloser) Write(p []byte) (int, error) {
    method Close (line 953) | func (m *mockWriteCloser) Close() error {
  type errorReader (line 933) | type errorReader struct
    method Read (line 937) | func (m *errorReader) Read(_ []byte) (int, error) {
  type errorWriter (line 941) | type errorWriter struct
    method Write (line 945) | func (m *errorWriter) Write(_ []byte) (int, error) {

FILE: client/transport.go
  constant defaultRedirectLimit (line 15) | defaultRedirectLimit = 16
  type httpClientTransport (line 26) | type httpClientTransport interface
  type standardClientTransport (line 42) | type standardClientTransport struct
    method Do (line 50) | func (s *standardClientTransport) Do(req *fasthttp.Request, resp *fast...
    method DoTimeout (line 54) | func (s *standardClientTransport) DoTimeout(req *fasthttp.Request, res...
    method DoDeadline (line 58) | func (s *standardClientTransport) DoDeadline(req *fasthttp.Request, re...
    method DoRedirects (line 62) | func (s *standardClientTransport) DoRedirects(req *fasthttp.Request, r...
    method CloseIdleConnections (line 66) | func (s *standardClientTransport) CloseIdleConnections() {
    method TLSConfig (line 70) | func (s *standardClientTransport) TLSConfig() *tls.Config {
    method SetTLSConfig (line 74) | func (s *standardClientTransport) SetTLSConfig(config *tls.Config) {
    method SetDial (line 78) | func (s *standardClientTransport) SetDial(dial fasthttp.DialFunc) {
    method Client (line 82) | func (s *standardClientTransport) Client() any {
    method StreamResponseBody (line 86) | func (s *standardClientTransport) StreamResponseBody() bool {
    method SetStreamResponseBody (line 90) | func (s *standardClientTransport) SetStreamResponseBody(enable bool) {
  function newStandardClientTransport (line 46) | func newStandardClientTransport(client *fasthttp.Client) *standardClient...
  type hostClientTransport (line 96) | type hostClientTransport struct
    method Do (line 104) | func (h *hostClientTransport) Do(req *fasthttp.Request, resp *fasthttp...
    method DoTimeout (line 108) | func (h *hostClientTransport) DoTimeout(req *fasthttp.Request, resp *f...
    method DoDeadline (line 112) | func (h *hostClientTransport) DoDeadline(req *fasthttp.Request, resp *...
    method DoRedirects (line 116) | func (h *hostClientTransport) DoRedirects(req *fasthttp.Request, resp ...
    method CloseIdleConnections (line 120) | func (h *hostClientTransport) CloseIdleConnections() {
    method TLSConfig (line 124) | func (h *hostClientTransport) TLSConfig() *tls.Config {
    method SetTLSConfig (line 128) | func (h *hostClientTransport) SetTLSConfig(config *tls.Config) {
    method SetDial (line 132) | func (h *hostClientTransport) SetDial(dial fasthttp.DialFunc) {
    method Client (line 136) | func (h *hostClientTransport) Client() any {
    method StreamResponseBody (line 140) | func (h *hostClientTransport) StreamResponseBody() bool {
    method SetStreamResponseBody (line 144) | func (h *hostClientTransport) SetStreamResponseBody(enable bool) {
  function newHostClientTransport (line 100) | func newHostClientTransport(client *fasthttp.HostClient) *hostClientTran...
  type lbClientTransport (line 150) | type lbClientTransport struct
    method Do (line 158) | func (l *lbClientTransport) Do(req *fasthttp.Request, resp *fasthttp.R...
    method DoTimeout (line 162) | func (l *lbClientTransport) DoTimeout(req *fasthttp.Request, resp *fas...
    method DoDeadline (line 166) | func (l *lbClientTransport) DoDeadline(req *fasthttp.Request, resp *fa...
    method DoRedirects (line 173) | func (l *lbClientTransport) DoRedirects(req *fasthttp.Request, resp *f...
    method CloseIdleConnections (line 177) | func (l *lbClientTransport) CloseIdleConnections() {
    method TLSConfig (line 183) | func (l *lbClientTransport) TLSConfig() *tls.Config {
    method SetTLSConfig (line 190) | func (l *lbClientTransport) SetTLSConfig(config *tls.Config) {
    method SetDial (line 196) | func (l *lbClientTransport) SetDial(dial fasthttp.DialFunc) {
    method Client (line 202) | func (l *lbClientTransport) Client() any {
    method StreamResponseBody (line 206) | func (l *lbClientTransport) StreamResponseBody() bool {
    method SetStreamResponseBody (line 223) | func (l *lbClientTransport) SetStreamResponseBody(enable bool) {
  function newLBClientTransport (line 154) | func newLBClientTransport(client *fasthttp.LBClient) *lbClientTransport {
  function forEachHostClient (line 231) | func forEachHostClient(lb *fasthttp.LBClient, fn func(*fasthttp.HostClie...
  function walkBalancingClient (line 239) | func walkBalancingClient(client any, fn func(*fasthttp.HostClient)) {
  function extractTLSConfig (line 249) | func extractTLSConfig(clients []fasthttp.BalancingClient) *tls.Config {
  function walkBalancingClientWithBreak (line 268) | func walkBalancingClientWithBreak(client any, fn func(*fasthttp.HostClie...
  type redirectClient (line 291) | type redirectClient interface
  function doRedirectsWithClient (line 299) | func doRedirectsWithClient(req *fasthttp.Request, resp *fasthttp.Respons...
  function composeRedirectURL (line 354) | func composeRedirectURL(base string, location []byte, disablePathNormali...

FILE: client/transport_test.go
  type stubBalancingClient (line 15) | type stubBalancingClient struct
    method DoDeadline (line 17) | func (stubBalancingClient) DoDeadline(*fasthttp.Request, *fasthttp.Res...
    method PendingRequests (line 20) | func (stubBalancingClient) PendingRequests() int { return 0 }
  type lbBalancingClient (line 22) | type lbBalancingClient struct
    method DoDeadline (line 26) | func (l *lbBalancingClient) DoDeadline(req *fasthttp.Request, resp *fa...
    method PendingRequests (line 33) | func (*lbBalancingClient) PendingRequests() int { return 0 }
    method LBClient (line 35) | func (l *lbBalancingClient) LBClient() *fasthttp.LBClient { return l.c...
  type stubRedirectCall (line 37) | type stubRedirectCall struct
  function ptrInt (line 43) | func ptrInt(v int) *int { return &v }
  function ptrString (line 45) | func ptrString(v string) *string { return &v }
  type stubRedirectClient (line 47) | type stubRedirectClient struct
    method Do (line 52) | func (s *stubRedirectClient) Do(req *fasthttp.Request, resp *fasthttp....
    method CallCount (line 74) | func (s *stubRedirectClient) CallCount() int { return s.callCount }
  function TestStandardClientTransportCoverage (line 76) | func TestStandardClientTransportCoverage(t *testing.T) {
  function TestHostClientTransportClientAccessor (line 122) | func TestHostClientTransportClientAccessor(t *testing.T) {
  function TestLBClientTransportAccessorsAndOverrides (line 143) | func TestLBClientTransportAccessorsAndOverrides(t *testing.T) {
  function TestExtractTLSConfigVariations (line 213) | func TestExtractTLSConfigVariations(t *testing.T) {
  function TestWalkBalancingClientWithBreak (line 230) | func TestWalkBalancingClientWithBreak(t *testing.T) {
  function TestDoRedirectsWithClientBranches (line 253) | func TestDoRedirectsWithClientBranches(t *testing.T) {
  function TestDoRedirectsWithClientDefaultLimit (line 328) | func TestDoRedirectsWithClientDefaultLimit(t *testing.T) {
  function Test_StandardClientTransport_StreamResponseBody (line 350) | func Test_StandardClientTransport_StreamResponseBody(t *testing.T) {
  function Test_HostClientTransport_StreamResponseBody (line 380) | func Test_HostClientTransport_StreamResponseBody(t *testing.T) {
  function Test_LBClientTransport_StreamResponseBody (line 411) | func Test_LBClientTransport_StreamResponseBody(t *testing.T) {
  function Test_httpClientTransport_Interface (line 468) | func Test_httpClientTransport_Interface(t *testing.T) {

FILE: color.go
  type Colors (line 8) | type Colors struct
  function defaultColors (line 69) | func defaultColors(colors *Colors) Colors {

FILE: constants.go
  constant MethodGet (line 5) | MethodGet     = "GET"
  constant MethodHead (line 6) | MethodHead    = "HEAD"
  constant MethodPost (line 7) | MethodPost    = "POST"
  constant MethodPut (line 8) | MethodPut     = "PUT"
  constant MethodPatch (line 9) | MethodPatch   = "PATCH"
  constant MethodDelete (line 10) | MethodDelete  = "DELETE"
  constant MethodConnect (line 11) | MethodConnect = "CONNECT"
  constant MethodOptions (line 12) | MethodOptions = "OPTIONS"
  constant MethodTrace (line 13) | MethodTrace   = "TRACE"
  constant methodUse (line 14) | methodUse     = "USE"
  constant MIMETextXML (line 19) | MIMETextXML               = "text/xml"
  constant MIMETextHTML (line 20) | MIMETextHTML              = "text/html"
  constant MIMETextPlain (line 21) | MIMETextPlain             = "text/plain"
  constant MIMETextJavaScript (line 22) | MIMETextJavaScript        = "text/javascript"
  constant MIMETextCSS (line 23) | MIMETextCSS               = "text/css"
  constant MIMEApplicationXML (line 24) | MIMEApplicationXML        = "application/xml"
  constant MIMEApplicationJSON (line 25) | MIMEApplicationJSON       = "application/json"
  constant MIMEApplicationJavaScript (line 26) | MIMEApplicationJavaScript = "application/javascript"
  constant MIMEApplicationCBOR (line 27) | MIMEApplicationCBOR       = "application/cbor"
  constant MIMEApplicationForm (line 28) | MIMEApplicationForm       = "application/x-www-form-urlencoded"
  constant MIMEOctetStream (line 29) | MIMEOctetStream           = "application/octet-stream"
  constant MIMEMultipartForm (line 30) | MIMEMultipartForm         = "multipart/form-data"
  constant MIMEApplicationMsgPack (line 31) | MIMEApplicationMsgPack    = "application/vnd.msgpack"
  constant MIMETextXMLCharsetUTF8 (line 33) | MIMETextXMLCharsetUTF8         = "text/xml; charset=utf-8"
  constant MIMETextHTMLCharsetUTF8 (line 34) | MIMETextHTMLCharsetUTF8        = "text/html; charset=utf-8"
  constant MIMETextPlainCharsetUTF8 (line 35) | MIMETextPlainCharsetUTF8       = "text/plain; charset=utf-8"
  constant MIMETextJavaScriptCharsetUTF8 (line 36) | MIMETextJavaScriptCharsetUTF8  = "text/javascript; charset=utf-8"
  constant MIMETextCSSCharsetUTF8 (line 37) | MIMETextCSSCharsetUTF8         = "text/css; charset=utf-8"
  constant MIMEApplicationXMLCharsetUTF8 (line 38) | MIMEApplicationXMLCharsetUTF8  = "application/xml; charset=utf-8"
  constant MIMEApplicationJSONCharsetUTF8 (line 39) | MIMEApplicationJSONCharsetUTF8 = "application/json; charset=utf-8"
  constant StatusContinue (line 47) | StatusContinue           = 100
  constant StatusSwitchingProtocols (line 48) | StatusSwitchingProtocols = 101
  constant StatusProcessing (line 49) | StatusProcessing         = 102
  constant StatusEarlyHints (line 50) | StatusEarlyHints         = 103
  constant StatusOK (line 52) | StatusOK                          = 200
  constant StatusCreated (line 53) | StatusCreated                     = 201
  constant StatusAccepted (line 54) | StatusAccepted                    = 202
  constant StatusNonAuthoritativeInformation (line 55) | StatusNonAuthoritativeInformation = 203
  constant StatusNoContent (line 56) | StatusNoContent                   = 204
  constant StatusResetContent (line 57) | StatusResetContent                = 205
  constant StatusPartialContent (line 58) | StatusPartialContent              = 206
  constant StatusMultiStatus (line 59) | StatusMultiStatus                 = 207
  constant StatusAlreadyReported (line 60) | StatusAlreadyReported             = 208
  constant StatusIMUsed (line 61) | StatusIMUsed                      = 226
  constant StatusMultipleChoices (line 63) | StatusMultipleChoices   = 300
  constant StatusMovedPermanently (line 64) | StatusMovedPermanently  = 301
  constant StatusFound (line 65) | StatusFound             = 302
  constant StatusSeeOther (line 66) | StatusSeeOther          = 303
  constant StatusNotModified (line 67) | StatusNotModified       = 304
  constant StatusUseProxy (line 68) | StatusUseProxy          = 305
  constant StatusSwitchProxy (line 69) | StatusSwitchProxy       = 306
  constant StatusTemporaryRedirect (line 70) | StatusTemporaryRedirect = 307
  constant StatusPermanentRedirect (line 71) | StatusPermanentRedirect = 308
  constant StatusBadRequest (line 73) | StatusBadRequest                   = 400
  constant StatusUnauthorized (line 74) | StatusUnauthorized                 = 401
  constant StatusPaymentRequired (line 75) | StatusPaymentRequired              = 402
  constant StatusForbidden (line 76) | StatusForbidden                    = 403
  constant StatusNotFound (line 77) | StatusNotFound                     = 404
  constant StatusMethodNotAllowed (line 78) | StatusMethodNotAllowed             = 405
  constant StatusNotAcceptable (line 79) | StatusNotAcceptable                = 406
  constant StatusProxyAuthRequired (line 80) | StatusProxyAuthRequired            = 407
  constant StatusRequestTimeout (line 81) | StatusRequestTimeout               = 408
  constant StatusConflict (line 82) | StatusConflict                     = 409
  constant StatusGone (line 83) | StatusGone                         = 410
  constant StatusLengthRequired (line 84) | StatusLengthRequired               = 411
  constant StatusPreconditionFailed (line 85) | StatusPreconditionFailed           = 412
  constant StatusRequestEntityTooLarge (line 86) | StatusRequestEntityTooLarge        = 413
  constant StatusRequestURITooLong (line 87) | StatusRequestURITooLong            = 414
  constant StatusUnsupportedMediaType (line 88) | StatusUnsupportedMediaType         = 415
  constant StatusRequestedRangeNotSatisfiable (line 89) | StatusRequestedRangeNotSatisfiable = 416
  constant StatusExpectationFailed (line 90) | StatusExpectationFailed            = 417
  constant StatusTeapot (line 91) | StatusTeapot                       = 418
  constant StatusMisdirectedRequest (line 92) | StatusMisdirectedRequest           = 421
  constant StatusUnprocessableEntity (line 93) | StatusUnprocessableEntity          = 422
  constant StatusLocked (line 94) | StatusLocked                       = 423
  constant StatusFailedDependency (line 95) | StatusFailedDependency             = 424
  constant StatusTooEarly (line 96) | StatusTooEarly                     = 425
  constant StatusUpgradeRequired (line 97) | StatusUpgradeRequired              = 426
  constant StatusPreconditionRequired (line 98) | StatusPreconditionRequired         = 428
  constant StatusTooManyRequests (line 99) | StatusTooManyRequests              = 429
  constant StatusRequestHeaderFieldsTooLarge (line 100) | StatusRequestHeaderFieldsTooLarge  = 431
  constant StatusUnavailableForLegalReasons (line 101) | StatusUnavailableForLegalReasons   = 451
  constant StatusInternalServerError (line 103) | StatusInternalServerError           = 500
  constant StatusNotImplemented (line 104) | StatusNotImplemented                = 501
  constant StatusBadGateway (line 105) | StatusBadGateway                    = 502
  constant StatusServiceUnavailable (line 106) | StatusServiceUnavailable            = 503
  constant StatusGatewayTimeout (line 107) | StatusGatewayTimeout                = 504
  constant StatusHTTPVersionNotSupported (line 108) | StatusHTTPVersionNotSupported       = 505
  constant StatusVariantAlsoNegotiates (line 109) | StatusVariantAlsoNegotiates         = 506
  constant StatusInsufficientStorage (line 110) | StatusInsufficientStorage           = 507
  constant StatusLoopDetected (line 111) | StatusLoopDetected                  = 508
  constant StatusNotExtended (line 112) | StatusNotExtended                   = 510
  constant StatusNetworkAuthenticationRequired (line 113) | StatusNetworkAuthenticationRequired = 511
  constant HeaderAuthorization (line 163) | HeaderAuthorization                      = "Authorization"
  constant HeaderProxyAuthenticate (line 164) | HeaderProxyAuthenticate                  = "Proxy-Authenticate"
  constant HeaderProxyAuthorization (line 165) | HeaderProxyAuthorization                 = "Proxy-Authorization"
  constant HeaderWWWAuthenticate (line 166) | HeaderWWWAuthenticate                    = "WWW-Authenticate"
  constant HeaderAge (line 167) | HeaderAge                                = "Age"
  constant HeaderCacheControl (line 168) | HeaderCacheControl                       = "Cache-Control"
  constant HeaderClearSiteData (line 169) | HeaderClearSiteData                      = "Clear-Site-Data"
  constant HeaderExpires (line 170) | HeaderExpires                            = "Expires"
  constant HeaderPragma (line 171) | HeaderPragma                             = "Pragma"
  constant HeaderWarning (line 172) | HeaderWarning                            = "Warning"
  constant HeaderAcceptCH (line 173) | HeaderAcceptCH                           = "Accept-CH"
  constant HeaderAcceptCHLifetime (line 174) | HeaderAcceptCHLifetime                   = "Accept-CH-Lifetime"
  constant HeaderContentDPR (line 175) | HeaderContentDPR                         = "Content-DPR"
  constant HeaderDPR (line 176) | HeaderDPR                                = "DPR"
  constant HeaderEarlyData (line 177) | HeaderEarlyData                          = "Early-Data"
  constant HeaderSaveData (line 178) | HeaderSaveData                           = "Save-Data"
  constant HeaderViewportWidth (line 179) | HeaderViewportWidth                      = "Viewport-Width"
  constant HeaderWidth (line 180) | HeaderWidth                              = "Width"
  constant HeaderETag (line 181) | HeaderETag                               = "ETag"
  constant HeaderIfMatch (line 182) | HeaderIfMatch                            = "If-Match"
  constant HeaderIfModifiedSince (line 183) | HeaderIfModifiedSince                    = "If-Modified-Since"
  constant HeaderIfNoneMatch (line 184) | HeaderIfNoneMatch                        = "If-None-Match"
  constant HeaderIfUnmodifiedSince (line 185) | HeaderIfUnmodifiedSince                  = "If-Unmodified-Since"
  constant HeaderLastModified (line 186) | HeaderLastModified                       = "Last-Modified"
  constant HeaderVary (line 187) | HeaderVary                               = "Vary"
  constant HeaderConnection (line 188) | HeaderConnection                         = "Connection"
  constant HeaderKeepAlive (line 189) | HeaderKeepAlive                          = "Keep-Alive"
  constant HeaderAccept (line 190) | HeaderAccept                             = "Accept"
  constant HeaderAcceptCharset (line 191) | HeaderAcceptCharset                      = "Accept-Charset"
  constant HeaderAcceptEncoding (line 192) | HeaderAcceptEncoding                     = "Accept-Encoding"
  constant HeaderAcceptLanguage (line 193) | HeaderAcceptLanguage                     = "Accept-Language"
  constant HeaderCookie (line 194) | HeaderCookie                             = "Cookie"
  constant HeaderExpect (line 195) | HeaderExpect                             = "Expect"
  constant HeaderMaxForwards (line 196) | HeaderMaxForwards                        = "Max-Forwards"
  constant HeaderSetCookie (line 197) | HeaderSetCookie                          = "Set-Cookie"
  constant HeaderAccessControlAllowCredentials (line 198) | HeaderAccessControlAllowCredentials      = "Access-Control-Allow-Credent...
  constant HeaderAccessControlAllowHeaders (line 199) | HeaderAccessControlAllowHeaders          = "Access-Control-Allow-Headers"
  constant HeaderAccessControlAllowMethods (line 200) | HeaderAccessControlAllowMethods          = "Access-Control-Allow-Methods"
  constant HeaderAccessControlAllowOrigin (line 201) | HeaderAccessControlAllowOrigin           = "Access-Control-Allow-Origin"
  constant HeaderAccessControlExposeHeaders (line 202) | HeaderAccessControlExposeHeaders         = "Access-Control-Expose-Headers"
  constant HeaderAccessControlMaxAge (line 203) | HeaderAccessControlMaxAge                = "Access-Control-Max-Age"
  constant HeaderAccessControlRequestHeaders (line 204) | HeaderAccessControlRequestHeaders        = "Access-Control-Request-Headers"
  constant HeaderAccessControlRequestMethod (line 205) | HeaderAccessControlRequestMethod         = "Access-Control-Request-Method"
  constant HeaderOrigin (line 206) | HeaderOrigin                             = "Origin"
  constant HeaderTimingAllowOrigin (line 207) | HeaderTimingAllowOrigin                  = "Timing-Allow-Origin"
  constant HeaderXPermittedCrossDomainPolicies (line 208) | HeaderXPermittedCrossDomainPolicies      = "X-Permitted-Cross-Domain-Pol...
  constant HeaderDNT (line 209) | HeaderDNT                                = "DNT"
  constant HeaderTk (line 210) | HeaderTk                                 = "Tk"
  constant HeaderContentDisposition (line 211) | HeaderContentDisposition                 = "Content-Disposition"
  constant HeaderContentEncoding (line 212) | HeaderContentEncoding                    = "Content-Encoding"
  constant HeaderContentLanguage (line 213) | HeaderContentLanguage                    = "Content-Language"
  constant HeaderContentLength (line 214) | HeaderContentLength                      = "Content-Length"
  constant HeaderContentLocation (line 215) | HeaderContentLocation                    = "Content-Location"
  constant HeaderContentType (line 216) | HeaderContentType                        = "Content-Type"
  constant HeaderForwarded (line 217) | HeaderForwarded                          = "Forwarded"
  constant HeaderVia (line 218) | HeaderVia                                = "Via"
  constant HeaderXForwardedFor (line 219) | HeaderXForwardedFor                      = "X-Forwarded-For"
  constant HeaderXForwardedHost (line 220) | HeaderXForwardedHost                     = "X-Forwarded-Host"
  constant HeaderXForwardedProto (line 221) | HeaderXForwardedProto                    = "X-Forwarded-Proto"
  constant HeaderXForwardedProtocol (line 222) | HeaderXForwardedProtocol                 = "X-Forwarded-Protocol"
  constant HeaderXForwardedSsl (line 223) | HeaderXForwardedSsl                      = "X-Forwarded-Ssl"
  constant HeaderXUrlScheme (line 224) | HeaderXUrlScheme                         = "X-Url-Scheme"
  constant HeaderLocation (line 225) | HeaderLocation                           = "Location"
  constant HeaderFrom (line 226) | HeaderFrom                               = "From"
  constant HeaderHost (line 227) | HeaderHost                               = "Host"
  constant HeaderReferer (line 228) | HeaderReferer                            = "Referer"
  constant HeaderReferrerPolicy (line 229) | HeaderReferrerPolicy                     = "Referrer-Policy"
  constant HeaderUserAgent (line 230) | HeaderUserAgent                          = "User-Agent"
  constant HeaderAllow (line 231) | HeaderAllow                              = "Allow"
  constant HeaderServer (line 232) | HeaderServer                             = "Server"
  constant HeaderAcceptRanges (line 233) | HeaderAcceptRanges                       = "Accept-Ranges"
  constant HeaderContentRange (line 234) | HeaderContentRange                       = "Content-Range"
  constant HeaderIfRange (line 235) | HeaderIfRange                            = "If-Range"
  constant HeaderRange (line 236) | HeaderRange                              = "Range"
  constant HeaderContentSecurityPolicy (line 237) | HeaderContentSecurityPolicy              = "Content-Security-Policy"
  constant HeaderContentSecurityPolicyReportOnly (line 238) | HeaderContentSecurityPolicyReportOnly    = "Content-Security-Policy-Repo...
  constant HeaderCrossOriginResourcePolicy (line 239) | HeaderCrossOriginResourcePolicy          = "Cross-Origin-Resource-Policy"
  constant HeaderExpectCT (line 240) | HeaderExpectCT                           = "Expect-CT"
  constant HeaderPermissionsPolicy (line 241) | HeaderPermissionsPolicy                  = "Permissions-Policy"
  constant HeaderPublicKeyPins (line 242) | HeaderPublicKeyPins                      = "Public-Key-Pins"
  constant HeaderPublicKeyPinsReportOnly (line 243) | HeaderPublicKeyPinsReportOnly            = "Public-Key-Pins-Report-Only"
  constant HeaderStrictTransportSecurity (line 244) | HeaderStrictTransportSecurity            = "Strict-Transport-Security"
  constant HeaderUpgradeInsecureRequests (line 245) | HeaderUpgradeInsecureRequests            = "Upgrade-Insecure-Requests"
  constant HeaderXContentTypeOptions (line 246) | HeaderXContentTypeOptions                = "X-Content-Type-Options"
  constant HeaderXDownloadOptions (line 247) | HeaderXDownloadOptions                   = "X-Download-Options"
  constant HeaderXFrameOptions (line 248) | HeaderXFrameOptions                      = "X-Frame-Options"
  constant HeaderXPoweredBy (line 249) | HeaderXPoweredBy                         = "X-Powered-By"
  constant HeaderXXSSProtection (line 250) | HeaderXXSSProtection                     = "X-XSS-Protection"
  constant HeaderLastEventID (line 251) | HeaderLastEventID                        = "Last-Event-ID"
  constant HeaderNEL (line 252) | HeaderNEL                                = "NEL"
  constant HeaderPingFrom (line 253) | HeaderPingFrom                           = "Ping-From"
  constant HeaderPingTo (line 254) | HeaderPingTo                             = "Ping-To"
  constant HeaderReportTo (line 255) | HeaderReportTo                           = "Report-To"
  constant HeaderTE (line 256) | HeaderTE                                 = "TE"
  constant HeaderTrailer (line 257) | HeaderTrailer                            = "Trailer"
  constant HeaderTransferEncoding (line 258) | HeaderTransferEncoding                   = "Transfer-Encoding"
  constant HeaderSecFetchSite (line 259) | HeaderSecFetchSite                       = "Sec-Fetch-Site"
  constant HeaderSecWebSocketAccept (line 260) | HeaderSecWebSocketAccept                 = "Sec-WebSocket-Accept"
  constant HeaderSecWebSocketExtensions (line 261) | HeaderSecWebSocketExtensions             = "Sec-WebSocket-Extensions"
  constant HeaderSecWebSocketKey (line 262) | HeaderSecWebSocketKey                    = "Sec-WebSocket-Key"
  constant HeaderSecWebSocketProtocol (line 263) | HeaderSecWebSocketProtocol               = "Sec-WebSocket-Protocol"
  constant HeaderSecWebSocketVersion (line 264) | HeaderSecWebSocketVersion                = "Sec-WebSocket-Version"
  constant HeaderAcceptPatch (line 265) | HeaderAcceptPatch                        = "Accept-Patch"
  constant HeaderAcceptPushPolicy (line 266) | HeaderAcceptPushPolicy                   = "Accept-Push-Policy"
  constant HeaderAcceptSignature (line 267) | HeaderAcceptSignature                    = "Accept-Signature"
  constant HeaderAltSvc (line 268) | HeaderAltSvc                             = "Alt-Svc"
  constant HeaderDate (line 269) | HeaderDate                               = "Date"
  constant HeaderIndex (line 270) | HeaderIndex                              = "Index"
  constant HeaderLargeAllocation (line 271) | HeaderLargeAllocation                    = "Large-Allocation"
  constant HeaderLink (line 272) | HeaderLink                               = "Link"
  constant HeaderPushPolicy (line 273) | HeaderPushPolicy                         = "Push-Policy"
  constant HeaderRetryAfter (line 274) | HeaderRetryAfter                         = "Retry-After"
  constant HeaderServerTiming (line 275) | HeaderServerTiming                       = "Server-Timing"
  constant HeaderSignature (line 276) | HeaderSignature                          = "Signature"
  constant HeaderSignedHeaders (line 277) | HeaderSignedHeaders                      = "Signed-Headers"
  constant HeaderSourceMap (line 278) | HeaderSourceMap                          = "SourceMap"
  constant HeaderUpgrade (line 279) | HeaderUpgrade                            = "Upgrade"
  constant HeaderXDNSPrefetchControl (line 280) | HeaderXDNSPrefetchControl                = "X-DNS-Prefetch-Control"
  constant HeaderXPingback (line 281) | HeaderXPingback                          = "X-Pingback"
  constant HeaderXRequestID (line 282) | HeaderXRequestID                         = "X-Request-ID"
  constant HeaderXRequestedWith (line 283) | HeaderXRequestedWith                     = "X-Requested-With"
  constant HeaderXResponseTime (line 284) | HeaderXResponseTime                      = "X-Response-Time"
  constant HeaderXRobotsTag (line 285) | HeaderXRobotsTag                         = "X-Robots-Tag"
  constant HeaderXUACompatible (line 286) | HeaderXUACompatible                      = "X-UA-Compatible"
  constant HeaderAccessControlAllowPrivateNetwork (line 287) | HeaderAccessControlAllowPrivateNetwork   = "Access-Control-Allow-Private...
  constant HeaderAccessControlRequestPrivateNetwork (line 288) | HeaderAccessControlRequestPrivateNetwork = "Access-Control-Request-Priva...
  constant NetworkTCP (line 293) | NetworkTCP  = "tcp"
  constant NetworkTCP4 (line 294) | NetworkTCP4 = "tcp4"
  constant NetworkTCP6 (line 295) | NetworkTCP6 = "tcp6"
  constant NetworkUnix (line 296) | NetworkUnix = "unix"
  constant StrGzip (line 301) | StrGzip     = "gzip"
  constant StrCompress (line 302) | StrCompress = "compress"
  constant StrIdentity (line 303) | StrIdentity = "identity"
  constant StrBr (line 304) | StrBr       = "br"
  constant StrDeflate (line 305) | StrDeflate  = "deflate"
  constant StrBrotli (line 306) | StrBrotli   = "brotli"
  constant StrZstd (line 307) | StrZstd     = "zstd"
  constant CookieSameSiteDisabled (line 313) | CookieSameSiteDisabled   = "disabled"
  constant CookieSameSiteLaxMode (line 314) | CookieSameSiteLaxMode    = "Lax"
  constant CookieSameSiteStrictMode (line 315) | CookieSameSiteStrictMode = "Strict"
  constant CookieSameSiteNoneMode (line 316) | CookieSameSiteNoneMode   = "None"
  constant ConstraintInt (line 321) | ConstraintInt             = "int"
  constant ConstraintBool (line 322) | ConstraintBool            = "bool"
  constant ConstraintFloat (line 323) | ConstraintFloat           = "float"
  constant ConstraintAlpha (line 324) | ConstraintAlpha           = "alpha"
  constant ConstraintGUID (line 325) | ConstraintGUID            = "guid"
  constant ConstraintMinLen (line 326) | ConstraintMinLen          = "minLen"
  constant ConstraintMaxLen (line 327) | ConstraintMaxLen          = "maxLen"
  constant ConstraintLen (line 328) | ConstraintLen             = "len"
  constant ConstraintBetweenLen (line 329) | ConstraintBetweenLen      = "betweenLen"
  constant ConstraintMinLenLower (line 330) | ConstraintMinLenLower     = "minlen"
  constant ConstraintMaxLenLower (line 331) | ConstraintMaxLenLower     = "maxlen"
  constant ConstraintBetweenLenLower (line 332) | ConstraintBetweenLenLower = "betweenlen"
  constant ConstraintMin (line 333) | ConstraintMin             = "min"
  constant ConstraintMax (line 334) | ConstraintMax             = "max"
  constant ConstraintRange (line 335) | ConstraintRange           = "range"
  constant ConstraintDatetime (line 336) | ConstraintDatetime        = "datetime"
  constant ConstraintRegex (line 337) | ConstraintRegex           = "regex"

FILE: ctx.go
  constant schemeHTTP (line 26) | schemeHTTP  = "http"
  constant schemeHTTPS (line 27) | schemeHTTPS = "https"
  constant maxParams (line 32) | maxParams         = 30
  constant maxDetectionPaths (line 33) | maxDetectionPaths = 3
  type contextKey (line 43) | type contextKey
  constant userContextKey (line 47) | userContextKey contextKey = iota
  type DefaultCtx (line 55) | type DefaultCtx struct
    method App (line 101) | func (c *DefaultCtx) App() *App {
    method BaseURL (line 106) | func (c *DefaultCtx) BaseURL() string {
    method RequestCtx (line 118) | func (c *DefaultCtx) RequestCtx() *fasthttp.RequestCtx {
    method Context (line 124) | func (c *DefaultCtx) Context() context.Context {
    method SetContext (line 137) | func (c *DefaultCtx) SetContext(ctx context.Context) {
    method Deadline (line 150) | func (*DefaultCtx) Deadline() (time.Time, bool) {
    method Done (line 162) | func (*DefaultCtx) Done() <-chan struct{} {
    method Err (line 170) | func (*DefaultCtx) Err() error {
    method Request (line 178) | func (c *DefaultCtx) Request() *fasthttp.Request {
    method Response (line 189) | func (c *DefaultCtx) Response() *fasthttp.Response {
    method Get (line 200) | func (c *DefaultCtx) Get(key string, defaultValue ...string) string {
    method GetHeaders (line 207) | func (c *DefaultCtx) GetHeaders() map[string][]string {
    method GetReqHeaders (line 214) | func (c *DefaultCtx) GetReqHeaders() map[string][]string {
    method GetRespHeader (line 222) | func (c *DefaultCtx) GetRespHeader(key string, defaultValue ...string)...
    method GetRespHeaders (line 229) | func (c *DefaultCtx) GetRespHeaders() map[string][]string {
    method ClientHelloInfo (line 234) | func (c *DefaultCtx) ClientHelloInfo() *tls.ClientHelloInfo {
    method Next (line 243) | func (c *DefaultCtx) Next() error {
    method RestartRouting (line 265) | func (c *DefaultCtx) RestartRouting() error {
    method setHandlerCtx (line 275) | func (c *DefaultCtx) setHandlerCtx(ctx CustomCtx) {
    method OriginalURL (line 290) | func (c *DefaultCtx) OriginalURL() string {
    method Path (line 297) | func (c *DefaultCtx) Path(override ...string) string {
    method RequestID (line 311) | func (c *DefaultCtx) RequestID() string {
    method Req (line 320) | func (c *DefaultCtx) Req() Req {
    method Res (line 326) | func (c *DefaultCtx) Res() Res {
    method Redirect (line 334) | func (c *DefaultCtx) Redirect() *Redirect {
    method ViewBind (line 345) | func (c *DefaultCtx) ViewBind(vars Map) error {
    method Route (line 355) | func (c *DefaultCtx) Route() *Route {
    method FullPath (line 370) | func (c *DefaultCtx) FullPath() string {
    method Matched (line 375) | func (c *DefaultCtx) Matched() bool {
    method IsMiddleware (line 380) | func (c *DefaultCtx) IsMiddleware() bool {
    method HasBody (line 392) | func (c *DefaultCtx) HasBody() bool {
    method OverrideParam (line 413) | func (c *DefaultCtx) OverrideParam(name, value string) {
    method IsWebSocket (line 486) | func (c *DefaultCtx) IsWebSocket() bool {
    method IsPreflight (line 502) | func (c *DefaultCtx) IsPreflight() bool {
    method SaveFile (line 514) | func (*DefaultCtx) SaveFile(fileheader *multipart.FileHeader, path str...
    method SaveFileToStorage (line 519) | func (c *DefaultCtx) SaveFileToStorage(fileheader *multipart.FileHeade...
    method Secure (line 557) | func (c *DefaultCtx) Secure() bool {
    method Status (line 563) | func (c *DefaultCtx) Status(status int) Ctx {
    method String (line 571) | func (c *DefaultCtx) String() string {
    method Value (line 610) | func (c *DefaultCtx) Value(key any) any {
    method XHR (line 626) | func (c *DefaultCtx) XHR() bool {
    method configDependentPaths (line 632) | func (c *DefaultCtx) configDependentPaths() {
    method Reset (line 662) | func (c *DefaultCtx) Reset(fctx *fasthttp.RequestCtx) {
    method release (line 686) | func (c *DefaultCtx) release() {
    method Abandon (line 718) | func (c *DefaultCtx) Abandon() {
    method IsAbandoned (line 723) | func (c *DefaultCtx) IsAbandoned() bool {
    method ForceRelease (line 731) | func (c *DefaultCtx) ForceRelease() {
    method renderExtensions (line 736) | func (c *DefaultCtx) renderExtensions(bind any) {
    method Bind (line 766) | func (c *DefaultCtx) Bind() *Bind {
    method getMethodInt (line 775) | func (c *DefaultCtx) getMethodInt() int {
    method getIndexRoute (line 779) | func (c *DefaultCtx) getIndexRoute() int {
    method getTreePathHash (line 783) | func (c *DefaultCtx) getTreePathHash() int {
    method getDetectionPath (line 787) | func (c *DefaultCtx) getDetectionPath() string {
    method getValues (line 791) | func (c *DefaultCtx) getValues() *[maxParams]string {
    method getMatched (line 795) | func (c *DefaultCtx) getMatched() bool {
    method getSkipNonUseRoutes (line 799) | func (c *DefaultCtx) getSkipNonUseRoutes() bool {
    method setIndexHandler (line 803) | func (c *DefaultCtx) setIndexHandler(handler int) {
    method setIndexRoute (line 807) | func (c *DefaultCtx) setIndexRoute(route int) {
    method setMatched (line 811) | func (c *DefaultCtx) setMatched(matched bool) {
    method setSkipNonUseRoutes (line 815) | func (c *DefaultCtx) setSkipNonUseRoutes(skip bool) {
    method setRoute (line 819) | func (c *DefaultCtx) setRoute(route *Route) {
    method getPathOriginal (line 823) | func (c *DefaultCtx) getPathOriginal() string {
  type TLSHandler (line 82) | type TLSHandler struct
    method GetClientInfo (line 89) | func (t *TLSHandler) GetClientInfo(info *tls.ClientHelloInfo) (*tls.Ce...
  type Views (line 95) | type Views interface
  function hasTransferEncodingBody (line 444) | func hasTransferEncodingBody(hdr *fasthttp.RequestHeader) bool {

FILE: ctx_interface.go
  type CustomCtx (line 13) | type CustomCtx interface
  function NewDefaultCtx (line 53) | func NewDefaultCtx(app *App) *DefaultCtx {
  method AcquireCtx (line 66) | func (app *App) AcquireCtx(fctx *fasthttp.RequestCtx) CustomCtx {
  method ReleaseCtx (line 89) | func (app *App) ReleaseCtx(c CustomCtx) {

FILE: ctx_interface_gen.go
  type Ctx (line 18) | type Ctx interface

FILE: ctx_test.go
  constant epsilon (line 45) | epsilon = 0.001
  type testContextKey (line 47) | type testContextKey struct
  type testNetAddr (line 49) | type testNetAddr struct
    method Network (line 54) | func (t testNetAddr) Network() string {
    method String (line 58) | func (t testNetAddr) String() string {
  function Test_Ctx_Accepts (line 63) | func Test_Ctx_Accepts(t *testing.T) {
  function Test_Ctx_AcceptsHelpers (line 101) | func Test_Ctx_AcceptsHelpers(t *testing.T) {
  function Test_Ctx_ContentTypeHelpers (line 122) | func Test_Ctx_ContentTypeHelpers(t *testing.T) {
  function Test_Ctx_Charset (line 158) | func Test_Ctx_Charset(t *testing.T) {
  function Test_Ctx_HeaderHelpers (line 231) | func Test_Ctx_HeaderHelpers(t *testing.T) {
  function Test_Ctx_TypedParsingDefaults (line 264) | func Test_Ctx_TypedParsingDefaults(t *testing.T) {
  function Benchmark_Ctx_Accepts (line 292) | func Benchmark_Ctx_Accepts(b *testing.B) {
  type customCtx (line 321) | type customCtx struct
    method Params (line 325) | func (c *customCtx) Params(key string, defaultValue ...string) string ...
  function Test_Ctx_CustomCtx (line 330) | func Test_Ctx_CustomCtx(t *testing.T) {
  function Test_Ctx_CustomCtx_WithMiddleware (line 354) | func Test_Ctx_CustomCtx_WithMiddleware(t *testing.T) {
  function Test_Ctx_CustomCtx_and_Method (line 385) | func Test_Ctx_CustomCtx_and_Method(t *testing.T) {
  function Test_Ctx_Accepts_EmptyAccept (line 418) | func Test_Ctx_Accepts_EmptyAccept(t *testing.T) {
  function Test_Ctx_Accepts_Wildcard (line 430) | func Test_Ctx_Accepts_Wildcard(t *testing.T) {
  function Test_Ctx_Accepts_MultiHeader (line 444) | func Test_Ctx_Accepts_MultiHeader(t *testing.T) {
  function Test_Ctx_AcceptsCharsets (line 455) | func Test_Ctx_AcceptsCharsets(t *testing.T) {
  function Test_Ctx_AcceptsCharsets_MultiHeader (line 465) | func Test_Ctx_AcceptsCharsets_MultiHeader(t *testing.T) {
  function Benchmark_Ctx_AcceptsCharsets (line 476) | func Benchmark_Ctx_AcceptsCharsets(b *testing.B) {
  function Test_Ctx_AcceptsEncodings (line 490) | func Test_Ctx_AcceptsEncodings(t *testing.T) {
  function Test_Ctx_AcceptsEncodings_MultiHeader (line 501) | func Test_Ctx_AcceptsEncodings_MultiHeader(t *testing.T) {
  function Benchmark_Ctx_AcceptsEncodings (line 512) | func Benchmark_Ctx_AcceptsEncodings(b *testing.B) {
  function Test_Ctx_AcceptsLanguages (line 526) | func Test_Ctx_AcceptsLanguages(t *testing.T) {
  function Test_Ctx_AcceptsLanguages_MultiHeader (line 536) | func Test_Ctx_AcceptsLanguages_MultiHeader(t *testing.T) {
  function Test_Ctx_AcceptsLanguages_BasicFiltering (line 547) | func Test_Ctx_AcceptsLanguages_BasicFiltering(t *testing.T) {
  function Test_Ctx_AcceptsLanguages_CaseInsensitive (line 573) | func Test_Ctx_AcceptsLanguages_CaseInsensitive(t *testing.T) {
  function Test_Ctx_AcceptsLanguagesExtended (line 583) | func Test_Ctx_AcceptsLanguagesExtended(t *testing.T) {
  function Benchmark_Ctx_AcceptsLanguages (line 611) | func Benchmark_Ctx_AcceptsLanguages(b *testing.B) {
  function Test_Ctx_App (line 625) | func Test_Ctx_App(t *testing.T) {
  function Test_Ctx_Append (line 635) | func Test_Ctx_Append(t *testing.T) {
  function Benchmark_Ctx_Append (line 671) | func Benchmark_Ctx_Append(b *testing.B) {
  function Test_Ctx_Attachment (line 685) | func Test_Ctx_Attachment(t *testing.T) {
  function Test_Ctx_Attachment_SanitizesFilenameControls (line 714) | func Test_Ctx_Attachment_SanitizesFilenameControls(t *testing.T) {
  function Benchmark_Ctx_Attachment (line 770) | func Benchmark_Ctx_Attachment(b *testing.B) {
  function Test_Ctx_BaseURL (line 783) | func Test_Ctx_BaseURL(t *testing.T) {
  function Benchmark_Ctx_BaseURL (line 795) | func Benchmark_Ctx_BaseURL(b *testing.B) {
  function Test_Ctx_Body (line 810) | func Test_Ctx_Body(t *testing.T) {
  function Test_Ctx_BodyRaw (line 820) | func Test_Ctx_BodyRaw(t *testing.T) {
  function Test_Ctx_BodyRaw_Immutable (line 830) | func Test_Ctx_BodyRaw_Immutable(t *testing.T) {
  function Benchmark_Ctx_Body (line 840) | func Benchmark_Ctx_Body(b *testing.B) {
  function Benchmark_Ctx_BodyRaw (line 856) | func Benchmark_Ctx_BodyRaw(b *testing.B) {
  function Benchmark_Ctx_BodyRaw_Immutable (line 872) | func Benchmark_Ctx_BodyRaw_Immutable(b *testing.B) {
  function Test_Ctx_Body_Immutable (line 888) | func Test_Ctx_Body_Immutable(t *testing.T) {
  function Benchmark_Ctx_Body_Immutable (line 899) | func Benchmark_Ctx_Body_Immutable(b *testing.B) {
  function Test_Ctx_Body_With_Compression (line 917) | func Test_Ctx_Body_With_Compression(t *testing.T) {
  function Benchmark_Ctx_Body_With_Compression (line 1028) | func Benchmark_Ctx_Body_With_Compression(b *testing.B) {
  function Test_Ctx_Body_With_Compression_Immutable (line 1150) | func Test_Ctx_Body_With_Compression_Immutable(t *testing.T) {
  function Benchmark_Ctx_Body_With_Compression_Immutable (line 1262) | func Benchmark_Ctx_Body_With_Compression_Immutable(b *testing.B) {
  function Test_Ctx_RequestCtx (line 1385) | func Test_Ctx_RequestCtx(t *testing.T) {
  function Test_Ctx_Cookie (line 1394) | func Test_Ctx_Cookie(t *testing.T) {
  function Test_Ctx_Cookie_PartitionedSecure (line 1452) | func Test_Ctx_Cookie_PartitionedSecure(t *testing.T) {
  function Test_Ctx_Cookie_Invalid (line 1469) | func Test_Ctx_Cookie_Invalid(t *testing.T) {
  function Test_Ctx_Cookie_DefaultPath (line 1495) | func Test_Ctx_Cookie_DefaultPath(t *testing.T) {
  function Test_Ctx_Cookie_MaxAgeOnly (line 1514) | func Test_Ctx_Cookie_MaxAgeOnly(t *testing.T) {
  function Test_Ctx_Cookie_StrictPartitioned (line 1533) | func Test_Ctx_Cookie_StrictPartitioned(t *testing.T) {
  function Test_Ctx_Cookie_SameSite_CaseInsensitive (line 1554) | func Test_Ctx_Cookie_SameSite_CaseInsensitive(t *testing.T) {
  function Test_Ctx_Cookie_SameSite_None_Secure (line 1621) | func Test_Ctx_Cookie_SameSite_None_Secure(t *testing.T) {
  function Benchmark_Ctx_Cookie (line 1715) | func Benchmark_Ctx_Cookie(b *testing.B) {
  function Test_Ctx_Cookies (line 1730) | func Test_Ctx_Cookies(t *testing.T) {
  function Test_Ctx_Format (line 1741) | func Test_Ctx_Format(t *testing.T) {
  function Test_Ctx_Format_NilHandler (line 1799) | func Test_Ctx_Format_NilHandler(t *testing.T) {
  function Benchmark_Ctx_Format (line 1859) | func Benchmark_Ctx_Format(b *testing.B) {
  function Test_Ctx_AutoFormat (line 1938) | func Test_Ctx_AutoFormat(t *testing.T) {
  function Test_Ctx_AutoFormat_Struct (line 2011) | func Test_Ctx_AutoFormat_Struct(t *testing.T) {
  function Benchmark_Ctx_AutoFormat (line 2074) | func Benchmark_Ctx_AutoFormat(b *testing.B) {
  function Benchmark_Ctx_AutoFormat_HTML (line 2090) | func Benchmark_Ctx_AutoFormat_HTML(b *testing.B) {
  function Benchmark_Ctx_AutoFormat_JSON (line 2106) | func Benchmark_Ctx_AutoFormat_JSON(b *testing.B) {
  function Benchmark_Ctx_AutoFormat_MsgPack (line 2122) | func Benchmark_Ctx_AutoFormat_MsgPack(b *testing.B) {
  function Benchmark_Ctx_AutoFormat_XML (line 2143) | func Benchmark_Ctx_AutoFormat_XML(b *testing.B) {
  function Test_Ctx_FormFile (line 2159) | func Test_Ctx_FormFile(t *testing.T) {
  function Test_Ctx_FormValue (line 2209) | func Test_Ctx_FormValue(t *testing.T) {
  function Benchmark_Ctx_Fresh_StaleEtag (line 2240) | func Benchmark_Ctx_Fresh_StaleEtag(b *testing.B) {
  function Test_Ctx_Fresh (line 2256) | func Test_Ctx_Fresh(t *testing.T) {
  function Benchmark_Ctx_Fresh_WithNoCache (line 2306) | func Benchmark_Ctx_Fresh_WithNoCache(b *testing.B) {
  function Benchmark_Ctx_Fresh_LastModified (line 2318) | func Benchmark_Ctx_Fresh_LastModified(b *testing.B) {
  function Test_Ctx_Binders (line 2330) | func Test_Ctx_Binders(t *testing.T) {
  function Test_Ctx_Get (line 2446) | func Test_Ctx_Get(t *testing.T) {
  function Test_Ctx_GetReqHeader (line 2459) | func Test_Ctx_GetReqHeader(t *testing.T) {
  function Test_Ctx_Host (line 2471) | func Test_Ctx_Host(t *testing.T) {
  function Test_Ctx_Host_UntrustedProxy (line 2481) | func Test_Ctx_Host_UntrustedProxy(t *testing.T) {
  function Test_Ctx_Host_TrustedProxy (line 2504) | func Test_Ctx_Host_TrustedProxy(t *testing.T) {
  function Test_Ctx_Host_TrustedProxyRange (line 2569) | func Test_Ctx_Host_TrustedProxyRange(t *testing.T) {
  function Test_Ctx_Host_UntrustedProxyRange (line 2581) | func Test_Ctx_Host_UntrustedProxyRange(t *testing.T) {
  function Benchmark_Ctx_Host (line 2593) | func Benchmark_Ctx_Host(b *testing.B) {
  function Test_Ctx_IsProxyTrusted (line 2606) | func Test_Ctx_IsProxyTrusted(t *testing.T) {
  function Test_Ctx_Hostname (line 2723) | func Test_Ctx_Hostname(t *testing.T) {
  function Benchmark_Ctx_Hostname (line 2736) | func Benchmark_Ctx_Hostname(b *testing.B) {
  function Test_Ctx_Hostname_TrustedProxy (line 2760) | func Test_Ctx_Hostname_TrustedProxy(t *testing.T) {
  function Test_Ctx_Hostname_TrustedProxy_Multiple (line 2776) | func Test_Ctx_Hostname_TrustedProxy_Multiple(t *testing.T) {
  function Test_Ctx_Hostname_TrustedProxyRange (line 2792) | func Test_Ctx_Hostname_TrustedProxyRange(t *testing.T) {
  function Test_Ctx_Hostname_UntrustedProxyRange (line 2807) | func Test_Ctx_Hostname_UntrustedProxyRange(t *testing.T) {
  function Test_Ctx_Port (line 2822) | func Test_Ctx_Port(t *testing.T) {
  function Test_Ctx_Port_RemoteAddrVariants (line 2831) | func Test_Ctx_Port_RemoteAddrVariants(t *testing.T) {
  function Test_Ctx_PortInHandler (line 2889) | func Test_Ctx_PortInHandler(t *testing.T) {
  function Test_Ctx_IP (line 2907) | func Test_Ctx_IP(t *testing.T) {
  function Test_Ctx_IP_ProxyHeader (line 2922) | func Test_Ctx_IP_ProxyHeader(t *testing.T) {
  function Test_Ctx_IP_ProxyHeader_With_IP_Validation (line 2962) | func Test_Ctx_IP_ProxyHeader_With_IP_Validation(t *testing.T) {
  function Test_Ctx_IP_UntrustedProxy (line 3004) | func Test_Ctx_IP_UntrustedProxy(t *testing.T) {
  function Test_Ctx_IP_TrustedProxy (line 3017) | func Test_Ctx_IP_TrustedProxy(t *testing.T) {
  function Test_Ctx_ProxyTrust_UnixRemoteAddr (line 3029) | func Test_Ctx_ProxyTrust_UnixRemoteAddr(t *testing.T) {
  function runCtxProxyTrustUnixRemoteAddrCase (line 3053) | func runCtxProxyTrustUnixRemoteAddrCase(t *testing.T, unixSocket bool) s...
  function Test_Ctx_IPs (line 3110) | func Test_Ctx_IPs(t *testing.T) {
  function Test_Ctx_IPs_With_IP_Validation (line 3146) | func Test_Ctx_IPs_With_IP_Validation(t *testing.T) {
  function Benchmark_Ctx_IPs (line 3183) | func Benchmark_Ctx_IPs(b *testing.B) {
  function Benchmark_Ctx_IPs_v6 (line 3195) | func Benchmark_Ctx_IPs_v6(b *testing.B) {
  function Benchmark_Ctx_IPs_With_IP_Validation (line 3208) | func Benchmark_Ctx_IPs_With_IP_Validation(b *testing.B) {
  function Benchmark_Ctx_IPs_v6_With_IP_Validation (line 3220) | func Benchmark_Ctx_IPs_v6_With_IP_Validation(b *testing.B) {
  function Benchmark_Ctx_IP_With_ProxyHeader (line 3233) | func Benchmark_Ctx_IP_With_ProxyHeader(b *testing.B) {
  function Benchmark_Ctx_IP_With_ProxyHeader_and_IP_Validation (line 3253) | func Benchmark_Ctx_IP_With_ProxyHeader_and_IP_Validation(b *testing.B) {
  function Benchmark_Ctx_IP (line 3274) | func Benchmark_Ctx_IP(b *testing.B) {
  function Test_Ctx_Is (line 3287) | func Test_Ctx_Is(t *testing.T) {
  function Benchmark_Ctx_Is (line 3332) | func Benchmark_Ctx_Is(b *testing.B) {
  function Test_Ctx_Locals (line 3347) | func Test_Ctx_Locals(t *testing.T) {
  function Test_Ctx_Deadline (line 3364) | func Test_Ctx_Deadline(t *testing.T) {
  function Test_Ctx_Done (line 3382) | func Test_Ctx_Done(t *testing.T) {
  function Test_Ctx_Err (line 3399) | func Test_Ctx_Err(t *testing.T) {
  function Test_Ctx_Value (line 3415) | func Test_Ctx_Value(t *testing.T) {
  function Test_Ctx_Value_AfterRelease (line 3432) | func Test_Ctx_Value_AfterRelease(t *testing.T) {
  function Test_Ctx_Value_InGoroutine (line 3454) | func Test_Ctx_Value_InGoroutine(t *testing.T) {
  function Test_Ctx_Context (line 3511) | func Test_Ctx_Context(t *testing.T) {
  function Test_Ctx_AccessAfterHandlerPanics (line 3531) | func Test_Ctx_AccessAfterHandlerPanics(t *testing.T) {
  function Test_Ctx_Context_AfterHandlerPanics (line 3547) | func Test_Ctx_Context_AfterHandlerPanics(t *testing.T) {
  function Test_Ctx_Request_Response_AfterRelease (line 3567) | func Test_Ctx_Request_Response_AfterRelease(t *testing.T) {
  function Test_Ctx_SetContext (line 3591) | func Test_Ctx_SetContext(t *testing.T) {
  type contextHelperTestKey (line 3603) | type contextHelperTestKey struct
  function Test_Ctx_StoreInContext_Config (line 3605) | func Test_Ctx_StoreInContext_Config(t *testing.T) {
  function Test_Ctx_ValueFromContext_Config (line 3644) | func Test_Ctx_ValueFromContext_Config(t *testing.T) {
  function Test_Ctx_Context_Multiple_Requests (line 3720) | func Test_Ctx_Context_Multiple_Requests(t *testing.T) {
  function Test_Ctx_Locals_Generic (line 3757) | func Test_Ctx_Locals_Generic(t *testing.T) {
  function Test_Ctx_Locals_GenericCustomStruct (line 3779) | func Test_Ctx_Locals_GenericCustomStruct(t *testing.T) {
  function Test_Ctx_Method (line 3802) | func Test_Ctx_Method(t *testing.T) {
  function Test_Ctx_ClientHelloInfo (line 3818) | func Test_Ctx_ClientHelloInfo(t *testing.T) {
  function Test_Ctx_InvalidMethod (line 3889) | func Test_Ctx_InvalidMethod(t *testing.T) {
  function Test_Ctx_MultipartForm (line 3907) | func Test_Ctx_MultipartForm(t *testing.T) {
  function Benchmark_Ctx_MultipartForm (line 3934) | func Benchmark_Ctx_MultipartForm(b *testing.B) {
  function Test_Ctx_OriginalURL (line 3959) | func Test_Ctx_OriginalURL(t *testing.T) {
  function Test_Ctx_Params (line 3969) | func Test_Ctx_Params(t *testing.T) {
  function Test_Ctx_Params_ErrorHandler_Panic_Issue_2832 (line 4020) | func Test_Ctx_Params_ErrorHandler_Panic_Issue_2832(t *testing.T) {
  function Test_Ctx_Params_Case_Sensitive (line 4039) | func Test_Ctx_Params_Case_Sensitive(t *testing.T) {
  function Test_Ctx_Params_Immutable (line 4061) | func Test_Ctx_Params_Immutable(t *testing.T) {
  function Benchmark_Ctx_Params (line 4080) | func Benchmark_Ctx_Params(b *testing.B) {
  function Test_Ctx_Path (line 4104) | func Test_Ctx_Path(t *testing.T) {
  function Test_Ctx_Protocol (line 4132) | func Test_Ctx_Protocol(t *testing.T) {
  function Benchmark_Ctx_Protocol (line 4145) | func Benchmark_Ctx_Protocol(b *testing.B) {
  function Test_Ctx_Scheme (line 4160) | func Test_Ctx_Scheme(t *testing.T) {
  function Test_Ctx_Scheme_HeaderNormalization (line 4204) | func Test_Ctx_Scheme_HeaderNormalization(t *testing.T) {
  function Benchmark_Ctx_Scheme (line 4237) | func Benchmark_Ctx_Scheme(b *testing.B) {
  function Test_Ctx_Scheme_TrustedProxy (line 4250) | func Test_Ctx_Scheme_TrustedProxy(t *testing.T) {
  function Test_Ctx_Scheme_TrustedProxyRange (line 4275) | func Test_Ctx_Scheme_TrustedProxyRange(t *testing.T) {
  function Test_Ctx_Scheme_UntrustedProxyRange (line 4303) | func Test_Ctx_Scheme_UntrustedProxyRange(t *testing.T) {
  function Test_Ctx_Scheme_UnTrustedProxy (line 4331) | func Test_Ctx_Scheme_UnTrustedProxy(t *testing.T) {
  function Test_Ctx_Query (line 4359) | func Test_Ctx_Query(t *testing.T) {
  function Benchmark_Ctx_Query (line 4376) | func Benchmark_Ctx_Query(b *testing.B) {
  function Test_Ctx_Range (line 4389) | func Test_Ctx_Range(t *testing.T) {
  function Test_Ctx_Range_LargeFile (line 4424) | func Test_Ctx_Range_LargeFile(t *testing.T) {
  function Test_Ctx_Range_Overflow (line 4449) | func Test_Ctx_Range_Overflow(t *testing.T) {
  function Test_Ctx_Range_Unsatisfiable (line 4466) | func Test_Ctx_Range_Unsatisfiable(t *testing.T) {
  function Test_Ctx_Range_TooManyRanges (line 4485) | func Test_Ctx_Range_TooManyRanges(t *testing.T) {
  function Test_Ctx_Range_SuffixNormalization (line 4504) | func Test_Ctx_Range_SuffixNormalization(t *testing.T) {
  function Benchmark_Ctx_Range (line 4610) | func Benchmark_Ctx_Range(b *testing.B) {
  function Test_Ctx_Route (line 4645) | func Test_Ctx_Route(t *testing.T) {
  function Test_Ctx_FullPath (line 4664) | func Test_Ctx_FullPath(t *testing.T) {
  function Test_Ctx_FullPath_Group (line 4681) | func Test_Ctx_FullPath_Group(t *testing.T) {
  function Test_Ctx_FullPath_Middleware (line 4699) | func Test_Ctx_FullPath_Middleware(t *testing.T) {
  function Test_Ctx_RouteNormalized (line 4731) | func Test_Ctx_RouteNormalized(t *testing.T) {
  function Test_Ctx_SaveFile (line 4744) | func Test_Ctx_SaveFile(t *testing.T) {
  function createMultipartFileHeader (line 4790) | func createMultipartFileHeader(t *testing.T, filename string, data []byt...
  function Test_Ctx_SaveFileToStorage (line 4818) | func Test_Ctx_SaveFileToStorage(t *testing.T) {
  function Test_Ctx_SaveFileToStorage_LargeUpload (line 4859) | func Test_Ctx_SaveFileToStorage_LargeUpload(t *testing.T) {
  function Test_Ctx_SaveFileToStorage_LimitExceeded (line 4884) | func Test_Ctx_SaveFileToStorage_LimitExceeded(t *testing.T) {
  function Test_Ctx_SaveFileToStorage_LimitExceededUnknownSize (line 4906) | func Test_Ctx_SaveFileToStorage_LimitExceededUnknownSize(t *testing.T) {
  type captureStorage (line 4929) | type captureStorage struct
    method helperFailure (line 4934) | func (s *captureStorage) helperFailure(msg string, args ...any) {
    method ensureStore (line 4939) | func (s *captureStorage) ensureStore(key string, val []byte) {
    method GetWithContext (line 4952) | func (s *captureStorage) GetWithContext(context.Context, string) ([]by...
    method Get (line 4957) | func (s *captureStorage) Get(string) ([]byte, error) {
    method SetWithContext (line 4962) | func (s *captureStorage) SetWithContext(_ context.Context, key string,...
    method Set (line 4967) | func (s *captureStorage) Set(key string, _ []byte, _ time.Duration) er...
    method DeleteWithContext (line 4972) | func (s *captureStorage) DeleteWithContext(context.Context, string) er...
    method Delete (line 4977) | func (s *captureStorage) Delete(string) error {
    method ResetWithContext (line 4982) | func (s *captureStorage) ResetWithContext(context.Context) error {
    method Reset (line 4987) | func (s *captureStorage) Reset() error {
    method Close (line 4992) | func (s *captureStorage) Close() error {
  function Test_Ctx_SaveFileToStorage_BufferNotReused (line 5001) | func Test_Ctx_SaveFileToStorage_BufferNotReused(t *testing.T) {
  type mockContextAwareStorage (line 5029) | type mockContextAwareStorage struct
    method helperFailure (line 5039) | func (s *mockContextAwareStorage) helperFailure(msg string, args ...an...
    method GetWithContext (line 5044) | func (s *mockContextAwareStorage) GetWithContext(context.Context, stri...
    method Get (line 5049) | func (s *mockContextAwareStorage) Get(string) ([]byte, error) {
    method SetWithContext (line 5054) | func (s *mockContextAwareStorage) SetWithContext(ctx context.Context, ...
    method Set (line 5076) | func (s *mockContextAwareStorage) Set(string, []byte, time.Duration) e...
    method DeleteWithContext (line 5081) | func (s *mockContextAwareStorage) DeleteWithContext(context.Context, s...
    method Delete (line 5086) | func (s *mockContextAwareStorage) Delete(string) error {
    method ResetWithContext (line 5091) | func (s *mockContextAwareStorage) ResetWithContext(context.Context) er...
    method Reset (line 5096) | func (s *mockContextAwareStorage) Reset() error {
    method Close (line 5101) | func (s *mockContextAwareStorage) Close() error {
  function Test_Ctx_SaveFileToStorage_ContextPropagation (line 5109) | func Test_Ctx_SaveFileToStorage_ContextPropagation(t *testing.T) {
  function Test_Ctx_Secure (line 5163) | func Test_Ctx_Secure(t *testing.T) {
  function Test_Ctx_Stale (line 5173) | func Test_Ctx_Stale(t *testing.T) {
  function Test_Ctx_Subdomains (line 5182) | func Test_Ctx_Subdomains(t *testing.T) {
  function Benchmark_Ctx_Subdomains (line 5310) | func Benchmark_Ctx_Subdomains(b *testing.B) {
  function Test_Ctx_ClearCookie (line 5324) | func Test_Ctx_ClearCookie(t *testing.T) {
  function Test_Ctx_Download (line 5341) | func Test_Ctx_Download(t *testing.T) {
  function Test_Ctx_Download_SanitizesFilenameControls (line 5369) | func Test_Ctx_Download_SanitizesFilenameControls(t *testing.T) {
  function Test_Ctx_SendEarlyHints (line 5415) | func Test_Ctx_SendEarlyHints(t *testing.T) {
  function Test_Ctx_SendFile (line 5439) | func Test_Ctx_SendFile(t *testing.T) {
  function Test_Ctx_SendFile_ContentType (line 5485) | func Test_Ctx_SendFile_ContentType(t *testing.T) {
  function Test_Ctx_SendFile_Download (line 5527) | func Test_Ctx_SendFile_Download(t *testing.T) {
  function Test_Ctx_SendFile_MaxAge (line 5556) | func Test_Ctx_SendFile_MaxAge(t *testing.T) {
  function Test_Static_Compress (line 5587) | func Test_Static_Compress(t *testing.T) {
  function Test_Ctx_SendFile_Compress_CheckCompressed (line 5617) | func Test_Ctx_SendFile_Compress_CheckCompressed(t *testing.T) {
  function Test_Ctx_SendFile_EmbedFS (line 5682) | func Test_Ctx_SendFile_EmbedFS(t *testing.T) {
  function Test_Ctx_SendFile_404 (line 5712) | func Test_Ctx_SendFile_404(t *testing.T) {
  function Test_Ctx_SendFile_Multiple (line 5728) | func Test_Ctx_SendFile_Multiple(t *testing.T) {
  function Test_Ctx_SendFile_Immutable (line 5787) | func Test_Ctx_SendFile_Immutable(t *testing.T) {
  function Test_Ctx_SendFile_RestoreOriginalURL (line 5832) | func Test_Ctx_SendFile_RestoreOriginalURL(t *testing.T) {
  function Test_SendFile_withRoutes (line 5850) | func Test_SendFile_withRoutes(t *testing.T) {
  function Test_SendFile_ByteRange (line 5884) | func Test_SendFile_ByteRange(t *testing.T) {
  function Benchmark_Ctx_SendFile (line 6077) | func Benchmark_Ctx_SendFile(b *testing.B) {
  function Test_Ctx_JSON (line 6093) | func Test_Ctx_JSON(t *testing.T) {
  function Benchmark_Ctx_JSON (line 6150) | func Benchmark_Ctx_JSON(b *testing.B) {
  function Test_Ctx_MsgPack (line 6172) | func Test_Ctx_MsgPack(t *testing.T) {
  function Benchmark_Ctx_MsgPack (line 6252) | func Benchmark_Ctx_MsgPack(b *testing.B) {
  function Test_Ctx_CBOR (line 6279) | func Test_Ctx_CBOR(t *testing.T) {
  function Benchmark_Ctx_CBOR (line 6351) | func Benchmark_Ctx_CBOR(b *testing.B) {
  function Benchmark_Ctx_JSON_Ctype (line 6376) | func Benchmark_Ctx_JSON_Ctype(b *testing.B) {
  function Test_Ctx_JSONP (line 6399) | func Test_Ctx_JSONP(t *testing.T) {
  function Benchmark_Ctx_JSONP (line 6443) | func Benchmark_Ctx_JSONP(b *testing.B) {
  function Test_Ctx_XML (line 6466) | func Test_Ctx_XML(t *testing.T) {
  function Benchmark_Ctx_XML (line 6526) | func Benchmark_Ctx_XML(b *testing.B) {
  function Test_Ctx_Links (line 6548) | func Test_Ctx_Links(t *testing.T) {
  function Benchmark_Ctx_Links (line 6564) | func Benchmark_Ctx_Links(b *testing.B) {
  function Test_Ctx_Location (line 6578) | func Test_Ctx_Location(t *testing.T) {
  function Test_Ctx_Next (line 6588) | func Test_Ctx_Next(t *testing.T) {
  function Test_Ctx_Next_Error (line 6605) | func Test_Ctx_Next_Error(t *testing.T) {
  function Test_Ctx_Render (line 6620) | func Test_Ctx_Render(t *testing.T) {
  function Test_Ctx_RenderWithoutLocals (line 6639) | func Test_Ctx_RenderWithoutLocals(t *testing.T) {
  function Test_Ctx_RenderWithLocals (line 6653) | func Test_Ctx_RenderWithLocals(t *testing.T) {
  function Test_Ctx_Matched_AfterNext (line 6682) | func Test_Ctx_Matched_AfterNext(t *testing.T) {
  function Test_Ctx_Matched_RouteError (line 6710) | func Test_Ctx_Matched_RouteError(t *testing.T) {
  function Test_Ctx_IsMiddleware (line 6728) | func Test_Ctx_IsMiddleware(t *testing.T) {
  function Test_Ctx_HasBody (line 6759) | func Test_Ctx_HasBody(t *testing.T) {
  function Test_Ctx_IsWebSocket (line 6854) | func Test_Ctx_IsWebSocket(t *testing.T) {
  function Test_Ctx_IsPreflight (line 6873) | func Test_Ctx_IsPreflight(t *testing.T) {
  function Test_Ctx_RenderWithViewBind (line 6903) | func Test_Ctx_RenderWithViewBind(t *testing.T) {
  function Test_Ctx_RenderWithOverwrittenViewBind (line 6924) | func Test_Ctx_RenderWithOverwrittenViewBind(t *testing.T) {
  function Test_Ctx_RenderWithViewBindLocals (line 6946) | func Test_Ctx_RenderWithViewBindLocals(t *testing.T) {
  function Test_Ctx_RenderWithLocalsAndBinding (line 6968) | func Test_Ctx_RenderWithLocalsAndBinding(t *testing.T) {
  function Benchmark_Ctx_RenderWithLocalsAndViewBind (line 6990) | func Benchmark_Ctx_RenderWithLocalsAndViewBind(b *testing.B) {
  function Benchmark_Ctx_RenderLocals (line 7016) | func Benchmark_Ctx_RenderLocals(b *testing.B) {
  function Benchmark_Ctx_RenderViewBind (line 7038) | func Benchmark_Ctx_RenderViewBind(b *testing.B) {
  function Test_Ctx_RestartRouting (line 7062) | func Test_Ctx_RestartRouting(t *testing.T) {
  function Test_Ctx_RestartRoutingWithChangedPath (line 7080) | func Test_Ctx_RestartRoutingWithChangedPath(t *testing.T) {
  function Test_Ctx_RestartRoutingWithChangedPathAndCatchAll (line 7106) | func Test_Ctx_RestartRoutingWithChangedPathAndCatchAll(t *testing.T) {
  type testTemplateEngine (line 7126) | type testTemplateEngine struct
    method Render (line 7131) | func (t *testTemplateEngine) Render(w io.Writer, name string, bind any...
    method Load (line 7147) | func (t *testTemplateEngine) Load() error {
  function Test_Ctx_Render_Engine (line 7156) | func Test_Ctx_Render_Engine(t *testing.T) {
  function Test_Ctx_Render_Engine_With_View_Layout (line 7172) | func Test_Ctx_Render_Engine_With_View_Layout(t *testing.T) {
  function Benchmark_Ctx_Render_Engine (line 7188) | func Benchmark_Ctx_Render_Engine(b *testing.B) {
  function Benchmark_Ctx_Get_Location_From_Route (line 7207) | func Benchmark_Ctx_Get_Location_From_Route(b *testing.B) {
  function Test_Ctx_Get_Location_From_Route_name (line 7227) | func Test_Ctx_Get_Location_From_Route_name(t *testing.T) {
  function Test_Ctx_Get_Location_From_Route_name_Optional_greedy (line 7267) | func Test_Ctx_Get_Location_From_Route_name_Optional_greedy(t *testing.T) {
  function Test_Ctx_Get_Location_From_Route_name_Optional_greedy_one_param (line 7286) | func Test_Ctx_Get_Location_From_Route_name_Optional_greedy_one_param(t *...
  type errorTemplateEngine (line 7303) | type errorTemplateEngine struct
    method Render (line 7305) | func (errorTemplateEngine) Render(_ io.Writer, _ string, _ any, _ ...s...
    method Load (line 7309) | func (errorTemplateEngine) Load() error { return nil }
  function Test_Ctx_Render_Engine_Error (line 7312) | func Test_Ctx_Render_Engine_Error(t *testing.T) {
  function Test_Ctx_Render_Go_Template (line 7323) | func Test_Ctx_Render_Go_Template(t *testing.T) {
  function Test_Ctx_Send (line 7348) | func Test_Ctx_Send(t *testing.T) {
  function Benchmark_Ctx_Send (line 7360) | func Benchmark_Ctx_Send(b *testing.B) {
  function Test_Ctx_SendStatus (line 7376) | func Test_Ctx_SendStatus(t *testing.T) {
  function Test_Ctx_SendStatusNoBodyResponses (line 7387) | func Test_Ctx_SendStatusNoBodyResponses(t *testing.T) {
  function Test_Ctx_SendString (line 7442) | func Test_Ctx_SendString(t *testing.T) {
  function Test_Ctx_SendStream (line 7453) | func Test_Ctx_SendStream(t *testing.T) {
  function Test_Ctx_SendStreamWriter (line 7472) | func Test_Ctx_SendStreamWriter(t *testing.T) {
  function Test_Ctx_SendStreamWriter_Interrupted (line 7501) | func Test_Ctx_SendStreamWriter_Interrupted(t *testing.T) {
  function Test_Ctx_Set (line 7542) | func Test_Ctx_Set(t *testing.T) {
  function Test_Ctx_Set_Splitter (line 7557) | func Test_Ctx_Set_Splitter(t *testing.T) {
  function Benchmark_Ctx_Set (line 7572) | func Benchmark_Ctx_Set(b *testing.B) {
  function Test_Ctx_Status (line 7584) | func Test_Ctx_Status(t *testing.T) {
  function Test_Ctx_Type (line 7598) | func Test_Ctx_Type(t *testing.T) {
  function Test_shouldIncludeCharset (line 7641) | func Test_shouldIncludeCharset(t *testing.T) {
  function Benchmark_Ctx_Type (line 7683) | func Benchmark_Ctx_Type(b *testing.B) {
  function Benchmark_Ctx_Type_Charset (line 7695) | func Benchmark_Ctx_Type_Charset(b *testing.B) {
  function Test_Ctx_Vary (line 7707) | func Test_Ctx_Vary(t *testing.T) {
  function Benchmark_Ctx_Vary (line 7719) | func Benchmark_Ctx_Vary(b *testing.B) {
  function Test_Ctx_Write (line 7730) | func Test_Ctx_Write(t *testing.T) {
  function Benchmark_Ctx_Write (line 7743) | func Benchmark_Ctx_Write(b *testing.B) {
  function Test_Ctx_Writef (line 7758) | func Test_Ctx_Writef(t *testing.T) {
  function Benchmark_Ctx_Writef (line 7770) | func Benchmark_Ctx_Writef(b *testing.B) {
  function Test_Ctx_WriteString (line 7785) | func Test_Ctx_WriteString(t *testing.T) {
  function Test_Ctx_XHR (line 7798) | func Test_Ctx_XHR(t *testing.T) {
  function Benchmark_Ctx_XHR (line 7808) | func Benchmark_Ctx_XHR(b *testing.B) {
  function Benchmark_Ctx_SendString_B (line 7822) | func Benchmark_Ctx_SendString_B(b *testing.B) {
  function Test_Ctx_Queries (line 7838) | func Test_Ctx_Queries(t *testing.T) {
  function Benchmark_Ctx_Queries (line 7887) | func Benchmark_Ctx_Queries(b *testing.B) {
  function Test_Ctx_BodyStreamWriter (line 7908) | func Test_Ctx_BodyStreamWriter(t *testing.T) {
  function Benchmark_Ctx_BodyStreamWriter (line 7933) | func Benchmark_Ctx_BodyStreamWriter(b *testing.B) {
  function Test_Ctx_String (line 7953) | func Test_Ctx_String(t *testing.T) {
  function Benchmark_Ctx_String (line 7962) | func Benchmark_Ctx_String(b *testing.B) {
  function Test_Ctx_IsFromLocal_X_Forwarded (line 7975) | func Test_Ctx_IsFromLocal_X_Forwarded(t *testing.T) {
  function Test_Ctx_IsFromLocal_RemoteAddr (line 8020) | func Test_Ctx_IsFromLocal_RemoteAddr(t *testing.T) {
  function Test_Ctx_extractIPsFromHeader (line 8109) | func Test_Ctx_extractIPsFromHeader(t *testing.T) {
  function Test_Ctx_extractIPsFromHeader_EnableValidateIp (line 8119) | func Test_Ctx_extractIPsFromHeader_EnableValidateIp(t *testing.T) {
  function Test_Ctx_GetRespHeaders (line 8130) | func Test_Ctx_GetRespHeaders(t *testing.T) {
  function Benchmark_Ctx_GetRespHeaders (line 8155) | func Benchmark_Ctx_GetRespHeaders(b *testing.B) {
  function Test_Ctx_GetReqHeaders (line 8178) | func Test_Ctx_GetReqHeaders(t *testing.T) {
  function Test_Ctx_Set_SanitizeHeaderValue (line 8203) | func Test_Ctx_Set_SanitizeHeaderValue(t *testing.T) {
  function Benchmark_Ctx_GetReqHeaders (line 8215) | func Benchmark_Ctx_GetReqHeaders(b *testing.B) {
  function Test_Ctx_Drop (line 8238) | func Test_Ctx_Drop(t *testing.T) {
  function Test_Ctx_DropWithMiddleware (line 8267) | func Test_Ctx_DropWithMiddleware(t *testing.T) {
  function Test_Ctx_End (line 8291) | func Test_Ctx_End(t *testing.T) {
  function Test_Ctx_End_after_timeout (line 8309) | func Test_Ctx_End_after_timeout(t *testing.T) {
  function Test_Ctx_End_with_drop_middleware (line 8324) | func Test_Ctx_End_with_drop_middleware(t *testing.T) {
  function Test_Ctx_End_after_drop (line 8347) | func Test_Ctx_End_after_drop(t *testing.T) {
  function Test_Ctx_OverrideParam (line 8368) | func Test_Ctx_OverrideParam(t *testing.T) {
  function Test_Ctx_AbandonSkipsReleaseCtx (line 8525) | func Test_Ctx_AbandonSkipsReleaseCtx(t *testing.T) {
  function Test_Ctx_ForceReleaseClearsAbandon (line 8548) | func Test_Ctx_ForceReleaseClearsAbandon(t *testing.T) {
  function Benchmark_Ctx_IsProxyTrusted (line 8564) | func Benchmark_Ctx_IsProxyTrusted(b *testing.B) {
  function Benchmark_Ctx_IsFromLocalhost (line 8987) | func Benchmark_Ctx_IsFromLocalhost(b *testing.B) {
  function Benchmark_Ctx_OverrideParam (line 9014) | func Benchmark_Ctx_OverrideParam(b *testing.B) {

FILE: error_test.go
  function Test_ConversionError (line 12) | func Test_ConversionError(t *testing.T) {
  function Test_UnknownKeyError (line 18) | func Test_UnknownKeyError(t *testing.T) {
  function Test_EmptyFieldError (line 24) | func Test_EmptyFieldError(t *testing.T) {
  function Test_MultiError (line 30) | func Test_MultiError(t *testing.T) {
  function Test_InvalidUnmarshalError (line 36) | func Test_InvalidUnmarshalError(t *testing.T) {
  function Test_MarshalerError (line 43) | func Test_MarshalerError(t *testing.T) {
  function Test_SyntaxError (line 50) | func Test_SyntaxError(t *testing.T) {
  function Test_UnmarshalTypeError (line 57) | func Test_UnmarshalTypeError(t *testing.T) {
  function Test_UnsupportedTypeError (line 64) | func Test_UnsupportedTypeError(t *testing.T) {
  function Test_UnsupportedValeError (line 71) | func Test_UnsupportedValeError(t *testing.T) {

FILE: extractors/extractors.go
  type Source (line 38) | type Source
  constant SourceHeader (line 42) | SourceHeader Source = iota
  constant SourceAuthHeader (line 45) | SourceAuthHeader
  constant SourceForm (line 48) | SourceForm
  constant SourceQuery (line 51) | SourceQuery
  constant SourceParam (line 54) | SourceParam
  constant SourceCookie (line 57) | SourceCookie
  constant SourceCustom (line 60) | SourceCustom
  type Extractor (line 67) | type Extractor struct
  function FromAuthHeader (line 115) | func FromAuthHeader(authScheme string) Extractor {
  function FromCookie (line 180) | func FromCookie(key string) Extractor {
  function FromParam (line 220) | func FromParam(param string) Extractor {
  function FromForm (line 263) | func FromForm(param string) Extractor {
  function FromHeader (line 302) | func FromHeader(header string) Extractor {
  function FromQuery (line 343) | func FromQuery(param string) Extractor {
  function FromCustom (line 406) | func FromCustom(key string, fn func(fiber.Ctx) (string, error)) Extractor {
  function Chain (line 462) | func Chain(extractors ...Extractor) Extractor {
  function isValidToken68 (line 506) | func isValidToken68(token string) bool {

FILE: extractors/extractors_test.go
  function Test_Extractors_Missing (line 15) | func Test_Extractors_Missing(t *testing.T) {
  function newRequest (line 59) | func newRequest(method, target string) *http.Request {
  function Test_Extractors (line 68) | func Test_Extractors(t *testing.T) {
  function Test_Extractor_Chain (line 149) | func Test_Extractor_Chain(t *testing.T) {
  function Test_Extractor_FromAuthHeader_EdgeCases (line 220) | func Test_Extractor_FromAuthHeader_EdgeCases(t *testing.T) {
  function Test_Extractor_Chain_Introspection (line 261) | func Test_Extractor_Chain_Introspection(t *testing.T) {
  function Test_Extractor_FromCustom (line 286) | func Test_Extractor_FromCustom(t *testing.T) {
  function Test_Extractor_Chain_Error_Propagation (line 364) | func Test_Extractor_Chain_Error_Propagation(t *testing.T) {
  function Test_Extractor_Chain_With_Success (line 401) | func Test_Extractor_Chain_With_Success(t *testing.T) {
  function Test_Extractor_FromAuthHeader_CustomScheme (line 434) | func Test_Extractor_FromAuthHeader_CustomScheme(t *testing.T) {
  function Test_Extractor_FromAuthHeader_WhitespaceToken (line 456) | func Test_Extractor_FromAuthHeader_WhitespaceToken(t *testing.T) {
  function Test_Extractor_FromAuthHeader_RFC_Compliance (line 479) | func Test_Extractor_FromAuthHeader_RFC_Compliance(t *testing.T) {
  function Test_Extractor_FromAuthHeader_Token68_Validation (line 579) | func Test_Extractor_FromAuthHeader_Token68_Validation(t *testing.T) {
  function Test_Extractor_FromAuthHeader_NoScheme (line 640) | func Test_Extractor_FromAuthHeader_NoScheme(t *testing.T) {
  function Test_Extractor_Chain_NilFunctions (line 678) | func Test_Extractor_Chain_NilFunctions(t *testing.T) {
  function Test_Extractor_Chain_AllErrors (line 709) | func Test_Extractor_Chain_AllErrors(t *testing.T) {
  function Test_Extractor_Chain_MixedScenarios (line 747) | func Test_Extractor_Chain_MixedScenarios(t *testing.T) {
  function Test_Extractor_SourceTypes (line 817) | func Test_Extractor_SourceTypes(t *testing.T) {
  function Test_Extractor_URL_Encoded (line 845) | func Test_Extractor_URL_Encoded(t *testing.T) {
  function Test_isValidToken68 (line 902) | func Test_isValidToken68(t *testing.T) {

FILE: group.go
  type Group (line 14) | type Group struct
    method Name (line 27) | func (grp *Group) Name(name string) Router {
    method Use (line 70) | func (grp *Group) Use(args ...any) Router {
    method Get (line 114) | func (grp *Group) Get(path string, handler any, handlers ...any) Router {
    method Head (line 120) | func (grp *Group) Head(path string, handler any, handlers ...any) Rout...
    method Post (line 126) | func (grp *Group) Post(path string, handler any, handlers ...any) Rout...
    method Put (line 132) | func (grp *Group) Put(path string, handler any, handlers ...any) Router {
    method Delete (line 137) | func (grp *Group) Delete(path string, handler any, handlers ...any) Ro...
    method Connect (line 143) | func (grp *Group) Connect(path string, handler any, handlers ...any) R...
    method Options (line 149) | func (grp *Group) Options(path string, handler any, handlers ...any) R...
    method Trace (line 155) | func (grp *Group) Trace(path string, handler any, handlers ...any) Rou...
    method Patch (line 161) | func (grp *Group) Patch(path string, handler any, handlers ...any) Rou...
    method Add (line 167) | func (grp *Group) Add(methods []string, path string, handler any, hand...
    method All (line 178) | func (grp *Group) All(path string, handler any, handlers ...any) Router {
    method Group (line 187) | func (grp *Group) Group(prefix string, handlers ...any) Router {
    method RouteChain (line 205) | func (grp *Group) RouteChain(path string) Register {
    method Route (line 215) | func (grp *Group) Route(prefix string, fn func(router Router), name .....

FILE: helpers.go
  type acceptedType (line 37) | type acceptedType struct
  constant noCacheValue (line 45) | noCacheValue = "no-cache"
  type headerParams (line 54) | type headerParams
  function ValueFromContext (line 62) | func ValueFromContext[T any](ctx, key any) (T, bool) {
  function StoreInContext (line 83) | func StoreInContext(c Ctx, key, value any) {
  function getTLSConfig (line 92) | func getTLSConfig(ln net.Listener) *tls.Config {
  function readContent (line 158) | func readContent(rf io.ReaderFrom, name string) (int64, error) {
  method quoteString (line 178) | func (app *App) quoteString(raw string) string {
  method quoteRawString (line 188) | func (app *App) quoteRawString(raw string) string {
  method isASCII (line 220) | func (*App) isASCII(s string) bool {
  function uniqueRouteStack (line 230) | func uniqueRouteStack(stack []*Route) []*Route {
  function defaultString (line 244) | func defaultString(value string, defaultValue []string) string {
  function getGroupPath (line 251) | func getGroupPath(prefix, path string) string {
  function acceptsOffer (line 266) | func acceptsOffer(spec, offer string, _ headerParams) bool {
  function acceptsLanguageOfferBasic (line 284) | func acceptsLanguageOfferBasic(spec, offer string, _ headerParams) bool {
  function acceptsLanguageOfferExtended (line 305) | func acceptsLanguageOfferExtended(spec, offer string, _ headerParams) bo...
  function acceptsOfferType (line 363) | func acceptsOfferType(spec, offerType string, specParams headerParams) b...
  function paramsMatch (line 412) | func paramsMatch(specParamStr headerParams, offerParams string) bool {
  function getSplicedStrList (line 446) | func getSplicedStrList(headerValue string, dst []string) []string {
  function joinHeaderValues (line 464) | func joinHeaderValues(headers [][]byte) []byte {
  function unescapeHeaderValue (line 475) | func unescapeHeaderValue(v []byte) ([]byte, error) {
  function forEachMediaRange (line 506) | func forEachMediaRange(header []byte, functor func([]byte)) {
  function getOffer (line 562) | func getOffer(header []byte, isAccepted func(spec, offer string, specPar...
  function sortAcceptedTypes (line 677) | func sortAcceptedTypes(at []acceptedType) {
  function normalizeEtag (line 699) | func normalizeEtag(t string) (value string, weak, ok bool) { //nolint:no...
  function matchEtag (line 714) | func matchEtag(s, etag string) bool {
  function matchEtagStrong (line 727) | func matchEtagStrong(s, etag string) bool {
  method isEtagStale (line 740) | func (app *App) isEtagStale(etag string, noneMatchBytes []byte) bool {
  function parseAddr (line 772) | func parseAddr(raw string) (host, port string) { //nolint:nonamedreturns...
  function isNoCache (line 812) | func isNoCache(cacheControl string) bool {
  function isNoCacheDelimiter (line 843) | func isNoCacheDelimiter(c byte) bool {
  function matchNoCacheToken (line 847) | func matchNoCacheToken(s string, i int) bool {
  type testConn (line 864) | type testConn struct
    method Read (line 872) | func (c *testConn) Read(b []byte) (int, error) {
    method Write (line 880) | func (c *testConn) Write(b []byte) (int, error) {
    method Close (line 891) | func (c *testConn) Close() error {
    method LocalAddr (line 900) | func (*testConn) LocalAddr() net.Addr { return &net.TCPAddr{Port: 0, Z...
    method RemoteAddr (line 903) | func (*testConn) RemoteAddr() net.Addr { return &net.TCPAddr{Port: 0, ...
    method SetDeadline (line 906) | func (*testConn) SetDeadline(_ time.Time) error { return nil }
    method SetReadDeadline (line 909) | func (*testConn) SetReadDeadline(_ time.Time) error { return nil }
    method SetWriteDeadline (line 912) | func (*testConn) SetWriteDeadline(_ time.Time) error { return nil }
  function toStringImmutable (line 914) | func toStringImmutable(b []byte) string {
  function toBytesImmutable (line 918) | func toBytesImmutable(s string) []byte {
  method methodInt (line 923) | func (app *App) methodInt(s string) int {
  method method (line 953) | func (app *App) method(methodInt int) string {
  function IsMethodSafe (line 959) | func IsMethodSafe(m string) bool {
  function IsMethodIdempotent (line 973) | func IsMethodIdempotent(m string) bool {
  function Convert (line 987) | func Convert[T any](value string, converter func(string) (T, error), def...
  function genericParseType (line 1006) | func genericParseType[V GenericType](str string) (V, error) {
  type GenericType (line 1104) | type GenericType interface
  type GenericTypeInteger (line 1109) | type GenericTypeInteger interface
  type GenericTypeIntegerSigned (line 1114) | type GenericTypeIntegerSigned interface
  type GenericTypeIntegerUnsigned (line 1119) | type GenericTypeIntegerUnsigned interface
  type GenericTypeFloat (line 1124) | type GenericTypeFloat interface

FILE: helpers_fuzz_test.go
  function FuzzUtilsGetOffer (line 10) | func FuzzUtilsGetOffer(f *testing.F) {

FILE: helpers_test.go
  function Test_Utils_GetOffer (line 24) | func Test_Utils_GetOffer(t *testing.T) {
  function Test_ReadContentReturnsBytes (line 117) | func Test_ReadContentReturnsBytes(t *testing.T) {
  type wrappedListener (line 138) | type wrappedListener struct
  type tlsConfigMethodListener (line 142) | type tlsConfigMethodListener struct
    method TLSConfig (line 147) | func (ln *tlsConfigMethodListener) TLSConfig() *tls.Config {
  type configMethodListener (line 151) | type configMethodListener struct
    method Config (line 156) | func (ln *configMethodListener) Config() *tls.Config {
  function Test_GetTLSConfig (line 160) | func Test_GetTLSConfig(t *testing.T) {
  function newLocalListener (line 228) | func newLocalListener(t *testing.T) net.Listener {
  function Benchmark_Utils_GetOffer (line 238) | func Benchmark_Utils_GetOffer(b *testing.B) {
  function Test_Utils_ParamsMatch (line 324) | func Test_Utils_ParamsMatch(t *testing.T) {
  function Benchmark_Utils_ParamsMatch (line 374) | func Benchmark_Utils_ParamsMatch(b *testing.B) {
  function Test_Utils_AcceptsOfferType (line 388) | func Test_Utils_AcceptsOfferType(t *testing.T) {
  function Test_Utils_GetSplicedStrList (line 456) | func Test_Utils_GetSplicedStrList(t *testing.T) {
  function Benchmark_Utils_GetSplicedStrList (line 526) | func Benchmark_Utils_GetSplicedStrList(b *testing.B) {
  function Test_Utils_SortAcceptedTypes (line 537) | func Test_Utils_SortAcceptedTypes(t *testing.T) {
  function Benchmark_Utils_SortAcceptedTypes_Sorted (line 571) | func Benchmark_Utils_SortAcceptedTypes_Sorted(b *testing.B) {
  function Benchmark_Utils_SortAcceptedTypes_Unsorted (line 586) | func Benchmark_Utils_SortAcceptedTypes_Unsorted(b *testing.B) {
  function Test_Utils_UniqueRouteStack (line 618) | func Test_Utils_UniqueRouteStack(t *testing.T) {
  function Test_Utils_getGroupPath (line 646) | func Test_Utils_getGroupPath(t *testing.T) {
  function Benchmark_Utils_getGroupPath (line 668) | func Benchmark_Utils_getGroupPath(b *testing.B) {
  function Benchmark_Utils_Unescape (line 680) | func Benchmark_Utils_Unescape(b *testing.B) {
  function Test_Utils_Parse_Address (line 694) | func Test_Utils_Parse_Address(t *testing.T) {
  function Test_Utils_TestConn_Deadline (line 722) | func Test_Utils_TestConn_Deadline(t *testing.T) {
  function Test_Utils_TestConn_ReadWrite (line 730) | func Test_Utils_TestConn_ReadWrite(t *testing.T) {
  function Test_Utils_TestConn_Closed_Write (line 753) | func Test_Utils_TestConn_Closed_Write(t *testing.T) {
  function Test_Utils_IsNoCache (line 772) | func Test_Utils_IsNoCache(t *testing.T) {
  function Benchmark_Utils_IsNoCache (line 804) | func Benchmark_Utils_IsNoCache(b *testing.B) {
  function Test_HeaderContainsValue (line 819) | func Test_HeaderContainsValue(t *testing.T) {
  function Benchmark_HeaderContainsValue (line 861) | func Benchmark_HeaderContainsValue(b *testing.B) {
  type testGenericParseTypeIntCase (line 873) | type testGenericParseTypeIntCase struct
  function Test_GenericParseTypeInts (line 879) | func Test_GenericParseTypeInts(t *testing.T) {
  function testGenericTypeInt (line 947) | func testGenericTypeInt[V GenericTypeInteger](t *testing.T, name string,...
  type testGenericParseTypeUintCase (line 964) | type testGenericParseTypeUintCase struct
  function Test_GenericParseTypeUints (line 970) | func Test_GenericParseTypeUints(t *testing.T) {
  function testGenericTypeUint (line 1018) | func testGenericTypeUint[V GenericTypeInteger](t *testing.T, name string...
  function Test_GenericParseTypeFloats (line 1036) | func Test_GenericParseTypeFloats(t *testing.T) {
  function Test_GenericParseTypeBytes (line 1083) | func Test_GenericParseTypeBytes(t *testing.T) {
  function Test_GenericParseTypeString (line 1125) | func Test_GenericParseTypeString(t *testing.T) {
  function Test_GenericParseTypeBoolean (line 1141) | func Test_GenericParseTypeBoolean(t *testing.T) {
  function testGenericParseError (line 1181) | func testGenericParseError[V GenericType](t *testing.T) {
  function Benchmark_GenericParseTypeInts (line 1190) | func Benchmark_GenericParseTypeInts(b *testing.B) {
  function benchGenericParseTypeInt (line 1259) | func benchGenericParseTypeInt[V GenericTypeInteger](b *testing.B, name s...
  function Benchmark_GenericParseTypeUints (line 1281) | func Benchmark_GenericParseTypeUints(b *testing.B) {
  function benchGenericParseTypeUInt (line 1338) | func benchGenericParseTypeUInt[V GenericTypeInteger](b *testing.B, name ...
  function Benchmark_GenericParseTypeFloats (line 1360) | func Benchmark_GenericParseTypeFloats(b *testing.B) {
  function Benchmark_GenericParseTypeBytes (line 1418) | func Benchmark_GenericParseTypeBytes(b *testing.B) {
  function Benchmark_GenericParseTypeString (line 1466) | func Benchmark_GenericParseTypeString(b *testing.B) {
  function Benchmark_GenericParseTypeBoolean (line 1488) | func Benchmark_GenericParseTypeBoolean(b *testing.B) {
  function Test_UnescapeHeaderValue (line 1533) | func Test_UnescapeHeaderValue(t *testing.T) {
  function Test_JoinHeaderValues (line 1556) | func Test_JoinHeaderValues(t *testing.T) {
  function Test_ParamsMatch_InvalidEscape (line 1563) | func Test_ParamsMatch_InvalidEscape(t *testing.T) {
  function Test_MatchEtag (line 1569) | func Test_MatchEtag(t *testing.T) {
  function Test_MatchEtagStrong (line 1580) | func Test_MatchEtagStrong(t *testing.T) {
  function Test_IsEtagStale (line 1591) | func Test_IsEtagStale(t *testing.T) {
  function Test_App_quoteRawString (line 1627) | func Test_App_quoteRawString(t *testing.T) {
  function TestStoreInContext (line 1654) | func TestStoreInContext(t *testing.T) {
  function TestValueFromContext (line 1673) | func TestValueFromContext(t *testing.T) {

FILE: hooks.go
  type Hooks (line 35) | type Hooks struct
    method OnRoute (line 241) | func (h *Hooks) OnRoute(handler ...OnRouteHandler) {
    method OnName (line 251) | func (h *Hooks) OnName(handler ...OnNameHandler) {
    method OnGroup (line 259) | func (h *Hooks) OnGroup(handler ...OnGroupHandler) {
    method OnGroupName (line 269) | func (h *Hooks) OnGroupName(handler ...OnGroupNameHandler) {
    method OnListen (line 276) | func (h *Hooks) OnListen(handler ...OnListenHandler) {
    method OnPreStartupMessage (line 283) | func (h *Hooks) OnPreStartupMessage(handler ...OnPreStartupMessageHand...
    method OnPostStartupMessage (line 290) | func (h *Hooks) OnPostStartupMessage(handler ...OnPostStartupMessageHa...
    method OnPreShutdown (line 297) | func (h *Hooks) OnPreShutdown(handler ...OnPreShutdownHandler) {
    method OnPostShutdown (line 304) | func (h *Hooks) OnPostShutdown(handler ...OnPostShutdownHandler) {
    method OnFork (line 311) | func (h *Hooks) OnFork(handler ...OnForkHandler) {
    method OnMount (line 320) | func (h *Hooks) OnMount(handler ...OnMountHandler) {
    method executeOnRouteHooks (line 326) | func (h *Hooks) executeOnRouteHooks(route *Route) error {
    method executeOnNameHooks (line 348) | func (h *Hooks) executeOnNameHooks(route *Route) error {
    method executeOnGroupHooks (line 370) | func (h *Hooks) executeOnGroupHooks(group Group) error {
    method executeOnGroupNameHooks (line 385) | func (h *Hooks) executeOnGroupNameHooks(group Group) error {
    method executeOnListenHooks (line 400) | func (h *Hooks) executeOnListenHooks(listenData *ListenData) error {
    method executeOnPreStartupMessageHooks (line 410) | func (h *Hooks) executeOnPreStartupMessageHooks(data *PreStartupMessag...
    method executeOnPostStartupMessageHooks (line 420) | func (h *Hooks) executeOnPostStartupMessageHooks(data *PostStartupMess...
    method executeOnPreShutdownHooks (line 430) | func (h *Hooks) executeOnPreShutdownHooks() {
    method executeOnPostShutdownHooks (line 438) | func (h *Hooks) executeOnPostShutdownHooks(err error) {
    method executeOnForkHooks (line 446) | func (h *Hooks) executeOnForkHooks(pid int) {
    method executeOnMountHooks (line 454) | func (h *Hooks) executeOnMountHooks(app *App) error {
  type StartupMessageLevel (line 53) | type StartupMessageLevel
  constant StartupMessageLevelInfo (line 57) | StartupMessageLevelInfo StartupMessageLevel = iota
  constant StartupMessageLevelWarning (line 59) | StartupMessageLevelWarning
  constant StartupMessageLevelError (line 61) | StartupMessageLevelError
  constant errString (line 64) | errString = "ERROR"
  type startupMessageEntry (line 67) | type startupMessageEntry struct
  type ListenData (line 76) | type ListenData struct
  type PreStartupMessageData (line 94) | type PreStartupMessageData struct
    method AddInfo (line 107) | func (sm *PreStartupMessageData) AddInfo(key, title, value string, pri...
    method AddWarning (line 117) | func (sm *PreStartupMessageData) AddWarning(key, title, value string, ...
    method AddError (line 127) | func (sm *PreStartupMessageData) AddError(key, title, value string, pr...
    method EntryKeys (line 137) | func (sm *PreStartupMessageData) EntryKeys() []string {
    method ResetEntries (line 146) | func (sm *PreStartupMessageData) ResetEntries() {
    method DeleteEntry (line 151) | func (sm *PreStartupMessageData) DeleteEntry(key string) {
    method addEntry (line 164) | func (sm *PreStartupMessageData) addEntry(key, title, value string, pr...
  function newPreStartupMessageData (line 190) | func newPreStartupMessageData(listenData *ListenData) *PreStartupMessage...
  type PostStartupMessageData (line 195) | type PostStartupMessageData struct
  function newPostStartupMessageData (line 208) | func newPostStartupMessageData(listenData *ListenData, disabled, isChild...
  function newHooks (line 222) | func newHooks(app *App) *Hooks {

FILE: hooks_test.go
  constant testMountPath (line 18) | testMountPath = "/api"
  function testSimpleHandler (line 20) | func testSimpleHandler(c Ctx) error {
  function Test_Hook_OnRoute (line 24) | func Test_Hook_OnRoute(t *testing.T) {
  function Test_Hook_OnRoute_Mount (line 42) | func Test_Hook_OnRoute_Mount(t *testing.T) {
  function Test_Hook_OnName (line 64) | func Test_Hook_OnName(t *testing.T) {
  function Test_Hook_OnName_Error (line 89) | func Test_Hook_OnName_Error(t *testing.T) {
  function Test_Hook_OnGroup (line 102) | func Test_Hook_OnGroup(t *testing.T) {
  function Test_Hook_OnGroup_Mount (line 121) | func Test_Hook_OnGroup_Mount(t *testing.T) {
  function Test_Hook_OnGroupName (line 138) | func Test_Hook_OnGroupName(t *testing.T) {
  function Test_Hook_OnGroupName_Error (line 170) | func Test_Hook_OnGroupName_Error(t *testing.T) {
  function Test_Hook_OnPreShutdown (line 183) | func Test_Hook_OnPreShutdown(t *testing.T) {
  function Test_Hook_OnPostShutdown (line 201) | func Test_Hook_OnPostShutdown(t *testing.T) {
  function Test_Hook_OnListen (line 268) | func Test_Hook_OnListen(t *testing.T) {
  function Test_ListenDataMetadata (line 292) | func Test_ListenDataMetadata(t *testing.T) {
  function Test_ListenData_Hook_HelperFunctions (line 354) | func Test_ListenData_Hook_HelperFunctions(t *testing.T) {
  function Test_Hook_OnListenPrefork (line 521) | func Test_Hook_OnListenPrefork(t *testing.T) {
  function Test_Hook_OnHook (line 544) | func Test_Hook_OnHook(t *testing.T) {
  function Test_Hook_OnMount (line 564) | func Test_Hook_OnMount(t *testing.T) {
  function Test_executeOnRouteHooks_ErrorWithMount (line 581) | func Test_executeOnRouteHooks_ErrorWithMount(t *testing.T) {
  function Test_executeOnNameHooks_ErrorWithMount (line 597) | func Test_executeOnNameHooks_ErrorWithMount(t *testing.T) {
  function Test_executeOnGroupHooks_ErrorWithMount (line 613) | func Test_executeOnGroupHooks_ErrorWithMount(t *testing.T) {
  function Test_executeOnGroupNameHooks_ErrorWithMount (line 629) | func Test_executeOnGroupNameHooks_ErrorWithMount(t *testing.T) {
  function Test_executeOnListenHooks_Error (line 645) | func Test_executeOnListenHooks_Error(t *testing.T) {
  function Test_executeOnPreStartupMessageHooks_Error (line 657) | func Test_executeOnPreStartupMessageHooks_Error(t *testing.T) {
  function Test_executeOnPostStartupMessageHooks_Error (line 669) | func Test_executeOnPostStartupMessageHooks_Error(t *testing.T) {
  function Test_executeOnPreShutdownHooks_Error (line 681) | func Test_executeOnPreShutdownHooks_Error(t *testing.T) {
  function Test_executeOnForkHooks_Error (line 695) | func Test_executeOnForkHooks_Error(t *testing.T) {
  function Test_executeOnMountHooks_Error (line 710) | func Test_executeOnMountHooks_Error(t *testing.T) {

FILE: internal/memory/memory.go
  type Storage (line 27) | type Storage struct
    method Get (line 53) | func (s *Storage) Get(key string) any {
    method Set (line 75) | func (s *Storage) Set(key string, val any, ttl time.Duration) {
    method Delete (line 96) | func (s *Storage) Delete(key string) {
    method Reset (line 103) | func (s *Storage) Reset() {
    method gc (line 110) | func (s *Storage) gc(sleep time.Duration) {
  type item (line 32) | type item struct
  function New (line 39) | func New() *Storage {

FILE: internal/memory/memory_test.go
  function Test_Memory (line 12) | func Test_Memory(t *testing.T) {
  function Benchmark_Memory (line 59) | func Benchmark_Memory(b *testing.B) {

FILE: internal/storage/memory/config.go
  type Config (line 8) | type Config struct
  function configDefault (line 21) | func configDefault(config ...Config) Config {

FILE: internal/storage/memory/memory.go
  type Storage (line 16) | type Storage struct
    method Get (line 51) | func (s *Storage) Get(key string) ([]byte, error) {
    method GetWithContext (line 69) | func (s *Storage) GetWithContext(ctx context.Context, key string) ([]b...
    method Set (line 78) | func (s *Storage) Set(key string, val []byte, exp time.Duration) error {
    method SetWithContext (line 102) | func (s *Storage) SetWithContext(ctx context.Context, key string, val ...
    method Delete (line 110) | func (s *Storage) Delete(key string) error {
    method DeleteWithContext (line 123) | func (s *Storage) DeleteWithContext(ctx context.Context, key string) e...
    method Reset (line 131) | func (s *Storage) Reset() error {
    method ResetWithContext (line 141) | func (s *Storage) ResetWithContext(ctx context.Context) error {
    method Close (line 150) | func (s *Storage) Close() error {
    method gc (line 155) | func (s *Storage) gc() {
    method Conn (line 196) | func (s *Storage) Conn() map[string]Entry {
    method Keys (line 203) | func (s *Storage) Keys() ([][]byte, error) {
  type Entry (line 24) | type Entry struct
  function New (line 31) | func New(config ...Config) *Storage {
  function wrapContextError (line 228) | func wrapContextError(ctx context.Context, op string) error {

FILE: internal/storage/memory/memory_test.go
  function Test_Storage_Memory_Set (line 11) | func Test_Storage_Memory_Set(t *testing.T) {
  function Test_Storage_Memory_SetWithContext (line 27) | func Test_Storage_Memory_SetWithContext(t *testing.T) {
  function Test_Storage_Memory_Set_Override (line 46) | func Test_Storage_Memory_Set_Override(t *testing.T) {
  function Test_Storage_Memory_Get (line 65) | func Test_Storage_Memory_Get(t *testing.T) {
  function Test_Storage_Memory_GetWithContext (line 85) | func Test_Storage_Memory_GetWithContext(t *testing.T) {
  function Test_Storage_Memory_Set_Expiration (line 108) | func Test_Storage_Memory_Set_Expiration(t *testing.T) {
  function Test_Storage_Memory_Set_Long_Expiration_with_Keys (line 134) | func Test_Storage_Memory_Set_Long_Expiration_with_Keys(t *testing.T) {
  function Test_Storage_Memory_Get_NotExist (line 166) | func Test_Storage_Memory_Get_NotExist(t *testing.T) {
  function Test_Storage_Memory_Delete (line 178) | func Test_Storage_Memory_Delete(t *testing.T) {
  function Test_Storage_Memory_DeleteWithContext (line 205) | func Test_Storage_Memory_DeleteWithContext(t *testing.T) {
  function Test_Storage_Memory_Reset (line 231) | func Test_Storage_Memory_Reset(t *testing.T) {
  function Test_Storage_Memory_ResetWithContext (line 262) | func Test_Storage_Memory_ResetWithContext(t *testing.T) {
  function Test_Storage_Memory_Close (line 296) | func Test_Storage_Memory_Close(t *testing.T) {
  function Test_Storage_Memory_Conn (line 302) | func Test_Storage_Memory_Conn(t *testing.T) {
  function Benchmark_Memory_Set (line 309) | func Benchmark_Memory_Set(b *testing.B) {
  function Benchmark_Memory_Set_Parallel (line 318) | func Benchmark_Memory_Set_Parallel(b *testing.B) {
  function Benchmark_Memory_Set_Asserted (line 330) | func Benchmark_Memory_Set_Asserted(b *testing.B) {
  function Benchmark_Memory_Set_Asserted_Parallel (line 340) | func Benchmark_Memory_Set_Asserted_Parallel(b *testing.B) {
  function Benchmark_Memory_Get (line 354) | func Benchmark_Memory_Get(b *testing.B) {
  function Benchmark_Memory_Get_Parallel (line 366) | func Benchmark_Memory_Get_Parallel(b *testing.B) {
  function Benchmark_Memory_Get_Asserted (line 381) | func Benchmark_Memory_Get_Asserted(b *testing.B) {
  function Benchmark_Memory_Get_Asserted_Parallel (line 394) | func Benchmark_Memory_Get_Asserted_Parallel(b *testing.B) {
  function Benchmark_Memory_SetAndDelete (line 411) | func Benchmark_Memory_SetAndDelete(b *testing.B) {
  function Benchmark_Memory_SetAndDelete_Parallel (line 421) | func Benchmark_Memory_SetAndDelete_Parallel(b *testing.B) {
  function Benchmark_Memory_SetAndDelete_Asserted (line 434) | func Benchmark_Memory_SetAndDelete_Asserted(b *testing.B) {
  function Benchmark_Memory_SetAndDelete_Asserted_Parallel (line 447) | func Benchmark_Memory_SetAndDelete_Asserted_Parallel(b *testing.B) {

FILE: internal/tlstest/tls.go
  function GetTLSConfigs (line 22) | func GetTLSConfigs() (serverTLSConf, clientTLSConf *tls.Config, err erro...

FILE: listen.go
  constant globalIpv4Addr (line 40) | globalIpv4Addr = "0.0.0.0"
  type ListenConfig (line 44) | type ListenConfig struct
  function listenConfigDefault (line 136) | func listenConfigDefault(config ...ListenConfig) ListenConfig {
  method Listen (line 172) | func (app *App) Listen(addr string, config ...ListenConfig) error {
  method Listener (line 269) | func (app *App) Listener(ln net.Listener, config ...ListenConfig) error {
  method createListener (line 307) | func (*App) createListener(addr string, tlsConfig *tls.Config, cfg *List...
  method printMessages (line 346) | func (app *App) printMessages(cfg *ListenConfig, listenData *ListenData) {
  method prepareListenData (line 355) | func (app *App) prepareListenData(addr string, isTLS bool, cfg *ListenCo...
  method startupMessage (line 391) | func (app *App) startupMessage(listenData *ListenData, cfg *ListenConfig) {
  function printStartupEntries (line 489) | func printStartupEntries(out io.Writer, colors *Colors, entries []startu...
  method printRoutesMessage (line 516) | func (app *App) printRoutesMessage() {
  method gracefulShutdown (line 561) | func (app *App) gracefulShutdown(ctx context.Context, cfg *ListenConfig) {

FILE: listen_test.go
  function Test_Listen (line 27) | func Test_Listen(t *testing.T) {
  function Test_Listen_Graceful_Shutdown (line 41) | func Test_Listen_Graceful_Shutdown(t *testing.T) {
  function testGracefulShutdown (line 55) | func testGracefulShutdown(t *testing.T, shutdownTimeout time.Duration) {
  function Test_Listen_Prefork (line 167) | func Test_Listen_Prefork(t *testing.T) {
  function Test_Listen_TLSMinVersion (line 176) | func Test_Listen_TLSMinVersion(t *testing.T) {
  function Test_Listen_TLS (line 213) | func Test_Listen_TLS(t *testing.T) {
  function Test_Listen_TLS_Prefork (line 234) | func Test_Listen_TLS_Prefork(t *testing.T) {
  function Test_Listen_MutualTLS (line 261) | func Test_Listen_MutualTLS(t *testing.T) {
  function Test_Listen_MutualTLS_Prefork (line 284) | func Test_Listen_MutualTLS_Prefork(t *testing.T) {
  function Test_Listener (line 313) | func Test_Listener(t *testing.T) {
  function Test_App_Listener_TLS_Listener (line 325) | func Test_App_Listener_TLS_Listener(t *testing.T) {
  function Test_Listen_TLSConfigFunc (line 349) | func Test_Listen_TLSConfigFunc(t *testing.T) {
  function Test_Listen_TLSConfig (line 371) | func Test_Listen_TLSConfig(t *testing.T) {
  function Test_Listen_TLSCertFiles (line 426) | func Test_Listen_TLSCertFiles(t *testing.T) {
  function Test_Listen_TLSConfig_WithTLSConfigFunc (line 445) | func Test_Listen_TLSConfig_WithTLSConfigFunc(t *testing.T) {
  function Test_Listen_AutoCert_Conflicts (line 474) | func Test_Listen_AutoCert_Conflicts(t *testing.T) {
  function Test_Listen_ListenerAddrFunc (line 488) | func Test_Listen_ListenerAddrFunc(t *testing.T) {
  function Test_Listen_BeforeServeFunc (line 510) | func Test_Listen_BeforeServeFunc(t *testing.T) {
  function Test_Listen_ListenerNetwork (line 533) | func Test_Listen_ListenerNetwork(t *testing.T) {
  function Test_Listen_ListenerNetwork_Unix (line 569) | func Test_Listen_ListenerNetwork_Unix(t *testing.T) {
  function Test_Listen_Master_Process_Show_Startup_Message (line 632) | func Test_Listen_Master_Process_Show_Startup_Message(t *testing.T) {
  function Test_Listen_Master_Process_Show_Startup_MessageWithAppName (line 665) | func Test_Listen_Master_Process_Show_Startup_MessageWithAppName(t *testi...
  function Test_Listen_Master_Process_Show_Startup_MessageWithAppNameNonAscii (line 694) | func Test_Listen_Master_Process_Show_Startup_MessageWithAppNameNonAscii(...
  function Test_Listen_Master_Process_Show_Startup_MessageWithDisabledPreforkAndCustomEndpoint (line 718) | func Test_Listen_Master_Process_Show_Startup_MessageWithDisabledPreforkA...
  function Test_StartupMessageCustomization (line 745) | func Test_StartupMessageCustomization(t *testing.T) {
  function Test_StartupMessageDisabledPostHook (line 782) | func Test_StartupMessageDisabledPostHook(t *testing.T) {
  function Test_StartupMessagePreventedByHook (line 804) | func Test_StartupMessagePreventedByHook(t *testing.T) {
  function Test_Listen_Print_Route (line 833) | func Test_Listen_Print_Route(t *testing.T) {
  function Test_Listen_Print_Route_With_Group (line 846) | func Test_Listen_Print_Route_With_Group(t *testing.T) {
  function captureOutput (line 869) | func captureOutput(f func()) string {
  function emptyHandler (line 901) | func emptyHandler(_ Ctx) error {

FILE: log/default.go
  type defaultLogger (line 16) | type defaultLogger struct
    method privateLog (line 24) | func (l *defaultLogger) privateLog(lv Level, fmtArgs []any) {
    method privateLogf (line 47) | func (l *defaultLogger) privateLogf(lv Level, format string, fmtArgs [...
    method privateLogw (line 74) | func (l *defaultLogger) privateLogw(lv Level, format string, keysAndVa...
    method Trace (line 119) | func (l *defaultLogger) Trace(v ...any) {
    method Debug (line 124) | func (l *defaultLogger) Debug(v ...any) {
    method Info (line 129) | func (l *defaultLogger) Info(v ...any) {
    method Warn (line 134) | func (l *defaultLogger) Warn(v ...any) {
    method Error (line 139) | func (l *defaultLogger) Error(v ...any) {
    method Fatal (line 144) | func (l *defaultLogger) Fatal(v ...any) {
    method Panic (line 149) | func (l *defaultLogger) Panic(v ...any) {
    method Tracef (line 154) | func (l *defaultLogger) Tracef(format string, v ...any) {
    method Debugf (line 159) | func (l *defaultLogger) Debugf(format string, v ...any) {
    method Infof (line 164) | func (l *defaultLogger) Infof(format string, v ...any) {
    method Warnf (line 169) | func (l *defaultLogger) Warnf(format string, v ...any) {
    method Errorf (line 174) | func (l *defaultLogger) Errorf(format string, v ...any) {
    method Fatalf (line 179) | func (l *defaultLogger) Fatalf(format string, v ...any) {
    method Panicf (line 184) | func (l *defaultLogger) Panicf(format string, v ...any) {
    method Tracew (line 189) | func (l *defaultLogger) Tracew(msg string, keysAndValues ...any) {
    method Debugw (line 194) | func (l *defaultLogger) Debugw(msg string, keysAndValues ...any) {
    method Infow (line 199) | func (l *defaultLogger) Infow(msg string, keysAndValues ...any) {
    method Warnw (line 204) | func (l *defaultLogger) Warnw(msg string, keysAndValues ...any) {
    method Errorw (line 209) | func (l *defaultLogger) Errorw(msg string, keysAndValues ...any) {
    method Fatalw (line 214) | func (l *defaultLogger) Fatalw(msg string, keysAndValues ...any) {
    method Panicw (line 219) | func (l *defaultLogger) Panicw(msg string, keysAndValues ...any) {
    method WithContext (line 224) | func (l *defaultLogger) WithContext(_ context.Context) CommonLogger {
    method SetLevel (line 233) | func (l *defaultLogger) SetLevel(level Level) {
    method SetOutpu
Condensed preview — 382 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,060K chars).
[
  {
    "path": ".cspell.json",
    "chars": 2012,
    "preview": "{\n  \"version\": \"0.2\",\n  \"language\": \"en, en-gb, en-us\",\n  \"useGitignore\": true,\n  \"caseSensitive\": false,\n  \"import\": [\n"
  },
  {
    "path": ".editorconfig",
    "chars": 455,
    "preview": "; This file is for unifying the coding style for different editors and IDEs.\n; More information at http://editorconfig.o"
  },
  {
    "path": ".gitattributes",
    "chars": 517,
    "preview": "# Handle line endings automatically for files detected as text\n# and leave all files detected as binary untouched.\n* tex"
  },
  {
    "path": ".github/.editorconfig",
    "chars": 354,
    "preview": "; https://editorconfig.org/\n\nroot = true\n\n[*]\ninsert_final_newline = true\ncharset = utf-8\ntrim_trailing_whitespace = tru"
  },
  {
    "path": ".github/.hound.yml",
    "chars": 24,
    "preview": "golint:\n  enabled: false"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 23,
    "preview": "* @gofiber/maintainers\n"
  },
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "chars": 5398,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "chars": 1904,
    "preview": "# Contributing\n\nBefore making any changes to this repository, we kindly request you to initiate discussions for proposed"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 435,
    "preview": "# These are supported funding model platforms\n\ngithub: [gofiber] # Replace with up to 4 GitHub Sponsors-enabled username"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report.yaml",
    "chars": 3152,
    "preview": "name: \"\\U0001F41B Bug Report\"\ntitle: \"\\U0001F41B [Bug]: \"\ndescription: Create a bug report to help us fix it.\nlabels: [\""
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 28,
    "preview": "blank_issues_enabled: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature-request.yaml",
    "chars": 3047,
    "preview": "name: \"📝 Feature Proposal\"\ntitle: \"📝 [Proposal]: \"\ndescription: Propose a feature or improvement for Fiber.\nlabels: [\"📝 "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/maintenance-task.yaml",
    "chars": 2165,
    "preview": "name: \"🧹 Maintenance Task\"\ntitle: \"🧹 [Maintenance]: \"\ndescription: Describe a maintenance task for the v3 of the Fiber p"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/question.yaml",
    "chars": 1985,
    "preview": "name: \"🤔 Question\"\ntitle: \"\\U0001F917 [Question]: \"\ndescription: Ask a question so we can help you easily.\nlabels: [\"🤔 Q"
  },
  {
    "path": ".github/README.md",
    "chars": 35983,
    "preview": "<h1 align=\"center\">\n  <a href=\"https://gofiber.io\">\n    <picture>\n      <source height=\"125\" media=\"(prefers-color-schem"
  },
  {
    "path": ".github/SECURITY.md",
    "chars": 2566,
    "preview": "# Security Policy\n\n1. [Supported Versions](#versions)\n2. [Reporting security problems to Fiber](#reporting)\n3. [Security"
  },
  {
    "path": ".github/codecov.yml",
    "chars": 478,
    "preview": "coverage:\r\n  status:\r\n    project:\r\n      default:\r\n        target: auto\r\n        threshold: 0.5%\r\n        base: auto\r\n "
  },
  {
    "path": ".github/config.yml",
    "chars": 1054,
    "preview": "# Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome\n# Comment to be posted to on fi"
  },
  {
    "path": ".github/copilot-instructions.md",
    "chars": 404,
    "preview": "# Copilot Usage\n\nWhen modifying code, always perform these steps:\n\n1. **Ensure code quality**\n   - `make format` to form"
  },
  {
    "path": ".github/copilot-setup-steps.yml",
    "chars": 586,
    "preview": "steps:\n  - run: |\n      if [ -d vendor ] || go list -m -mod=readonly all; then\n        echo \"Dependencies already presen"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 1018,
    "preview": "# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates\n\nversion: 2\nupd"
  },
  {
    "path": ".github/index.html",
    "chars": 214,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, i"
  },
  {
    "path": ".github/labeler.yml",
    "chars": 215,
    "preview": "_extends: .github\r\nlabels:\r\n  - label: 'v3'\r\n    matcher:\r\n      baseBranch: 'main'\r\n      title: '/(v3)/i'\r\n      body:"
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 2819,
    "preview": "# Description\n\nPlease provide a clear and concise description of the changes you've made and the problem they address. I"
  },
  {
    "path": ".github/release-drafter.yml",
    "chars": 1340,
    "preview": "name-template: 'v$RESOLVED_VERSION'\ntag-template: 'v$RESOLVED_VERSION'\ncommitish: main\nfilter-by-commitish: true\ninclude"
  },
  {
    "path": ".github/release.yml",
    "chars": 564,
    "preview": "# .github/release.yml\n\nchangelog:\n  categories:\n    - title: '❗ Breaking Changes'\n      labels:\n        - '❗ BreakingCha"
  },
  {
    "path": ".github/scripts/sync_docs.sh",
    "chars": 2160,
    "preview": "#!/usr/bin/env bash\nset -e\n\n# Some env variables\nBRANCH=\"main\"\nREPO_URL=\"github.com/gofiber/docs.git\"\nAUTHOR_EMAIL=\"gith"
  },
  {
    "path": ".github/testdata/ca-chain.cert.pem",
    "chars": 3969,
    "preview": "-----BEGIN CERTIFICATE-----\nMIIFeTCCA2GgAwIBAgIDEAISMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNVBAYTAlVT\nMQ8wDQYDVQQIDAZEZW5pYWwxFDA"
  },
  {
    "path": ".github/testdata/fs/css/style.css",
    "chars": 46,
    "preview": "h1 {\n    color: red;\n    text-align: center;\n}"
  },
  {
    "path": ".github/testdata/fs/css/test/style2.css",
    "chars": 23,
    "preview": "h1 {\n  color: black;\n}\n"
  },
  {
    "path": ".github/testdata/fs/index.html",
    "chars": 299,
    "preview": "<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale="
  },
  {
    "path": ".github/testdata/hello_world.tmpl",
    "chars": 27,
    "preview": "<h1>Hello {{ .Name }}!</h1>"
  },
  {
    "path": ".github/testdata/index.html",
    "chars": 20,
    "preview": "<p>Hello, Fiber!</p>"
  },
  {
    "path": ".github/testdata/index.tmpl",
    "chars": 19,
    "preview": "<h1>{{.Title}}</h1>"
  },
  {
    "path": ".github/testdata/main.tmpl",
    "chars": 17,
    "preview": "<h1>I'm main</h1>"
  },
  {
    "path": ".github/testdata/ssl.key",
    "chars": 1703,
    "preview": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD4IQusAs8PJdnG\n3mURt/AXtgC+ceqLOatJ49JJE1V"
  },
  {
    "path": ".github/testdata/ssl.pem",
    "chars": 1004,
    "preview": "-----BEGIN CERTIFICATE-----\nMIICujCCAaKgAwIBAgIJAMbXnKZ/cikUMA0GCSqGSIb3DQEBCwUAMBUxEzARBgNV\nBAMTCnVidW50dS5uYW4wHhcNMTU"
  },
  {
    "path": ".github/testdata/template-invalid.html",
    "chars": 19,
    "preview": "<h1>{{.Title}</h1>\n"
  },
  {
    "path": ".github/testdata/template.tmpl",
    "chars": 32,
    "preview": "<h1>{{.Title}} {{.Summary}}</h1>"
  },
  {
    "path": ".github/testdata/testRoutes.json",
    "chars": 38375,
    "preview": "{\n  \"test_routes\": [{\n      \"method\": \"GET\",\n      \"path\": \"/authorizations\"\n    },\n    {\n      \"method\": \"GET\",\n      \""
  },
  {
    "path": ".github/testdata2/bruh.tmpl",
    "chars": 17,
    "preview": "<h1>I'm Bruh</h1>"
  },
  {
    "path": ".github/testdata3/hello_world.tmpl",
    "chars": 27,
    "preview": "<h1>Hello {{ .Name }}!</h1>"
  },
  {
    "path": ".github/workflows/auto-labeler.yml",
    "chars": 388,
    "preview": "name: auto-labeler\n\non:\n  issues:\n    types: [opened, edited, milestoned]\n  pull_request_target:\n    types: [opened, edi"
  },
  {
    "path": ".github/workflows/benchmark.yml",
    "chars": 4463,
    "preview": "on:\n  workflow_dispatch:\n  push:\n    branches:\n      - main\n    paths-ignore:\n      - \"**/*.md\"\n  pull_request:\n    path"
  },
  {
    "path": ".github/workflows/codeql-analysis.yml",
    "chars": 1881,
    "preview": "name: \"CodeQL\"\n\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - main\n    paths-ignore:\n      - \"**/*.md\"\n  pull_r"
  },
  {
    "path": ".github/workflows/dependabot_automerge.yml",
    "chars": 1355,
    "preview": "name: Dependabot auto-merge\non:\n  workflow_dispatch:\n  pull_request_target:\npermissions:\n  contents: write\n  pull-reques"
  },
  {
    "path": ".github/workflows/linter.yml",
    "chars": 1111,
    "preview": "name: golangci-lint\n\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - main\n    paths-ignore:\n      - \"**/*.md\"\n  p"
  },
  {
    "path": ".github/workflows/manual-dependabot.yml",
    "chars": 1569,
    "preview": "# https://github.com/dependabot/dependabot-script/blob/main/manual-github-actions.yaml\n# https://github.com/dependabot/d"
  },
  {
    "path": ".github/workflows/markdown.yml",
    "chars": 538,
    "preview": "name: markdownlint\n\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - main\n    paths:\n      - \"**/*.md\"\n  pull_requ"
  },
  {
    "path": ".github/workflows/modernize.yml",
    "chars": 779,
    "preview": "name: Modernize Lint\n\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - main\n    paths-ignore:\n      - \"**/*.md\"\n  "
  },
  {
    "path": ".github/workflows/move-closed-milestone-items.yml",
    "chars": 3978,
    "preview": "name: Move closed milestone items\n\non:\n  workflow_dispatch:\n    inputs:\n      source_milestone:\n        description: Mil"
  },
  {
    "path": ".github/workflows/release-drafter.yml",
    "chars": 632,
    "preview": "name: Release Drafter\n\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch:\n\npermissions:\n  contents: read\n\njobs:"
  },
  {
    "path": ".github/workflows/spell-check.yml",
    "chars": 1944,
    "preview": "name: Spell check\n\non:\n  workflow_dispatch:\n  pull_request:\n    types:\n      - opened\n      - synchronize\n      - reopen"
  },
  {
    "path": ".github/workflows/sync-docs.yml",
    "chars": 783,
    "preview": "name: \"Sync docs\"\n\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - main\n    paths:\n      - \"docs/**\"\n  release:\n "
  },
  {
    "path": ".github/workflows/test.yml",
    "chars": 1591,
    "preview": "name: Test\n\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - main\n    paths-ignore:\n      - \"**/*.md\"\n  pull_reque"
  },
  {
    "path": ".github/workflows/v3-label-automation.yml",
    "chars": 1612,
    "preview": "name: Assign v3 project and milestone\n\non:\n  issues:\n    types:\n      - labeled\n  pull_request_target:\n    types:\n      "
  },
  {
    "path": ".github/workflows/vulncheck.yml",
    "chars": 746,
    "preview": "name: Run govulncheck\n\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - main\n    paths-ignore:\n      - \"**/*.md\"\n "
  },
  {
    "path": ".gitignore",
    "chars": 431,
    "preview": "# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\n\n# Test binary, built with `go test -c`\n*.test\n*.tmp"
  },
  {
    "path": ".golangci.yml",
    "chars": 6310,
    "preview": "version: \"2\"\nrun:\n  modules-download-mode: readonly\n  allow-serial-runners: true\nlinters:\n  enable:\n    - asasalint\n    "
  },
  {
    "path": ".markdownlint.yml",
    "chars": 10023,
    "preview": "# Example markdownlint configuration with all properties set to their default value\n\n# Default state for all rules\ndefau"
  },
  {
    "path": "AGENTS.md",
    "chars": 3684,
    "preview": "# AGENTS.md\n\n## Agent Instructions\n\n> **Note for the AI agent:** Before running the startup script, verify that all depe"
  },
  {
    "path": "LICENSE",
    "chars": 1108,
    "preview": "MIT License\r\n\r\nCopyright (c) 2019-present Fenny and Contributors\r\n\r\nPermission is hereby granted, free of charge, to any"
  },
  {
    "path": "Makefile",
    "chars": 2521,
    "preview": "GOVERSION ?= $(shell go env GOVERSION)\n\n## help: 💡 Display available commands\n.PHONY: help\nhelp:\n\t@echo '⚡️ GoFiber/Fibe"
  },
  {
    "path": "adapter.go",
    "chars": 7090,
    "preview": "package fiber\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"reflect\"\n\n\t\"github.com/valyala/fasthttp\"\n\t\"github.com/valyala/fasthttp/fast"
  },
  {
    "path": "adapter_test.go",
    "chars": 23185,
    "preview": "package fiber\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"os\"\n\t\"reflect\"\n\t\"testing\"\n\t\"time\"\n\n\t\"g"
  },
  {
    "path": "addon/retry/README.md",
    "chars": 3117,
    "preview": "# Retry Addon\n\nRetry addon for [Fiber](https://github.com/gofiber/fiber) designed to apply retry mechanism for unsuccess"
  },
  {
    "path": "addon/retry/config.go",
    "chars": 1690,
    "preview": "package retry\n\nimport (\n\t\"time\"\n)\n\n// Config defines the config for addon.\ntype Config struct {\n\t// InitialInterval defi"
  },
  {
    "path": "addon/retry/config_test.go",
    "chars": 1771,
    "preview": "package retry\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestConfigDefault_NoConfig(t "
  },
  {
    "path": "addon/retry/exponential_backoff.go",
    "chars": 2136,
    "preview": "package retry\n\nimport (\n\t\"crypto/rand\"\n\t\"math/big\"\n\t\"time\"\n)\n\n// ExponentialBackoff is a retry mechanism for retrying so"
  },
  {
    "path": "addon/retry/exponential_backoff_test.go",
    "chars": 4142,
    "preview": "package retry\n\nimport (\n\t\"crypto/rand\"\n\t\"errors\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test"
  },
  {
    "path": "app.go",
    "chars": 46058,
    "preview": "// ⚡️ Fiber is an Express inspired web framework written in Go with ☕️\n// 🤖 GitHub Repository: https://github.com/gofibe"
  },
  {
    "path": "app_integration_test.go",
    "chars": 23479,
    "preview": "package fiber_test\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\""
  },
  {
    "path": "app_test.go",
    "chars": 83741,
    "preview": "// ⚡️ Fiber is an Express inspired web framework written in Go with ☕️\n// 🤖 GitHub Repository: https://github.com/gofibe"
  },
  {
    "path": "bind.go",
    "chars": 15154,
    "preview": "package fiber\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"slices\"\n\t\"sync\"\n\n\t\"github.com/gofiber/fiber/v3/bi"
  },
  {
    "path": "bind_test.go",
    "chars": 78107,
    "preview": "//nolint:wrapcheck,tagliatelle // We must not wrap errors in tests\npackage fiber\n\nimport (\n\t\"bytes\"\n\t\"compress/gzip\"\n\t\"e"
  },
  {
    "path": "binder/README.md",
    "chars": 5906,
    "preview": "# Fiber Binders\n\n**Binder** is a new request/response binding feature for Fiber introduced in Fiber v3. It replaces the "
  },
  {
    "path": "binder/binder.go",
    "chars": 1852,
    "preview": "package binder\n\nimport (\n\t\"errors\"\n\t\"sync\"\n)\n\n// Binder errors\nvar (\n\tErrSuitableContentNotFound = errors.New(\"binder: s"
  },
  {
    "path": "binder/binder_test.go",
    "chars": 4687,
    "preview": "package binder\n\nimport (\n\t\"mime/multipart\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n\t\"gi"
  },
  {
    "path": "binder/cbor.go",
    "chars": 1108,
    "preview": "package binder\n\nimport (\n\t\"github.com/gofiber/utils/v2\"\n)\n\n// CBORBinding is the CBOR binder for CBOR request body.\ntype"
  },
  {
    "path": "binder/cbor_test.go",
    "chars": 2766,
    "preview": "package binder\n\nimport (\n\t\"testing\"\n\n\t\"github.com/fxamacker/cbor/v2\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test"
  },
  {
    "path": "binder/cookie.go",
    "chars": 828,
    "preview": "package binder\n\nimport (\n\t\"github.com/gofiber/utils/v2\"\n\t\"github.com/valyala/fasthttp\"\n)\n\n// CookieBinding is the cookie"
  },
  {
    "path": "binder/cookie_test.go",
    "chars": 2054,
    "preview": "package binder\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n\t\"github.com/valyala/fasthttp\"\n)\n\nfunc Test_"
  },
  {
    "path": "binder/form.go",
    "chars": 2687,
    "preview": "package binder\n\nimport (\n\t\"mime/multipart\"\n\t\"sync\"\n\n\t\"github.com/gofiber/utils/v2\"\n\t\"github.com/valyala/fasthttp\"\n)\n\ncon"
  },
  {
    "path": "binder/form_test.go",
    "chars": 9975,
    "preview": "package binder\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"mime/multipart\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n\t\"github.co"
  },
  {
    "path": "binder/header.go",
    "chars": 849,
    "preview": "package binder\n\nimport (\n\t\"github.com/gofiber/utils/v2\"\n\t\"github.com/valyala/fasthttp\"\n)\n\n// HeaderBinding is the binder"
  },
  {
    "path": "binder/header_test.go",
    "chars": 2171,
    "preview": "package binder\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n\t\"github.com/valyala/fasthttp\"\n)\n\nfunc Test_"
  },
  {
    "path": "binder/json.go",
    "chars": 518,
    "preview": "package binder\n\nimport (\n\t\"github.com/gofiber/utils/v2\"\n)\n\n// JSONBinding is the JSON binder for JSON request body.\ntype"
  },
  {
    "path": "binder/json_test.go",
    "chars": 1508,
    "preview": "package binder\n\nimport (\n\t\"encoding/json\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_JSON_Binding_B"
  },
  {
    "path": "binder/mapping.go",
    "chars": 9542,
    "preview": "package binder\n\nimport (\n\t\"fmt\"\n\t\"maps\"\n\t\"mime/multipart\"\n\t\"reflect\"\n\t\"strings\"\n\t\"sync\"\n\n\tutilsstrings \"github.com/gofib"
  },
  {
    "path": "binder/mapping_test.go",
    "chars": 14766,
    "preview": "package binder\n\nimport (\n\t\"fmt\"\n\t\"mime/multipart\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"sync\"\n\t\"testing\"\n\n\t\"github.com/gofiber/schema\""
  },
  {
    "path": "binder/msgpack.go",
    "chars": 1182,
    "preview": "package binder\n\nimport (\n\t\"github.com/gofiber/utils/v2\"\n)\n\n// MsgPackBinding is the MsgPack binder for MsgPack request b"
  },
  {
    "path": "binder/msgpack_test.go",
    "chars": 3053,
    "preview": "package binder\n\nimport (\n\t\"testing\"\n\n\t\"github.com/shamaton/msgpack/v3\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Te"
  },
  {
    "path": "binder/query.go",
    "chars": 829,
    "preview": "package binder\n\nimport (\n\t\"github.com/gofiber/utils/v2\"\n\t\"github.com/valyala/fasthttp\"\n)\n\n// QueryBinding is the query b"
  },
  {
    "path": "binder/query_test.go",
    "chars": 2676,
    "preview": "package binder\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n\t\"github.com/valyala/fasthttp\"\n)\n\nfunc Test_"
  },
  {
    "path": "binder/resp_header.go",
    "chars": 856,
    "preview": "package binder\n\nimport (\n\t\"github.com/gofiber/utils/v2\"\n\t\"github.com/valyala/fasthttp\"\n)\n\n// RespHeaderBinding is the re"
  },
  {
    "path": "binder/resp_header_test.go",
    "chars": 1917,
    "preview": "package binder\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n\t\"github.com/valyala/fasthttp\"\n)\n\nfunc Test_"
  },
  {
    "path": "binder/uri.go",
    "chars": 658,
    "preview": "package binder\n\n// URIBinding is the binder implementation for populating values from route parameters.\ntype URIBinding "
  },
  {
    "path": "binder/uri_test.go",
    "chars": 1519,
    "preview": "package binder\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_URIBinding_Bind(t *testing.T) {"
  },
  {
    "path": "binder/xml.go",
    "chars": 601,
    "preview": "package binder\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/gofiber/utils/v2\"\n)\n\n// XMLBinding is the XML binder for XML request body."
  },
  {
    "path": "binder/xml_test.go",
    "chars": 2392,
    "preview": "package binder\n\nimport (\n\t\"encoding/xml\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_XMLBinding_Bind"
  },
  {
    "path": "client/README.md",
    "chars": 1668,
    "preview": "<h1 align=\"center\">Fiber Client</h1>\n<p align=\"center\">Easy-to-use HTTP client based on fasthttp (inspired by <a href=\"h"
  },
  {
    "path": "client/client.go",
    "chars": 24018,
    "preview": "// Package client exposes Fiber's HTTP client built on top of fasthttp.\n//\n// It allows constructing new clients or wrap"
  },
  {
    "path": "client/client_test.go",
    "chars": 55186,
    "preview": "package client\n\nimport (\n\t\"context\"\n\t\"crypto/tls\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"io\"\n\t\"net\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflec"
  },
  {
    "path": "client/cookiejar.go",
    "chars": 9066,
    "preview": "// The code was originally taken from https://github.com/valyala/fasthttp/pull/526.\npackage client\n\nimport (\n\t\"bytes\"\n\t\""
  },
  {
    "path": "client/cookiejar_test.go",
    "chars": 7117,
    "preview": "package client\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/require\"\n\t\"github.com/valyala/fastht"
  },
  {
    "path": "client/core.go",
    "chars": 8382,
    "preview": "// Core pipeline scaffolds request execution for Fiber's HTTP client, including\n// hook invocation, retry orchestration,"
  },
  {
    "path": "client/core_test.go",
    "chars": 13568,
    "preview": "package client\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/tls\"\n\t\"errors\"\n\t\"net\"\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/str"
  },
  {
    "path": "client/errors.go",
    "chars": 537,
    "preview": "package client\n\nimport (\n\t\"errors\"\n)\n\nvar (\n\terrResponseChanTypeAssertion = errors.New(\"failed to type-assert to *Respon"
  },
  {
    "path": "client/helper_test.go",
    "chars": 3374,
    "preview": "package client\n\nimport (\n\t\"net\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/fxamacker/cbor/v2\"\n\t\"github.com/gofiber/fiber/v3\"\n\t\"git"
  },
  {
    "path": "client/hooks.go",
    "chars": 9280,
    "preview": "package client\n\nimport (\n\t\"crypto/rand\"\n\t\"fmt\"\n\t\"io\"\n\t\"mime/multipart\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"str"
  },
  {
    "path": "client/hooks_test.go",
    "chars": 20839,
    "preview": "package client\n\nimport (\n\t\"bytes\"\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/url\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n"
  },
  {
    "path": "client/request.go",
    "chars": 28372,
    "preview": "package client\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"io\"\n\t\"iter\"\n\t\"maps\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"slices\"\n\t\"sor"
  },
  {
    "path": "client/request_bench_test.go",
    "chars": 1529,
    "preview": "package client\n\nimport (\n\t\"runtime\"\n\t\"runtime/metrics\"\n\t\"strconv\"\n\t\"testing\"\n)\n\n// BenchmarkRequestHeapScan measures how"
  },
  {
    "path": "client/request_test.go",
    "chars": 41243,
    "preview": "package client\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"io\"\n\t\"maps\"\n\t\"mime/multipart\"\n\t\"net\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"r"
  },
  {
    "path": "client/response.go",
    "chars": 6588,
    "preview": "package client\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/fs\"\n\t\"iter\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\n\t\"github.com/g"
  },
  {
    "path": "client/response_test.go",
    "chars": 21557,
    "preview": "package client\n\nimport (\n\t\"bytes\"\n\t\"crypto/tls\"\n\t\"encoding/xml\"\n\t\"errors\"\n\t\"io\"\n\t\"net\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\""
  },
  {
    "path": "client/transport.go",
    "chars": 11572,
    "preview": "// Transport adapters unify fasthttp clients behind a shared interface so the\n// Fiber client can coordinate behavior li"
  },
  {
    "path": "client/transport_test.go",
    "chars": 16937,
    "preview": "package client\n\nimport (\n\t\"crypto/tls\"\n\t\"errors\"\n\t\"net\"\n\t\"sync/atomic\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify"
  },
  {
    "path": "color.go",
    "chars": 1947,
    "preview": "// ⚡️ Fiber is an Express inspired web framework written in Go with ☕️\n// 🤖 GitHub Repository: https://github.com/gofibe"
  },
  {
    "path": "constants.go",
    "chars": 18217,
    "preview": "package fiber\n\n// HTTP methods were copied from net/http.\nconst (\n\tMethodGet     = \"GET\"     // RFC 7231, 4.3.1\n\tMethodH"
  },
  {
    "path": "ctx.go",
    "chars": 25802,
    "preview": "// ⚡️ Fiber is an Express inspired web framework written in Go with ☕️\n// 🤖 GitHub Repository: https://github.com/gofibe"
  },
  {
    "path": "ctx_interface.go",
    "chars": 2638,
    "preview": "// ⚡️ Fiber is an Express inspired web framework written in Go with ☕️\n// 🤖 GitHub Repository: https://github.com/gofibe"
  },
  {
    "path": "ctx_interface_gen.go",
    "chars": 26796,
    "preview": "// Code generated by ifacemaker; DO NOT EDIT.\n\npackage fiber\n\nimport (\n\t\"bufio\"\n\t\"context\"\n\t\"crypto/tls\"\n\t\"io\"\n\t\"mime/mu"
  },
  {
    "path": "ctx_test.go",
    "chars": 257173,
    "preview": "// ⚡️ Fiber is an Express inspired web framework written in Go with ☕️\n// 🤖 GitHub Repository: https://github.com/gofibe"
  },
  {
    "path": "docs/addon/_category_.json",
    "chars": 208,
    "preview": "{\n  \"label\": \"\\uD83D\\uDD0C Addon\",\n  \"position\": 5,\n  \"collapsed\": true,\n  \"link\": {\n    \"type\": \"generated-index\",\n    "
  },
  {
    "path": "docs/addon/retry.md",
    "chars": 2966,
    "preview": "---\nid: retry\n---\n\n# Retry Addon\n\nThe Retry addon for [Fiber](https://github.com/gofiber/fiber) retries failed network o"
  },
  {
    "path": "docs/api/_category_.json",
    "chars": 155,
    "preview": "{\n  \"label\": \"\\uD83D\\uDEE0\\uFE0F API\",\n  \"position\": 3,\n  \"link\": {\n    \"type\": \"generated-index\",\n    \"description\": \"A"
  },
  {
    "path": "docs/api/app.md",
    "chars": 19022,
    "preview": "---\nid: app\ntitle: 🚀 App\ndescription: The `App` type represents your Fiber application.\nsidebar_position: 2\n---\n\nimport "
  },
  {
    "path": "docs/api/bind.md",
    "chars": 26930,
    "preview": "---\nid: bind\ntitle: 📎 Bind\ndescription: Binds the request and response items to a struct.\nsidebar_position: 4\ntoc_max_he"
  },
  {
    "path": "docs/api/constants.md",
    "chars": 18141,
    "preview": "---\nid: constants\ntitle: 📋 Constants\ndescription: Core HTTP constants used throughout Fiber.\nsidebar_position: 10\n---\n\n#"
  },
  {
    "path": "docs/api/ctx.md",
    "chars": 84264,
    "preview": "---\nid: ctx\ntitle: 🧠 Ctx\ndescription: >-\n  The Ctx interface represents the Context which holds the HTTP request and\n  r"
  },
  {
    "path": "docs/api/fiber.md",
    "chars": 64624,
    "preview": "---\nid: fiber\ntitle: 📦 Fiber\ndescription: Fiber represents the fiber package where you start to create an instance.\nside"
  },
  {
    "path": "docs/api/hooks.md",
    "chars": 8473,
    "preview": "---\nid: hooks\ntitle: 🎣 Hooks\nsidebar_position: 7\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabIte"
  },
  {
    "path": "docs/api/log.md",
    "chars": 5001,
    "preview": "---\nid: log\ntitle: 📃 Log\ndescription: Fiber's built-in log package\nsidebar_position: 6\n---\n\nLogs help you observe progra"
  },
  {
    "path": "docs/api/redirect.md",
    "chars": 5774,
    "preview": "---\nid: redirect\ntitle: 🔄 Redirect\ndescription: Fiber's built-in redirect package\nsidebar_position: 5\ntoc_max_heading_le"
  },
  {
    "path": "docs/api/services.md",
    "chars": 9777,
    "preview": "---\nid: services\ntitle: 🧩 Services\nsidebar_position: 9\n---\n\nServices wrap external dependencies. Register them in the ap"
  },
  {
    "path": "docs/api/state.md",
    "chars": 14542,
    "preview": "---\nid: state\ntitle: 🗂️ State Management\nsidebar_position: 8\n---\n\nState management provides a global key–value store for"
  },
  {
    "path": "docs/client/_category_.json",
    "chars": 146,
    "preview": "{\n  \"label\": \"\\uD83C\\uDF0E Client\",\n  \"position\": 6,\n  \"link\": {\n    \"type\": \"generated-index\",\n    \"description\": \"HTTP"
  },
  {
    "path": "docs/client/examples.md",
    "chars": 5870,
    "preview": "---\nid: examples\ntitle: 🍳 Examples\ndescription: >-\n  Client usage examples.\nsidebar_position: 5\n---\n\nimport Tabs from '@"
  },
  {
    "path": "docs/client/hooks.md",
    "chars": 7006,
    "preview": "---\nid: hooks\ntitle: 🎣 Hooks\ndescription: >-\n  Hooks are used to manipulate the request/response process of the Fiber cl"
  },
  {
    "path": "docs/client/request.md",
    "chars": 28779,
    "preview": "---\nid: request\ntitle: 📤 Request\ndescription: >-\n  Request methods of Gofiber HTTP client.\nsidebar_position: 2\n---\n\nThe "
  },
  {
    "path": "docs/client/response.md",
    "chars": 7957,
    "preview": "---\nid: response\ntitle: 📥 Response\ndescription: >-\n  Response methods of Gofiber HTTP client.\nsidebar_position: 3\n---\n\nT"
  },
  {
    "path": "docs/client/rest.md",
    "chars": 17630,
    "preview": "---\nid: rest\ntitle: 🖥️ REST\ndescription: >-\n  HTTP client for Fiber.\nsidebar_position: 1\ntoc_max_heading_level: 5\n---\n\nT"
  },
  {
    "path": "docs/extra/_category_.json",
    "chars": 148,
    "preview": "{\n  \"label\": \"\\uD83E\\uDDE9 Extra\",\n  \"position\": 8,\n  \"link\": {\n    \"type\": \"generated-index\",\n    \"description\": \"Extra"
  },
  {
    "path": "docs/extra/benchmarks.md",
    "chars": 2775,
    "preview": "---\nid: benchmarks\ntitle: 📊 Benchmarks\ndescription: >-\n  These benchmarks aim to compare the performance of Fiber and ot"
  },
  {
    "path": "docs/extra/faq.md",
    "chars": 6709,
    "preview": "---\nid: faq\ntitle: 🤔 FAQ\ndescription: >-\n  Frequently asked questions. Open an issue if you have another question to add"
  },
  {
    "path": "docs/extra/internal.md",
    "chars": 18306,
    "preview": "---\ntitle: 🏗️ Internal Architecture\ndescription: >-\n  Learn about the internal architecture of Fiber, including the over"
  },
  {
    "path": "docs/extra/learning-resources.md",
    "chars": 1718,
    "preview": "---\nid: learning-resources\ntitle: 📚 Learning Resources\ndescription: >-\n  Interactive learning platforms and community re"
  },
  {
    "path": "docs/guide/_category_.json",
    "chars": 140,
    "preview": "{\n  \"label\": \"\\uD83D\\uDCD6 Guide\",\n  \"position\": 7,\n  \"link\": {\n    \"type\": \"generated-index\",\n    \"description\": \"Guide"
  },
  {
    "path": "docs/guide/advance-format.md",
    "chars": 3224,
    "preview": "---\nid: advance-format\ntitle: 🐛 Advanced Format\ndescription: >-\n  Learn how to use MessagePack (MsgPack) and CBOR for ef"
  },
  {
    "path": "docs/guide/context.md",
    "chars": 8610,
    "preview": "---\nid: go-context\ntitle: \"\\U0001F9E0 Go Context\"\ndescription: >-\n  Learn how Fiber's Ctx integrates with Go's context.C"
  },
  {
    "path": "docs/guide/error-handling.md",
    "chars": 3690,
    "preview": "---\nid: error-handling\ntitle: 🐛 Error Handling\ndescription: >-\n  Fiber supports centralized error handling: handlers ret"
  },
  {
    "path": "docs/guide/extractors.md",
    "chars": 15149,
    "preview": "---\nid: extractors\ntitle: 🔬 Extractors\ndescription: Learn how to use extractors in Fiber middleware\nsidebar_position: 8."
  },
  {
    "path": "docs/guide/faster-fiber.md",
    "chars": 1030,
    "preview": "---\nid: faster-fiber\ntitle: ⚡ Make Fiber Faster\nsidebar_position: 7\n---\n\n## Custom JSON Encoder/Decoder\n\nFiber defaults "
  },
  {
    "path": "docs/guide/grouping.md",
    "chars": 2193,
    "preview": "---\nid: grouping\ntitle: 🎭 Grouping\nsidebar_position: 2\n---\n\n:::info\nGrouping works like Express.js. Groups are virtual; "
  },
  {
    "path": "docs/guide/reverse-proxy.md",
    "chars": 6952,
    "preview": "---\nid: reverse-proxy\ntitle: 🔄 Reverse Proxy Configuration\ndescription: >-\n  Learn how to set up reverse proxies like Ng"
  },
  {
    "path": "docs/guide/routing.md",
    "chars": 13947,
    "preview": "---\nid: routing\ntitle: 🔌 Routing\ndescription: >-\n  Routing refers to how an application's endpoints (URIs) respond to cl"
  },
  {
    "path": "docs/guide/templates.md",
    "chars": 5939,
    "preview": "---\nid: templates\ntitle: 📝 Templates\ndescription: Fiber supports server-side template engines.\nsidebar_position: 3\n---\n\n"
  },
  {
    "path": "docs/guide/utils.md",
    "chars": 4033,
    "preview": "---\nid: utils\ntitle: 🧰 Utils\nsidebar_position: 8\ntoc_max_heading_level: 4\n---\n\n## Generics\n\n### Convert\n\nConverts a stri"
  },
  {
    "path": "docs/guide/validation.md",
    "chars": 3376,
    "preview": "---\nid: validation\ntitle: 🔎 Validation\nsidebar_position: 5\n---\n\n## Validator package\n\nFiber's [Bind](../api/bind.md#vali"
  },
  {
    "path": "docs/intro.md",
    "chars": 5640,
    "preview": "---\nslug: /\nid: welcome\ntitle: 👋 Welcome\nsidebar_position: 1\n---\nWelcome to Fiber's online API documentation, complete w"
  },
  {
    "path": "docs/middleware/_category_.json",
    "chars": 331,
    "preview": "{\n  \"label\": \"\\uD83E\\uDDEC Middleware\",\n  \"position\": 4,\n  \"collapsed\": true,\n  \"link\": {\n    \"type\": \"generated-index\","
  },
  {
    "path": "docs/middleware/adaptor.md",
    "chars": 11821,
    "preview": "---\nid: adaptor\n---\n\n# Adaptor\n\nThe `adaptor` package converts between Fiber and `net/http`, letting you reuse handlers,"
  },
  {
    "path": "docs/middleware/basicauth.md",
    "chars": 5794,
    "preview": "---\nid: basicauth\n---\n\n# BasicAuth\n\nBasic Authentication middleware for [Fiber](https://github.com/gofiber/fiber) that p"
  },
  {
    "path": "docs/middleware/cache.md",
    "chars": 8720,
    "preview": "---\nid: cache\n---\n\n# Cache\n\nCache middleware for [Fiber](https://github.com/gofiber/fiber) that intercepts responses and"
  },
  {
    "path": "docs/middleware/compress.md",
    "chars": 2856,
    "preview": "---\nid: compress\n---\n\n# Compress\n\nCompression middleware for [Fiber](https://github.com/gofiber/fiber) that automaticall"
  },
  {
    "path": "docs/middleware/cors.md",
    "chars": 25417,
    "preview": "---\nid: cors\n---\n\n# CORS\n\nCORS (Cross-Origin Resource Sharing) middleware for [Fiber](https://github.com/gofiber/fiber) "
  },
  {
    "path": "docs/middleware/csrf.md",
    "chars": 20563,
    "preview": "---\nid: csrf\n---\n\n# CSRF\n\nThe CSRF middleware protects against [Cross-Site Request Forgery](https://en.wikipedia.org/wik"
  },
  {
    "path": "docs/middleware/earlydata.md",
    "chars": 2959,
    "preview": "---\nid: earlydata\n---\n\n# EarlyData\n\nThe Early Data middleware adds TLS 1.3 \"0-RTT\" support to [Fiber](https://github.com"
  },
  {
    "path": "docs/middleware/encryptcookie.md",
    "chars": 5118,
    "preview": "---\nid: encryptcookie\n---\n\n# Encrypt Cookie\n\nThe Encrypt Cookie middleware for [Fiber](https://github.com/gofiber/fiber)"
  },
  {
    "path": "docs/middleware/envvar.md",
    "chars": 1410,
    "preview": "---\nid: envvar\n---\n\n# EnvVar\n\nEnvVar middleware for [Fiber](https://github.com/gofiber/fiber) exposes environment variab"
  },
  {
    "path": "docs/middleware/etag.md",
    "chars": 1736,
    "preview": "---\nid: etag\n---\n\n# ETag\n\nETag middleware for [Fiber](https://github.com/gofiber/fiber) that helps caches validate respo"
  },
  {
    "path": "docs/middleware/expvar.md",
    "chars": 1484,
    "preview": "---\nid: expvar\n---\n\n# ExpVar\n\nThe ExpVar middleware exposes runtime variables over HTTP in JSON. Using it (e.g., `app.Us"
  },
  {
    "path": "docs/middleware/favicon.md",
    "chars": 2662,
    "preview": "---\nid: favicon\n---\n\n# Favicon\n\nFavicon middleware for [Fiber](https://github.com/gofiber/fiber) that drops repeated `/f"
  },
  {
    "path": "docs/middleware/healthcheck.md",
    "chars": 2825,
    "preview": "---\nid: healthcheck\n---\n\n# Health Check\n\nMiddleware that adds liveness, readiness, and startup probes to [Fiber](https:/"
  },
  {
    "path": "docs/middleware/helmet.md",
    "chars": 3730,
    "preview": "---\nid: helmet\n---\n\n# Helmet\n\nHelmet secures your app by adding common security headers.\n\n## Signatures\n\n```go\nfunc New("
  },
  {
    "path": "docs/middleware/idempotency.md",
    "chars": 5055,
    "preview": "---\nid: idempotency\n---\n\n# Idempotency\n\nThe Idempotency middleware helps build fault-tolerant APIs. Duplicate requests—s"
  },
  {
    "path": "docs/middleware/keyauth.md",
    "chars": 9900,
    "preview": "---\nid: keyauth\n---\n\n# KeyAuth\n\nThe KeyAuth middleware implements API key authentication.\n\n## Signatures\n\n```go\nfunc New"
  },
  {
    "path": "docs/middleware/limiter.md",
    "chars": 7248,
    "preview": "---\nid: limiter\n---\n\n# Limiter\n\nThe Limiter middleware for [Fiber](https://github.com/gofiber/fiber) throttles repeated "
  },
  {
    "path": "docs/middleware/logger.md",
    "chars": 11577,
    "preview": "---\nid: logger\n---\n\n# Logger\n\nLogger middleware for [Fiber](https://github.com/gofiber/fiber) that logs HTTP requests an"
  },
  {
    "path": "docs/middleware/paginate.md",
    "chars": 7036,
    "preview": "---\nid: paginate\n---\n\n# Paginate\n\nPagination middleware for [Fiber](https://github.com/gofiber/fiber) that extracts pagi"
  },
  {
    "path": "docs/middleware/pprof.md",
    "chars": 1674,
    "preview": "---\nid: pprof\n---\n\n# Pprof\n\nPprof middleware exposes runtime profiling data for analysis with the Go `pprof` tool. Impor"
  },
  {
    "path": "docs/middleware/proxy.md",
    "chars": 9085,
    "preview": "---\nid: proxy\n---\n\n# Proxy\n\nThe Proxy middleware forwards requests to one or more upstream servers.\n\n## Signatures\n\n```g"
  },
  {
    "path": "docs/middleware/recover.md",
    "chars": 2434,
    "preview": "---\nid: recover\n---\n\n# Recover\n\nThe Recover middleware for [Fiber](https://github.com/gofiber/fiber) intercepts panics a"
  },
  {
    "path": "docs/middleware/redirect.md",
    "chars": 1513,
    "preview": "---\nid: redirect\n---\n\n# Redirect\n\nRedirect middleware maps old URLs to new ones using simple rules.\n\n## Signatures\n\n```g"
  },
  {
    "path": "docs/middleware/requestid.md",
    "chars": 2305,
    "preview": "---\nid: requestid\n---\n\n# RequestID\n\nThe RequestID middleware generates or propagates a request identifier, adding it to "
  },
  {
    "path": "docs/middleware/responsetime.md",
    "chars": 1090,
    "preview": "---\nid: responsetime\n---\n\n# ResponseTime\n\nResponse time middleware for [Fiber](https://github.com/gofiber/fiber) that me"
  },
  {
    "path": "docs/middleware/rewrite.md",
    "chars": 1433,
    "preview": "---\nid: rewrite\n---\n\n# Rewrite\n\nThe Rewrite middleware remaps the request path using custom rules, helping with backward"
  },
  {
    "path": "docs/middleware/session.md",
    "chars": 24443,
    "preview": "---\nid: session\n---\n\n# Session\n\nThe Session middleware adds session management to Fiber apps through the [Storage](https"
  },
  {
    "path": "docs/middleware/skip.md",
    "chars": 1181,
    "preview": "---\nid: skip\n---\n\n# Skip\n\nThe Skip middleware wraps a handler and bypasses it when the predicate returns `true` for the "
  },
  {
    "path": "docs/middleware/static.md",
    "chars": 5865,
    "preview": "---\nid: static\n---\n\n# Static\n\nThe Static middleware serves assets such as **images**, **CSS**, and **JavaScript**.\n\n:::i"
  },
  {
    "path": "docs/middleware/timeout.md",
    "chars": 5258,
    "preview": "---\nid: timeout\n---\n\n# Timeout\n\nThe timeout middleware enforces a deadline on handler execution. It wraps handlers with\n"
  },
  {
    "path": "docs/partials/routing/handler.md",
    "chars": 6520,
    "preview": "---\nid: route-handlers\ntitle: Route Handlers\n---\n\nimport Reference from '@site/src/components/reference';\n\nRegisters a r"
  },
  {
    "path": "docs/whats_new.md",
    "chars": 113655,
    "preview": "---\nid: whats_new\ntitle: 🆕 What's New in v3\nsidebar_position: 2\ntoc_max_heading_level: 4\n---\n\n## 🎉 Welcome\n\nWe are excit"
  },
  {
    "path": "error.go",
    "chars": 3423,
    "preview": "package fiber\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\n\t\"github.com/gofiber/schema\"\n)\n\n// Wrap and return this for unreacha"
  },
  {
    "path": "error_test.go",
    "chars": 1634,
    "preview": "package fiber\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"testing\"\n\n\t\"github.com/gofiber/schema\"\n\t\"github.com/stretchr/testif"
  },
  {
    "path": "errors_internal.go",
    "chars": 342,
    "preview": "package fiber\n\nimport (\n\t\"errors\"\n)\n\nvar (\n\terrBindPoolTypeAssertion  = errors.New(\"failed to type-assert to *Bind\")\n\ter"
  },
  {
    "path": "extractors/README.md",
    "chars": 3785,
    "preview": "# Extractors Package\n\nPackage providing shared value extraction utilities for Fiber middleware packages.\n\n## Audience\n\n*"
  },
  {
    "path": "extractors/extractors.go",
    "chars": 17140,
    "preview": "package extractors\n\n// Package extractors provides shared value extraction utilities for Fiber middleware.\n// This packa"
  },
  {
    "path": "extractors/extractors_test.go",
    "chars": 29106,
    "preview": "package extractors\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/gofiber/fiber/v3\"\n\t\"github.com/s"
  }
]

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

About this extraction

This page contains the full source code of the gofiber/fiber GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 382 files (3.6 MB), approximately 947.5k tokens, and a symbol index with 4208 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!