PackageTrack
Sign in Get early access

pingora

A framework to build fast, reliable and programmable networked systems at Internet scale.

0.8.1 8.9M downloads/mo #3317 most downloaded on crates.io cloudflare/pingora

What this package is like to depend on

Last release 2 months ago

04 Jun 2026

Release timing varies

gaps range from 3 weeks to 1.2 years

Nearly every release is documented

notes for 10 of 11 stable releases

Nothing withdrawn

no release was ever pulled

4 years old

11 releases · first in 2022

3 releases in the last 12 months

see the full history below

Release timeline

11 releases · Dec 2022 to Jun 2026
2023 2024 2025 2026
Release Pre-release

Releases

latest 11
  1. 0.8.1 04 Jun 2026
    Release notes

    0.8.1 - 2026-06-04

    🔒 Security

    • Bound default HTTP/2 server limits to mitigate memory exhaustion.
    • Upgrade Rustls-related dev-dependencies to address rustls-webpki security advisories.

    ⚙️ Miscellaneous Tasks

    • Pin tracing dependencies to preserve Rust 1.84 compatibility.
    • Use cargo check for MSRV verification instead of compiling dev-dependencies during tests.
    • Update the Semgrep OSS scanning workflow.
    • Use valid paths in header serialization tests.
    • Gate HTTP/1 CONNECT tests on patched HTTP/1 support.
    Open source →
  2. 0.8.0 02 Mar 2026
    Release notes

    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.
    Open source →
    Release notes

    🚀 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.
    Open source →
  3. 0.7.0 30 Jan 2026
    Release notes

    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
    Open source →
    Release notes

    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
    Open source →
  4. 0.6.0 15 Aug 2025
    Release notes

    0.6.0 - 2025-08-15

    Highlights

    • This release bumps the minimum h2 crate dependency to guard against the MadeYouReset H2 attack

    🚀 Features

    • Log runtime names during Server shutdown
    • Enabling tracking the execution phase of a server
    • Allow using in-memory compression dicts
    • Make H2Options configurable at HttpServer, HttpProxy
      Also adds HttpServerOptions to the HttpServer implementation, and
      updates the HttpEchoApp to use HttpServer for easier adhoc testing.

    🐛 Bug Fixes

    • Fix: read body without discard

    Everything Else

    • Try loading each LRU shard individually and warn on errors
    • Update LRU save to disk to be atomic
    • Allow cache to spawn_async_purge
    • Pass hit handler in hit filter
    • Cache hit filter can mutate cache, allow resetting cache lock
    • Persist keepalive_timeout between requests on same stream
    • Properly check for H2 io ReadError retry types
    • Add cache lock wait timeout for readers
    • Fix CacheLock status timeout conditions
    • Handle close on partial chunk head
    • Allow optional to reset session timeouts
    • Clippy fixes for 1.87, add 1.87 to GitHub CI
    • Run range_{header,body}_filter after disabling cache
    • Convert InterpretCacheControl members to Duration
    • Disable downstream ranging on max file size
    • Allow explicit infinite keepalive timeout to be respected
      Note that a necessary follow up is to refactor the infinite keepalive
      timeout to only apply to first read between requests on reused conns.
    • Add method to disable keepalive if downstream is unfinished
    • Discard extra upstream body and disable keepalive
    • Explicitly disable keepalive on upstream connection when excess body
      (content-length) is detected.
    • Add brief sleep to shutdown signal tests to avoid flake
    • Allow override of cache lock timeouts
    • Allow arbitrary bytes in CacheKey instead of just Strings
    • Corrects out-of-order data return after multiple peek calls with different buffer sizes.
    • Mark previously too large chunked assets as cacheable
    • Boring/OpenSSL load cert chain from connector options
    • Add initial support for multipart range requests
    • Adds a callback to HttpHealthCheck for collecting detailed backend summary information
    • Multipart range filter state fixes

    Docs

    • Explanation of request_body_filter phase
    Open source →
    Release notes

    Highlights

    • This release bumps the minimum h2 crate dependency to guard against the MadeYouReset H2 attack

    🚀 Features

    • Log runtime names during Server shutdown
    • Enabling tracking the execution phase of a server
    • Allow using in-memory compression dicts
    • Make H2Options configurable at HttpServer, HttpProxy Also adds HttpServerOptions to the HttpServer implementation, and updates the HttpEchoApp to use HttpServer for easier adhoc testing.

    🐛 Bug Fixes

    • Fix: read body without discard

    Everything Else

    • Try loading each LRU shard individually and warn on errors
    • Update LRU save to disk to be atomic
    • Allow cache to spawn_async_purge
    • Pass hit handler in hit filter
    • Cache hit filter can mutate cache, allow resetting cache lock
    • Persist keepalive_timeout between requests on same stream
    • Properly check for H2 io ReadError retry types
    • Add cache lock wait timeout for readers
    • Fix CacheLock status timeout conditions
    • Handle close on partial chunk head
    • Allow optional to reset session timeouts
    • Clippy fixes for 1.87, add 1.87 to GitHub CI
    • Run range_{header,body}_filter after disabling cache
    • Convert InterpretCacheControl members to Duration
    • Disable downstream ranging on max file size
    • Allow explicit infinite keepalive timeout to be respected Note that a necessary follow up is to refactor the infinite keepalive timeout to only apply to first read between requests on reused conns.
    • Add method to disable keepalive if downstream is unfinished
    • Discard extra upstream body and disable keepalive
    • Explicitly disable keepalive on upstream connection when excess body (content-length) is detected.
    • Add brief sleep to shutdown signal tests to avoid flake
    • Allow override of cache lock timeouts
    • Allow arbitrary bytes in CacheKey instead of just Strings
    • Corrects out-of-order data return after multiple peek calls with different buffer sizes.
    • Mark previously too large chunked assets as cacheable
    • Boring/OpenSSL load cert chain from connector options
    • Add initial support for multipart range requests
    • Adds a callback to HttpHealthCheck for collecting detailed backend summary information
    • Multipart range filter state fixes

    Docs

    • Explanation of request_body_filter phase
    Open source →
  5. 0.5.0 09 May 2025
    Release notes

    0.5.0 - 2025-05-09

    🚀 Features

    🐛 Bug Fixes

    Everything Else

    Open source →
    Release notes

    🚀 Features

    🐛 Bug Fixes

    Everything Else

    Open source →
  6. 0.4.0 01 Nov 2024
    Release notes Open source →
    Release notes Open source →
  7. 0.3.0 12 Jul 2024
    Release notes

    0.3.0 - 2024-07-12

    🚀 Features

    • Add support for HTTP modules. This feature allows users to import modules written by 3rd parties.
    • Add request_body_filter. Now request body can be inspected and modified.
    • Add H2c support.
    • Add TCP fast open support.
    • Add support for server side TCP keep-alive.
    • Add support to get TCP_INFO.
    • Add support to set DSCP.
    • Add or_err()/or_err_with API to convert Options to pingora::Error.
    • Add or_fail() API to convert impl std::error::Error to pingora::Error.
    • Add the API to track socket read and write pending time.
    • Compression: allow setting level per algorithm.

    🐛 Bug Fixes

    • Fixed a panic when using multiple H2 streams in the same H2 connection to upstreams.
    • Pingora now respects the Connection header it sends to upstream.
    • Accept-Ranges header is now removed when response is compressed.
    • Fix ipv6_only socket flag.
    • A new H2 connection is opened now if the existing connection returns GOAWAY with graceful shutdown error.
    • Fix a FD mismatch error when 0.0.0.0 is used as the upstream IP

    ⚙️ Changes and Miscellaneous Tasks

    • Dependency: replace structopt with clap
    • Rework the API of HTTP modules
    • Optimize remove_header() API call
    • UDS parsing now requires the path to have unix: prefix. The support for the path without prefix is deprecated and will be removed on the next release.
    • Other minor API changes
    Open source →
    Release notes

    🚀 Features

    • Add support for HTTP modules. This feature allows users to import modules written by 3rd parties.
    • Add request_body_filter. Now request body can be inspected and modified.
    • Add H2c support.
    • Add TCP fast open support.
    • Add support for server side TCP keep-alive.
    • Add support to get TCP_INFO.
    • Add support to set DSCP.
    • Add or_err()/or_err_with API to convert Options to pingora::Error.
    • Add or_fail() API to convert impl std::error::Error to pingora::Error.
    • Add the API to track socket read and write pending time.
    • Compression: allow setting level per algorithm.

    🐛 Bug Fixes

    • Fixed a panic when using multiple H2 streams in the same H2 connection to upstreams.
    • Pingora now respects the Connection header it sends to upstream.
    • Accept-Ranges header is now removed when response is compressed.
    • Fix ipv6_only socket flag.
    • A new H2 connection is opened now if the existing connection returns GOAWAY with graceful shutdown error.
    • Fix a FD mismatch error when 0.0.0.0 is used as the upstream IP

    ⚙️ Changes and Miscellaneous Tasks

    • Dependency: replace structopt with clap
    • Rework the API of HTTP modules
    • Optimize remove_header() API call
    • UDS parsing now requires the path to have unix: prefix. The support for the path without prefix is deprecated and will be removed on the next release.
    • Other minor API changes
    Open source →
  8. 0.2.0 10 May 2024
    Release notes

    🚀 Features

    • Add support for downstream h2 trailers and add an upstream h2 response trailer filter
    • Add the ability to set TCP recv buf size
    • Add a convenience function to retrieve Session digest
    • Add body_bytes_read() method to Session
    • Add cache_not_modified_filter
    • Add SSLKEYLOG support for tls upstream
    • Add Service<HttpProxy<T>> constructor for providing name
    • Add purge_response callback
    • Make pop_closed pub, to simplify DIY drains

    🐛 Bug Fixes

    • Fixed gRPC trailer proxying
    • Fixed response_body_filter end_of_stream always being false
    • Fixed compile error in Rust <= 1.73
    • Fixed non linux build
    • Fixed the counting problem of used_weight data field in LruUnit<T>
    • Fixed cargo run --example server missing cert
    • Fixed error log string interpolation outside of proper context
    • Fixed tinylfu test flake

    ⚙️ Changes and Miscellaneous Tasks

    • API change: Server::run_forever now takes ownership and ensures exit semantics
    • API change: cleanup() method of ServerApp trait is now async
    • Behavior change: Always return HttpTask::Body on body done instead of HttpTask::done
    • Behavior change: HTTP/1 reason phrase is now parsed and proxied
    • Updated h2 dependency for RUSTSEC-2024-0332
    • Updated zstd dependencies
    • Code optimization and refactor in a few crates
    • More examples and docs
    Open source →
  9. 0.1.1 18 Apr 2024
    Release notes

    0.1.1 - 2024-04-05

    🚀 Features

    • 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
    • upstream_response_filter now runs on upstream 304 responses during cache revalidation
    • Added server_addr and client_addr APIs to Session
    • Allow body modification in response_body_filter
    • Allow configuring grace period and graceful shutdown timeout
    • Added TinyUFO sharded skip list storage option

    🐛 Bug Fixes

    • Fixed build failures with the boringssl feature
    • Fixed compile warnings with nightly Rust
    • Fixed an issue where Upgrade request bodies might not be handled correctly
    • Fix compilation to only include openssl or boringssl rather than both
    • Fix OS read errors so they are reported as ReadError rather than ReadTimeout when reading http/1.1 response headers

    ⚙️ Miscellaneous Tasks

    • Performance improvements in pingora-ketama
    • Added more TinyUFO benchmarks
    • Added tests for pingora-cache purge
    • Limit buffer size for InvalidHTTPHeader error logs
    • Example code: improvements in pingora client, new LB cluster example
    • Typo fixes and clarifications across comments and docs
    Open source →
    Release notes

    🚀 Features

    • 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
    • upstream_response_filter now runs on upstream 304 responses during cache revalidation
    • Added server_addr and client_addr APIs to Session
    • Allow body modification in response_body_filter
    • Allow configuring grace period and graceful shutdown timeout
    • Added TinyUFO sharded skip list storage option

    🐛 Bug Fixes

    • Fixed build failures with the boringssl feature
    • Fixed compile warnings with nightly Rust
    • Fixed an issue where Upgrade request bodies might not be handled correctly
    • Fix compilation to only include openssl or boringssl rather than both
    • Fix OS read errors so they are reported as ReadError rather than ReadTimeout when reading http/1.1 response headers

    ⚙️ Miscellaneous Tasks

    • Performance improvements in pingora-ketama
    • Added more TinyUFO benchmarks
    • Added tests for pingora-cache purge
    • Limit buffer size for InvalidHTTPHeader error logs
    • Example code: improvements in pingora client, new LB cluster example
    • Typo fixes and clarifications across comments and docs
    Open source →
  10. 0.1.0 28 Feb 2024
    Release notes

    Highlights

    • First Public Release of Pingora 🎉
    Open source →
    Release notes

    Highlights

    • First Public Release of Pingora 🎉
    Open source →
  11. 0.0.0 07 Dec 2022

    Nothing published for this version

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive