@@ -77,49 +77,49 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7777- ` HTTP.base_uri ` for setting a base URI that resolves relative request paths
7878 per RFC 3986. Supports chaining (`HTTP.base_uri("https://api.example.com/v1 ")
7979 .get("users")` ), and integrates with ` persistent` connections by deriving the
80- host when omitted (#519 , #512 , #493 )
80+ host when omitted ([ #519 ] , [ #512 ] , [ #493 ] )
8181- ` Request::Body#loggable? ` and ` Response::Body#loggable? ` predicates, and a
8282 ` binary_formatter ` option for the logging feature. Binary bodies
8383 (IO/Enumerable request sources, binary-encoded request strings, and
8484 binary-encoded responses) are now formatted instead of dumped raw,
8585 preventing unreadable log output when transferring files like images or
8686 audio. Available formatters: ` :stats ` (default, logs byte count),
8787 ` :base64 ` (logs base64-encoded content), or a custom ` Proc ` . Invalid
88- formatter values raise ` ArgumentError ` (#784 )
88+ formatter values raise ` ArgumentError ` ([ #784 ] )
8989- ` Feature#on_request ` and ` Feature#around_request ` lifecycle hooks, called
9090 before/around each request attempt (including retries), for per-attempt side
91- effects like instrumentation spans and circuit breakers (#826 )
91+ effects like instrumentation spans and circuit breakers ([ #826 ] )
9292- Pattern matching support (` deconstruct_keys ` ) for Response, Response::Status,
93- Headers, ContentType, and URI (#642 )
93+ Headers, ContentType, and URI ([ #642 ] )
9494- Combined global and per-operation timeouts: global and per-operation timeouts
9595 are no longer mutually exclusive. Use
9696 ` HTTP.timeout(global: 60, read: 30, write: 30, connect: 5) ` to set both a
97- global request timeout and individual operation limits (#773 )
97+ global request timeout and individual operation limits ([ #773 ] )
9898
9999### Fixed
100100
101101- ` HTTP::URI.form_encode ` now encodes newlines as ` %0A ` instead of
102- ` %0D%0A ` (#449 )
102+ ` %0D%0A ` ([ #449 ] )
103103- Thread-safety: ` Headers::Normalizer ` cache is now per-thread via
104104 ` Thread.current ` , eliminating a potential race condition when multiple
105105 threads share a normalizer instance
106106- Instrumentation feature now correctly starts a new span for each retry
107107 attempt, fixing ` NoMethodError ` with ` ActiveSupport::Notifications ` when
108- using ` .retriable ` with the instrumentation feature (#826 )
108+ using ` .retriable ` with the instrumentation feature ([ #826 ] )
109109- Raise ` HTTP::URI::InvalidError ` for malformed or schemeless URIs and
110110 ` ArgumentError ` for nil or empty URIs, instead of confusing
111- ` UnsupportedSchemeError ` or ` Addressable::URI::InvalidURIError ` (#565 )
111+ ` UnsupportedSchemeError ` or ` Addressable::URI::InvalidURIError ` ([ #565 ] )
112112- Strip ` Authorization ` and ` Cookie ` headers when following redirects to a
113113 different origin (scheme, host, or port) to prevent credential leakage
114- (#516 , #770 )
114+ ([ #516 ] , [ #770 ] )
115115- AutoInflate now preserves the response charset encoding instead of
116- defaulting to ` Encoding::BINARY ` (#535 )
116+ defaulting to ` Encoding::BINARY ` ([ #535 ] )
117117- ` LocalJumpError ` when using instrumentation with instrumenters that
118118 unconditionally yield in ` #instrument ` (e.g., ` ActiveSupport::Notifications ` )
119- (#673 )
119+ ([ #673 ] )
120120- Logging feature no longer eagerly consumes the response body at debug level;
121121 body chunks are now logged as they are streamed, preserving
122- ` response.body.each ` (#785 )
122+ ` response.body.each ` ([ #785 ] )
123123
124124### Removed
125125
@@ -133,7 +133,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
133133 and excluding user info from the origin string
134134- ` HTTP::URI#request_uri ` is no longer delegated to ` Addressable::URI `
135135- ` HTTP::URI#omit ` is no longer delegated to ` Addressable::URI ` and now
136- returns ` HTTP::URI ` instead of ` Addressable::URI ` (#491 )
136+ returns ` HTTP::URI ` instead of ` Addressable::URI ` ([ #491 ] )
137137- ` HTTP::URI#query_values ` and ` HTTP::URI#query_values= ` delegations to
138138 ` Addressable::URI ` . Query parameter merging now uses stdlib
139139 ` URI.decode_www_form ` /` URI.encode_www_form `
@@ -142,7 +142,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
142142 normalizer now inlines these operations directly
143143- ` HTTP::URI#join ` is no longer delegated to ` Addressable::URI ` and now
144144 returns ` HTTP::URI ` instead of ` Addressable::URI ` . Uses stdlib ` URI.join `
145- with automatic percent-encoding of non-ASCII characters (#491 )
145+ with automatic percent-encoding of non-ASCII characters ([ #491 ] )
146146- ` HTTP::URI.form_encode ` no longer delegates to ` Addressable::URI ` . Uses
147147 stdlib ` URI.encode_www_form ` instead
148148
@@ -168,19 +168,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
168168 ` HTTP::Options ` into ` HTTP::Client#perform ` , eliminating the need for
169169 separate ` Retriable::Client ` and ` Retriable::Session ` classes
170170- Improved error message when request body size cannot be determined to suggest
171- setting ` Content-Length ` explicitly or using chunked ` Transfer-Encoding ` (#560 )
171+ setting ` Content-Length ` explicitly or using chunked ` Transfer-Encoding ` ([ #560 ] )
172172- ** BREAKING** ` Connection#readpartial ` now raises ` EOFError ` instead of
173173 returning ` nil ` at end-of-stream, and supports an ` outbuf ` parameter,
174174 conforming to the ` IO#readpartial ` API. ` Body#readpartial ` and
175- ` Inflater#readpartial ` also raise ` EOFError ` (#618 )
175+ ` Inflater#readpartial ` also raise ` EOFError ` ([ #618 ] )
176176- ** BREAKING** Stricter timeout options parsing: ` .timeout() ` with a Hash now
177- rejects unknown keys, non-numeric values, string keys, and empty hashes (#754 )
177+ rejects unknown keys, non-numeric values, string keys, and empty hashes ([ #754 ] )
178178- Bumped min llhttp dependency version
179- - ** BREAKING** Handle responses in the reverse order from the requests (#776 )
179+ - ** BREAKING** Handle responses in the reverse order from the requests ([ #776 ] )
180180- ** BREAKING** ` Response#cookies ` now returns ` Array<HTTP::Cookie> ` instead of
181181 ` HTTP::CookieJar ` . The ` cookies ` option has been removed from ` Options ` ;
182182 ` Chainable#cookies ` now sets the ` Cookie ` header directly with no implicit
183- merging — the last ` .cookies() ` call wins (#536 )
183+ merging — the last ` .cookies() ` call wins ([ #536 ] )
184184- Cookie jar management during redirects moved from ` Redirector ` to ` Session ` .
185185 ` Redirector ` is now a pure redirect-following engine with no cookie
186186 awareness; ` Session#request ` manages cookies across redirect hops
@@ -189,14 +189,44 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
189189 ` HTTP::Options.new(response: :body) ` continues to work, but
190190 ` HTTP::Options.new({response: :body}) ` must be updated to
191191 ` HTTP::Options.new(**options) ` . Invalid option names now raise
192- ` ArgumentError ` automatically (#447 )
192+ ` ArgumentError ` automatically ([ #447 ] )
193193
194194### Removed
195195
196196- ** BREAKING** Drop Ruby 2.x support
197197- ** BREAKING** Remove ` Headers::Mixin ` and the ` [] ` /` []= ` delegators on
198198 ` Request ` and ` Response ` . Use ` request.headers["..."] ` and
199- ` response.headers["..."] ` instead (#537 )
199+ ` response.headers["..."] ` instead ([ #537 ] )
200200
201+ [ #223 ] : https://github.com/httprb/http/issues/223
202+ [ #358 ] : https://github.com/httprb/http/issues/358
201203[ #371 ] : https://github.com/httprb/http/issues/371
204+ [ #447 ] : https://github.com/httprb/http/issues/447
205+ [ #448 ] : https://github.com/httprb/http/issues/448
206+ [ #449 ] : https://github.com/httprb/http/issues/449
207+ [ #491 ] : https://github.com/httprb/http/issues/491
208+ [ #493 ] : https://github.com/httprb/http/pull/493
209+ [ #512 ] : https://github.com/httprb/http/issues/512
210+ [ #516 ] : https://github.com/httprb/http/issues/516
211+ [ #519 ] : https://github.com/httprb/http/issues/519
212+ [ #535 ] : https://github.com/httprb/http/issues/535
213+ [ #536 ] : https://github.com/httprb/http/issues/536
214+ [ #537 ] : https://github.com/httprb/http/issues/537
215+ [ #544 ] : https://github.com/httprb/http/issues/544
216+ [ #560 ] : https://github.com/httprb/http/pull/560
217+ [ #565 ] : https://github.com/httprb/http/issues/565
218+ [ #566 ] : https://github.com/httprb/http/issues/566
219+ [ #579 ] : https://github.com/httprb/http/issues/579
220+ [ #618 ] : https://github.com/httprb/http/pull/618
221+ [ #642 ] : https://github.com/httprb/http/issues/642
222+ [ #667 ] : https://github.com/httprb/http/issues/667
223+ [ #673 ] : https://github.com/httprb/http/issues/673
224+ [ #739 ] : https://github.com/httprb/http/issues/739
225+ [ #754 ] : https://github.com/httprb/http/pull/754
226+ [ #770 ] : https://github.com/httprb/http/issues/770
227+ [ #773 ] : https://github.com/httprb/http/issues/773
228+ [ #776 ] : https://github.com/httprb/http/issues/776
229+ [ #784 ] : https://github.com/httprb/http/issues/784
230+ [ #785 ] : https://github.com/httprb/http/issues/785
231+ [ #826 ] : https://github.com/httprb/http/issues/826
202232[ unreleased ] : https://github.com/httprb/http/compare/v5.3.0...main
0 commit comments