* 🚀 Feature: Add idempotency middleware (#2253)
* middleware: add idempotency middleware
* middleware/idempotency: use fiber.Storage instead of custom storage
* middleware/idempotency: only allocate data if really required
* middleware/idempotency: marshal response using msgp
* middleware/idempotency: add msgp tests
* middleware/idempotency: do not export response
* middleware/idempotency: disable msgp's -io option to disable generating unused methods
* middleware/idempotency: switch to time.Duration based app.Test
* middleware/idempotency: only create closure once
* middleware/idempotency: add benchmarks
* middleware/idempotency: optimize strings.ToLower when making comparison
The real "strings.ToLower" still needs to be used when storing the data.
* middleware/idempotency: safe-copy body
* middleware/idempotency: backport to v2
* middleware: add idempotency middleware
* middleware/idempotency: use fiber.Storage instead of custom storage
* middleware/idempotency: only allocate data if really required
* middleware/idempotency: marshal response using msgp
* middleware/idempotency: add msgp tests
* middleware/idempotency: do not export response
* middleware/idempotency: disable msgp's -io option to disable generating unused methods
* middleware/idempotency: switch to time.Duration based app.Test
* middleware/idempotency: only create closure once
* middleware/idempotency: add benchmarks
* middleware/idempotency: optimize strings.ToLower when making comparison
The real "strings.ToLower" still needs to be used when storing the data.
* middleware/idempotency: safe-copy body
app: make app.Test accept a time.Duration timeout
Cases found by running semgrep with an empty .semgrepignore file
semgrep --lang=go -e '$O.Test($X, $Y)'
* app: do not use empty *net.IPNet in case of an error of "net.ParseCIDR"
* app: expose error returned by "net.ParseCIDR"
* ctx: do not repeatedly call method in loop
* ctx: add test for "IsProxyTrusted" func
* - logger: fix custom tag
- use real bytebufferpool dependency instead of the internal
* - logger: fix custom tag
- use real bytebufferpool dependency instead of the internal
* - logger: fix custom tag
- use real bytebufferpool dependency instead of the internal
* - logger: fix custom tag
- use real bytebufferpool dependency instead of the internal
* WIP: Use Parent Error Handler on Mount
* Add suggested boolean guard
* Move flag to App
* Move to copy of config as configured
* Apply the same trick to customMethod
* ctx: simplify Protocol()
* ctx: also mention "X-Url-Scheme" header in Protocol()
* ctx: use the same warning comment about enabling Config.EnableTrustedProxyCheck everywhere
* internal/memory: cache timestamp
* internal/memory: ensure to never delete non-expired items
This fixes a TOCTOU problem between a mutex rlock and a mutex lock.
* internal/memory: move costly operations outside of locked area
* internal/storage: cache timestamp
* internal/storage: ensure to never delete non-expired items
This fixes a TOCTOU problem between a mutex rlock and a mutex lock.
* internal/storage: move costly operations outside of locked area