ossify 0.4.2

A modern, easy-to-use, and reqwest-powered Rust SDK for Alibaba Cloud Object Storage Service (OSS)
Documentation
# Changelog

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

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.4.2] – 2026-05-19

### Added

- Mirrored `reqwest` TLS backend features at the `ossify` crate level:
  `default-tls`, `rustls`, `rustls-no-provider`, `native-tls`,
  `native-tls-vendored`, `native-tls-no-alpn`, and
  `native-tls-vendored-no-alpn`.
- Added GitHub Actions CI and release workflows, with feature-combination
  checks driven through `cargo-hack`.

### Changed

- The default TLS backend now follows `reqwest`'s `default-tls` feature.
  `reqwest` itself is still built with `default-features = false`, and TLS
  selection is controlled through `ossify` features.
- Tests no longer install a rustls crypto provider manually through a
  `rustls` dev-dependency, so default-client construction is validated
  through the crate's public feature graph.

### Fixed

- Explicit endpoint ports are preserved when building request URLs and `Host`
  headers, including custom endpoints such as `http://127.0.0.1:9000` and
  bracketed IPv6 endpoints. This keeps OSS V4 signing aligned with the actual
  HTTP authority.

## [0.4.1] – 2026-05-06

### Changed

- `DefaultCredentialsChain` no longer wraps the chain in an extra
  `CachingCredentialsProvider`. `RrsaCredentialsProvider` already caches
  STS credentials internally; caching env-var credentials at the outer
  layer would hide rotated keys.
- `DefaultCredentialsChainBuilder` drops the now-redundant `refresh_skew`
  and `session_duration_seconds` builder methods.

### Added – credentials

- `RrsaCredentialsProvider::from_env` now reads two provisional
  environment variables (names are not part of any official Alibaba Cloud
  SDK convention and may change if the vendor standardises them):
  - `ALIBABA_CLOUD_SESSION_DURATION_SECONDS` — overrides the STS session
    duration (default 3600 s).
  - `ALIBABA_CLOUD_CREDENTIALS_REFRESH_SKEW_SECONDS` — how many seconds
    before expiration to proactively refresh credentials (default 300 s).

## [0.4.0] – 2026-04-28

### Overview

