Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
5b12525
Fix `httpparse` version to match internal
johnhurt Nov 7, 2025
376f39b
Add Custom Protocol Support to the Framework
brk0v Jun 16, 2025
9228982
Add default noop custom param to client Session
drcaramelsyrup Oct 27, 2025
0481e7e
reserve additional space if needed
duke8253 Oct 24, 2025
8c080c8
Use bstr for formatting byte strings
stepancheg Aug 16, 2025
a0b76f3
Prevent downstream error prior to header from canceling cache fill
drcaramelsyrup Oct 30, 2025
b1f0d73
Add max_h2_streams to HttpPeer hash
andrewhavck Oct 31, 2025
454c2cd
expose LRU shard information
duke8253 Oct 31, 2025
5a673ed
fix size calculation for buffer capacity
duke8253 Oct 31, 2025
097600a
Fix Rust 1.91 warnings
drcaramelsyrup Nov 3, 2025
f93fb9e
Allow Extensions in cache LockCore and user tracing
drcaramelsyrup Oct 31, 2025
f067a72
Use static str in ErrorSource or ErrorType as_str
drcaramelsyrup Oct 31, 2025
4f4fcc3
Add maybe_cache_key function
drcaramelsyrup Oct 31, 2025
56d8f7b
pingora-limits Rate: correct some comments, test/example
gdavidsson Oct 27, 2025
a2f5361
Add body-bytes tracking across H1/H2 and proxy metrics
zaidoon1 Nov 1, 2025
32bea77
Allow setting max_weight on MissFinishType::Appended
drcaramelsyrup Nov 5, 2025
4590c6f
Add peek_weight API to LRU
drcaramelsyrup Nov 6, 2025
4e343c6
bump msrv to 1.84
duke8253 Nov 7, 2025
71c9fd2
fix
duke8253 Nov 7, 2025
4d87350
fix
duke8253 Nov 7, 2025
393c01e
upgrade http crate to latest version
zaidoon1 Nov 10, 2025
ef96c36
max multipart ranges configurable in range_header_filter
drcaramelsyrup Nov 11, 2025
a88d048
Fix chunked trailer end parsing
drcaramelsyrup Jun 2, 2025
fa1d565
feat: add ConnectionFilter trait for early TCP connection filtering
Nov 11, 2025
4b8bbc6
Tweak the implementation of and documentation of `connection_filter` …
johnhurt Nov 11, 2025
c3f22fa
Lock age timeouts cause lock reacquisition
drcaramelsyrup Nov 7, 2025
a3aa6cb
Set h1.1 when proxying cacheable responses
drcaramelsyrup Nov 13, 2025
849d4f4
Add or remove accept-ranges on range header filter
drcaramelsyrup Nov 9, 2025
200cee4
update msrv in github ci, fixup .bleep
gumpt Nov 21, 2025
72e4392
Fixed Session::write_response_header_ref bypassing downstream modules
palant Sep 27, 2025
75a8775
Override request keepalive on process shutdown
drcaramelsyrup Nov 19, 2025
fb3401d
Add shutdown flag to proxy session
drcaramelsyrup Nov 21, 2025
58e139e
Add ResponseHeader in pingora_http crate's prelude
PeppyDays Mar 8, 2025
e5fa882
sec: removed atty
siennathesane Sep 9, 2025
d6060ed
Add a configurable upgrade for pingora-ketama that reduces runtime cp…
johnhurt Dec 1, 2025
da332d5
add to cache api spans
gumpt Dec 2, 2025
6ebc829
Extensible SslDigest
nojima Dec 3, 2025
00e58e8
Fix SslFiletype import in handshake_complete_callback test
drcaramelsyrup Dec 3, 2025
9857c4c
Allow arbitrary user data in ProxyDigest
gdavidsson Dec 4, 2025
4820eb9
Allow adding SslDigestExtensions on upstream
drcaramelsyrup Dec 4, 2025
231acac
feat: Virtual L4 Streams
theduke Oct 21, 2025
a7a7941
feat: add support for verify_cert and verify_hostname using rustls
tedscode Nov 16, 2025
94e9de6
increase visibility of multirange items
gumpt Dec 1, 2025
d8ba11b
Use seek_multipart on body readers
drcaramelsyrup Nov 28, 2025
c93c5c7
Log read error when reading trailers end
drcaramelsyrup Nov 14, 2025
93a87f9
docs: improve formatting in rate_limiter.md
cppcoffee Jun 24, 2025
b4010b3
docs: add doc make target and fix warnings
gumpt Dec 11, 2025
542507c
feat: make HttpProxy public
ma-ts Dec 1, 2025
5361131
Fix out of sync README
johnhurt Jan 2, 2026
c9ced0e
Formalize 1.84 msrv for pingora-cache, pingora-proxy
drcaramelsyrup Dec 24, 2025
5c4bd0b
Re-add the warning about cache-api volitility
johnhurt Jan 2, 2026
5378f7e
Default to close on downstream response before body finish
drcaramelsyrup Dec 27, 2025
ed1e51b
Bumping version to 0.7.0
gdavidsson Jan 2, 2026
e990a04
Ensure idle_timeout is polled even if idle_timeout is unset so notify…
andrewhavck Jan 1, 2026
4fea8b6
Fix doc of HttpServerOptions.h2c
stepancheg Nov 8, 2025
f986278
Add simple read test for invalid extra char in header end
drcaramelsyrup Dec 31, 2025
386160f
Allow customizing lock status on Custom NoCacheReasons
drcaramelsyrup Nov 19, 2025
7b37287
Close h1 conn by default if req header unfinished
drcaramelsyrup Jan 8, 2026
a524bd7
Resyncing bleeper
Noah-Kennedy Jan 16, 2026
de4cc62
Add configurable retries for upgrade sock connect/accept
drcaramelsyrup Jan 8, 2026
006804a
fix visibility lint
gumpt Jan 8, 2026
a985d00
deflake test by increasing write size
gumpt Jan 8, 2026
69b4db8
Fix flakes in connector mocks
drcaramelsyrup Jan 8, 2026
133b2da
Make the version restrictions on rmp and rmp-serde more strict to pre…
johnhurt Jan 9, 2026
a687897
Fix transfer fd compile error for non linux os
andrewhavck Jan 9, 2026
ef017ce
Year 2026
andrewhavck Jan 10, 2026
1e41892
Restore downstream custom reader
Jan 13, 2026
29c9f7b
Rewind preread bytes when parsing next H1 response
drcaramelsyrup Dec 24, 2025
d23b6f0
Add SSLKEYLOGFILE support to rustls connector
nbarbier-265 Nov 9, 2025
e6ef837
Add epoch and epoch_override to CacheMeta
drcaramelsyrup Jan 13, 2026
3a5fdf4
Upgrade lru to >= 0.16.3 crate version because of ~~~-0002
johnhurt Jan 14, 2026
ad449bf
feat: Add new_mtls for HttpProxy
cachpachios Jan 3, 2026
3cf5505
0.7.0 Release
johnhurt Jan 30, 2026
d6c896b
add gitlab-ci yml to bleeper ignore
gumpt Jan 16, 2026
bcf2d0b
feat: add support for client certificate verification in mTLS configu…
fabian4 Jan 15, 2026
c469430
Fix a bug with the ketama load balancing where configurations were no…
johnhurt Jan 9, 2026
900ec23
Add upstream_write_pending_time to Session for upload diagnostics
schunduri-blip Jan 21, 2026
824bdee
Upgrade body mode on 101
drcaramelsyrup Dec 29, 2025
2f59535
Prevent v1 reuse on body overread (pipeline)
drcaramelsyrup Jan 29, 2026
55d1739
Send RST_STREAM CANCEL on application read timeouts for h2 client
andrewhavck Jan 9, 2026
d3a3b1a
Pipe subrequests utility
gumpt Jan 30, 2026
2ddc980
Handle UpgradedBody in more filters
drcaramelsyrup Feb 3, 2026
9ac75d0
Ignore msrv in lockfile for audit
drcaramelsyrup Feb 10, 2026
7f7166d
transfer-encoding parsing robustness
duke8253 Jan 27, 2026
40c3c1e
Avoid close delimit mode on http/1.0 req
drcaramelsyrup Jan 31, 2026
e47e095
Upgrade body mode on subrequest
drcaramelsyrup Feb 1, 2026
fc904c0
Reject invalid content-length v1 requests
drcaramelsyrup Feb 1, 2026
7d54ffb
Add the ability limit the number of times an upstream connection can …
johnhurt Feb 9, 2026
caeb7a1
Add a builder for pingora proxy service to avoid parameter combinatio…
johnhurt Feb 10, 2026
e7d6bc7
Add is_upgrade_req() and was_upgraded() to custom server Session trait
Feb 11, 2026
87e2e2f
Reject non-chunked transfer-encoding
drcaramelsyrup Feb 11, 2026
d3d2cf5
Disable CONNECT method proxying by default
drcaramelsyrup Feb 13, 2026
2628a00
Correct the custom protocol code for shutdown
Feb 18, 2026
0d6aa22
Handle custom ALPNs in s2n impl of ALPN::to_wire_protocols() (#1)
varunravi98 Feb 17, 2026
b083273
Add a system for specifying and using service-level dependencies
johnhurt Feb 19, 2026
257b59a
remove `CacheKey::default` impl
gumpt Feb 19, 2026
1355987
Check fd match in h2 connector
drcaramelsyrup Feb 14, 2026
1e3469b
Fix upgrade handling if body not init
drcaramelsyrup Feb 19, 2026
460b7f3
Validate invalid content-length on v1 resp by default
drcaramelsyrup Feb 1, 2026
b40ba3d
fix(windows): add missing `RawStream::Virtual` match arm in `AsRawSoc…
soddygo Feb 9, 2026
c3e6cee
Add Windows support and block until main loop returns
danechitoaie Dec 4, 2025
b0a9858
fix invalid CL option on ALPN fallbacks
drcaramelsyrup Feb 20, 2026
83029bf
Recognize dcb/dcz in compression handling
schunduri-blip Jan 30, 2026
b85f724
fix: don't use all for socket
justinrubek Feb 11, 2026
0183503
don't consider "bytes=" a valid range header
gumpt Feb 26, 2026
9740e8d
strip {content, transfer}-encoding from 416s
gumpt Feb 26, 2026
0f83728
Allow server bootstrapping to take place in the context of services w…
johnhurt Feb 26, 2026
2b496bc
Bump pingora to version 0.8.0
johnhurt Feb 27, 2026
faac65b
Update changelog for 0.8.0
johnhurt Mar 2, 2026
e12274a
Merge upstream cloudflare/pingora main (0.8.0) into upstream_upgrade
pigri Mar 12, 2026
5e8f71d
Refactor code for improved readability and consistency
pigri Mar 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .bleep
Original file line number Diff line number Diff line change
@@ -1 +1 @@
ed8657309187516d2e673037821a9fbd8405d703
d2c25d726c5738e6a8028dc3e7642ecfe6c1824e
2 changes: 2 additions & 0 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[resolver]
incompatible-rust-versions = "fallback"
2 changes: 1 addition & 1 deletion .github/workflows/audit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:

- name: Generate Cargo.lock
# https://github.com/rustsec/audit-check/issues/27
run: cargo generate-lockfile
run: cargo generate-lockfile --ignore-rust-version

- name: Audit Check
# https://github.com/rustsec/audit-check/issues/2
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ jobs:
fail-fast: false
matrix:
# nightly, msrv, and latest stable
toolchain: [nightly, 1.83.0, 1.87.0]
toolchain: [nightly, 1.84.0, 1.91.1]
runs-on: ubuntu-latest
# Only run on "pull_request" event for external PRs. This is to avoid
# duplicate builds for PRs created from internal branches.
Expand Down Expand Up @@ -48,12 +48,12 @@ jobs:

- name: Run cargo clippy
run: |
[[ ${{ matrix.toolchain }} != 1.87.0 ]] || cargo clippy --all-targets --all -- --allow=unknown-lints --deny=warnings
[[ ${{ matrix.toolchain }} != 1.91.1 ]] || cargo clippy --all-targets --all -- --allow=unknown-lints --deny=warnings

- name: Run cargo audit
run: |
[[ ${{ matrix.toolchain }} != 1.87.0 ]] || (cargo install --locked cargo-audit && cargo audit)
[[ ${{ matrix.toolchain }} != 1.91.1 ]] || (cargo install --locked cargo-audit && cargo generate-lockfile --ignore-rust-version && cargo audit)

- name: Run cargo machete
run: |
[[ ${{ matrix.toolchain }} != 1.87.0 ]] || (cargo install cargo-machete --version 0.7.0 && cargo machete)
[[ ${{ matrix.toolchain }} != 1.91.1 ]] || (cargo install cargo-machete --version 0.7.0 && cargo machete)
129 changes: 122 additions & 7 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,125 @@

All notable changes to this project will be documented in this file.

## [0.8.0](https://github.com/cloudflare/pingora/compare/0.7.0...0.8.0) - 2026-03-02


**🚀 Features**

* Add support for client certificate verification in mTLS configuration.
* Add upstream\_write\_pending\_time to Session for upload diagnostics.
* Pipe subrequests utility: creates a state machine to treat subrequests as a "pipe," enabling direct sending of request body and writing of response tasks, with a handler for error propagation and support for reusing a preset or captured input body for chained subrequests.
* Add the ability to limit the number of times a downstream connection can be reused
* Add a system for specifying and using service-level dependencies
* Add a builder for pingora proxy service, e.g. to specify ServerOptions.

**🐛 Bug Fixes**

* Fix various Windows compiler issues.
* Handle custom ALPNs in s2n impl of ALPN::to\_wire\_protocols() to fix s2n compile issues.
* Fix: don't use “all” permissions for socket.
* Fix a bug with the ketama load balancing where configurations were not persisted after updates.
* Ensure http1 downstream session is not reused on more body bytes than expected.
* Send RST\_STREAM CANCEL on application read timeouts for h2 client.
* Start close-delimited body mode after 101 is received for WebSocket upgrades. `UpgradedBody` is now an explicit HttpTask.
* Avoid close delimit mode on http/1.0 req.
* Reject invalid content-length http/1 requests to eliminate ambiguous request framing.
* Validate invalid content-length on http/1 resp by default, and removes content-length from the response if transfer-encoding is present, per RFC.
* Correct the custom protocol code for shutdown: changed the numeric code passed on shutdown to 0 to indicate an explicit shutdown rather than a transport error.

**⚙️ Miscellaneous Tasks**

* Remove `CacheKey::default` impl, users of caching should implement `cache_key_callback` themselves
* Allow server bootstrapping to take place in the context of services with dependents and dependencies
* Don't consider "bytes=" a valid range header: added an early check for an empty/whitespace-only range-set after the `bytes=` prefix, returning 416 Range Not Satisfiable, consistent with RFC 9110 14.1.2.
* Strip {content, transfer}-encoding from 416s to mirror the behavior for 304 Not Modified responses.
* Disable CONNECT method proxying by default, with an option to enable via server options; unsupported requests will now be automatically rejected.

## [0.7.0](https://github.com/cloudflare/pingora/compare/0.6.0...0.7.0) - 2026-01-30

### Highlights

- Extensible SslDigest to save user-defined TLS context
- Add ConnectionFilter trait for early TCP connection filtering

### 🚀 Features

- Add ConnectionFilter trait for early TCP connection filtering
- Introduce a virtual L4 stream abstraction
- Add support for verify_cert and verify_hostname using rustls
- Exposes the HttpProxy struct to allow external crates to customize the proxy logic.
- Exposes a new_mtls method for creating a HttpProxy with a client_cert_key to enable mtls peers.
- Add SSLKEYLOGFILE support to rustls connector
- Allow spawning background subrequests from main session
- Allow Extensions in cache LockCore and user tracing
- Add body-bytes tracking across H1/H2 and proxy metrics
- Allow setting max_weight on MissFinishType::Appended
- Allow adding SslDigestExtensions on downstream and upstream
- Add Custom session support for encapsulated HTTP

### 🐛 Bug Fixes

- Use write timeout consistently for h2 body writes
- Prevent downstream error prior to header from canceling cache fill
- Fix debug log and new tests
- Fix size calculation for buffer capacity
- Fix cache admission on header only misses
- Fix duplicate zero-size chunk on cache hit
- Fix chunked trailer end parsing
- Lock age timeouts cause lock reacquisition
- Fix transfer fd compile error for non linux os

### Sec

- Removed atty
- Upgrade lru to >= 0.16.3 crate version because of RUSTSEC-2026-0002

### Everything Else

- Add tracing to log reason for not caching an asset on cache put
- Evict when asset count exceeds optional watermark
- Remove trailing comma from Display for HttpPeer
- Make ProxyHTTP::upstream_response_body_filter return an optional duration for rate limiting
- Restore daemonize STDOUT/STDERR when error log file is not specified
- Log task info when upstream header failed to send
- Check cache enablement to determine cache fill
- Update meta when revalidating before lock release
- Add ForceFresh status to cache hit filter
- Pass stale status to cache lock
- Bump max multipart ranges to 200
- Downgrade Expires header warn to debug log
- CI and effective msrv bump to 1.83
- Add default noop custom param to client Session
- Use static str in ErrorSource or ErrorType as_str
- Use bstr for formatting byte strings
- Tweak the implementation of and documentation of `connection_filter` feature
- Set h1.1 when proxying cacheable responses
- Add or remove accept-ranges on range header filter
- Update msrv in github ci, fixup .bleep
- Override request keepalive on process shutdown
- Add shutdown flag to proxy session
- Add ResponseHeader in pingora_http crate's prelude
- Add a configurable upgrade for pingora-ketama that reduces runtime cpu and memory
- Add to cache api spans
- Increase visibility of multirange items
- Use seek_multipart on body readers
- Log read error when reading trailers end
- Re-add the warning about cache-api volatility
- Default to close on downstream response before body finish
- Ensure idle_timeout is polled even if idle_timeout is unset so notify events are registered for h2 idle pool, filter out closed connections when retrieving from h2 in use pool.
- Add simple read test for invalid extra char in header end
- Allow customizing lock status on Custom NoCacheReasons
- Close h1 conn by default if req header unfinished
- Add configurable retries for upgrade sock connect/accept
- Deflake test by increasing write size
- Make the version restrictions on rmp and rmp-serde more strict to prevent forcing consumers to use 2024 edition
- Rewind preread bytes when parsing next H1 response
- Add epoch and epoch_override to CacheMeta

## [0.6.0](https://github.com/cloudflare/pingora/compare/0.5.0...0.6.0) - 2025-08-15

### Highlights
- This release bumps the minimum h2 crate dependency to guard against the [MadeYouReset]((https://blog.cloudflare.com/madeyoureset-an-http-2-vulnerability-thwarted-by-rapid-reset-mitigations/)) H2 attack
- This release bumps the minimum h2 crate dependency to guard against the [MadeYouReset]((https://blog.cloudflare.com/madeyoureset-an-http-2-vulnerability-thwarted-by-rapid-reset-mitigations/)) H2 attack


### 🚀 Features
Expand Down Expand Up @@ -63,7 +178,7 @@ All notable changes to this project will be documented in this file.


## [0.5.0](https://github.com/cloudflare/pingora/compare/0.4.0...0.5.0) - 2025-05-09

### 🚀 Features

- [Add tweak_new_upstream_tcp_connection hook to invoke logic on new upstream TCP sockets prior to connection](https://github.com/cloudflare/pingora/commit/be4a023d18c2b061f64ad5efd0868f9498199c91)
Expand All @@ -76,7 +191,7 @@ All notable changes to this project will be documented in this file.
- [Add get_stale and get_stale_while_update for memory-cache](https://github.com/cloudflare/pingora/commit/bb28044cbe9ac9251940b8a313d970c7d15aaff6)

### 🐛 Bug Fixes

- [Fix deadloop if proxy_handle_upstream exits earlier than proxy_handle_downstream](https://github.com/cloudflare/pingora/commit/bb111aaa92b3753e650957df3a68f56b0cffc65d)
- [Check on h2 stream end if error occurred for forwarding HTTP tasks](https://github.com/cloudflare/pingora/commit/e18f41bb6ddb1d6354e824df3b91d77f3255bea2)
- [Check for content-length underflow on end of stream h2 header](https://github.com/cloudflare/pingora/commit/575d1aafd7c679a50a443701a4c55dcfdbc443b2)
Expand All @@ -91,9 +206,9 @@ All notable changes to this project will be documented in this file.
- [Always drain v1 request body before session reuse](https://github.com/cloudflare/pingora/commit/fda3317ec822678564d641e7cf1c9b77ee3759ff)
- [Fixes HTTP1 client reads to properly timeout on initial read](https://github.com/cloudflare/pingora/commit/3c7db34acb0d930ae7043290a88bc56c1cd77e45)
- [Fixes issue where if TLS client never sends any bytes, hangs forever](https://github.com/cloudflare/pingora/commit/d1bf0bcac98f943fd716278d674e7d10dce2223e)

### Everything Else

- [Add builder api for pingora listeners](https://github.com/cloudflare/pingora/commit/3f564af3ae56e898478e13e71d67d095d7f5dbbd)
- [Better handling for h1 requests that contain both transfer-encoding and content-length](https://github.com/cloudflare/pingora/commit/9287b82645be4a52b0b63530ba38aa0c7ddc4b77)
- [Allow setting raw path in request to support non-UTF8 use cases](https://github.com/cloudflare/pingora/commit/e6b823c5d89860bb97713fdf14f197f799aed6af)
Expand Down Expand Up @@ -209,7 +324,7 @@ All notable changes to this project will be documented in this file.
## [0.1.1](https://github.com/cloudflare/pingora/compare/0.1.0...0.1.1) - 2024-04-05

### 🚀 Features
- `Server::new` now accepts `Into<Option<T>>`
- `Server::new` now accepts `Into<Option<T>>`
- Implemented client `HttpSession::get_keepalive_values` for Keep-Alive parsing
- Expose `ListenFds` and `Fds` to fix a voldemort types issue
- Expose config options in `ServerConf`, provide new `Server` constructor
Expand Down
6 changes: 4 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,18 @@ members = [
]

[workspace.dependencies]
bstr = "1.12.0"
tokio = "1"
tokio-stream = { version = "0.1" }
async-trait = "0.1.42"
httparse = "1"
bytes = "1.0"
derivative = "2.2.0"
http = "1.0.0"
http = "1"
log = "0.4"
h2 = ">=0.4.11"
once_cell = "1"
lru = "0.14"
lru = "0.16.3"
ahash = ">=0.8.9"

[profile.bench]
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,11 @@ Both x86_64 and aarch64 architectures will be supported.

## Rust version

Pingora keeps a rolling MSRV (minimum supported Rust version) policy of 6 months. This means we will accept PRs that upgrade the MSRV as long as the new Rust version used is at least 6 months old.
Pingora keeps a rolling MSRV (minimum supported Rust version) policy of 6 months. This means we will accept PRs that upgrade the MSRV as long as the new Rust version used is at least 6 months old. However, we generally will not bump the highest MSRV across the workspace without a sufficiently compelling reason.

Our current MSRV is effectively 1.83.
Our current MSRV is 1.84.

Previously Pingora advertised an MSRV of 1.72. Older Rust versions may still be able to compile via `cargo update` pinning dependencies such as `backtrace@0.3.74`. The advertised MSRV in config files will be officially bumped to 1.83 in an upcoming release.
Currently not all crates enforce `rust-version` as it is possible to use some crates on lower versions.

## Build Requirements

Expand Down
2 changes: 1 addition & 1 deletion clippy.toml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
msrv = "1.72"
msrv = "1.84"
15 changes: 7 additions & 8 deletions docs/user_guide/rate_limiter.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ Pingora provides a crate `pingora-limits` which provides a simple and easy to us
```rust
use async_trait::async_trait;
use once_cell::sync::Lazy;
use pingora::http::ResponseHeader;
use pingora::prelude::*;
use pingora_limits::rate::Rate;
use std::sync::Arc;
Expand Down Expand Up @@ -135,11 +134,11 @@ impl ProxyHttp for LB {
```

## Testing
To use the example above,
To use the example above,

1. Run your program with `cargo run`.
1. Run your program with `cargo run`.
2. Verify the program is working with a few executions of ` curl localhost:6188 -H "appid:1" -v`
- The first request should work and any later requests that arrive within 1s of a previous request should fail with:
- The first request should work and any later requests that arrive within 1s of a previous request should fail with:
```
* Trying 127.0.0.1:6188...
* Connected to localhost (127.0.0.1) port 6188 (#0)
Expand All @@ -148,20 +147,20 @@ To use the example above,
> User-Agent: curl/7.88.1
> Accept: */*
> appid:1
>
>
< HTTP/1.1 429 Too Many Requests
< X-Rate-Limit-Limit: 1
< X-Rate-Limit-Remaining: 0
< X-Rate-Limit-Reset: 1
< Date: Sun, 14 Jul 2024 20:29:02 GMT
< Connection: close
<
<
* Closing connection 0
```

## Complete Example
You can run the pre-made example code in the [`pingora-proxy` examples folder](https://github.com/cloudflare/pingora/tree/main/pingora-proxy/examples/rate_limiter.rs) with
You can run the pre-made example code in the [`pingora-proxy` examples folder](https://github.com/cloudflare/pingora/tree/main/pingora-proxy/examples/rate_limiter.rs) with

```
cargo run --example rate_limiter
```
```
2 changes: 1 addition & 1 deletion pingora-boringssl/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "pingora-boringssl"
version = "0.6.0"
version = "0.8.0"
authors = ["Yuchen Wu <yuchen@cloudflare.com>"]
license = "Apache-2.0"
edition = "2021"
Expand Down
6 changes: 2 additions & 4 deletions pingora-boringssl/src/boring_tokio.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2025 Cloudflare, Inc.
// Copyright 2026 Cloudflare, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -263,9 +263,7 @@ where
return Poll::Pending;
}
Err(e) => {
return Poll::Ready(Err(e
.into_io_error()
.unwrap_or_else(|e| io::Error::new(io::ErrorKind::Other, e))));
return Poll::Ready(Err(e.into_io_error().unwrap_or_else(io::Error::other)));
}
}

Expand Down
2 changes: 1 addition & 1 deletion pingora-boringssl/src/ext.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2025 Cloudflare, Inc.
// Copyright 2026 Cloudflare, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
Expand Down
2 changes: 1 addition & 1 deletion pingora-boringssl/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2025 Cloudflare, Inc.
// Copyright 2026 Cloudflare, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
Expand Down
22 changes: 12 additions & 10 deletions pingora-cache/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
[package]
name = "pingora-cache"
version = "0.6.0"
version = "0.8.0"
authors = ["Yuchen Wu <yuchen@cloudflare.com>"]
license = "Apache-2.0"
edition = "2021"
rust-version = "1.84"
repository = "https://github.com/cloudflare/pingora"
categories = ["asynchronous", "network-programming"]
keywords = ["async", "http", "cache"]
Expand All @@ -17,27 +18,28 @@ name = "pingora_cache"
path = "src/lib.rs"

[dependencies]
pingora-core = { version = "0.6.0", path = "../pingora-core", default-features = false }
pingora-error = { version = "0.6.0", path = "../pingora-error" }
pingora-header-serde = { version = "0.6.0", path = "../pingora-header-serde" }
pingora-http = { version = "0.6.0", path = "../pingora-http" }
pingora-lru = { version = "0.6.0", path = "../pingora-lru" }
pingora-timeout = { version = "0.6.0", path = "../pingora-timeout" }
pingora-core = { version = "0.8.0", path = "../pingora-core", default-features = false }
pingora-error = { version = "0.8.0", path = "../pingora-error" }
pingora-header-serde = { version = "0.8.0", path = "../pingora-header-serde" }
pingora-http = { version = "0.8.0", path = "../pingora-http" }
pingora-lru = { version = "0.8.0", path = "../pingora-lru" }
pingora-timeout = { version = "0.8.0", path = "../pingora-timeout" }
bstr = { workspace = true }
http = { workspace = true }
indexmap = "1"
once_cell = { workspace = true }
regex = "1"
blake2 = "0.10"
serde = { version = "1.0", features = ["derive"] }
rmp-serde = "1"
rmp-serde = "1.3.0"
bytes = { workspace = true }
httpdate = "1.0.2"
log = { workspace = true }
async-trait = { workspace = true }
parking_lot = "0.12"
cf-rustracing = "1.0"
cf-rustracing-jaeger = "1.0"
rmp = "0.8"
rmp = "0.8.14"
tokio = { workspace = true }
lru = { workspace = true }
ahash = { workspace = true }
Expand All @@ -49,7 +51,7 @@ rand = "0.8"
[dev-dependencies]
tokio-test = "0.4"
tokio = { workspace = true, features = ["fs"] }
env_logger = "0.9"
env_logger = "0.11"
dhat = "0"
futures = "0.3"

Expand Down
2 changes: 1 addition & 1 deletion pingora-cache/benches/lru_memory.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2025 Cloudflare, Inc.
// Copyright 2026 Cloudflare, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
Expand Down
Loading
Loading