Skip to content

Tags: modern-python/httpware

Tags

0.17.2

Toggle 0.17.2's commit message

Verified

This tag was signed with the committer’s verified signature.
lesnik512 Artur Shiriev
httpware 0.17.2

0.17.1

Toggle 0.17.1's commit message

Verified

This tag was signed with the committer’s verified signature.
lesnik512 Artur Shiriev
httpware 0.17.1

0.17.0

Toggle 0.17.0's commit message

Verified

This tag was signed with the committer’s verified signature.
lesnik512 Artur Shiriev
httpware 0.17.0

0.16.1

Toggle 0.16.1's commit message

Verified

This tag was signed with the committer’s verified signature.
lesnik512 Artur Shiriev
httpware 0.16.1

0.16.0

Toggle 0.16.0's commit message
Release 0.16.0 — free-threading (nogil) support

0.15.2

Toggle 0.15.2's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
release: add 0.15.2 notes (#107)

No public API changes since 0.15.1 — docs accuracy fixes, the
sync/async dedup refactor series closing out the 2026-06-14 deep
audit's duplication list, and CI/planning tooling.

0.15.1

Toggle 0.15.1's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
ci: publish to PyPI via Trusted Publishing (OIDC) (#89)

* ci: publish to PyPI via Trusted Publishing (OIDC)

Drop the long-lived PYPI_TOKEN secret in favor of OIDC. uv publish
auto-detects the GitHub Actions id-token, so the release job grants
id-token: write and runs under a `pypi` environment that scopes the
PyPI Trusted Publisher.

Requires a matching Trusted Publisher on the httpware PyPI project
(workflow: release.yml, environment: pypi) before the next tag.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* ci: drop PYPI_TOKEN guard from publish recipe

OIDC publishing sets no PYPI_TOKEN, so the guard would abort the run.
The GITHUB_REF_NAME check still refuses to run outside CI.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* docs(release): add 0.15.1 notes (Trusted Publishing pipeline)

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>

0.15.0

Toggle 0.15.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
feat!: status-agnostic response-body cap (max_response_body_bytes) (#78)

* feat: add reason discriminator to ResponseTooLargeError

Status-agnostic semantics + explicit declared/streamed trip mode, ahead of
the max_response_body_bytes cap rework. Existing stream() Content-Length
checks pass reason="declared"; restructured in a later task.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* feat: add pure _accumulate_capped core with property test

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* feat: add shared _read_capped streaming accumulator

_read_capped / _read_capped_async wrap the pure core with the Content-Length
early-reject and the buffered Response rebuild; _safe_extensions drops the
stale network_stream. Caller owns the stream lifecycle.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* feat!: replace max_error_body_bytes with max_response_body_bytes

Status-agnostic, decoded-byte cap enforced at the non-streaming terminal via a
streaming capped-accumulator (send(stream=True) + _read_capped). Branches on
cap is None so the default path keeps plain send() and .elapsed. Construction
validates >= 1. The old error-only param is removed (pre-1.0, no shim).

BREAKING CHANGE: max_error_body_bytes is replaced by max_response_body_bytes.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* feat: bound stream() error pre-read via _read_capped

Both stream() error branches route the 4xx/5xx pre-read through the shared
accumulator when a cap is set, so chunked/compression-bombed error bodies are
caught instead of read unbounded; exc.response.content stays populated.
User-driven success streaming is never capped.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* test: lock ResponseTooLargeError resilience semantics

Cap trips are not retried, do not trip the circuit breaker, and an over-cap
retryable 5xx surfaces as ResponseTooLargeError (cap-wins). No prod change —
these assert the behavior that falls out of the ClientError hierarchy.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* docs: promote response-body cap into architecture; retire deferred item

Rewrite architecture/client.md 'Bounded response bodies' and the errors.md
ResponseTooLargeError entry for the status-agnostic decoded-byte cap; remove the
actioned deferred item; add the 0.15.0 release note; check in the change bundle
(design.md + plan.md).

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* docs(planning): mark response-body-cap bundle shipped (#78)

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* fix: correct capped-rebuild header handling + skip bodiless responses

Two bugs in the capped read path found in review of #78:

- The rebuilt Response kept content-encoding while holding already-decoded
  content, so httpx2 re-decompressed and crashed on every compressed body under
  the cap. Strip content-encoding / transfer-encoding / (compressed)
  content-length via _buffered_headers; httpx2 recomputes content-length.
- A bodiless response (HEAD / 204 / 304) with a large declared Content-Length
  was falsely rejected. _response_has_body short-circuits these: read the empty
  body and return the original response unchanged, preserving its headers (HEAD
  legitimately echoes the entity length).

Adds within-cap compressed-body and bodiless regression tests at the
_read_capped, send(), and stream() levels.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>

0.14.0

Toggle 0.14.0's commit message

Verified

This commit was signed with the committer’s verified signature.
lesnik512 Artur Shiriev
chore(planning): archive circuit-breaker-state bundle, ship 0.14.0 (#70)

Post-merge bookkeeping for PR #70: fill the 0.14.0 release-notes PR number,
mark the bundle shipped (pr: 70), move it active -> archive, flip its Index
line to Archived, and trim the deferred CircuitBreaker entry to just manual
control now that read-only state has shipped.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

0.13.0

Toggle 0.13.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
feat(circuit-breaker): time-based failure-rate trip mode (0.13.0) (#69)

* feat(circuit-breaker): add time-bucketed _RollingWindow recorder

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* feat(circuit-breaker): thread rate-mode config + validation

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* feat(circuit-breaker): rate-over-window trip mode

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* test(circuit-breaker): assert rate-mode circuit.opened attributes

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* docs(circuit-breaker): document rate mode; 0.13.0 release notes

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* docs(planning): add the circuit-breaker-rate-mode change bundle

Design + plan for the opt-in time-based failure-rate trip mode, and the
Active Index entry. Bundle stays active/draft until merge.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* docs(circuit-breaker): document rate mode in the module docstring

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* chore(planning): archive the circuit-breaker-rate-mode bundle (#69)

Ship bookkeeping for PR #69: fill the 0.13.0 release-notes PR number, mark
the bundle shipped (pr: 69), move it from changes/active/ to changes/archive/,
flip its Index line to Archived, and trim the deferred "CircuitBreaker v2" item
to the still-open axes (count-based window, manual control + state).

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

* docs(circuit-breaker): clarify mode-switch precedence and cross-mode validation

Address PR #69 review: note that failure_rate_threshold is the sole mode
switch (both-set → rate wins, not an error), and that window_seconds /
minimum_calls are validated in both modes even when inert in classic.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>