# Rust Client for the RabbitMQ HTTP API Change Log

## v0.89.0 (unreleased)

No changes yet.


## v0.88.0 (May 1, 2026)

### Breaking Changes

 * `responses::OAuthConfiguration` and `Client#oauth_configuration` were removed
   because the endpoint they were relying on is no longer available in RabbitMQ `4.3.0`

   In earlier versions the endpoint hasn't been used by RabbitMQ's management UI
   since `3.11.0`

### Enhancements

 * `QueueInfo#operator_policy` and `QueueInfo#effective_policy_definition` are new functions
   that expose a couple of new-ish queue metrics to this client

### Bug Fixes

 * Fixes propagation of `x-max-age`, `x-max-length-bytes`, `x-stream-max-segment-size-bytes`
   arguments upon stream declaration

 * Compilation with default feature set was broken due to a feature-conditional `use`


## v0.87.0 (Apr 7, 2026)

### Enhancements

 * `ExchangeType` now covers the non-standard exchange types shipped with RabbitMQ core or Tanzu RabbitMQ:
   `ConsistentHashing`, `ModulusHash`, `Random`, `LocalRandom`,
   `JmsTopic`, `RecentHistory`, `DelayedMessage`, `MessageDeduplication`, plus a `Plugin(String)`
   catch-all for arbitrary plugin exchange types
 * `ExchangeType::ModulusHash` is a new value for the `x-modulus-hash` exchange,
   which is included into RabbitMQ core as of `4.3.0` (previously it was a part of the `rabbitmq-sharding` plugin)


## v0.86.0 (Mar 20, 2026)

### Enhancements

 * `HttpClientError` `Display` messages now include the underlying error details for
   `RequestError`, `InvalidHeaderValue`, `IncompatibleBody`, and `EndpointValidationError::ClientBuildError`


## v0.85.0 (Mar 16, 2026)

### Dependencies

 * `reqwest` upgraded to `0.13.2`


## v0.84.0 (Mar 7, 2026)