`v0.4.0` is a **full-surface** release: ossify now covers every API
listed in the [official OSS operations index](https://www.alibabacloud.com/help/en/oss/developer-reference/list-of-operations-by-function)
plus the dedicated Vector Bucket endpoint family. The release adds ~170
new operations across a dozen categories, generalises the transport
plumbing to support JSON bodies and binary frame streams, and includes
several infrastructure improvements.

**Breaking changes**: this is a pre-1.0 release; several signatures have
been refined (see below) compared to `v0.3.x`.

### Added – categories & APIs

#### Service (account-level, `USE_BUCKET=false`)

- `DescribeRegions`
- `ListUserDataRedundancyTransition`
- `InitUserAntiDDosInfo`, `UpdateUserAntiDDosInfo`, `GetUserAntiDDosInfo`
- `PutPublicAccessBlock`, `GetPublicAccessBlock`, `DeletePublicAccessBlock`
- Resource Pool basics + per-requester QoS + bucket-group QoS
  (12 operations under `ops::service::resource_pool`)

#### Bucket

- `access_monitor/` — Put/Get
- `access_point/` — Create/Get/Delete/ListAccessPoints, Put/Get/Delete
  AccessPointPolicy
- `object_fc_access_point/` — Object-FC access point (9 operations)
- `anti_ddos/` — Init/Update/Get
- `archive_direct_read/` — Put/Get
- `cname/` — Create/Delete/List CnameToken, Put/Get BucketCnameToken
- `cors/` — Put/Get/Delete + GetBucketOptions (preflight)
- `data_accelerator/` — Put/Get/Delete
- `data_indexing/` — Open/Get/Close + DoMetaQuery
- `encryption/` — Put/Get/Delete
- `https_config/` — Put/Get
- `inventory/` — Put/Get/List/Delete
- `lifecycle/` — Put/Get/Delete
- `live_channel/` — 9 operations (RTMP / HLS / VOD playlist)
- `logging/` — Put/Get/Delete + CNAME variants
- `policy/` — Put/Get/Delete/GetPolicyStatus
- `public_access_block/` — Put/Get/Delete (+ access-point variants)
- `qos/` + `requester_qos/` — 7 operations
- `redundancy_transition/` — Create/Get/Delete/List
- `referer/` — Put/Get
- `replication/` — 6 operations
- `request_payment/` — Put/Get
- `resource_group/`, `resource_pool_bucket_group/` — 3 operations
- `retention/` — 5 WORM operations
- `style/` — Put/Get/List/Delete
- `tagging/` — Put/Get/Delete
- `transfer_acceleration/` — Put/Get
- `versioning/` — Put/Get + RestoreObject
- `website/` — Put/Get/Delete

#### Object

- `base/` — AppendObject, SealAppendObject, GetObjectMeta,
  DeleteMultipleObjects, RestoreObject, CleanRestoredObject,
  PostObject (V1 + V4 signing helpers) and Callback helpers
- `acl/` — Put/Get
- `folder/` (HNS) — CreateDirectory, Rename, DeleteDirectory
- `multipart_upload/` — ListMultipartUploads, ListParts, UploadPartCopy
- `select/`**SelectObject** and **CreateSelectObjectMeta** with a
  full binary frame-stream decoder (`SelectFrame`, `SelectFrameStream`)
  supporting CSV + JSON inputs, optional payload CRC-32, and typed
  request/response models
- `symbolic_link/` — Put/Get
- `tagging/` — Put/Get/Delete

#### Vector Bucket (`ops::vector_bucket`, dedicated `oss-vectors` endpoint)

- `bucket/` — Put/Get/List/Delete VectorBucket (13 JSON APIs total)
- `index/` — Put/Get/List/Delete VectorIndex
- `vectors/` — Put/Get/List/Delete/Query Vectors with a typed
  MongoDB-style filter DSL (`VectorFilter::{eq,ne,is_in,not_in,exists,
and,or,Raw}`) and `top_k` ANN search

### Added – infrastructure

- `body::JSONBody<T>` — JSON request body encoder (for Vector Bucket).
- `response::StreamResponseProcessor` — returns the raw
  `reqwest::Response` so callers can consume streamed / framed bodies
  (used by SelectObject and CreateSelectObjectMeta).
- `ops::common::qos::{QoSConfiguration, RequesterQoSInfo}`,
  `ops::common::resource_pool::*`, `ops::common::live_channel::*`,
  `ops::common::vector::*`, `ops::common::acl::ObjectAcl` and many more
  shared XML/JSON types.
- `SelectFrame` wire-format decoder with IEEE CRC-32 payload
  verification (via `crc32fast`).

### Added – credentials

- `RrsaCredentialsProvider` — OIDC-token → STS credentials exchange
  with automatic refresh, for ACK (Alibaba Cloud Kubernetes) pods.
- `DefaultCredentialsChain` — walks environment credentials and RRSA
  when neither explicit AK/SK nor a provider is supplied.

### Changed

- `Error::ApiError { status_code, message }` replaces the older
  opaque HTTP-error variant; consumers can now pattern-match on OSS
  response codes directly.
- README re-written to cover every category and every advanced
  feature; code snippets updated to compile against the current API.

### Fixed

- Query-string serializer: a sequence of `(key, value)` tuples (for
  example `Vec<(&str, &str)>`) now serialises to
  `"key1=value1&key2=value2"` instead of concatenating the raw
  values. Two bugs in `src/ser/` were addressed:
  1. `PairSerializer` dropped the key when it got the value — it
     wrote only `value` instead of `key=value`.
  2. `SeqSerializer` / `TupleSerializer` never emitted `&` between
     elements and never skipped empty `(key, None)` pairs.
     The serializer now writes each pair into a scratch buffer, skips
     entries whose value is `None` / unit, and inserts `&` between
     non-empty pairs. Unblocks the previously long-standing
     `ser::tests::test_serialize_tags` failure.

### Dependencies

- Added `crc32fast = "1.5"`.
- Kept in sync with `reqwest = "0.13"` and mirrors its TLS backend features,
  `quick-xml = "0.39"`, `serde_with = "3.14"`, `jiff = "0.2"`.

### Test & quality

- Lib test count grew from the `v0.3.x` baseline to **530 passing
  tests** (all green — the `ser::tests::test_serialize_tags` failure
  inherited from earlier releases was fixed as part of this cycle).
- `cargo clippy --lib --tests` is clean.

## [0.3.x] and earlier

Earlier versions bootstrapped the signing pipeline, covered
`PutBucket` / `GetBucketInfo` / `ListObjects`, basic object CRUD and
multipart uploads, presigned URLs, and the core credential providers.
See the git history for details.

[0.4.2]: https://github.com/honsunrise/ossify/releases/tag/v0.4.2
[0.4.1]: https://github.com/honsunrise/ossify/releases/tag/v0.4.1
[0.4.0]: https://github.com/honsunrise/ossify/releases/tag/v0.4.0