# Release History

## 1.1.0 (2026-07-09)

### Features Added

- `Error` now captures a `std::backtrace::Backtrace` at construction time and includes it in `Debug` output (e.g., `{:?}`) when `RUST_BACKTRACE=1` is set.

### Other Changes

- Added `#[must_use]` to `AsyncRuntime` functions.
- Added `#[must_use]` to `ItemIterator` (`Pager`) and `PageIterator` types.
- Added `#[must_use]` to `Poller` type.

## 1.0.0 (2026-05-11)

### Features Added

- Initial stable release.

### Breaking Changes

- Added `#[non_exhaustive]` to `AttributeArray`, `AttributeValue`, `SpanStatus`, and `SpanKind`.
- Bearer token authorization now requires TLS (https).

## 0.35.0 (2026-04-22)

### Features Added

- Added the `reqwest_rustls` feature to use `aws-lc-rs` as the default TLS provider.

### Breaking Changes

- Added connection timeout of 20s and read timeout of 60s.
- Removed the `reqwest_native_tls` feature in favor of `reqwest_rustls`.
- `new_http_client()` now takes an `Option<HttpClientOptions>` to disable automatic decompression - still enabled by default if `reqwest_gzip` or `reqwest_deflate` features are enabled.

## 0.34.0 (2026-04-07)

### Features Added

- Added `From<BytesStream> for Body`.
- Derived `Clone` and `Serialize` on `ErrorResponse`, `ErrorDetail`, and `InnerError`.

### Breaking Changes

- `SeekableStream::len()` and `Body::len()` now return `Option<u64>` instead of `usize` to support streams with unknown length and to align with `std::fs::Metadata::len()` for large file sizes.
- `SeekableStream::is_empty()` and `Body::is_empty()` now return `Option<bool>`.
- Added `tokio` feature to `default` features.
- Changed `async_runtime::spawn`/`SpawnedTask` to return a trait object that supports `abort()`.

### Other Changes

- The `url.full` span attribute in distributed traces now has query parameter values sanitized. Only parameters in `LoggingOptions::additional_allowed_query_params` and the default allow list (e.g., `api-version`) retain their values; all others are replaced with `REDACTED`.

## 0.33.0 (2026-03-05)

### Features Added

- Added `ErrorKind::Connection` for connection errors.
- Added `QueryBuilder`, `DEFAULT_ALLOWED_HEADER_NAMES`, `DEFAULT_ALLOWED_QUERY_PARAMETERS`, and `REDACTED_PATTERN` to `azure_core::http`.
- Added `request_header!`, `request_option!`, and `request_query!` macros.
- Added `SecretBytes` to `azure_core::credentials` for securely passing byte secrets without printing them in `Debug` or `Display` output.
- The `reqwest` HTTP client now classifies connection errors as `ErrorKind::Connection`.

### Breaking Changes