### Enhancements

 * Publishing to `crates.io` now uses [Trusted Publishing](https://crates.io/docs/trusted-publishing)


## v0.83.0 (Feb 20, 2026)

### Enhancements

 * A new feature, `zeroize`, together with a new type, `Password`, that offers [zeroisation](https://en.wikipedia.org/wiki/Zeroisation)
   for the most security-demanding use cases


## v0.82.0 (Feb 20, 2026)

### Breaking Changes

 * SSRF hardening: `ClientBuilder#build` now returns `Result<Client, EndpointValidationError>`
   and rejects endpoints that do not use an `http` or `https` scheme

### Enhancements

 * `ClientBuilder#with_redirect_policy` controls the HTTP redirect policy.
   `with_recommended_defaults` now also disables redirects
 * `EndpointValidationError` and `RedirectPolicy` are re-exported from both `api` and `blocking_api`


## v0.81.0 (Feb 17, 2026)

### Enhancements

 * `ClusterNode#rabbitmq_version` now takes the version straight from the `GET /api/nodes`
    or `GET /api/nodes/{name}` responses, if [available](https://github.com/rabbitmq/rabbitmq-server/pull/15454) (starting with RabbitMQ `4.2.4`).
    The function falls back to the `rabbit` Erlang/OTP application version on older nodes
 * `ClusterNode` gained a few new optional fields available since RabbitMQ `4.2.4`:
   `erlang_version`, `erlang_full_version`, `crypto_lib_version`
 * `Overview#crypto_lib_version` is a new field reporting the crypto library
   (such as OpenSSL, LibreSSL) version used by the node's runtime.
   Only provided by RabbitMQ `4.2.4` and later versions.


## v0.80.0 (Feb 13, 2026)

### Enhancements

 * New `HttpClientError` helpers for "transport-level" connection error classification: `is_connection_error`, `is_timeout`,
   `is_tls_handshake_error`, `as_reqwest_error`
 * `Client#probe_reachability` tests whether the node is reachable and the configured credentials are accepted.
   Returns a `ReachabilityProbeOutcome` enum rather than a `Result` because both outcomes are expected,
   so using the `?` operator would be semantically wrong
 * Improved `TagList` ergonomics with `can_access_http_api`, `is_administrator`, `can_access_monitoring_endpoints`
 * `TagList` now implements `From<Vec<String>>`
 * `ClientBuilder#with_connect_timeout` sets the TCP connection timeout independently of the overall request timeout


## v0.79.0 (Feb 11, 2026)

### Enhancements

 * `responses::Listener#human_friendly_name` is a new method that returns a human-friendly name for the listener:
   for example, "MQTT over WebSockets with TLS" for `https/web-mqtt` (a cryptic internal listener name)


## v0.78.0 (Feb 10, 2026)

### Enhancements

 * Introduce `ClusterNode#rabbitmq_version` that relies on the Erlang/OTP application version.
   Yeah, the HTTP API could lend us a hand here but so far hasn't.


## v0.77.0 (Feb 5, 2026)

### Enhancements

 * Documentation improvements

### Dependencies

 * `regex` bumped to `1.12`
 * `tokio` bumped to `1.49`
 * `percent-encoding` bumped to `2.3`


## v0.76.0 (Jan 16, 2026)

### Enhancements

 * `Amqp091ShovelParams` no longer serializes `src-predeclared`, `dest-predeclared` when those keys are `false`
   for RabbitMQ 3.12.x compatibility


## v0.75.0 (Jan 16, 2026)

### Breaking Changes

 * `ExchangeFederationParams#queue_type` and `OwnedExchangeFederationParams#queue_type` are now
   optional (`Option<QueueType>` instead of `QueueType`) for RabbitMQ 3.12.x compatibility.

   The [`queue-type`](https://www.rabbitmq.com/docs/federation-reference) parameter was introduced
   in the 3.13 series.

 * `NodeMemoryBreakdown#other_ets_tables` is now `i64` instead of `u64` because it can be
   [reported as negative](https://github.com/rabbitmq/rabbitmq-server/pull/15289) due to an ETS table memory accounting peculiarity in RabbitMQ before 4.2.3.


## v0.73.0 (Dec 30, 2025)

### Dependencies

 * `reqwest` upgraded to `0.13.1`


## v0.72.0 (Dec 22, 2025)

### Enhancements

 * New `RuntimeParameter` predicates: `is_shovel`, `is_federation_upstream`,
   `is_federation_upstream_set`, `is_federation`, `is_policy`, `is_operator_policy`, `is_vhost_limits`


## v0.71.0 (Dec 13, 2025)

### Enhancements

 * `ClientBuilder#with_recommended_defaults` applies sensible defaults: 60s request timeout, 3 retries with 1s delay
 * `HttpClientError` now has helper methods: `is_not_found`, `is_already_exists`, `is_unauthorized`, `is_forbidden`,
   `is_client_error`, `is_server_error`, `status_code`, `url`, `error_details`
 * New policies-related functions: `Client#list_policies_for_target`, `Client#list_operator_policies_for_target`, `Client#list_matching_policies`,
   `Client#list_matching_operator_policies`
 * `OptionalQueueArgument` is a new enum for type-safe [optional queue arguments](https://www.rabbitmq.com/docs/queues#optional-arguments)
 * `XArgumentsBuilder#with_argument` accepts `OptionalQueueArgument` directly
 * `Amqp091ShovelSourceEndpoint`, `Amqp091ShovelDestinationEndpoint` make type-safe shovel endpoint configuration easier
 * Owned variants of param types: `OwnedQueueParams`, `OwnedExchangeParams`, `OwnedPolicyParams`, `OwnedUserParams`,
   `OwnedAmqp091ShovelSourceEndpoint`, `OwnedAmqp091ShovelDestinationEndpoint`
 * The library has accumulated two `OverflowBehavior` implementations; they were folded into the `common` version and
   re-exported from the `requests` module

## v0.70.0 (Dec 11, 2025)

### Bug Fixes

 * `SupportedProtocol::from` now correctly maps `https/web-amqp` to `AMQPOverWebSocketsWithTLS`

### Enhancements

 * `PaginationParams` constructors now clamp values exceeding `MAX_PAGE_SIZE` instead of panicking
 * New convenience methods for listing queues by type: `Client#list_quorum_queues`, `Client#list_quorum_queues_in`,
   `Client#list_classic_queues`, `Client#list_classic_queues_in`, `Client#list_streams`, `Client#list_streams_in`
 * `Client#delete_queues` for batch queue deletion
 * `VirtualHostParamsBuilder` for fluent virtual host parameter construction
 * `UserParams#policymaker` convenience constructor

## v0.69.0 (Dec 11, 2025)

### Enhancements

 * Support for pagination with `Client#list_connections_paged`, `Client#list_queues_paged`, `Client#list_queues_in_paged`, `PaginationParams`
 * API ergonomics improvements: `XArgumentsBuilder`, `PolicyDefinitionBuilder`, `HttpClientError#user_message`, `PolicyParams` improvements,
   and a few more convenience methods on `Client`

## v0.68.0 (Nov 28, 2025)

### Enhancements

* Improve `tabled` column names for `AuthenticationAttemptStatistics`.

## v0.67.0 (Nov 28, 2025)

### Bug Fixes

 * Add two more aliases to `SupportedProtocol::AMQP` for the authentication attempts
   statistics endpoint.

## v0.66.0 (Oct 17, 2025)

### Enhancements

 * Request errors now include the `error` and `reason` fields populated if the API response contains them

## v0.65.0 (Oct 11, 2025)

### Enhancements

 * `Overview#has_jit_enabled` is a new method that returns `true` if the Erlang runtime has the JIT enabled

## v0.64.0 (Oct 9, 2025)

### Bug Fixes

 * Reintroduced `QueueOps#has_queue_ttl_arg`, which was unintentionally lost during a refactoring

## v0.63.0 (Oct 9, 2025)

### Bug Fixes

 * Reintroduced `QueueOps#is_server_named`, which was unintentionally lost during a refactoring

## v0.62.0 (Oct 9, 2025)

### Enhancements

 * `Client#list_all_cluster_plugins` is a new function that returns a combined set of plugins enabled across all cluster nodes
 * `Client#list_node_plugins` is a new function that returns the list of plugins enabled on a specific node

## v0.61.0 (Oct 8, 2025)

### Enhancements

 * Logging via the `log` crate. Both clients now emit trace-level logs for HTTP operations, including request/response details and retry attempts.

 * HTTP request timeout support. Both `ClientBuilder` implementations now provide a `with_request_timeout` method
   for configuring request timeouts:

   ```rust
   use std::time::Duration;
   use rabbitmq_http_client::api::ClientBuilder;

   let client = ClientBuilder::new()
       .with_endpoint("http://localhost:15672/api")
       .with_basic_auth_credentials("user", "pass")
       .with_request_timeout(Duration::from_secs(30))
       .build();
   ```

   The timeout applies to the entire request/response cycle.
   If a request takes longer than the configured duration, it will be aborted and return a timeout error.

   Note that this new setting is ignored if a custom HTTP client is provided via `ClientBuilder#with_client`.
   In that case, configure the timeout directly on the custom client instead.

## v0.60.0 (Sep 28, 2025)

### Enhancements

 * HTTP request retry support. Both `ClientBuilder` implementations now allow for minimalistic retry behavior configuration:
   the number of retry attempts and the fixed delay between them.

   ```rust
   use rabbitmq_http_client::api::{ClientBuilder, RetrySettings};

   let client = ClientBuilder::new()
       .with_endpoint("http://localhost:15672/api")
       .with_basic_auth_credentials("user", "pass")
       .with_retry_settings(RetrySettings {
           // 2 retry attempts (+ 1 initial = 3 total attempts)
           max_attempts: 2,
           // a fixed wait of 500 ms between retries
           delay_ms: 500,
       })
       .build();
   ```

## v0.59.0 (Sep 26, 2025)

### Enhancements

 * `NodeMemoryFootprint#breakdown` is now an `Option<NodeMemoryBreakdown>` to handle cases
   where the node memory breakdown stats are not yet available.

### Bug Fixes

 * `NodeMemoryTotals#max` now correctly compares all three memory totals (RSS, allocated, and used by runtime) instead of comparing RSS twice.

## v0.58.0 (Sep 23, 2025)

### Breaking Changes

 * All `delete_*` and `clear_*` functions now accept an `idempotently` boolean argument,
   making it possible to issue idempotent deletion requests that would not fail
   with a `404 Not Found` response.

   This affects the following functions:
   * `delete_federation_upstream`
   * `delete_policy`
   * `delete_operator_policy`
   * `close_connection`
   * `close_user_connections`
   * `delete_binding`
   * `clear_topic_permissions`
   * `delete_shovel`
   * `clear_runtime_parameter`

 * `delete_binding` now accepts a `requests::BindingDeletionParams` struct instead of a long list of arguments.

### Enhancements

 * All `delete_*` functions now support idempotent operations.

## v0.57.0 (Sep 22, 2025)

### Enhancements

 * `responses::Shovel` can now be converted to `requests::RuntimeParameterDefinition`, for example, when a shovel
   needs to be updated

## v0.56.0 (Sep 21, 2025)

### Module Organization

 * `crate::api` was split into multiple smaller modules, `crate::api::*`. Re-exports are provided for backwards compatibility.
 * Similarly, `crate::blocking_api` was split into multiple smaller modules, `crate::blocking_api::*`, with re-exports in place.
 * Similarly, `crate::requests` was split into multiple smaller modules, `crate::requests::*`.
 * `crate::requests` was split into multiple smaller modules, `crate::requests::*`.
 * Similarly, `crate::responses` was split into multiple smaller modules, `crate::responses::*`, with re-exports in place.

## v0.55.0 (Sep 20, 2025)

### Enhancements

 * Optimized `uris::UriBuilder` for updates of multiple query parameters

### Bug Fixes

 * Fix several `uris::UriBuilder` bugs around query parameter updates

## v0.54.0 (Sep 19, 2025)

### Enhancements

 * `FederationUpstream` and `FederationUpstreamParams` no longer have a "fidelity gap," a difference between fields
   that had made it impossible to convert the former into the latter
 * `FederationUpstream` now includes several missing (rarely used) fields such as `bind_using_nowait`, `channel_use_mode`

### Breaking Changes

 * `FederationUpstream#prefetch_count` and `FederationUpstream#reconnect_delay` were bumped to `u32`

## v0.53.0 (Sep 18, 2025)

### Enhancements

 * `uris::UriBuilder` is a convenient way of modifying URIs used by [federation upstreams](https://www.rabbitmq.com/docs/federation#what-does-it-do) and [shovels](https://www.rabbitmq.com/docs/shovel).
   Its `replace` and `merge` methods are now much more efficient
   as they no longer rebuild the URI query string multiple times.

   ```rust
   use rabbitmq_http_client::uris::UriBuilder;
   use rabbitmq_http_client::commons::TlsPeerVerificationMode;

   let uri = UriBuilder::new("amqps://user:pass@localhost:5671/vhost")
       .unwrap()
       .with_tls_peer_verification(TlsPeerVerificationMode::Enabled)
       .with_ca_cert_file("/path/to/ca_bundle.pem")
       .build()
       .unwrap();
   ```

 * `uris::TlsClientSettings` makes it possible to group TLS settings and apply them
   to a `uris::UriBuilder` in one go.

   ```rust
   use rabbitmq_http_client::uris::{TlsClientSettings, UriBuilder};
   use rabbitmq_http_client::commons::TlsPeerVerificationMode;

   let settings = TlsClientSettings::new()
        .peer_verification(TlsPeerVerificationMode::Enabled)
        .ca_cert_file("/path/to/ca_bundle.pem");

   let uri = UriBuilder::new("amqps://user:pass@localhost:5671/vhost?verify=verify_none")
       .unwrap()
       .replace(settings)
       .build()
       .unwrap();
   ```

 * `commons::TlsPeerVerificationMode` is a new enum representing [TLS peer verification modes](https://www.rabbitmq.com/docs/ssl#peer-verification)
 * `commons::TLS_PEER_VERIFICATION_KEY` is a new constant for the `verify` key used by federation
   and shovel URIs, and more

## v0.52.0 (Sep 17, 2025)

### Enhancements

 * `VirtualHostDefinitionSetTransformer` trait and `VirtualHostTransformationChain` for transforming virtual host-specific definition sets
 * Virtual host equivalents of cluster-wide transformers: `PrepareForQuorumQueueMigrationVhost`, `StripCmqKeysFromVhostPolicies`, `DropEmptyVhostPolicies`
 * `PrepareForQuorumQueueMigration` and `PrepareForQuorumQueueMigrationVhost` transformers now also strip CMQ-related x-arguments
   (such as `x-ha-mode`) from queues definitions, as they won't pass validation on RabbitMQ `4.x`

## v0.51.0 (Sep 16, 2025)

### Enhancements

 * `responses::TagList`, `responses::PluginList`, `responses::XArguments`, `responses::NodeList`, `responses::MessageList`,`responses::FeatureFlagList`,
   `responses::DeprecatedFeatureList` now all implement `Deref` and `DerefMut`
 * `responses::Channel#state` now uses an enum, `responses::ChannelState`, instead of a string.
 * `Client#enable_vhost_deletion_protection` [protects](https://www.rabbitmq.com/docs/vhosts#deletion-protection) a virtual host from deletion (using the `POST /api/vhosts/{vhost}/deletion/protection` endpoint).
 * `Client#disable_vhost_deletion_protection` lifts [deletion protection](https://www.rabbitmq.com/docs/vhosts#deletion-protection) (using the `DELETE /api/vhosts/{vhost}/deletion/protection` endpoint).
 * `Client#auth_attempts_statistics` is a new function providing support for the `GET /api/auth/attempts/{node}` endpoint.
 * `Client#list_topic_permissions` is a new function that provides support for the `GET /api/topic-permissions` endpoint.
 * `Client#list_topic_permissions_in` is a new function that provides support for the `GET /api/vhosts/{vhost}/topic-permissions` endpoint.
 * `Client#get_topic_permissions_of` is a new function that provides support for the `GET /api/topic-permissions/{vhost}/{user}` endpoint.
 * `Client#list_channels_on` is a new function that provides support for the `GET /api/connections/{connection}/channels` endpoint.
 * `Client#get_channel_info` returns information about a specific channel.
 * `Client#current_user` is a new function providing support for the `GET /api/whoami` endpoint.

### Bug Fixes

 * `Client#delete_binding` could panic if the optional `x-arguments` value was passed in as `None`
 * `api::Client#enable_schema_definition_sync_on_node` was unintentionally named `enable_schema_definition_sync_one_node`

## v0.50.0 (Sep 13, 2025)

### Breaking Changes

 * `blocking_api::Client#enable_schema_definition_sync`, `blocking_api::Client#disable_schema_definition_sync` were
   removed in favor of `blocking_api::Client#enable_schema_definition_sync_on_node` and `blocking_api::Client#disable_schema_definition_sync_on_node`
   that accept an `Option<&str>` for name, like in `api::Client`. `None` means "on all cluster nodes."

### Enhancements

 * Adopted a few type aliases: `common::Username`, `common::VirtualHostName`, `common::PermissionPattern`, `common::ChannelId`.
 * `responses::TagList`, `responses::PluginList`, `responses::NodeList`, `responses::FeatureFlagList`, `responses::DeprecatedFeatureList`
   now implement `contains`.


## v0.49.0 (Sep 07, 2025)

### Enhancements

 * `responses::TagList`, `responses::PluginList`, `responses::FeatureFlagList`, `responses::DeprecatedFeatureList`,
   `responses::MessageList` now all have `len` and `is_empty` methods.
 * `responses::TagList`, `responses::PluginList`, `responses::NodeList`, `responses::FeatureFlagList`, `responses::DeprecatedFeatureList`,
   `responses::MessageList` now all implement `IntoIterator`.


## v0.48.0 (Sep 07, 2025)

* `responses::NodeList#len` is now properly accompanied by `responses::NodeList#is_empty`.


## v0.47.0 (Sep 07, 2025)

### Enhancements

 * `responses::ClusterIdentity` now implements `ToString`, `From<String>`, and `From<&str>`.
 * `responses::NodeList#len` is a new function that returns the length of the list.


## v0.46.0 (Sep 06, 2025)

### Enhancements

 * `QueueOps#x_arguments`: returns the optional arguments of an object (`XArguments`).
 * `QueueOps#has_queue_ttl_arg`: returns true if optional arguments of an object include a queue TTL argument (`"x-expires"`).
 * `QueueOps#has_message_ttl_arg`: returns true if optional arguments of an object include a message TTL argument (`"x-message-ttl"`).
 * `QueueOps#has_length_limit_in_messages`: returns true if optional arguments of an object include a queue length limit in messages (`"x-max-length"`).
 * `QueueOps#has_length_limit_in_bytes`: returns true if optional arguments of an object include a queue length limit in bytes (`"x-max-length-bytes"`).
 * `QueueOps#is_server_named`: returns true if an object's name suggests it is a server-named (system) entity.



## v0.45.0 (Sep 01, 2025)

### Enhancements

 * New struct, `requests::TopicPermissions`, for declaring topic permissions.
 * New struct, `responses::TopicPermission` for representing topic permissions.
 * `Client#list_topic_permissions_of` is a new function that lists topic permissions of a user.
 * `Client#grant_permissions` is now an alias for `Client#declare_permissions`, providing an easier to remember alias.
 * `Client#declare_topic_permissions` is a new function that sets topic permissions for a user
 * `Client#clear_topic_permissions` is a new function to clear topic permissions for a user.


## v0.44.0 (Aug 25, 2025)

### Enhancements

 * `responses::MessagingProtocol` was updated to include a new variant, `MessagingProtocol::Local`,
    that represents a "protocol" used by local shovels in RabbitMQ 4.2.0 and later.


## v0.43.0 (Aug 19, 2025)

### Enhancements

 * `responses::VirtualHost#metadata` is now optional. It was introduced in RabbitMQ `3.8.0` in 2019
   but for various reasons can be missing in versions up to `3.11.0` or so.

   This can be considered a RabbitMQ `3.10.x` (that reached EOL in late 2023) compatibility fix.
   Responsible adults don't run EOL versions of RabbitMQ, of course.


## v0.42.0 (Aug 14, 2025)

### Bug Fixes

 * `responses::Shovel.vhost` is now an option because this field will be missing for
   static shovels.


## v0.41.0 (Aug 11, 2025)

### Enhancements

 * `Client#list_shovels_in` is a new function that returns a list of shovels in a specific virtual host
 * `ShovelState` now includes one more state, `ShovelState::Terminated`


## v0.40.0 (Jul 17, 2025)

### Enhancements

 * Several structs in `responses` now implement `Default`, in particular for deserialization,
   and can handle the cases with certain metrics missing at request time on a freshly booted
   RabbitMQ node


## v0.39.0 (Jul 14, 2025)

### Enhancements

 * Support for a new deprecated feature flag state column, introduced in [rabbitmq/rabbitmq-server#14227](https://github.com/rabbitmq/rabbitmq-server/pull/14227)
 * `Client#declare_policies` and `Client#declare_operator_policies` are two new helper functions for declaring multiple policies at once.
    Note that both functions will still issue the same number of API requests, so it only exists for convenience
 * `Client#delete_policies_in` and `Client#delete_operator_policies_in` are two new helper functions for deleting multiple policies at once.
    Note that both functions will still issue the same number of API requests, so it only exists for convenience

## v0.38.0 (Jul 11, 2025)

### Enhancements

 * Introduce `password_hashing::HashingAlgorithm` with two variants, SHA-256 and SHA-512
 * Support for SHA-512 hashing of salted passwords


## v0.37.0 (Jul 11, 2025)

### Breaking Changes

 * `responses::PolicyDefinitionOps` was extended and renamed to `responses::OptionalArgumentSourceOps`

### Enhancements

 * New `DefinitionSetTransformer`: `PrepareForQuorumQueueMigration`.

   This one not only strips off the CMQ-related keys
   but also handles an incompatible `"overflow"`/`"x-overflow"` key value
   and `"queue-mode"`/`"x-queue-mode"` keys, both not supported
   by quorum queues.

 * `responses::OptionalArgumentSourceOps` now supports more operations on [optional queue arguments](https://www.rabbitmq.com/docs/queues#optional-arguments)
    of `responses::QueueDefinition` as well as policy definitions (`responses::PolicyDefinition`, `responses::Policy`)


## v0.36.0 (Jul 4, 2025)

### Enhancements

 * `responses::Connection` can now represent direct connections,
   a special kind of connections supported by the Erlang AMQP 0-9-1 client,
   that shovels and federation links use when connecting to the local
   node.

   GitHub issues: [rabbitmq/rabbitmqadmin-ng#68](https://github.com/rabbitmq/rabbitmqadmin-ng/issues/68), [#61](https://github.com/michaelklishin/rabbitmq-http-api-rs/pull/61)


## v0.35.0 (Jun 28, 2025)

### Enhancements

 * `ClientCapabilities` fields now default to `false` when not provided in
    the API response.

    GitHub issue: [#56](https://github.com/michaelklishin/rabbitmq-http-api-rs/issues/56).


## v0.34.0 (Jun 12, 2025)

### Upgrades

 * `tabled` was upgraded to `0.20.0`


## v0.33.0 (Jun 10, 2025)

### Bug Fixes

 * `NoActiveProtocolListenerDetails` was split into `NoActiveProtocolListenerDetailsPre41` and `NoActiveProtocolListenerDetails41AndLater`
    to support `GET /api/health/checks/protocol-listener/{protocols}` responses of both RabbitMQ 4.0.x and 4.1.x.

    Relevant RabbitMQ change: [rabbitmq/rabbitmq-server#13871](https://github.com/rabbitmq/rabbitmq-server/pull/13871).


## v0.32.0 (Jun 6, 2025)

### Enhancements

 * Minor helper functions, such as `Policy#with_overrides` and `PolicyDefinition#merge`


## v0.31.0 (May 16, 2025)

### Enhancements

 * `PolicyDefinition#insert` and `Policy#insert_definition_key` are new functions for adding or updating
   policy definition key-value pairs
 * `responses::Policy` can now be converted to `requests::PolicyParams` for easier policy definition
    updates
 * More flexible use of optional `reqwest` features.

   Contributed by @ikrivosheev.

   GitHub issue: [#53](https://github.com/michaelklishin/rabbitmq-http-api-rs/pull/53).


## v0.30.0 (May 6, 2025)

### Enhancements

 * `Client#list_global_runtime_parameters`, `Client#get_global_runtime_parameter`, `Client#upsert_global_runtime_parameter`, `Client#clear_global_runtime_parameter`
   are new functions for working with [global runtime parameters](https://www.rabbitmq.com/docs/parameters)
 * `Client#get_cluster_tags`, `Client#set_cluster_tags`, `Client#clear_cluster_tags` are new functions for operations on [cluster tags](https://www.rabbitmq.com/docs/parameters#cluster-tags)


## v0.29.0 (Apr 14, 2025)

### Breaking Changes

 * `PolicyDefinition` and specifically `requests::PolicyParams.definition` is now a `Map<String, Value>`
   and not an `Option<Map<String, Value>>`. When creating a policy, the definition cannot be missing or blank,
   or else it would not pass server validation.


## v0.28.0 (Mar 23, 2025)

### Enhancements

 * Federation support. Key API elements: `FederationUpstreamParams`, `QueueFederationParams`, `ExchangeFederationParams`,
   `FederationUpstream`, `FederationLink`, `Client#declare_federation_upstream_with_parameters`, `Client#declare_federation_upstream`, `Client#delete_federation_upstream`, `Client#list_federation_upstreams`, `Client#list_federation_links`

 * New definition set transformations that include certain parts of the definition set:
   `exclude_users`, `exclude_permissions`, `exclude_runtime_parameters`, `exclude_policies`


## v0.27.0 (Mar 11, 2025)

### Enhancements

 * `ClusterDefinitionSet` transformations are maturing.

   There are two `transformations::DefinitionSetTransformer`s
   available: one that removes the 3.13.x era policy queues related to classic queue mirroring, and another
   that removes policies with empty definitions.

   The two are supposed to be used together.


## v0.26.0  (Mar 10, 2025)

### Enhancements

 * `ClientBuilder<E, U, P>` now has a default type parameter value.

   Contributed by @ikrivosheev.

   GitHub issue: [#46](https://github.com/michaelklishin/rabbitmq-http-api-rs/pull/46)

 * `QueueOps`, `NamedPolicyTargetObject` are two new traits that allow
   key queue properties to be accessed on several structs that semantically represent
   a queue, either directly or in an exported set of definitions

 * `QueueType::Unsupported(String)` is a new queue type variant

 * Initial functions for mutating certain parts of `ClusterDefinitionSet`s


## v0.25.0  (Mar 3, 2025)

### Enhancements

 * `PolicyTarget#does_apply_to` is a new function that allows for `PolicyTarget`
   equivalence comparison. For example, `PolicyTarget::QuorumQueues` is a subset of `PolicyTarget::Queues` but `PolicyTarget::QuorumQueues` is not


## v0.24.0  (Mar 2, 2025)

### Enhancements

 * `Client#declare_amqp10_shovel` is a new function that declares a dynamic shovel
   where both source and destination use AMQP 1.0

 * Both `Amqp091ShovelSourceParams` and `Amqp091ShovelDestinationParams` now support a new boolean option, `predeclared`,
   that enables [either or both sides to rely on a pre-declared topology](https://www.rabbitmq.com/docs/shovel-dynamic#predeclared-topology)




## v0.23.0  (Feb 24, 2025)

### Breaking Changes

 * `RuntimeParameterDefinition#name`, `RuntimeParameterDefinition#vhost`, and `RuntimeParameterDefinition#component` types changed from `String` to `&str`

### Enhancements

 * `Client#declare_amqp091_shovel` is a new function that declares a dynamic shovel
    where both source and destination use AMQP 0-9-1

 * `Client#delete_shovel` is a new function for deleting shovels


## v0.22.0 (Feb 8, 2025)

### Enhancements

 * `Client#import_vhost_definitions` is a new function that imports virtual host-specific
   definition files (as opposed to cluster-wide ones) into the target virtual host

 * `Client#import_cluster_wide_definitions` is an alias to `Client#import_definitions`
   to better reflect what it does


## v0.21.0 (Feb 8, 2025)

### Enhancements

 * `responses::VirtualHostDefinitionSet` is an equivalent of `responses::ClusterDefinitionSet` but adapted
   for the specifics of virtual host-specific definitions, namely the fact that they do not contain
   virtual hosts, users, or permissions, and objects such as queues or bindings do not have the
   virtual host field to make it possible to import them into a virtual host with any name

 * `Client#export_vhost_definitions`, `Client#export_vhost_definitions_as_string` and
   `Client#export_vhost_definitions_as_data` are new functions that export virtual host-specific
    definitions (as opposed to cluster-wide ones)

### Breaking Changes

 * `responses::DefinitionSet` was renamed to `responses::ClusterDefinitionSet` to
   differentiate it from virtual host-specific definitions, which are from now on
   represented by `responses::VirtualHostDefinitionSet`

 * `Client#export_definitions` was renamed to `Client#export_cluster_wide_definitions`
 * `Client#export_definitions_as_string` was renamed to `Client#export_cluster_wide_definitions_as_string`
 * `Client#export_definitions_as_data` was renamed to `Client#export_cluster_wide_definitions_as_data`


## v0.20.0  (Feb 2, 2025)

### Enhancements

 * `Client#close_user_connections` is a new function that closes all connections
    that authenticated with a specific username


## v0.19.0 (Feb 1, 2025)

### Refactoring

* `Client#disable_schema_definition_sync` was renamed to `Client#disable_schema_definition_sync_on_node`.

  This breaking change only applies to a function specific to
  Tanzu RabbitMQ 4.1, a series currently in development.

* `Client#enable_schema_definition_sync` was renamed to `Client#enable_schema_definition_sync_on_node`.

  This breaking change only applies to a function specific to
  Tanzu RabbitMQ 4.1, a series currently in development.

### Enhancements

* `Client#disable_schema_definition_sync` now disables SDS on all cluster nodes.

  This function is specific to Tanzu RabbitMQ 4.1, a series currently in development.

* `Client#enable_schema_definition_sync` now enables SDS on all cluster nodes.

  This function is specific to Tanzu RabbitMQ 4.1, a series currently in development.


## v0.18.0  (Feb 1, 2025)

### Bug Fixes

 * `responses::Connection#channel_max` is now an `Option<u16>` because
   this metric won't be available for, say, RabbitMQ Stream Protocol
   connections

### Enhancements

 * New convenience functions for working with streams: `Client#get_stream_info`, `Client#delete_stream`

 * `Client#declare_stream` and `requests::StreamParams` for convenient
   stream declaration


## v0.17.0  (Jan 27, 2025)

### Enhancements

 * Initial support for Tanzu RabbitMQ Schema Definitions Sync (SDS) operations.

 * Initial support for Tanzu RabbitMQ Warm Standby Replication (WSR) operations.

 * Isolated test suite runs for each client.

   To run only the async client tests, use

   ```bash
   cargo test async --all-features
   ```

   To run only the blocking client tests, use

   ```bash
   cargo test blocking --all-features
   ```

### Bug Fixes

 *  Async `Client#delete_*` functions now correctly handle `NotFound` responses for idempotent deletes


## v0.16.0  (Jan 15, 2025)

### Bug Fixes

 * `api::Client` now computes API endpoint paths correctly (a slash was missing)


## v0.15.0  (Jan 5, 2025)

### Enhancements

 * `Client#get_node_memory_footprint` is a new function that returns a [node memory footprint breakdown](https://www.rabbitmq.com/docs/memory-use).
   `responses::NodeMemoryFootprint` and `responses::NodeMemoryBreakdown` are the key types that provide
   access to per-category proportions, both absolute and relative (in percent)


## v0.14.0  (Dec 31, 2024)

### Enhancements

 * New `responses::HealthCheckFailureDetails` variants to accommodate active port and protocol
   listener [health checks](https://www.rabbitmq.com/docs/monitoring#health-checks)

 * New [health check](https://www.rabbitmq.com/docs/monitoring#health-checks) function: `Client#health_check_protocol_listener`


## v0.13.0 (Dec 31, 2024)

### Enhancements

 * New functions for listing [stream](https://www.rabbitmq.com/docs/streams) connections, publishers and consumers: `Client#list_stream_publishers`, `Client#list_stream_publishers_in`, `Client#list_stream_publishers_of`, `Client#list_stream_publishers_on_connection`, `Client#list_stream_consumers`, `Client#list_stream_consumers_in`, `Client#list_stream_consumers_on_connection`, `Client#list_stream_connections`, `Client#list_stream_connections_in`

 * New [health check](https://www.rabbitmq.com/docs/monitoring#health-checks) function: `Client#health_check_port_listener`


## v0.12.0 (Dec 28, 2024)

### Enhancements

 * `Client#list_feature_flags`, `Client#enable_feature_flag`, `Client#enable_all_stable_feature_flags` are three
   new functions for working with [feature flags](https://www.rabbitmq.com/docs/feature-flags)


## v0.11.0 (Dec 28, 2024)

### Enhancements

 * `Client#list_all_deprecated_features` and `Client#list_deprecated_features_in_use`
   are new functions for listing all [deprecated features](https://www.rabbitmq.com/docs/deprecated-features) and only those whose use is
   detected in the cluster.

 * `Client#list_feature_flags` is a new function that lists all [feature flags](https://www.rabbitmq.com/docs/feature-flags)
   in the cluster, including their state and stability.


## v0.10.0 (Dec 27, 2024)

### Dependencies

 * Bumps minimum `reqwest` version to `0.12.11`


## v0.9.0 (Dec 24, 2024)

### Breaking Changes

 * To propagate more request context to the caller,
   `crate::error::Error` was updated to provide a request URL, a header map,
   and a request body (if available).

   This reason for doing this comes down to how `reqwest`'s `Response` functions
   are designed: the ones that consume and parse the body also consume `self`,
   which means propagating a `Response` to the caller is not very useful at best,
   and arguably is misleading.

### Enhancements

 * `crate::api` now provides an async API. `crate::blocking_api` provides the
   original synchronous API.

   Contributed by @ikrivosheev.

   GitHub issues: [#29](https://github.com/michaelklishin/rabbitmq-http-api-rs/pull/29), [#30](https://github.com/michaelklishin/rabbitmq-http-api-rs/pull/30)

 * `Client#overview` is a new function that corresponds to the `GET /api/overview` API endpoint.

   Contributed by @ikrivosheev.

   GitHub issue: [#31](https://github.com/michaelklishin/rabbitmq-http-api-rs/pull/31)
