@@ -23,6 +23,7 @@ title: Changelog
2323
2424## Table of Contents
2525
26+ - [ 3.17.0] ( #3170 )
2627- [ 3.16.0] ( #3160 )
2728- [ 3.15.0] ( #3150 )
2829- [ 3.14.1] ( #3141 )
@@ -84,6 +85,135 @@ title: Changelog
8485- [ 0.7.0] ( #070 )
8586- [ 0.6.0] ( #060 )
8687
88+ ## 3.17.0
89+
90+ ** The changes marked with :warning : are not backward compatible.**
91+
92+ ### Change
93+
94+ - :warning : change(auth): require configured jwt claims, harden empty claims_to_verify and key-auth anonymous fallback [ #13468 ] ( https://github.com/apache/apisix/pull/13468 )
95+ - :warning : enforce algorithm match before signature verification in jwt-auth plugin [ #13182 ] ( https://github.com/apache/apisix/pull/13182 )
96+ - :warning : remove server-side token generation endpoint (` /apisix/plugin/jwe/encrypt ` ) from jwe-decrypt plugin [ #13464 ] ( https://github.com/apache/apisix/pull/13464 )
97+ - :warning : require admin key for the schema validate endpoint [ #13328 ] ( https://github.com/apache/apisix/pull/13328 )
98+ - :warning : bound batch-requests pipeline item count, timeout, and tighten request schema [ #13492 ] ( https://github.com/apache/apisix/pull/13492 )
99+ - :warning : default signed_headers to [ "date"] in hmac-auth plugin [ #13388 ] ( https://github.com/apache/apisix/pull/13388 )
100+ - :warning : sign request URI cookie and tighten cookie attributes in cas-auth plugin (new required ` cookie.secret ` ) [ #13331 ] ( https://github.com/apache/apisix/pull/13331 )
101+ - :warning : add consumer_isolation (default true) and cache_set_cookie options to proxy-cache plugin [ #13350 ] ( https://github.com/apache/apisix/pull/13350 )
102+ - :warning : add ssl_verify option (default true) and fix shared state in tencent-cloud-cls plugin [ #13194 ] ( https://github.com/apache/apisix/pull/13194 )
103+ - :warning : address TLS ssl_verify hardcoding and credential encryption issues (ai-rag ssl_verify now defaults to true) [ #13203 ] ( https://github.com/apache/apisix/pull/13203 )
104+ - :warning : resolve env vars before YAML parsing to preserve types in standalone mode [ #13078 ] ( https://github.com/apache/apisix/pull/13078 )
105+
106+ ### Core
107+
108+ - feat: support batch TCP/UDP port ranges in stream_proxy config [ #13153 ] ( https://github.com/apache/apisix/pull/13153 )
109+ - feat(admin): make /configs/validate available in all modes [ #13220 ] ( https://github.com/apache/apisix/pull/13220 )
110+ - feat: add core.response.get_response_source() API for response origin classification [ #13224 ] ( https://github.com/apache/apisix/pull/13224 )
111+ - feat: add rate-limiting-info variable [ #13155 ] ( https://github.com/apache/apisix/pull/13155 )
112+ - feat: enhance encrypt_fields to support nested structures [ #13192 ] ( https://github.com/apache/apisix/pull/13192 )
113+ - feat: extend secret references to all plugins with central resolution [ #13312 ] ( https://github.com/apache/apisix/pull/13312 )
114+ - perf(core): cache parsed JSON request body to avoid redundant decoding [ #13377 ] ( https://github.com/apache/apisix/pull/13377 )
115+ - perf(ctx): cache parsed request body to avoid repeated decode for post_arg.* [ #13356 ] ( https://github.com/apache/apisix/pull/13356 )
116+ - refactor: extract reusable building blocks from K8s and Nacos discovery [ #13201 ] ( https://github.com/apache/apisix/pull/13201 )
117+ - refactor: extract reusable building blocks from Consul discovery [ #13230 ] ( https://github.com/apache/apisix/pull/13230 )
118+ - fix: replace module-level mutable tables with per-call allocation [ #13369 ] ( https://github.com/apache/apisix/pull/13369 )
119+ - fix: add null_as_nil option to core.json.decode for AI plugins [ #13231 ] ( https://github.com/apache/apisix/pull/13231 )
120+ - fix: add schema compatibility for consumer and credential resources [ #13154 ] ( https://github.com/apache/apisix/pull/13154 )
121+ - fix(admin): use local config to fetch global rules in standalone mode [ #13122 ] ( https://github.com/apache/apisix/pull/13122 )
122+ - fix(admin): strip SSL private keys array in GET single and list responses [ #13227 ] ( https://github.com/apache/apisix/pull/13227 )
123+ - fix: split global rules phase execution for client-control compatibility [ #13345 ] ( https://github.com/apache/apisix/pull/13345 )
124+ - fix: preserve stream service plugin context [ #13402 ] ( https://github.com/apache/apisix/pull/13402 )
125+ - fix(stream/traffic-split): handle upstream_id set by plugin in stream context [ #13285 ] ( https://github.com/apache/apisix/pull/13285 )
126+ - fix(stream/traffic-split): set route_id in stream preread phase [ #13284 ] ( https://github.com/apache/apisix/pull/13284 )
127+ - fix: rebuild stream router when services change [ #13318 ] ( https://github.com/apache/apisix/pull/13318 )
128+ - fix: remove stale HTTP2 body guard [ #13428 ] ( https://github.com/apache/apisix/pull/13428 )
129+ - fix: isolate logger response body buffers [ #13450 ] ( https://github.com/apache/apisix/pull/13450 )
130+ - fix: batch-processor infinite timer loop prevents graceful shutdown [ #13288 ] ( https://github.com/apache/apisix/pull/13288 )
131+ - fix(tracer): prevent stale ctx.tracing crash on HTTPS keepalive connections [ #13232 ] ( https://github.com/apache/apisix/pull/13232 )
132+ - fix: handle missing X-Etcd-Index header gracefully in config_etcd [ #13364 ] ( https://github.com/apache/apisix/pull/13364 )
133+ - fix(core/etcd): nil-deref on response without header field [ #13361 ] ( https://github.com/apache/apisix/pull/13361 )
134+ - fix(consul): tolerate null Service.Meta in fetch_services_from_server [ #13258 ] ( https://github.com/apache/apisix/pull/13258 )
135+ - fix: address TLS security vulnerabilities in SSL log, OIDC encryption, and K8s ssl_verify [ #13190 ] ( https://github.com/apache/apisix/pull/13190 )
136+ - fix: avoid logging plaintext value when encrypt/decrypt fails in ssl.lua [ #13298 ] ( https://github.com/apache/apisix/pull/13298 )
137+ - fix: downgrade decrypt failure log from warn to info [ #13324 ] ( https://github.com/apache/apisix/pull/13324 )
138+ - fix(xrpc): bound redis command-line preallocation size [ #13483 ] ( https://github.com/apache/apisix/pull/13483 )
139+
140+ ### Plugins
141+
142+ - feat: add acl plugin [ #13349 ] ( https://github.com/apache/apisix/pull/13349 )
143+ - feat: add data-mask plugin [ #13347 ] ( https://github.com/apache/apisix/pull/13347 )
144+ - feat: add saml-auth plugin [ #13346 ] ( https://github.com/apache/apisix/pull/13346 )
145+ - feat: add dingtalk-auth plugin [ #13381 ] ( https://github.com/apache/apisix/pull/13381 )
146+ - feat: add feishu-auth plugin [ #13382 ] ( https://github.com/apache/apisix/pull/13382 )
147+ - feat(plugin): add error-page plugin [ #13380 ] ( https://github.com/apache/apisix/pull/13380 )
148+ - feat(plugin): add graphql-limit-count plugin [ #13372 ] ( https://github.com/apache/apisix/pull/13372 )
149+ - feat(plugin): add graphql-proxy-cache plugin [ #13435 ] ( https://github.com/apache/apisix/pull/13435 )
150+ - feat: add proxy-buffering plugin [ #13446 ] ( https://github.com/apache/apisix/pull/13446 )
151+ - feat: add oas-validator plugin [ #13344 ] ( https://github.com/apache/apisix/pull/13344 )
152+ - feat: add traffic-label plugin [ #13342 ] ( https://github.com/apache/apisix/pull/13342 )
153+ - feat: add exit-transformer plugin [ #13343 ] ( https://github.com/apache/apisix/pull/13343 )
154+ - feat(request-id): add UUID v7 generation support [ #13152 ] ( https://github.com/apache/apisix/pull/13152 )
155+ - feat(ai-proxy): support aws bedrock [ #13249 ] ( https://github.com/apache/apisix/pull/13249 )
156+ - feat(ai-proxy): support Bedrock ConverseStream streaming [ #13307 ] ( https://github.com/apache/apisix/pull/13307 )
157+ - feat(ai-proxy): add native Anthropic Messages API protocol support [ #13181 ] ( https://github.com/apache/apisix/pull/13181 )
158+ - feat(ai): add OpenAI Responses API (/v1/responses) support [ #13186 ] ( https://github.com/apache/apisix/pull/13186 )
159+ - feat(ai-proxy): add passthrough protocol for unrecognized API formats [ #13320 ] ( https://github.com/apache/apisix/pull/13320 )
160+ - feat(ai-proxy): rewrite Anthropic-to-OpenAI converter with whitelist body construction [ #13321 ] ( https://github.com/apache/apisix/pull/13321 )
161+ - feat(ai-proxy): add provider-aware max_tokens override with priority control [ #13251 ] ( https://github.com/apache/apisix/pull/13251 )
162+ - feat(ai-proxy): add per-protocol request_body override and rename max_tokens mapping to llm_options [ #13269 ] ( https://github.com/apache/apisix/pull/13269 )
163+ - feat(ai-proxy): add max_stream_duration_ms and max_response_bytes safeguards [ #13250 ] ( https://github.com/apache/apisix/pull/13250 )
164+ - feat(ai-proxy): abort upstream read on client disconnect during streaming [ #13254 ] ( https://github.com/apache/apisix/pull/13254 )
165+ - feat: populate upstream nginx variables when ai-proxy uses cosocket transport [ #13317 ] ( https://github.com/apache/apisix/pull/13317 )
166+ - feat(ai-rate-limiting): add expression-based limit strategy [ #13191 ] ( https://github.com/apache/apisix/pull/13191 )
167+ - feat(ai-proxy-multi): add max_retries and retry_on_failure_within_ms for fallback [ #13495 ] ( https://github.com/apache/apisix/pull/13495 )
168+ - feat(elasticsearch-logger): support dynamic index with time and variable resolution [ #13334 ] ( https://github.com/apache/apisix/pull/13334 )
169+ - feat(limit-count): upgrade lua-resty-limit-traffic to v1.2.0 [ #13212 ] ( https://github.com/apache/apisix/pull/13212 )
170+ - feat(proxy-cache): honor Vary header for memory strategy [ #13376 ] ( https://github.com/apache/apisix/pull/13376 )
171+ - feat(cas-auth): support configuring an absolute callback URL [ #13413 ] ( https://github.com/apache/apisix/pull/13413 )
172+ - feat(openid-connect): make client_secret optional for local JWT verification modes [ #13472 ] ( https://github.com/apache/apisix/pull/13472 )
173+ - feat(openid-connect): update session config to support lua-resty-session, fixes deprecated session.cookie.lifetime [ #13178 ] ( https://github.com/apache/apisix/pull/13178 )
174+ - feat(hmac-auth): add max_req_body_size to bound request body during validation [ #13478 ] ( https://github.com/apache/apisix/pull/13478 )
175+ - feat: add max_req_body_size to bound client request body in forward-auth and ai-proxy [ #13466 ] ( https://github.com/apache/apisix/pull/13466 )
176+ - refactor: three-layer AI proxy architecture (protocols/providers/transport) [ #13170 ] ( https://github.com/apache/apisix/pull/13170 )
177+ - perf(ai-proxy): optimize SSE decoder - remove PCRE, add decode_buf, fix comment lines [ #13391 ] ( https://github.com/apache/apisix/pull/13391 )
178+ - perf(ai): reuse raw request body when unchanged [ #13406 ] ( https://github.com/apache/apisix/pull/13406 )
179+ - perf(limit-count): use evalsha with NOSCRIPT fallback for Redis script execution [ #13363 ] ( https://github.com/apache/apisix/pull/13363 )
180+ - fix: sort AI proxy upstream request JSON keys [ #13461 ] ( https://github.com/apache/apisix/pull/13461 )
181+ - fix(ai-proxy-multi): stabilize domain health checks [ #13441 ] ( https://github.com/apache/apisix/pull/13441 )
182+ - fix(ai-proxy-multi): resolve _ dns_value in construct_upstream when nil [ #13322 ] ( https://github.com/apache/apisix/pull/13322 )
183+ - fix(ai-proxy): map upstream LLM timeouts to 504 instead of 500 [ #13481 ] ( https://github.com/apache/apisix/pull/13481 )
184+ - fix(ai-proxy): return 502 when streaming converter receives mismatched response format [ #13229 ] ( https://github.com/apache/apisix/pull/13229 )
185+ - fix(ai-proxy): yield to scheduler in streaming SSE loop to avoid worker CPU starvation [ #13255 ] ( https://github.com/apache/apisix/pull/13255 )
186+ - fix(ai-proxy): populate $upstream_response_length for cosocket transport [ #13323 ] ( https://github.com/apache/apisix/pull/13323 )
187+ - fix(ai-request-rewrite): return 400 when request body is missing [ #13097 ] ( https://github.com/apache/apisix/pull/13097 )
188+ - fix(ai-prompt-template): fix malformed JSON error message [ #13096 ] ( https://github.com/apache/apisix/pull/13096 )
189+ - fix(ai-prompt-* ): handle nil err in JSON body parse path [ #13314 ] ( https://github.com/apache/apisix/pull/13314 )
190+ - fix: remove llm related metrics for non llm requests [ #13088 ] ( https://github.com/apache/apisix/pull/13088 )
191+ - fix(limit): atomic redis commits and resolved-var validation [ #13467 ] ( https://github.com/apache/apisix/pull/13467 )
192+ - fix(security): encrypt missing secret-like plugin fields at rest [ #13389 ] ( https://github.com/apache/apisix/pull/13389 )
193+ - fix: redact sensitive data from plugin log output [ #13123 ] ( https://github.com/apache/apisix/pull/13123 )
194+ - fix: remove credential-leaking log statements in sls-logger, hmac-auth, tcp-logger, udp-logger [ #13205 ] ( https://github.com/apache/apisix/pull/13205 )
195+ - fix(gcp): report auth_file path instead of file contents in parse error [ #13409 ] ( https://github.com/apache/apisix/pull/13409 )
196+ - fix(authz-keycloak): copy permissions before appending http_method_as_scope [ #13410 ] ( https://github.com/apache/apisix/pull/13410 )
197+ - fix(authz-casdoor): scope session cookie per Casdoor client [ #13387 ] ( https://github.com/apache/apisix/pull/13387 )
198+ - fix(opa): apply send_headers_upstream for headers absent from OPA response [ #13433 ] ( https://github.com/apache/apisix/pull/13433 )
199+ - fix(cas-auth): harden session and callback handling [ #13427 ] ( https://github.com/apache/apisix/pull/13427 )
200+ - fix(cas-auth): return 400 instead of 500 for SLO POST with empty body [ #13471 ] ( https://github.com/apache/apisix/pull/13471 )
201+ - fix(jwe-decrypt): reject tokens that fail to decrypt [ #13404 ] ( https://github.com/apache/apisix/pull/13404 )
202+ - fix(openidc): include request port in ` redirect_uri ` [ #13081 ] ( https://github.com/apache/apisix/pull/13081 )
203+ - fix(openid-connect): ensure identity headers reflect validated tokens [ #13330 ] ( https://github.com/apache/apisix/pull/13330 )
204+ - fix(forward-auth): clear configured upstream headers not present in auth response [ #13183 ] ( https://github.com/apache/apisix/pull/13183 )
205+ - fix(wolf-rbac): use trusted client IP source for access_check [ #13329 ] ( https://github.com/apache/apisix/pull/13329 )
206+ - fix(chaitin-waf): use trusted client IP source for WAF backend [ #13339 ] ( https://github.com/apache/apisix/pull/13339 )
207+ - fix(file-logger): incorrectly attempts to decompress uncompressed response body [ #13100 ] ( https://github.com/apache/apisix/pull/13100 )
208+ - fix: preserve processed_entries during stale buffer cleanup [ #13094 ] ( https://github.com/apache/apisix/pull/13094 )
209+ - fix(opentelemetry): inject additional_attributes in log phase [ #13265 ] ( https://github.com/apache/apisix/pull/13265 )
210+ - fix(opentelemetry): coerce additional_attributes values to string [ #13146 ] ( https://github.com/apache/apisix/pull/13146 )
211+ - fix(opentelemetry): preserve booleans, handle multi-value headers, tighten test [ #13315 ] ( https://github.com/apache/apisix/pull/13315 )
212+ - fix(brotli): preserve ETag and Last-Modified headers in Brotli-compressed response [ #12853 ] ( https://github.com/apache/apisix/pull/12853 )
213+ - fix: harden cors, multi-auth and body-transformer plugins against malformed requests [ #13469 ] ( https://github.com/apache/apisix/pull/13469 )
214+ - fix(proxy-mirror): keep the original method path when mirroring gRPC requests [ #13499 ] ( https://github.com/apache/apisix/pull/13499 )
215+ - fix(dingtalk-auth): clear client-supplied X-Userinfo before authentication [ #13491 ] ( https://github.com/apache/apisix/pull/13491 )
216+
87217## 3.16.0
88218
89219** The changes marked with :warning : are not backward compatible.**
0 commit comments