- Support for `wasm32-unknown-unknown` has been removed ([#3377](https://github.com/Azure/azure-sdk-for-rust/issues/3377))

## 0.32.0 (2026-02-10)

### Features Added

- Added `PagerContinuation` for `Pager` continuation.
- Added `PollerContinuation` for `Poller` continuation.

### Breaking Changes

- Changed our minimum supported Rust version (MSRV) from 1.85 to 1.88.
- Changed paging APIs to use `PagerContinuation` and non-generic `PagerState`/`PagerResult` types.
- Changed polling APIs to use `PollerContinuation` and non-generic `PollerState`/`PollerResult` types.
- Renamed `PagerOptions::continuation_token` to `continuation`.
- Renamed `Pager::continuation_token` to `continuation`.
- Renamed `Pager::into_continuation_token` to `into_continuation`.
- Renamed `PageIterator::continuation_token` to `continuation`.
- Renamed `PageIterator::into_continuation_token` to `into_continuation`.
- `Pager` callbacks must now return `Result`.

## 0.31.0 (2026-01-16)

### Features Added

- Added `Body::take()`.
- Added `continuation_token` to `PagerOptions`.
- Added extensible request authorization and authentication challenge handling to `BearerTokenAuthorizationPolicy`.
  - `OnRequest`, `OnChallenge`, and `Authorizer` traits define callbacks for these features.
  - `with_on_request()` and `with_on_challenge()` builder methods set callbacks for a policy instance.
- Added `Request::body_mut()`.
- Added `UrlExt::set_query_pair()` to simplify overwriting query parameter key values.
- Sort query parameters lexicographically in `QueryBuilder`.

### Breaking Changes

- Added type parameter `C` to `Pager` declaration, defaulting to `Url` so it can be elided in most existing declarations.
- Changed `Pager::from_callback` to take a `PagerOptions` as the second parameter rather than a `Context` parameter.
- Changed `Pager::from_callback` to `Pager::new` which now requires the caller to return a `Pin<Box<dyn Future>>`.
- Changed `Poller::from_callback` to `Poller::new` which now requires the caller to return a `Pin<Box<dyn Future>>`.
- Changed `PollerResult::next` field to `PollerResult::continuation_token`.
- Changed `PollerState` generic parameter from `N` to `C`.
- Moved `BearerTokenAuthorizationPolicy` into `azure_core::http::policies::auth`.
- Removed `ItemIterator::with_continuation_token()`. Pass a continuation token to `PagerOptions::continuation_token` instead.
- Removed `PageIterator::with_continuation_token()`. Pass a continuation token to `PagerOptions::continuation_token` instead.
- Removed `Pager::from_stream`.
- Removed `Poller::from_stream`.
- Renamed `BoxedFuture` to `PagerResultFuture` in `pager` module.

## 0.30.1 (2025-11-09)

### Other Changes

- Increment version for re-release following a fix to publishing.

## 0.30.0 (2025-11-07)

### Features Added

- Added `Context::to_owned()` to create a newly owned `Context` from an existing `Context`.
- Added `ItemIterator::continuation_token()` and `with_continuation_token()` to resume paging items. The current page is restarted until _after_ all items have been iterated.
- Added `PipelineOptions::retry_status_codes` for configuring which status codes should trigger a retry.
- Added `Response<T, F>::body(&self) -> &ResponseBody`.
- Added `Response<T, F>::to_raw_response()` function to create a `RawResponse` from cloned data.
- Added `UrlExt::append_path()`.
- Implemented `IntoFuture` for a `Poller`. Call `await` on a Poller to get the final model, or `into_stream()` to get a `futures::Stream` to poll the operation manually.
- Re-exported `serde_json::Value` as `azure_core::Value` ([#1687](https://github.com/Azure/azure-sdk-for-rust/issues/1687))

### Breaking Changes

- Added `Context` field to `PollerOptions`. Client methods which return `Poller` objects should accept a `PollerOptions` in their `method_options` field instead of a `ClientMethodOptions`.
- Added `F: Format` type parameter to `Poller` and `PollerResult`.
- Added `Format` associated type to `StatusMonitor`.
- Added `Format::deserialize()` function to `Format` trait.
- Added `S` type parameter to `xml::from_xml` congruent with `json::from_json()`.
- Changed `PollerOptions::frequency` from `Option<Duration>` to `Duration`.
- Moved deserializers and serializers for optional base64-encoded bytes to `base64::option` module. `base64` module now deserializes or serializes non-optional fields congruent with the `time` module.
- Removed `constants` module.
- Removed `credentials::DEFAULT_SCOPE_SUFFIX`.
- Removed `CustomHeaders` policy.
- Removed `ErrorKind::MockFramework`.
- Removed `Poller::wait()` function. Call `await` on a `Poller` to wait for it to complete and, upon success, return the final model.
- Removed `xml::read_xml_str()`.
- Renamed `BearerTokenCredentialPolicy` to `BearerTokenAuthorizationPolicy`.
- Renamed `BufResponse` to `AsyncRawResponse` so that `AsyncRawResponse` is to `RawResponse` as `AsyncIterator` is to `Iterator`.
- Renamed `BufResponseBody` to `AsyncResponseBody` so that `AsyncResponseBody` is to `ResponseBody` as `AsyncIterator` is to `Iterator`.
- Renamed `Response<T, F>::into_body(self) -> Result<Response<T>>` to `into_model(self) -> Result<Response<T>>`. `into_body(self)` now returns a `ResponseBody`.
- Renamed `RetryPolicy::get_retry_headers()` to `RetryPolicy::retry_headers()`
- Renamed `xml::read_xml()` to `xml::from_xml()` congruent with `json::from_json()`.

### Bugs Fixed

- `ItemIterator::into_pages()` now properly supports resuming from the current page until _after_ all items have been iterated.

## 0.29.1 (2025-10-06)

### Breaking Changes

- Removed the `azurite_workaround` feature (unused).

### Bugs Fixed

- Fix feature documentation ([#3118](https://github.com/Azure/azure-sdk-for-rust/issues/3118))

## 0.29.0 (2025-10-03)

### Features Added

- Added `Error::with_error_fn()`.
- Added `AsyncResponse<T>` for responses that may stream the body outside the HTTP pipeline. This replaces `Response<T, F>` requiring an async read of the body that occurred outside the HTTP pipeline.
- Added `http::response::BufResponseBody`, which also implements `Stream`.
- Added a `Pipeline::stream()` to return a `Result<BufResponse>`.
- Added `RawResponse::deconstruct()`.
- Added `ResponseBody::into_string()`.
- Added `ResponseBody::from_bytes()`.
- Added the `cloud` module with types for configuring clients to use different Azure clouds.
- Implemented `AsRef<[u8]>` and `Deref<Target = [u8]>` for `ResponseBody`.

### Breaking Changes

- Changed `ClientOptions::retry` from `Option<RetryOptions>` to `RetryOptions`.
- Changed `DeserializeWith::deserialize_with()` to be sync.
- Changed `Pipeline::send()` to return a `Result<RawResponse>`.
- Changed `RawResponse::body()` to return a `&ResponseBody` instead of `&Bytes`. `ResponseBody` wraps `&Bytes`, and implements `AsRef<[u8]>` and `Deref<Target = [u8]>`.
- Changed `RawResponse::into_body()` to return a `ResponseBody` instead of `Bytes`. `ResponseBody` wraps `&Bytes`, and implements `AsRef<[u8]>` and `Deref<Target = [u8]>`.
- Changed `RawResponse::json()` from `async` to a sync function. The body was already buffered.
- Changed `RawResponse::xml()` from `async` to a sync function. The body was already buffered.
- Changed `Response<T, F>` to fully sync; it holds a `RawResponse` that was already buffered entirely from the service so no longer needs or defines async functions.
- Changed `ResponseBody::json()` and `xml()` to borrow `self`.
- Removed `create_extensible_enum` and `create_enum` macros.
- Removed `BufResponse::json()`.
- Removed `BufResponse::xml()`.
- Removed `CustomHeadersPolicy` from public API.
- Removed `ErrorKind::http_response()`. Construct an `ErrorResponse::HttpResponse` variant instead.
- Removed `ExponentialRetryPolicy` from public API.
- Removed `FixedRetryPolicy` from public API.
- Removed `LoggingPolicy` from public API.
- Removed `NoRetryPolicy` from public API.
- Removed implementation of `Stream` for `ResponseBody`.
- Removed several unreferenced HTTP headers and accessor structures for those headers.
- Renamed `TransportOptions::new_custom_policy()` to `Transport::with_policy()`.
- Renamed `TransportOptions` to `Transport`.
- Renamed a number of construction functions for `Error` to align with [guidelines](https://azure.github.io/azure-sdk/rust_introduction.html)
  - Renamed `Error::full()` to `Error::with_error()`.
  - Renamed `Error::with_message()` to `Error::with_message_fn()`.
  - Renamed `Error::message()` to `Error::with_message()`.
  - Renamed `Error::with_context()` to `Error::with_context_fn()`.
  - Renamed `Error::context()` to `Error::with_context()`.
  - Renamed `ResultExt::map_kind()` to `ResultExt::with_kind()`.
  - Renamed `ResultExt::with_context()` to `ResultExt::with_context_fn()`.
  - Renamed `ResultExt::context()` to `ResultExt::with_context()`.
- Replaced implementation of `From<BufResponse>` for `Response<T, F>` to `From<RawResponse>`.
- Replaced implementation of `From<Response<T, F>>` for `BufResponse` to `From<AsyncResponse<T>>`.

### Bugs Fixed

- `ErrorKind::HttpResponse { raw_response, .. }` may have been incorrectly `None`.

## 0.28.0 (2025-09-11)

### Features Added

- Added `RawResponse` to `ErrorKind::HttpResponse` that contains the HTTP status code, headers, and complete error response body.
- Added `RequestContent::from_slice()`.
- Added `TokenRequestOptions { method_options: ClientMethodOptions }`.
- Added `TryFrom<T> for RequestContent<T, JsonFormat>` for JSON primitives.
- Added support for WASM to the `async_runtime` module.
- Added logging policy to log HTTP requests and responses in the pipeline. As a part of this change, sanitization support was added to places which log HTTP headers and URLs. The `azure_core::http::ClientOptions` has been enhanced with a `LoggingOptions` which allows a user/service client to specify headers or URL query parameters which should be allowed. Note that the sanitization feature is disabled if you build with the `debug` feature enabled.
- Added support for a new `azure_core::error::http::ErrorResponse` structure which describes an error according to the Azure REST API guidelines.
- Added a new `azure_core::http::check_success(BufResponse)` function to convert a buffered response to an `ErrorKind::HttpResponse`.

### Breaking Changes

- Added a lifetime parameter to `TokenRequestOptions`.
- Added the ability to configure pipeline configuration independently from `ClientOptions`. This adds a new optional `PipelineOptions` parameter to `azure_core::http::Pipeline::new()`. If not specified, it defaults to the expected options for `azure_core` services.
- Changed `FromStr for RequestContent<T, F>` to `RequestContent::from_str()`.
- Changed `TryFrom<&'static str> for RequestContent<T, F>` to `RequestContent::from_static()`.
- Changed `TryFrom<Bytes> for RequestContent<T, F>` to `From<Bytes> for RequestContent<T, F>` because it was already infallible.
- Removed `TryFrom<Vec<u8>> for RequestContent<T, F>` since `RequestContent::from()` already exists.
- Removed feature `reqwest_rustls_tls`. See [README.md](https://github.com/heaths/azure-sdk-for-rust/blob/main/sdk/core/azure_core/README.md) for alternative HTTP client configuration.
- Removed the `fs` module including the `FileStream` and `FileStreamBuilder` types. Moved to `examples/` for `typespec_client_core` to copy if needed.
- Removed the `setters` macro.
- Renamed `RawResponse` to `BufResponse`. New `RawResponse` contains complete body as `Bytes` used in `ErrorKind::HttpResponse`.

## 0.27.0 (2025-08-01)

### Features Added

- Added support for distributed tracing macros in Azure service clients, including convenience macros `#[tracing::new]`, `#[tracing::client]` and `#[tracing::function]` to reduce implementation details. See [distributed tracing in rust](https://github.com/Azure/azure-sdk-for-rust/blob/main/doc/distributed-tracing-for-rust-service-clients.md) for more information on distributed tracing.

### Breaking Changes

- `Pager::from_callback` and `PageIterator::from_callback` define a parameter of type `PagerState<C>` instead of `Option<C>`, where `None` => `Initial` and `Some(C)` => `More(C)`.
- `Poller::from_callback` defines a parameter of type `PollerState<N>` instead of `Option<N>`, where `None` => `Initial` and `Some(N)` => `More(N)`.

## 0.26.0 (2025-07-10)

### Features Added

- Added `get_async_runtime()` and `set_async_runtime()` to allow customers to replace the asynchronous runtime used by the Azure SDK.
- Added `PageIterator::continuation_token()` and `PageIterator::with_continuation_token()` to support reconstructing a `PageIterator` in another process or on another machine to continue paging.
- Added `Poller<T>` for long-running operations (LROs).
- Added `Request::set_method()` to allow changing the HTTP method of a request.
- Added `StatusMonitor` for long-running operations.

### Breaking Changes

- Added `http::PollerOptions` parameter to `http::poller::get_retry_after`.
- Implemented `FromStr` where `FromStr::Err = Infallible` for `PollerStatus` instead of `From<&str>`.
- Minimum supported Rust version (MSRV) is now 1.85.
- `azure_core::http::Pipeline::new` now takes an `azure_core::http::ClientOptions` which is defined in `azure_core`, but convertible to `typespec_client_core::http::ClientOptions`.
- Moved `process::Executor` to `azure_identity`.
- Removed `Pipeline::replace_policy`.
- Removed unused `location` and `body` modules from `http::poller`.
- Renamed `azure_core::date` to `azure_core::time` and added `azure_core::time::Duration` as the standard "duration" type for the SDK.
- Renamed `http::poller::body_content` to `http::poller::body`.
- Renamed `PagerResult::More { next }` to `continuation`.
- Renamed `PollerStatus::Other` to `PollerStatus::UnknownValue` following [guidelines](https://azure.github.io/azure-sdk/rust_introduction.html#rust-enum-extensible).
- Renamed `TelemetryOptions` to `UserAgentOptions`.
- Renamed `TelemetryPolicy` to `UserAgentPolicy`.

### Other Changes

- The `CustomHeadersPolicy` is executed after the retry policy in the `Pipeline`.

## 0.25.0 (2025-06-06)

### Features Added

- Added `#[safe]` attribute helper for `SafeDebug` derive macro to show or hide types and members as appropriate.
- Added `Page` trait to facilitate the `ItemIterator`.
- Added `PageIterator` to asynchronously iterate all pages.

### Breaking Changes

- A `Pager` now asynchronously iterates over items across all pages. Call `Pager::into_pages()` to get a `PageIterator` to asynchronously iterate over all pages.
- Removed `AccessToken::is_expired()`.
- Renamed `PagerResult::Continue` to `More` and its `continuation` field to `next`.
- Renamed `PagerResult::Complete` to `Done`.
- Renamed `PageStream` to `ItemIterator`.

### Bugs Fixed

- `BearerTokenCredentialPolicy` returns an error when a proactive token refresh attempt fails

## 0.24.0 (2025-05-02)

### Features Added

- Added `TaskSpawner` abstraction to spawn asynchronous tasks for different async runtimes. Defaults to optional `tokio` runtime.

### Breaking Changes

- `PagerResult` always returns items of type `T` instead of `Response<T>`.

### Other Changes

- Deriving `SafeDebug` formats non-exhaustive types by default. Enable `debug` feature to format normal `Debug` output.
- Updated dependencies.

## 0.23.0 (2025-04-08)

### Features Added

- Added `azure_core::process::Executor` to run commands asynchronously.
  The `tokio` feature is disabled by default so `std::process::Command` is used; otherwise, if enabled, `tokio::process::Command` is used.
- Added `http` module containing all functions, modules, and types from `typespec_client_core::http`.
- Added `azure_core::http::policies::ClientRequestIdPolicy` to every pipeline. Client libraries can add with custom header name instead.
- Moved `Pager` from `typespec_client_core::http` to `azure_core::http` module since it is Azure-specific.
- Re-exported `Body`, `Request`, and `RequestContent` from `http::request` module.
- Re-exported `create_enum`, `create_extensible_enum` macros from `typespec_client_core`.
- Re-exported `Model` and `Response` from `http::response` module.

### Breaking Changes

- Removed `azure_core::credentials::TokenCredential::clear_cache()`
- Consolidated all the `tokio` features into a single feature named `tokio`. Traits remain separate but `tokio` support is enabled with a single feature.
- Moved `AppendToUrlQuery` type under `http` module.
- Moved `ByteStream` and `SeekableStream` types under `stream` module.
- Moved `ClientMethodOptions` type under `http` module.
- Moved `ClientOptions` type under `http` module.
- Moved `Context` type under `http` module.
- Moved `Etag` type under `http` module.
- Moved `ExponentialRetryOptions` type under `http` module.
- Moved `FixedRetryOptions` type under `http` module.
- Moved `headers` module under `http` module.
- Moved `HttpClient` type under `http` module.
- Moved `LeaseAction` type under `http` module.
- Moved `LeaseDuration` type under `http` module.
- Moved `LeaseState` type under `http` module.
- Moved `LeaseStatus` type under `http` module.
- Moved `Method` type under `http` module.
- Moved `new_http_client` function under `http` module.
- Moved `Pipeline` type under `http` module.
- Moved `policies` module under `http` module.
- Moved `request` module under `http` module.
- Moved `response` module under `http` module.
- Moved `RetryOptions` type under `http` module.
- Moved `StatusCode` type under `http` module.
- Moved `TelemetryOptions` type under `http` module.
- Moved `TransportOptions` type under `http` module.
- Moved `Url` type under `http` module.
- Removed `content_type` module.
- Removed `EMPTY_BODY` constant from root.
- Removed `future!()` macro.
- Removed `Header` re-export from `http` module. It is still defined in the `http::headers` module.
- Removed `parsing` module.
- Removed `query_param` module.
- Removed `RequestId` type alias from root.
- Removed `SessionToken` type alias from root.
- Renamed `lro` module to `http::poller` module.
- Renamed `lro` module types with prefix "Lro" to prefix "Poller".
- Renamed `tokio` module to `fs` since it contained only the `typespec_client_core::fs` module members.

## 0.22.0 (2025-02-18)

### Features Added

- Initial supported release.
