Full Code of apache/apisix for AI

master dca582e3bd49 cached
1573 files
12.6 MB
3.4M tokens
436 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (13,435K chars total). Download the full file to get everything.
Repository: apache/apisix
Branch: master
Commit: dca582e3bd49
Files: 1573
Total size: 12.6 MB

Directory structure:
gitextract_li5ku6pd/

├── .gitmodules
├── .ignore_words
├── .licenserc.yaml
├── .markdownlint.yml
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CODE_STYLE.md
├── CONTRIBUTING.md
├── LICENSE
├── MAINTAIN.md
├── Makefile
├── NOTICE
├── README.md
├── THREAT_MODEL.md
├── Vision-and-Milestones.md
├── apisix/
│   ├── admin/
│   │   ├── consumer_group.lua
│   │   ├── consumers.lua
│   │   ├── credentials.lua
│   │   ├── global_rules.lua
│   │   ├── init.lua
│   │   ├── plugin_config.lua
│   │   ├── plugin_metadata.lua
│   │   ├── plugins.lua
│   │   ├── proto.lua
│   │   ├── resource.lua
│   │   ├── routes.lua
│   │   ├── schema.lua
│   │   ├── secrets.lua
│   │   ├── services.lua
│   │   ├── ssl.lua
│   │   ├── standalone.lua
│   │   ├── stream_routes.lua
│   │   ├── upstreams.lua
│   │   ├── utils.lua
│   │   └── v3_adapter.lua
│   ├── api_router.lua
│   ├── balancer/
│   │   ├── chash.lua
│   │   ├── ewma.lua
│   │   ├── least_conn.lua
│   │   ├── priority.lua
│   │   └── roundrobin.lua
│   ├── balancer.lua
│   ├── cli/
│   │   ├── apisix.lua
│   │   ├── config.lua
│   │   ├── env.lua
│   │   ├── etcd.lua
│   │   ├── file.lua
│   │   ├── ip.lua
│   │   ├── ngx_tpl.lua
│   │   ├── ops.lua
│   │   ├── schema.lua
│   │   └── util.lua
│   ├── constants.lua
│   ├── consumer.lua
│   ├── consumer_group.lua
│   ├── control/
│   │   ├── router.lua
│   │   └── v1.lua
│   ├── core/
│   │   ├── config_etcd.lua
│   │   ├── config_local.lua
│   │   ├── config_util.lua
│   │   ├── config_xds.lua
│   │   ├── config_yaml.lua
│   │   ├── ctx.lua
│   │   ├── dns/
│   │   │   └── client.lua
│   │   ├── env.lua
│   │   ├── etcd.lua
│   │   ├── event.lua
│   │   ├── id.lua
│   │   ├── io.lua
│   │   ├── ip.lua
│   │   ├── json.lua
│   │   ├── log.lua
│   │   ├── lrucache.lua
│   │   ├── math.lua
│   │   ├── os.lua
│   │   ├── profile.lua
│   │   ├── pubsub.lua
│   │   ├── request.lua
│   │   ├── resolver.lua
│   │   ├── response.lua
│   │   ├── schema.lua
│   │   ├── string.lua
│   │   ├── table.lua
│   │   ├── timer.lua
│   │   ├── utils.lua
│   │   └── version.lua
│   ├── core.lua
│   ├── debug.lua
│   ├── discovery/
│   │   ├── consul/
│   │   │   ├── init.lua
│   │   │   └── schema.lua
│   │   ├── consul_kv/
│   │   │   ├── init.lua
│   │   │   └── schema.lua
│   │   ├── dns/
│   │   │   ├── init.lua
│   │   │   └── schema.lua
│   │   ├── eureka/
│   │   │   ├── init.lua
│   │   │   └── schema.lua
│   │   ├── init.lua
│   │   ├── kubernetes/
│   │   │   ├── informer_factory.lua
│   │   │   ├── init.lua
│   │   │   └── schema.lua
│   │   ├── nacos/
│   │   │   ├── init.lua
│   │   │   └── schema.lua
│   │   └── tars/
│   │       ├── init.lua
│   │       └── schema.lua
│   ├── events.lua
│   ├── global_rules.lua
│   ├── healthcheck_manager.lua
│   ├── http/
│   │   ├── route.lua
│   │   ├── router/
│   │   │   ├── radixtree_host_uri.lua
│   │   │   ├── radixtree_uri.lua
│   │   │   └── radixtree_uri_with_parameter.lua
│   │   └── service.lua
│   ├── include/
│   │   └── apisix/
│   │       └── model/
│   │           └── pubsub.proto
│   ├── init.lua
│   ├── inspect/
│   │   ├── dbg.lua
│   │   └── init.lua
│   ├── patch.lua
│   ├── plugin.lua
│   ├── plugin_config.lua
│   ├── plugins/
│   │   ├── ai-aliyun-content-moderation.lua
│   │   ├── ai-aws-content-moderation.lua
│   │   ├── ai-drivers/
│   │   │   ├── aimlapi.lua
│   │   │   ├── anthropic.lua
│   │   │   ├── azure-openai.lua
│   │   │   ├── deepseek.lua
│   │   │   ├── gemini.lua
│   │   │   ├── openai-base.lua
│   │   │   ├── openai-compatible.lua
│   │   │   ├── openai.lua
│   │   │   ├── openrouter.lua
│   │   │   ├── schema.lua
│   │   │   ├── sse.lua
│   │   │   └── vertex-ai.lua
│   │   ├── ai-prompt-decorator.lua
│   │   ├── ai-prompt-guard.lua
│   │   ├── ai-prompt-template.lua
│   │   ├── ai-proxy/
│   │   │   ├── base.lua
│   │   │   └── schema.lua
│   │   ├── ai-proxy-multi.lua
│   │   ├── ai-proxy.lua
│   │   ├── ai-rag/
│   │   │   ├── embeddings/
│   │   │   │   └── azure_openai.lua
│   │   │   └── vector-search/
│   │   │       └── azure_ai_search.lua
│   │   ├── ai-rag.lua
│   │   ├── ai-rate-limiting.lua
│   │   ├── ai-request-rewrite.lua
│   │   ├── ai.lua
│   │   ├── api-breaker.lua
│   │   ├── attach-consumer-label.lua
│   │   ├── authz-casbin.lua
│   │   ├── authz-casdoor.lua
│   │   ├── authz-keycloak.lua
│   │   ├── aws-lambda.lua
│   │   ├── azure-functions.lua
│   │   ├── basic-auth.lua
│   │   ├── batch-requests.lua
│   │   ├── body-transformer.lua
│   │   ├── brotli.lua
│   │   ├── cas-auth.lua
│   │   ├── chaitin-waf.lua
│   │   ├── clickhouse-logger.lua
│   │   ├── client-control.lua
│   │   ├── consumer-restriction.lua
│   │   ├── cors.lua
│   │   ├── csrf.lua
│   │   ├── datadog.lua
│   │   ├── degraphql.lua
│   │   ├── dubbo-proxy.lua
│   │   ├── echo.lua
│   │   ├── elasticsearch-logger.lua
│   │   ├── error-log-logger.lua
│   │   ├── example-plugin.lua
│   │   ├── ext-plugin/
│   │   │   ├── helper.lua
│   │   │   └── init.lua
│   │   ├── ext-plugin-post-req.lua
│   │   ├── ext-plugin-post-resp.lua
│   │   ├── ext-plugin-pre-req.lua
│   │   ├── fault-injection.lua
│   │   ├── file-logger.lua
│   │   ├── forward-auth.lua
│   │   ├── gm.lua
│   │   ├── google-cloud-logging.lua
│   │   ├── grpc-transcode/
│   │   │   ├── proto.lua
│   │   │   ├── request.lua
│   │   │   ├── response.lua
│   │   │   └── util.lua
│   │   ├── grpc-transcode.lua
│   │   ├── grpc-web.lua
│   │   ├── gzip.lua
│   │   ├── hmac-auth.lua
│   │   ├── http-dubbo.lua
│   │   ├── http-logger.lua
│   │   ├── inspect.lua
│   │   ├── ip-restriction/
│   │   │   └── init.lua
│   │   ├── ip-restriction.lua
│   │   ├── jwe-decrypt.lua
│   │   ├── jwt-auth/
│   │   │   └── parser.lua
│   │   ├── jwt-auth.lua
│   │   ├── kafka-logger.lua
│   │   ├── kafka-proxy.lua
│   │   ├── key-auth.lua
│   │   ├── lago.lua
│   │   ├── ldap-auth.lua
│   │   ├── limit-conn/
│   │   │   ├── init.lua
│   │   │   ├── limit-conn-redis-cluster.lua
│   │   │   ├── limit-conn-redis.lua
│   │   │   └── util.lua
│   │   ├── limit-conn.lua
│   │   ├── limit-count/
│   │   │   ├── init.lua
│   │   │   ├── limit-count-local.lua
│   │   │   ├── limit-count-redis-cluster.lua
│   │   │   └── limit-count-redis.lua
│   │   ├── limit-count.lua
│   │   ├── limit-req/
│   │   │   ├── limit-req-redis-cluster.lua
│   │   │   ├── limit-req-redis.lua
│   │   │   └── util.lua
│   │   ├── limit-req.lua
│   │   ├── log-rotate.lua
│   │   ├── loggly.lua
│   │   ├── loki-logger.lua
│   │   ├── mcp/
│   │   │   ├── broker/
│   │   │   │   ├── shared_dict.lua
│   │   │   │   └── utils.lua
│   │   │   ├── server.lua
│   │   │   ├── server_wrapper.lua
│   │   │   └── transport/
│   │   │       └── sse.lua
│   │   ├── mcp-bridge.lua
│   │   ├── mocking.lua
│   │   ├── multi-auth.lua
│   │   ├── node-status.lua
│   │   ├── ocsp-stapling.lua
│   │   ├── opa/
│   │   │   └── helper.lua
│   │   ├── opa.lua
│   │   ├── openfunction.lua
│   │   ├── openid-connect.lua
│   │   ├── opentelemetry.lua
│   │   ├── openwhisk.lua
│   │   ├── prometheus/
│   │   │   └── exporter.lua
│   │   ├── prometheus.lua
│   │   ├── proxy-cache/
│   │   │   ├── disk_handler.lua
│   │   │   ├── init.lua
│   │   │   ├── memory.lua
│   │   │   ├── memory_handler.lua
│   │   │   └── util.lua
│   │   ├── proxy-control.lua
│   │   ├── proxy-mirror.lua
│   │   ├── proxy-rewrite.lua
│   │   ├── public-api.lua
│   │   ├── real-ip.lua
│   │   ├── redirect.lua
│   │   ├── referer-restriction.lua
│   │   ├── request-id.lua
│   │   ├── request-validation.lua
│   │   ├── response-rewrite.lua
│   │   ├── rocketmq-logger.lua
│   │   ├── server-info.lua
│   │   ├── serverless/
│   │   │   ├── generic-upstream.lua
│   │   │   └── init.lua
│   │   ├── serverless-post-function.lua
│   │   ├── serverless-pre-function.lua
│   │   ├── skywalking-logger.lua
│   │   ├── skywalking.lua
│   │   ├── sls-logger.lua
│   │   ├── splunk-hec-logging.lua
│   │   ├── syslog/
│   │   │   └── init.lua
│   │   ├── syslog.lua
│   │   ├── tcp-logger.lua
│   │   ├── tencent-cloud-cls/
│   │   │   └── cls-sdk.lua
│   │   ├── tencent-cloud-cls.lua
│   │   ├── traffic-split.lua
│   │   ├── ua-restriction.lua
│   │   ├── udp-logger.lua
│   │   ├── uri-blocker.lua
│   │   ├── wolf-rbac.lua
│   │   ├── workflow.lua
│   │   ├── zipkin/
│   │   │   ├── codec.lua
│   │   │   ├── random_sampler.lua
│   │   │   └── reporter.lua
│   │   └── zipkin.lua
│   ├── pubsub/
│   │   └── kafka.lua
│   ├── resource.lua
│   ├── router.lua
│   ├── schema_def.lua
│   ├── script.lua
│   ├── secret/
│   │   ├── aws.lua
│   │   ├── gcp.lua
│   │   └── vault.lua
│   ├── secret.lua
│   ├── ssl/
│   │   └── router/
│   │       └── radixtree_sni.lua
│   ├── ssl.lua
│   ├── stream/
│   │   ├── plugins/
│   │   │   ├── ip-restriction.lua
│   │   │   ├── limit-conn.lua
│   │   │   ├── mqtt-proxy.lua
│   │   │   ├── prometheus.lua
│   │   │   ├── syslog.lua
│   │   │   └── traffic-split.lua
│   │   ├── router/
│   │   │   └── ip_port.lua
│   │   ├── xrpc/
│   │   │   ├── metrics.lua
│   │   │   ├── protocols/
│   │   │   │   ├── dubbo/
│   │   │   │   │   ├── init.lua
│   │   │   │   │   └── schema.lua
│   │   │   │   └── redis/
│   │   │   │       ├── commands.lua
│   │   │   │       ├── init.lua
│   │   │   │       ├── metrics.lua
│   │   │   │       └── schema.lua
│   │   │   ├── runner.lua
│   │   │   └── sdk.lua
│   │   └── xrpc.lua
│   ├── timers.lua
│   ├── tracer.lua
│   ├── upstream.lua
│   ├── utils/
│   │   ├── auth.lua
│   │   ├── batch-processor-manager.lua
│   │   ├── batch-processor.lua
│   │   ├── content-decode.lua
│   │   ├── google-cloud-oauth.lua
│   │   ├── log-util.lua
│   │   ├── noop_span.lua
│   │   ├── redis-schema.lua
│   │   ├── redis.lua
│   │   ├── rediscluster.lua
│   │   ├── rfc5424.lua
│   │   ├── router.lua
│   │   ├── span.lua
│   │   ├── trusted-addresses.lua
│   │   └── upstream.lua
│   └── wasm.lua
├── apisix-master-0.rockspec
├── autodocs/
│   ├── config.ld
│   ├── generate.sh
│   └── ldoc.ltp
├── benchmark/
│   ├── fake-apisix/
│   │   ├── conf/
│   │   │   ├── cert/
│   │   │   │   ├── apisix.crt
│   │   │   │   ├── apisix.key
│   │   │   │   └── openssl.conf
│   │   │   └── nginx.conf
│   │   └── lua/
│   │       └── apisix.lua
│   ├── run.sh
│   └── server/
│       └── conf/
│           └── nginx.conf
├── bin/
│   └── apisix
├── ci/
│   ├── backup-docker-images.sh
│   ├── check_changelog_prs.ts
│   ├── common.sh
│   ├── free_disk_space.sh
│   ├── init-common-test-service.sh
│   ├── init-last-test-service.sh
│   ├── init-plugin-test-service.sh
│   ├── kubernetes-ci.sh
│   ├── linux-install-etcd-client.sh
│   ├── linux-install-openresty.sh
│   ├── linux_apisix_current_luarocks_in_customed_nginx_runner.sh
│   ├── linux_apisix_current_luarocks_runner.sh
│   ├── linux_openresty_common_runner.sh
│   ├── linux_openresty_runner.sh
│   ├── linux_openresty_tongsuo_runner.sh
│   ├── pod/
│   │   ├── docker-compose.common.yml
│   │   ├── docker-compose.first.yml
│   │   ├── docker-compose.last.yml
│   │   ├── docker-compose.plugin.yml
│   │   ├── etcd/
│   │   │   └── env/
│   │   │       └── common.env
│   │   ├── eureka/
│   │   │   └── env/
│   │   │       └── common.env
│   │   ├── kafka/
│   │   │   ├── kafka-server/
│   │   │   │   ├── env/
│   │   │   │   │   ├── common.env
│   │   │   │   │   ├── common2.env
│   │   │   │   │   ├── common3-scram.env
│   │   │   │   │   └── last.env
│   │   │   │   ├── kafka_jaas.conf
│   │   │   │   └── kafka_scram_jaas.conf
│   │   │   └── zookeeper-server/
│   │   │       └── env/
│   │   │           └── common.env
│   │   ├── keycloak/
│   │   │   ├── kcadm_configure_basic.sh
│   │   │   ├── kcadm_configure_cas.sh
│   │   │   ├── kcadm_configure_university.sh
│   │   │   ├── server.crt.pem
│   │   │   └── server.key.pem
│   │   ├── nacos/
│   │   │   ├── env/
│   │   │   │   ├── common.env
│   │   │   │   └── service.env
│   │   │   ├── healthcheck/
│   │   │   │   ├── Dockerfile
│   │   │   │   ├── nacos-server-healthcheck.sh
│   │   │   │   └── nacos-service-healthcheck.sh
│   │   │   └── service/
│   │   │       └── Dockerfile
│   │   ├── opa/
│   │   │   ├── data.json
│   │   │   ├── echo.rego
│   │   │   ├── example.rego
│   │   │   └── with_route.rego
│   │   ├── openfunction/
│   │   │   ├── build-function-image.sh
│   │   │   └── function-example/
│   │   │       ├── test-body/
│   │   │       │   ├── go.mod
│   │   │       │   ├── go.sum
│   │   │       │   └── hello.go
│   │   │       ├── test-header/
│   │   │       │   ├── go.mod
│   │   │       │   └── hello.go
│   │   │       └── test-uri/
│   │   │           ├── go.mod
│   │   │           ├── go.sum
│   │   │           └── hello.go
│   │   ├── otelcol-contrib/
│   │   │   └── config.yaml
│   │   └── vector/
│   │       └── vector.toml
│   ├── prepare_filesystem_mcp.sh
│   ├── redhat-ci.sh
│   └── tars-ci.sh
├── conf/
│   ├── cert/
│   │   ├── ssl_PLACE_HOLDER.crt
│   │   └── ssl_PLACE_HOLDER.key
│   ├── config.yaml
│   ├── config.yaml.example
│   ├── debug.yaml
│   └── mime.types
├── docker/
│   ├── compose/
│   │   ├── apisix_conf/
│   │   │   └── master/
│   │   │       └── config.yaml
│   │   └── docker-compose-master.yaml
│   └── debian-dev/
│       ├── Dockerfile
│       ├── docker-entrypoint.sh
│       └── install-brotli.sh
├── docs/
│   ├── assets/
│   │   └── other/
│   │       ├── apisix-plugin-design.graffle
│   │       └── json/
│   │           └── apisix-grafana-dashboard.json
│   ├── en/
│   │   └── latest/
│   │       ├── FAQ.md
│   │       ├── admin-api.md
│   │       ├── apisix-variable.md
│   │       ├── architecture-design/
│   │       │   └── apisix.md
│   │       ├── aws.md
│   │       ├── batch-processor.md
│   │       ├── benchmark.md
│   │       ├── build-apisix-dev-environment-devcontainers.md
│   │       ├── build-apisix-dev-environment-on-mac.md
│   │       ├── building-apisix.md
│   │       ├── certificate.md
│   │       ├── config.json
│   │       ├── control-api.md
│   │       ├── customize-nginx-configuration.md
│   │       ├── dashboard.md
│   │       ├── debug-function.md
│   │       ├── debug-mode.md
│   │       ├── deployment-modes.md
│   │       ├── discovery/
│   │       │   ├── consul.md
│   │       │   ├── consul_kv.md
│   │       │   ├── control-plane-service-discovery.md
│   │       │   ├── dns.md
│   │       │   ├── eureka.md
│   │       │   ├── kubernetes.md
│   │       │   └── nacos.md
│   │       ├── discovery.md
│   │       ├── examples/
│   │       │   └── plugins-hmac-auth-generate-signature.md
│   │       ├── external-plugin.md
│   │       ├── getting-started/
│   │       │   ├── README.md
│   │       │   ├── configure-routes.md
│   │       │   ├── key-authentication.md
│   │       │   ├── load-balancing.md
│   │       │   └── rate-limiting.md
│   │       ├── grpc-proxy.md
│   │       ├── http3.md
│   │       ├── install-dependencies.md
│   │       ├── installation-guide.md
│   │       ├── internal/
│   │       │   ├── plugin-runner.md
│   │       │   └── testing-framework.md
│   │       ├── mtls.md
│   │       ├── plugin-develop.md
│   │       ├── plugins/
│   │       │   ├── ai-aliyun-content-moderation.md
│   │       │   ├── ai-aws-content-moderation.md
│   │       │   ├── ai-prompt-decorator.md
│   │       │   ├── ai-prompt-guard.md
│   │       │   ├── ai-prompt-template.md
│   │       │   ├── ai-proxy-multi.md
│   │       │   ├── ai-proxy.md
│   │       │   ├── ai-rag.md
│   │       │   ├── ai-rate-limiting.md
│   │       │   ├── ai-request-rewrite.md
│   │       │   ├── api-breaker.md
│   │       │   ├── attach-consumer-label.md
│   │       │   ├── authz-casbin.md
│   │       │   ├── authz-casdoor.md
│   │       │   ├── authz-keycloak.md
│   │       │   ├── aws-lambda.md
│   │       │   ├── azure-functions.md
│   │       │   ├── basic-auth.md
│   │       │   ├── batch-requests.md
│   │       │   ├── body-transformer.md
│   │       │   ├── brotli.md
│   │       │   ├── cas-auth.md
│   │       │   ├── chaitin-waf.md
│   │       │   ├── clickhouse-logger.md
│   │       │   ├── client-control.md
│   │       │   ├── consumer-restriction.md
│   │       │   ├── cors.md
│   │       │   ├── csrf.md
│   │       │   ├── datadog.md
│   │       │   ├── degraphql.md
│   │       │   ├── dubbo-proxy.md
│   │       │   ├── echo.md
│   │       │   ├── elasticsearch-logger.md
│   │       │   ├── error-log-logger.md
│   │       │   ├── ext-plugin-post-req.md
│   │       │   ├── ext-plugin-post-resp.md
│   │       │   ├── ext-plugin-pre-req.md
│   │       │   ├── fault-injection.md
│   │       │   ├── file-logger.md
│   │       │   ├── forward-auth.md
│   │       │   ├── gm.md
│   │       │   ├── google-cloud-logging.md
│   │       │   ├── grpc-transcode.md
│   │       │   ├── grpc-web.md
│   │       │   ├── gzip.md
│   │       │   ├── hmac-auth.md
│   │       │   ├── http-dubbo.md
│   │       │   ├── http-logger.md
│   │       │   ├── inspect.md
│   │       │   ├── ip-restriction.md
│   │       │   ├── jwe-decrypt.md
│   │       │   ├── jwt-auth.md
│   │       │   ├── kafka-logger.md
│   │       │   ├── kafka-proxy.md
│   │       │   ├── key-auth.md
│   │       │   ├── lago.md
│   │       │   ├── ldap-auth.md
│   │       │   ├── limit-conn.md
│   │       │   ├── limit-count.md
│   │       │   ├── limit-req.md
│   │       │   ├── log-rotate.md
│   │       │   ├── loggly.md
│   │       │   ├── loki-logger.md
│   │       │   ├── mocking.md
│   │       │   ├── mqtt-proxy.md
│   │       │   ├── multi-auth.md
│   │       │   ├── node-status.md
│   │       │   ├── ocsp-stapling.md
│   │       │   ├── opa.md
│   │       │   ├── openfunction.md
│   │       │   ├── openid-connect.md
│   │       │   ├── opentelemetry.md
│   │       │   ├── openwhisk.md
│   │       │   ├── prometheus.md
│   │       │   ├── proxy-cache.md
│   │       │   ├── proxy-control.md
│   │       │   ├── proxy-mirror.md
│   │       │   ├── proxy-rewrite.md
│   │       │   ├── public-api.md
│   │       │   ├── real-ip.md
│   │       │   ├── redirect.md
│   │       │   ├── referer-restriction.md
│   │       │   ├── request-id.md
│   │       │   ├── request-validation.md
│   │       │   ├── response-rewrite.md
│   │       │   ├── rocketmq-logger.md
│   │       │   ├── server-info.md
│   │       │   ├── serverless.md
│   │       │   ├── skywalking-logger.md
│   │       │   ├── skywalking.md
│   │       │   ├── sls-logger.md
│   │       │   ├── splunk-hec-logging.md
│   │       │   ├── syslog.md
│   │       │   ├── tcp-logger.md
│   │       │   ├── tencent-cloud-cls.md
│   │       │   ├── traffic-split.md
│   │       │   ├── ua-restriction.md
│   │       │   ├── udp-logger.md
│   │       │   ├── uri-blocker.md
│   │       │   ├── wolf-rbac.md
│   │       │   ├── workflow.md
│   │       │   └── zipkin.md
│   │       ├── profile.md
│   │       ├── pubsub/
│   │       │   └── kafka.md
│   │       ├── pubsub.md
│   │       ├── router-radixtree.md
│   │       ├── ssl-protocol.md
│   │       ├── status-api.md
│   │       ├── stream-proxy.md
│   │       ├── support-fips-in-apisix.md
│   │       ├── terminology/
│   │       │   ├── api-gateway.md
│   │       │   ├── consumer-group.md
│   │       │   ├── consumer.md
│   │       │   ├── credential.md
│   │       │   ├── global-rule.md
│   │       │   ├── plugin-config.md
│   │       │   ├── plugin-metadata.md
│   │       │   ├── plugin.md
│   │       │   ├── route.md
│   │       │   ├── router.md
│   │       │   ├── script.md
│   │       │   ├── secret.md
│   │       │   ├── service.md
│   │       │   └── upstream.md
│   │       ├── tutorials/
│   │       │   ├── add-multiple-api-versions.md
│   │       │   ├── cache-api-responses.md
│   │       │   ├── client-to-apisix-mtls.md
│   │       │   ├── expose-api.md
│   │       │   ├── health-check.md
│   │       │   ├── keycloak-oidc.md
│   │       │   ├── manage-api-consumers.md
│   │       │   ├── monitor-api-health-check.md
│   │       │   ├── observe-your-api.md
│   │       │   ├── protect-api.md
│   │       │   └── websocket-authentication.md
│   │       ├── upgrade-guide-from-2.15.x-to-3.0.0.md
│   │       ├── wasm.md
│   │       ├── xrpc/
│   │       │   └── redis.md
│   │       └── xrpc.md
│   └── zh/
│       └── latest/
│           ├── CHANGELOG.md
│           ├── CODE_STYLE.md
│           ├── FAQ.md
│           ├── README.md
│           ├── admin-api.md
│           ├── apisix-variable.md
│           ├── architecture-design/
│           │   └── apisix.md
│           ├── batch-processor.md
│           ├── benchmark.md
│           ├── build-apisix-dev-environment-on-mac.md
│           ├── building-apisix.md
│           ├── certificate.md
│           ├── config.json
│           ├── control-api.md
│           ├── customize-nginx-configuration.md
│           ├── dashboard.md
│           ├── debug-function.md
│           ├── debug-mode.md
│           ├── discovery/
│           │   ├── control-plane-service-discovery.md
│           │   ├── dns.md
│           │   ├── eureka.md
│           │   ├── kubernetes.md
│           │   └── nacos.md
│           ├── discovery.md
│           ├── external-plugin.md
│           ├── getting-started/
│           │   ├── README.md
│           │   ├── configure-routes.md
│           │   ├── key-authentication.md
│           │   ├── load-balancing.md
│           │   └── rate-limiting.md
│           ├── grpc-proxy.md
│           ├── http3.md
│           ├── install-dependencies.md
│           ├── installation-guide.md
│           ├── mtls.md
│           ├── plugin-develop.md
│           ├── plugins/
│           │   ├── ai-aliyun-content-moderation.md
│           │   ├── ai-aws-content-moderation.md
│           │   ├── ai-prompt-decorator.md
│           │   ├── ai-prompt-guard.md
│           │   ├── ai-prompt-template.md
│           │   ├── ai-proxy-multi.md
│           │   ├── ai-proxy.md
│           │   ├── ai-rag.md
│           │   ├── ai-rate-limiting.md
│           │   ├── ai-request-rewrite.md
│           │   ├── api-breaker.md
│           │   ├── attach-consumer-label.md
│           │   ├── authz-casbin.md
│           │   ├── authz-casdoor.md
│           │   ├── authz-keycloak.md
│           │   ├── aws-lambda.md
│           │   ├── azure-functions.md
│           │   ├── basic-auth.md
│           │   ├── batch-requests.md
│           │   ├── body-transformer.md
│           │   ├── brotli.md
│           │   ├── chaitin-waf.md
│           │   ├── clickhouse-logger.md
│           │   ├── client-control.md
│           │   ├── consumer-restriction.md
│           │   ├── cors.md
│           │   ├── csrf.md
│           │   ├── datadog.md
│           │   ├── dubbo-proxy.md
│           │   ├── echo.md
│           │   ├── elasticsearch-logger.md
│           │   ├── error-log-logger.md
│           │   ├── ext-plugin-post-req.md
│           │   ├── ext-plugin-post-resp.md
│           │   ├── ext-plugin-pre-req.md
│           │   ├── fault-injection.md
│           │   ├── file-logger.md
│           │   ├── forward-auth.md
│           │   ├── gm.md
│           │   ├── google-cloud-logging.md
│           │   ├── grpc-transcode.md
│           │   ├── grpc-web.md
│           │   ├── gzip.md
│           │   ├── hmac-auth.md
│           │   ├── http-dubbo.md
│           │   ├── http-logger.md
│           │   ├── ip-restriction.md
│           │   ├── jwe-decrypt.md
│           │   ├── jwt-auth.md
│           │   ├── kafka-logger.md
│           │   ├── key-auth.md
│           │   ├── ldap-auth.md
│           │   ├── limit-conn.md
│           │   ├── limit-count.md
│           │   ├── limit-req.md
│           │   ├── log-rotate.md
│           │   ├── loggly.md
│           │   ├── loki-logger.md
│           │   ├── mocking.md
│           │   ├── mqtt-proxy.md
│           │   ├── multi-auth.md
│           │   ├── node-status.md
│           │   ├── ocsp-stapling.md
│           │   ├── opa.md
│           │   ├── openfunction.md
│           │   ├── openid-connect.md
│           │   ├── opentelemetry.md
│           │   ├── openwhisk.md
│           │   ├── prometheus.md
│           │   ├── proxy-cache.md
│           │   ├── proxy-control.md
│           │   ├── proxy-mirror.md
│           │   ├── proxy-rewrite.md
│           │   ├── public-api.md
│           │   ├── real-ip.md
│           │   ├── redirect.md
│           │   ├── referer-restriction.md
│           │   ├── request-id.md
│           │   ├── request-validation.md
│           │   ├── response-rewrite.md
│           │   ├── rocketmq-logger.md
│           │   ├── server-info.md
│           │   ├── serverless.md
│           │   ├── skywalking-logger.md
│           │   ├── skywalking.md
│           │   ├── sls-logger.md
│           │   ├── splunk-hec-logging.md
│           │   ├── syslog.md
│           │   ├── tcp-logger.md
│           │   ├── tencent-cloud-cls.md
│           │   ├── traffic-split.md
│           │   ├── ua-restriction.md
│           │   ├── udp-logger.md
│           │   ├── uri-blocker.md
│           │   ├── wolf-rbac.md
│           │   ├── workflow.md
│           │   └── zipkin.md
│           ├── profile.md
│           ├── router-radixtree.md
│           ├── ssl-protocol.md
│           ├── status-api.md
│           ├── stream-proxy.md
│           ├── support-fips-in-apisix.md
│           ├── terminology/
│           │   ├── api-gateway.md
│           │   ├── consumer-group.md
│           │   ├── consumer.md
│           │   ├── credential.md
│           │   ├── global-rule.md
│           │   ├── plugin-config.md
│           │   ├── plugin-metadata.md
│           │   ├── plugin.md
│           │   ├── route.md
│           │   ├── router.md
│           │   ├── script.md
│           │   ├── secret.md
│           │   ├── service.md
│           │   └── upstream.md
│           ├── tutorials/
│           │   ├── cache-api-responses.md
│           │   ├── client-to-apisix-mtls.md
│           │   ├── expose-api.md
│           │   ├── health-check.md
│           │   ├── keycloak-oidc.md
│           │   ├── manage-api-consumers.md
│           │   ├── observe-your-api.md
│           │   └── protect-api.md
│           ├── upgrade-guide-from-2.15.x-to-3.0.0.md
│           └── wasm.md
├── example/
│   ├── apisix/
│   │   ├── plugins/
│   │   │   └── 3rd-party.lua
│   │   └── stream/
│   │       └── plugins/
│   │           └── 3rd-party.lua
│   ├── build-dev-image.dockerfile
│   └── my_hook.lua
├── powered-by.md
├── t/
│   ├── APISIX.pm
│   ├── admin/
│   │   ├── api.t
│   │   ├── balancer.t
│   │   ├── consumer-credentials.t
│   │   ├── consumer-group-force-delete.t
│   │   ├── consumer-group.t
│   │   ├── consumers.t
│   │   ├── consumers2.t
│   │   ├── credentials.t
│   │   ├── filter.t
│   │   ├── global-rules-conflict.t
│   │   ├── global-rules.t
│   │   ├── global-rules2.t
│   │   ├── health-check.t
│   │   ├── metadata.spec.ts
│   │   ├── metadata.t
│   │   ├── plugin-configs-force-delete.t
│   │   ├── plugin-configs.t
│   │   ├── plugin-metadata.t
│   │   ├── plugin-metadata2.t
│   │   ├── plugin-metadata3.t
│   │   ├── plugins-reload.t
│   │   ├── plugins.t
│   │   ├── protos-force-delete.t
│   │   ├── protos.t
│   │   ├── resources.t
│   │   ├── response_body_format.t
│   │   ├── routes-array-nodes.t
│   │   ├── routes.t
│   │   ├── routes2.t
│   │   ├── routes3.t
│   │   ├── routes4.t
│   │   ├── routes_request_body.t
│   │   ├── schema-validate.t
│   │   ├── schema.t
│   │   ├── secrets.t
│   │   ├── services-array-nodes.t
│   │   ├── services-force-delete.t
│   │   ├── services-string-id.t
│   │   ├── services.t
│   │   ├── services2.t
│   │   ├── ssl.t
│   │   ├── ssl2.t
│   │   ├── ssl3.t
│   │   ├── ssl4.t
│   │   ├── ssl5.t
│   │   ├── ssls.t
│   │   ├── standalone-healthcheck.t
│   │   ├── standalone-plugin-validation.t
│   │   ├── standalone.spec.ts
│   │   ├── standalone.t
│   │   ├── stream-routes-disable.t
│   │   ├── stream-routes-subordinate.t
│   │   ├── stream-routes.t
│   │   ├── token.t
│   │   ├── upstream-array-nodes.t
│   │   ├── upstream-force-delete.t
│   │   ├── upstream.t
│   │   ├── upstream2.t
│   │   ├── upstream3.t
│   │   ├── upstream4.t
│   │   └── upstream5.t
│   ├── apisix.luacov
│   ├── assets/
│   │   ├── ai-proxy-response.json
│   │   ├── content-moderation-responses.json
│   │   ├── embeddings.json
│   │   └── openai-compatible-api-response.json
│   ├── certs/
│   │   ├── apisix.crt
│   │   ├── apisix.key
│   │   ├── apisix_admin_ssl.crt
│   │   ├── apisix_admin_ssl.key
│   │   ├── apisix_ecc.crt
│   │   ├── apisix_ecc.key
│   │   ├── client_enc.crt
│   │   ├── client_enc.key
│   │   ├── client_sign.crt
│   │   ├── client_sign.key
│   │   ├── etcd.key
│   │   ├── etcd.pem
│   │   ├── gm_ca.crt
│   │   ├── incorrect.crt
│   │   ├── incorrect.key
│   │   ├── localhost_slapd_cert.pem
│   │   ├── localhost_slapd_key.pem
│   │   ├── mtls_ca.crt
│   │   ├── mtls_ca.key
│   │   ├── mtls_client.crt
│   │   ├── mtls_client.key
│   │   ├── mtls_server.crt
│   │   ├── mtls_server.key
│   │   ├── ocsp/
│   │   │   ├── ecc_good.crt
│   │   │   ├── ecc_good.key
│   │   │   ├── index.txt
│   │   │   ├── rsa_good.crt
│   │   │   ├── rsa_good.key
│   │   │   ├── rsa_revoked.crt
│   │   │   ├── rsa_revoked.key
│   │   │   ├── rsa_unknown.crt
│   │   │   ├── rsa_unknown.key
│   │   │   ├── signer.crt
│   │   │   └── signer.key
│   │   ├── openssl-test2.conf
│   │   ├── openssl.conf
│   │   ├── private.pem
│   │   ├── public.pem
│   │   ├── server_1024.crt
│   │   ├── server_1024.key
│   │   ├── server_enc.crt
│   │   ├── server_enc.key
│   │   ├── server_sign.crt
│   │   ├── server_sign.key
│   │   ├── test-dot.crt
│   │   ├── test-dot.key
│   │   ├── test2.crt
│   │   ├── test2.key
│   │   ├── vector_logs_ca.crt
│   │   ├── vector_logs_ca.key
│   │   ├── vector_logs_server.crt
│   │   └── vector_logs_server.key
│   ├── chaos/
│   │   ├── delayetcd/
│   │   │   └── delayetcd.go
│   │   ├── e2e.go
│   │   ├── e2e_test.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   ├── killetcd/
│   │   │   └── killetcd.go
│   │   ├── kubernetes/
│   │   │   ├── deployment.yaml
│   │   │   └── service.yaml
│   │   └── utils/
│   │       ├── Dockerfile
│   │       ├── kube_utils.go
│   │       ├── setup_chaos_utils.sh
│   │       └── utils.go
│   ├── cli/
│   │   ├── cli.t
│   │   ├── cli_envsubst_confusion.t
│   │   ├── common.sh
│   │   ├── docker-compose-etcd-cluster.yaml
│   │   ├── test_access_log.sh
│   │   ├── test_admin.sh
│   │   ├── test_admin_mtls.sh
│   │   ├── test_admin_ui.sh
│   │   ├── test_apisix_mirror.sh
│   │   ├── test_ci_only.sh
│   │   ├── test_cmd.sh
│   │   ├── test_control.sh
│   │   ├── test_core_config.sh
│   │   ├── test_deployment_control_plane.sh
│   │   ├── test_deployment_data_plane.sh
│   │   ├── test_deployment_data_plane_with_readonly_etcd.sh
│   │   ├── test_deployment_traditional.sh
│   │   ├── test_dns.sh
│   │   ├── test_dubbo.sh
│   │   ├── test_etcd.sh
│   │   ├── test_etcd_healthcheck.sh
│   │   ├── test_etcd_mtls.sh
│   │   ├── test_etcd_sync_event_handle.sh
│   │   ├── test_etcd_tls.sh
│   │   ├── test_http_config.sh
│   │   ├── test_kubernetes.sh
│   │   ├── test_limit_conn_redis_ttl.sh
│   │   ├── test_limit_req_redis_ttl.sh
│   │   ├── test_load_full_data_init_worker.sh
│   │   ├── test_main.sh
│   │   ├── test_makefile.sh
│   │   ├── test_opentelemetry_set_ngx_var.sh
│   │   ├── test_prometheus.sh
│   │   ├── test_prometheus_reload.sh
│   │   ├── test_prometheus_stream.sh
│   │   ├── test_proxy_mirror_timeout.sh
│   │   ├── test_route_match_with_graphql.sh
│   │   ├── test_serverless.sh
│   │   ├── test_snippet.sh
│   │   ├── test_standalone.sh
│   │   ├── test_standalone_docker.sh
│   │   ├── test_standalone_yaml_format.sh
│   │   ├── test_status_api.sh
│   │   ├── test_status_api_standalone.sh
│   │   ├── test_stream_config.sh
│   │   ├── test_tls_over_tcp.sh
│   │   ├── test_upstream_mtls.sh
│   │   ├── test_validate_config.sh
│   │   ├── test_wasm.sh
│   │   └── test_zipkin_set_ngx_var.sh
│   ├── config-center-json/
│   │   ├── consumer-group.t
│   │   ├── consumer.t
│   │   ├── global-rule.t
│   │   ├── plugin-configs.t
│   │   ├── plugin-metadata.t
│   │   ├── plugin.t
│   │   ├── route-service.t
│   │   ├── route-upstream.t
│   │   ├── route.t
│   │   ├── secret.t
│   │   ├── ssl.t
│   │   └── stream-route.t
│   ├── config-center-yaml/
│   │   ├── consumer-group.t
│   │   ├── consumer.t
│   │   ├── global-rule.t
│   │   ├── plugin-configs.t
│   │   ├── plugin-metadata.t
│   │   ├── plugin.t
│   │   ├── route-service.t
│   │   ├── route-upstream.t
│   │   ├── route.t
│   │   ├── secret.t
│   │   ├── ssl.t
│   │   └── stream-route.t
│   ├── control/
│   │   ├── control-healthcheck-bug-fix.t
│   │   ├── discovery.t
│   │   ├── gc.t
│   │   ├── healthcheck.t
│   │   ├── plugin-api.t
│   │   ├── plugin-metadata.t
│   │   ├── plugins-reload.t
│   │   ├── routes.t
│   │   ├── schema.t
│   │   ├── services.t
│   │   └── upstreams.t
│   ├── core/
│   │   ├── config-default.t
│   │   ├── config.t
│   │   ├── config_etcd.t
│   │   ├── config_util.t
│   │   ├── ctx.t
│   │   ├── ctx2.t
│   │   ├── ctx3.t
│   │   ├── ctx4.t
│   │   ├── ctx_with_params.t
│   │   ├── env.t
│   │   ├── etcd-auth-fail.t
│   │   ├── etcd-auth.t
│   │   ├── etcd-mtls.t
│   │   ├── etcd-sync.t
│   │   ├── etcd-write.t
│   │   ├── etcd.t
│   │   ├── json.t
│   │   ├── log.t
│   │   ├── lrucache.t
│   │   ├── lrucache2.t
│   │   ├── os.t
│   │   ├── profile.t
│   │   ├── random.t
│   │   ├── request.t
│   │   ├── resolver.t
│   │   ├── response.t
│   │   ├── schema.t
│   │   ├── schema_def.t
│   │   ├── string.t
│   │   ├── table.t
│   │   ├── timer.t
│   │   ├── trusted-addresses.t
│   │   ├── uid.t
│   │   └── utils.t
│   ├── coredns/
│   │   ├── Corefile
│   │   └── db.test.local
│   ├── debug/
│   │   ├── debug-mode.t
│   │   ├── dynamic-hook.t
│   │   └── hook.t
│   ├── discovery/
│   │   ├── consul.t
│   │   ├── consul2.t
│   │   ├── consul_dump.t
│   │   ├── consul_kv.t
│   │   ├── consul_kv_dump.t
│   │   ├── dns/
│   │   │   ├── mix.t
│   │   │   └── sanity.t
│   │   ├── eureka.t
│   │   ├── kubernetes_schema.t
│   │   ├── nacos.t
│   │   ├── nacos2.t
│   │   ├── nacos3.t
│   │   ├── reset-healthchecker.t
│   │   └── stream/
│   │       ├── consul.t
│   │       ├── consul_kv.t
│   │       ├── dns.t
│   │       ├── eureka.t
│   │       └── nacos.t
│   ├── error_page/
│   │   └── error_page.t
│   ├── fake-plugin-exit.lua
│   ├── fuzzing/
│   │   ├── client_abort.py
│   │   ├── http_upstream.py
│   │   ├── public.py
│   │   ├── requirements.txt
│   │   ├── serverless_route_test.py
│   │   ├── simple_http.py
│   │   ├── simpleroute_test.py
│   │   ├── upstream/
│   │   │   └── nginx.conf
│   │   └── vars_route_test.py
│   ├── gm/
│   │   └── gm.t
│   ├── grpc_server_example/
│   │   ├── echo.pb
│   │   ├── go.mod
│   │   ├── go.sum
│   │   ├── main.go
│   │   ├── proto/
│   │   │   ├── echo.pb.go
│   │   │   ├── echo.proto
│   │   │   ├── echo_grpc.pb.go
│   │   │   ├── helloworld.pb.go
│   │   │   ├── helloworld.proto
│   │   │   ├── helloworld_grpc.pb.go
│   │   │   ├── import.pb.go
│   │   │   ├── import.proto
│   │   │   ├── src.pb.go
│   │   │   ├── src.proto
│   │   │   └── src_grpc.pb.go
│   │   └── proto.pb
│   ├── http3/
│   │   └── admin/
│   │       └── basic.t
│   ├── jest.config.ts
│   ├── kubernetes/
│   │   ├── configs/
│   │   │   ├── account.yaml
│   │   │   ├── endpoint.yaml
│   │   │   ├── endpointslices.yaml
│   │   │   └── kind.yaml
│   │   └── discovery/
│   │       ├── kubernetes.t
│   │       ├── kubernetes2.t
│   │       ├── kubernetes3.t
│   │       ├── kubernetes4.t
│   │       └── stream/
│   │           └── kubernetes.t
│   ├── lib/
│   │   ├── apisix/
│   │   │   └── plugins/
│   │   │       ├── jwt-auth.lua
│   │   │       └── prometheus/
│   │   │           └── exporter.lua
│   │   ├── chaitin_waf_server.lua
│   │   ├── dubbo-backend/
│   │   │   ├── dubbo-backend-interface/
│   │   │   │   ├── pom.xml
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           └── java/
│   │   │   │               └── org/
│   │   │   │                   └── apache/
│   │   │   │                       └── dubbo/
│   │   │   │                           └── backend/
│   │   │   │                               └── DemoService.java
│   │   │   ├── dubbo-backend-provider/
│   │   │   │   ├── pom.xml
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           ├── java/
│   │   │   │           │   └── org/
│   │   │   │           │       └── apache/
│   │   │   │           │           └── dubbo/
│   │   │   │           │               └── backend/
│   │   │   │           │                   └── provider/
│   │   │   │           │                       ├── DemoServiceImpl.java
│   │   │   │           │                       └── Provider.java
│   │   │   │           └── resources/
│   │   │   │               ├── META-INF/
│   │   │   │               │   └── spring/
│   │   │   │               │       └── dubbo-demo-provider.xml
│   │   │   │               ├── dubbo.properties
│   │   │   │               └── log4j.properties
│   │   │   └── pom.xml
│   │   ├── dubbo-serialization-backend/
│   │   │   ├── dubbo-serialization-backend-interface/
│   │   │   │   ├── pom.xml
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           └── java/
│   │   │   │               └── org/
│   │   │   │                   └── apache/
│   │   │   │                       └── dubbo/
│   │   │   │                           └── backend/
│   │   │   │                               ├── DubboSerializationTestService.java
│   │   │   │                               └── PoJo.java
│   │   │   ├── dubbo-serialization-backend-provider/
│   │   │   │   ├── pom.xml
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           ├── java/
│   │   │   │           │   └── org/
│   │   │   │           │       └── apache/
│   │   │   │           │           └── dubbo/
│   │   │   │           │               └── backend/
│   │   │   │           │                   └── provider/
│   │   │   │           │                       ├── DubboSerializationTestServiceImpl.java
│   │   │   │           │                       └── Provider.java
│   │   │   │           └── resources/
│   │   │   │               ├── META-INF/
│   │   │   │               │   └── spring/
│   │   │   │               │       └── dubbo-demo-provider.xml
│   │   │   │               ├── dubbo.properties
│   │   │   │               └── log4j.properties
│   │   │   └── pom.xml
│   │   ├── etcd.proto
│   │   ├── ext-plugin.lua
│   │   ├── grafana_loki.lua
│   │   ├── keycloak.lua
│   │   ├── keycloak_cas.lua
│   │   ├── mock_layer4.lua
│   │   ├── pubsub.lua
│   │   ├── server.lua
│   │   ├── test_admin.lua
│   │   ├── test_inspect.lua
│   │   ├── test_otel.lua
│   │   └── test_redis.lua
│   ├── misc/
│   │   ├── patch.t
│   │   ├── pre-function.t
│   │   └── timers.t
│   ├── node/
│   │   ├── chash-balance.t
│   │   ├── chash-hashon.t
│   │   ├── client-mtls-openresty.t
│   │   ├── client-mtls.t
│   │   ├── consumer-group.t
│   │   ├── consumer-plugin.t
│   │   ├── consumer-plugin2.t
│   │   ├── consumer-plugin3.t
│   │   ├── credential-plugin-basic-auth.t
│   │   ├── credential-plugin-incremental-effective.t
│   │   ├── credential-plugin-jwt-auth.t
│   │   ├── credential-plugin-key-auth.t
│   │   ├── credential-plugin-multi-credentials.t
│   │   ├── credential-plugin-set-request-header.t
│   │   ├── credential-plugin-work-with-other-plugin.t
│   │   ├── data_encrypt.t
│   │   ├── data_encrypt2.t
│   │   ├── ewma.t
│   │   ├── filter_func.t
│   │   ├── global-rule.t
│   │   ├── grpc-proxy-mtls.t
│   │   ├── grpc-proxy-stream.t
│   │   ├── grpc-proxy-unary.t
│   │   ├── grpc-proxy.t
│   │   ├── healthcheck-discovery.t
│   │   ├── healthcheck-dns.t
│   │   ├── healthcheck-global-switch.t
│   │   ├── healthcheck-https.t
│   │   ├── healthcheck-ipv6.t
│   │   ├── healthcheck-leak-bugfix.t
│   │   ├── healthcheck-multiple-worker.t
│   │   ├── healthcheck-passive-resty-events.t
│   │   ├── healthcheck-service-discovery.t
│   │   ├── healthcheck-stop-checker.t
│   │   ├── healthcheck.t
│   │   ├── healthcheck2.t
│   │   ├── healthcheck3.t
│   │   ├── healthchecker-independent-upstream.t
│   │   ├── hosts.t
│   │   ├── http_host.t
│   │   ├── https-proxy.t
│   │   ├── invalid-port.t
│   │   ├── invalid-route.t
│   │   ├── invalid-service.t
│   │   ├── invalid-upstream.t
│   │   ├── least_conn.t
│   │   ├── least_conn2.t
│   │   ├── merge-route.t
│   │   ├── not-exist-service.t
│   │   ├── not-exist-upstream.t
│   │   ├── plugin-configs.t
│   │   ├── plugin.t
│   │   ├── plugin1.t
│   │   ├── priority-balancer/
│   │   │   ├── health-checker.t
│   │   │   └── sanity.t
│   │   ├── remote-addr-ipv6.t
│   │   ├── remote-addr.t
│   │   ├── remote_addrs.t
│   │   ├── route-delete.t
│   │   ├── route-domain-with-local-dns.t
│   │   ├── route-domain.t
│   │   ├── route-filter-func.t
│   │   ├── route-host.t
│   │   ├── route-status.t
│   │   ├── route-uris.t
│   │   ├── rr-balance.t
│   │   ├── sanity-radixtree.t
│   │   ├── service-empty.t
│   │   ├── ssl-protocols.t
│   │   ├── ssl.t
│   │   ├── timeout-upstream.t
│   │   ├── upstream-array-nodes.t
│   │   ├── upstream-discovery-dynamic.t
│   │   ├── upstream-discovery.t
│   │   ├── upstream-domain-with-special-dns.t
│   │   ├── upstream-domain-with-special-ipv6-dns.t
│   │   ├── upstream-domain.t
│   │   ├── upstream-ipv6.t
│   │   ├── upstream-keepalive-pool.t
│   │   ├── upstream-mtls.t
│   │   ├── upstream-node-dns.t
│   │   ├── upstream-retries.t
│   │   ├── upstream-status-5xx.t
│   │   ├── upstream-status-all.t
│   │   ├── upstream-websocket.t
│   │   ├── upstream.t
│   │   ├── vars.t
│   │   └── wildcard-host.t
│   ├── package.json
│   ├── plugin/
│   │   ├── ai-aliyun-content-moderation.t
│   │   ├── ai-aws-content-moderation-secrets.t
│   │   ├── ai-aws-content-moderation.t
│   │   ├── ai-aws-content-moderation2.t
│   │   ├── ai-prompt-decorator.t
│   │   ├── ai-prompt-guard.t
│   │   ├── ai-prompt-template.t
│   │   ├── ai-proxy-anthropic.t
│   │   ├── ai-proxy-azure-openai.t
│   │   ├── ai-proxy-gemini.t
│   │   ├── ai-proxy-kafka-log.t
│   │   ├── ai-proxy-multi.balancer.t
│   │   ├── ai-proxy-multi.openai-compatible.t
│   │   ├── ai-proxy-multi.t
│   │   ├── ai-proxy-multi2.t
│   │   ├── ai-proxy-multi3.t
│   │   ├── ai-proxy-openrouter.t
│   │   ├── ai-proxy-vertex-ai.t
│   │   ├── ai-proxy.openai-compatible.t
│   │   ├── ai-proxy.t
│   │   ├── ai-proxy2.t
│   │   ├── ai-proxy3.t
│   │   ├── ai-rag.t
│   │   ├── ai-rate-limiting-consumer-isolation.t
│   │   ├── ai-rate-limiting.t
│   │   ├── ai-request-rewrite.t
│   │   ├── ai-request-rewrite2.t
│   │   ├── ai.t
│   │   ├── ai2.t
│   │   ├── ai3.t
│   │   ├── ai4.t
│   │   ├── ai5.t
│   │   ├── api-breaker.t
│   │   ├── attach-consumer-label.t
│   │   ├── authz-casbin/
│   │   │   ├── model.conf
│   │   │   └── policy.csv
│   │   ├── authz-casbin.t
│   │   ├── authz-casdoor.t
│   │   ├── authz-keycloak.t
│   │   ├── authz-keycloak2.t
│   │   ├── authz-keycloak3.t
│   │   ├── authz-keycloak4.t
│   │   ├── aws-lambda.t
│   │   ├── azure-functions.t
│   │   ├── basic-auth-anonymous-consumer.t
│   │   ├── basic-auth-realm.t
│   │   ├── basic-auth.t
│   │   ├── batch-requests-grpc.t
│   │   ├── batch-requests.t
│   │   ├── batch-requests2.t
│   │   ├── body-transformer-multipart.t
│   │   ├── body-transformer.t
│   │   ├── body-transformer2.t
│   │   ├── brotli.t
│   │   ├── cas-auth.t
│   │   ├── chaitin-waf-reject.t
│   │   ├── chaitin-waf-timeout.t
│   │   ├── chaitin-waf.t
│   │   ├── clickhouse-logger.t
│   │   ├── clickhouse-logger2.t
│   │   ├── clickhouse-logger3.t
│   │   ├── client-control.t
│   │   ├── consumer-bug-fix.t
│   │   ├── consumer-restriction.t
│   │   ├── consumer-restriction2.t
│   │   ├── cors.t
│   │   ├── cors2.t
│   │   ├── cors3.t
│   │   ├── cors4.t
│   │   ├── csrf.t
│   │   ├── custom_sort_plugins.t
│   │   ├── datadog.t
│   │   ├── degraphql.t
│   │   ├── dubbo-proxy/
│   │   │   ├── route.t
│   │   │   └── upstream.t
│   │   ├── echo.t
│   │   ├── elasticsearch-logger.t
│   │   ├── elasticsearch-logger2.t
│   │   ├── error-log-logger-clickhouse.t
│   │   ├── error-log-logger-kafka.t
│   │   ├── error-log-logger-skywalking.t
│   │   ├── error-log-logger.t
│   │   ├── example.t
│   │   ├── ext-plugin/
│   │   │   ├── conf_token.t
│   │   │   ├── extra-info.t
│   │   │   ├── http-req-call.t
│   │   │   ├── request-body.t
│   │   │   ├── response.t
│   │   │   ├── runner.sh
│   │   │   ├── runner_can_not_terminated.sh
│   │   │   ├── sanity.t
│   │   │   └── sanity2.t
│   │   ├── fault-injection.t
│   │   ├── fault-injection2.t
│   │   ├── file-logger-reopen.t
│   │   ├── file-logger.t
│   │   ├── file-logger2.t
│   │   ├── forward-auth.t
│   │   ├── forward-auth2.t
│   │   ├── google-cloud-logging/
│   │   │   ├── config-https-domain.json
│   │   │   ├── config-https-ip.json
│   │   │   └── config.json
│   │   ├── google-cloud-logging.t
│   │   ├── google-cloud-logging2.t
│   │   ├── google-cloud-logging3.t
│   │   ├── grpc-transcode-reload-bugfix.t
│   │   ├── grpc-transcode.t
│   │   ├── grpc-transcode2.t
│   │   ├── grpc-transcode3.t
│   │   ├── grpc-web/
│   │   │   ├── a6/
│   │   │   │   ├── buf.gen.yaml
│   │   │   │   ├── buf.yaml
│   │   │   │   ├── package.json
│   │   │   │   └── route.proto
│   │   │   ├── client.cts
│   │   │   ├── go.mod
│   │   │   ├── go.sum
│   │   │   ├── server.go
│   │   │   └── setup.sh
│   │   ├── grpc-web.t
│   │   ├── gzip.t
│   │   ├── hmac-auth-anonymous-consumer.t
│   │   ├── hmac-auth-realm.t
│   │   ├── hmac-auth.t
│   │   ├── hmac-auth2.t
│   │   ├── hmac-auth3.t
│   │   ├── hmac-auth4.t
│   │   ├── http-dubbo.t
│   │   ├── http-logger-json.t
│   │   ├── http-logger-large-body.t
│   │   ├── http-logger-log-format.t
│   │   ├── http-logger-new-line.t
│   │   ├── http-logger.t
│   │   ├── http-logger2.t
│   │   ├── http-logger3.t
│   │   ├── inspect.t
│   │   ├── ip-restriction.t
│   │   ├── jwe-decrypt.t
│   │   ├── jwt-auth-anonymous-consumer.t
│   │   ├── jwt-auth-more-algo.t
│   │   ├── jwt-auth-realm.t
│   │   ├── jwt-auth.t
│   │   ├── jwt-auth2.t
│   │   ├── jwt-auth3.t
│   │   ├── jwt-auth4.t
│   │   ├── kafka-logger-large-body.t
│   │   ├── kafka-logger-log-format.t
│   │   ├── kafka-logger.t
│   │   ├── kafka-logger2.t
│   │   ├── kafka-logger3.t
│   │   ├── kafka-logger4.t
│   │   ├── kafka-proxy.t
│   │   ├── key-auth-anonymous-consumer.t
│   │   ├── key-auth-realm.t
│   │   ├── key-auth-upstream-domain-node.t
│   │   ├── key-auth.t
│   │   ├── lago.spec.mts
│   │   ├── lago.t
│   │   ├── ldap-auth-realm.t
│   │   ├── ldap-auth.t
│   │   ├── limit-conn-redis-cluster.t
│   │   ├── limit-conn-redis.t
│   │   ├── limit-conn-variable.t
│   │   ├── limit-conn.t
│   │   ├── limit-conn2.t
│   │   ├── limit-conn3.t
│   │   ├── limit-count-consumer-group-credentials.t
│   │   ├── limit-count-consumer-isolation.t
│   │   ├── limit-count-redis-cluster.t
│   │   ├── limit-count-redis-cluster2.t
│   │   ├── limit-count-redis-cluster3.t
│   │   ├── limit-count-redis.t
│   │   ├── limit-count-redis2.t
│   │   ├── limit-count-redis3.t
│   │   ├── limit-count-redis4.t
│   │   ├── limit-count-rules.t
│   │   ├── limit-count-variable.t
│   │   ├── limit-count.t
│   │   ├── limit-count2.t
│   │   ├── limit-count3.t
│   │   ├── limit-count4.t
│   │   ├── limit-count5.t
│   │   ├── limit-req-redis-cluster.t
│   │   ├── limit-req-redis.t
│   │   ├── limit-req-shared-counter.t
│   │   ├── limit-req.t
│   │   ├── limit-req2.t
│   │   ├── limit-req3.t
│   │   ├── log-rotate.t
│   │   ├── log-rotate2.t
│   │   ├── log-rotate3.t
│   │   ├── loggly.t
│   │   ├── loki-logger.t
│   │   ├── loki-logger2.t
│   │   ├── mcp/
│   │   │   └── assets/
│   │   │       └── bridge-list-tools.json
│   │   ├── mcp-bridge.spec.mts
│   │   ├── mcp-bridge.t
│   │   ├── mocking.t
│   │   ├── multi-auth.t
│   │   ├── multi-auth2.t
│   │   ├── node-status.t
│   │   ├── ocsp-stapling.t
│   │   ├── opa.t
│   │   ├── opa2.t
│   │   ├── openfunction.t
│   │   ├── openid-connect/
│   │   │   └── configuration.json
│   │   ├── openid-connect-redis.t
│   │   ├── openid-connect.t
│   │   ├── openid-connect2.t
│   │   ├── openid-connect3.t
│   │   ├── openid-connect4.t
│   │   ├── openid-connect5.t
│   │   ├── openid-connect6.t
│   │   ├── openid-connect7.t
│   │   ├── openid-connect8.t
│   │   ├── openid-connect9.t
│   │   ├── opentelemetry.t
│   │   ├── opentelemetry2.t
│   │   ├── opentelemetry3.t
│   │   ├── opentelemetry4-bugfix-pb-state.t
│   │   ├── opentelemetry5.t
│   │   ├── opentelemetry6.t
│   │   ├── openwhisk.t
│   │   ├── plugin.t
│   │   ├── prometheus-ai-proxy.t
│   │   ├── prometheus-metric-expire.t
│   │   ├── prometheus.t
│   │   ├── prometheus2.t
│   │   ├── prometheus3.t
│   │   ├── prometheus4.t
│   │   ├── proxy-cache/
│   │   │   ├── disk.t
│   │   │   └── memory.t
│   │   ├── proxy-control.t
│   │   ├── proxy-mirror.t
│   │   ├── proxy-mirror2.t
│   │   ├── proxy-mirror3.t
│   │   ├── proxy-rewrite.t
│   │   ├── proxy-rewrite2.t
│   │   ├── proxy-rewrite3.t
│   │   ├── public-api.t
│   │   ├── real-ip.t
│   │   ├── redirect.t
│   │   ├── redirect2.t
│   │   ├── referer-restriction.t
│   │   ├── request-id.t
│   │   ├── request-id2.t
│   │   ├── request-id3.t
│   │   ├── request-validation.t
│   │   ├── request-validation2.t
│   │   ├── response-rewrite.t
│   │   ├── response-rewrite2.t
│   │   ├── response-rewrite3.t
│   │   ├── rocketmq-logger-log-format.t
│   │   ├── rocketmq-logger.t
│   │   ├── rocketmq-logger2.t
│   │   ├── security-warning.t
│   │   ├── security-warning2.t
│   │   ├── server-info.t
│   │   ├── serverless.t
│   │   ├── skywalking-logger.t
│   │   ├── skywalking-logger2.t
│   │   ├── skywalking.t
│   │   ├── skywalking2.t
│   │   ├── sls-logger.t
│   │   ├── splunk-hec-logging.t
│   │   ├── splunk-hec-logging2.t
│   │   ├── syslog.t
│   │   ├── tcp-logger.t
│   │   ├── tencent-cloud-cls.t
│   │   ├── traffic-split.t
│   │   ├── traffic-split2.t
│   │   ├── traffic-split3.t
│   │   ├── traffic-split4.t
│   │   ├── traffic-split5.t
│   │   ├── ua-restriction.t
│   │   ├── udp-logger.t
│   │   ├── uri-blocker.t
│   │   ├── wolf-rbac.t
│   │   ├── workflow-without-case.t
│   │   ├── workflow.t
│   │   ├── workflow2.t
│   │   ├── workflow3.t
│   │   ├── zipkin.t
│   │   ├── zipkin2.t
│   │   └── zipkin3.t
│   ├── pubsub/
│   │   ├── kafka.t
│   │   └── pubsub.t
│   ├── router/
│   │   ├── graphql.t
│   │   ├── multi-ssl-certs.t
│   │   ├── radixtree-host-uri-priority.t
│   │   ├── radixtree-host-uri.t
│   │   ├── radixtree-host-uri2.t
│   │   ├── radixtree-host-uri3.t
│   │   ├── radixtree-method.t
│   │   ├── radixtree-sni.t
│   │   ├── radixtree-sni2.t
│   │   ├── radixtree-sni3.t
│   │   ├── radixtree-uri-host.t
│   │   ├── radixtree-uri-keep-end-slash.t
│   │   ├── radixtree-uri-multiple.t
│   │   ├── radixtree-uri-priority.t
│   │   ├── radixtree-uri-sanity.t
│   │   ├── radixtree-uri-vars.t
│   │   ├── radixtree-uri-with-parameter.t
│   │   └── radixtree-uri-with-parameter2.t
│   ├── script/
│   │   ├── script.t
│   │   ├── script_distribute.t
│   │   └── script_test.lua
│   ├── secret/
│   │   ├── aws.t
│   │   ├── conf/
│   │   │   ├── error.json
│   │   │   └── success.json
│   │   ├── gcp.t
│   │   ├── secret_lru.t
│   │   └── vault.t
│   ├── sse_server_example/
│   │   ├── go.mod
│   │   └── main.go
│   ├── stream-node/
│   │   ├── control-api-healthcheck.t
│   │   ├── healthcheck-resty-events.t
│   │   ├── mtls.t
│   │   ├── priority-balancer.t
│   │   ├── random.t
│   │   ├── sanity-repeat.t
│   │   ├── sanity-with-service.t
│   │   ├── sanity.t
│   │   ├── sni.t
│   │   ├── tls.t
│   │   ├── upstream-domain.t
│   │   └── upstream-tls.t
│   ├── stream-plugin/
│   │   ├── ip-restriction.t
│   │   ├── limit-conn.t
│   │   ├── limit-conn2.t
│   │   ├── mqtt-proxy.t
│   │   ├── mqtt-proxy2.t
│   │   ├── plugin.t
│   │   ├── prometheus.t
│   │   ├── syslog.t
│   │   └── traffic-split.t
│   ├── tars/
│   │   ├── conf/
│   │   │   └── tars.sql
│   │   └── discovery/
│   │       ├── stream/
│   │       │   └── tars.t
│   │       └── tars.t
│   ├── ts/
│   │   ├── admin_api.ts
│   │   └── utils.ts
│   ├── tsconfig.json
│   ├── utils/
│   │   ├── batch-processor.t
│   │   └── rfc5424.t
│   ├── wasm/
│   │   ├── fault-injection/
│   │   │   └── main.go
│   │   ├── fault-injection.t
│   │   ├── forward-auth.go
│   │   ├── forward-auth.t
│   │   ├── global-rule.t
│   │   ├── go.mod
│   │   ├── go.sum
│   │   ├── log/
│   │   │   └── main.go
│   │   ├── request-body/
│   │   │   └── main.go
│   │   ├── request-body.t
│   │   ├── response-rewrite/
│   │   │   └── main.go
│   │   ├── response-rewrite.t
│   │   └── route.t
│   ├── xds-library/
│   │   ├── config_xds.t
│   │   ├── config_xds_2.t
│   │   ├── export.go
│   │   ├── main.go
│   │   └── xds.h
│   └── xrpc/
│       ├── apisix/
│       │   └── stream/
│       │       └── xrpc/
│       │           └── protocols/
│       │               └── pingpong/
│       │                   ├── init.lua
│       │                   └── schema.lua
│       ├── dubbo.t
│       ├── pingpong.t
│       ├── pingpong2.t
│       ├── pingpong3.t
│       ├── prometheus.t
│       ├── redis.t
│       └── redis2.t
└── utils/
    ├── check-category.py
    ├── check-lua-code-style.sh
    ├── check-merge-conflict.sh
    ├── check-plugins-code.sh
    ├── check-test-code-style.sh
    ├── check-version.sh
    ├── fix-zh-doc-segment.py
    ├── gen-vote-contents.sh
    ├── install-dependencies.sh
    └── linux-install-luarocks.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitmodules
================================================
[submodule "t/toolkit"]
	path = t/toolkit
	url = https://github.com/api7/test-toolkit.git
[submodule ".github/actions/action-semantic-pull-request"]
	path = .github/actions/action-semantic-pull-request
	url = https://github.com/amannn/action-semantic-pull-request.git
[submodule ".github/actions/autocorrect"]
	path = .github/actions/autocorrect
	url = https://github.com/huacnlee/autocorrect.git


================================================
FILE: .ignore_words
================================================
iam
te
ba
ue
shttp
nd
hel
nulll
smove
aks
nin


================================================
FILE: .licenserc.yaml
================================================
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
header:
  license:
    spdx-id: Apache-2.0
    copyright-owner: Apache Software Foundation

  license-location-threshold: 360

  paths-ignore:
    - '.gitignore'
    - '.gitattributes'
    - '.gitmodules'
    - 'LICENSE'
    - 'NOTICE'
    - '**/*.json'
    - '**/*.key'
    - '**/*.crt'
    - '**/*.pem'
    - '**/*.pb.go'
    - '**/pnpm-lock.yaml'
    - '.github/'
    - 'conf/mime.types'
    - '**/*.svg'
    # Exclude CI env_file
    - 'ci/pod/**/*.env'
    # eyes has some limitation to handle git pattern
    - '**/*.log'
    # Exclude test toolkit files
    - 't/toolkit'
    - 'go.mod'
    - 'go.sum'
    # Exclude non-Apache licensed files
    - 'apisix/balancer/ewma.lua'
    # Exclude plugin-specific configuration files
    - 't/plugin/authz-casbin'
    - 't/coredns'
    - 't/fuzzing/requirements.txt'
    - 'autodocs/'
    - 'docs/**/*.md'
    - '.ignore_words'
    - '.luacheckrc'
    # Exclude file contains certificate revocation information
    - 't/certs/ocsp/index.txt'

  comment: on-failure


================================================
FILE: .markdownlint.yml
================================================
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

MD001: false
MD004: false
MD005: false
MD006: false
MD007: false
MD010: false
MD013: false
MD014: false
MD024: false
MD026: false
MD029: false
MD033: false
MD034: false
MD036: false
MD040: false
MD041: false
MD046: false


================================================
FILE: CHANGELOG.md
================================================
---
title: Changelog
---

<!--
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
-->

## Table of Contents

- [3.15.0](#3150)
- [3.14.1](#3141)
- [3.14.0](#3140)
- [3.13.0](#3130)
- [3.12.0](#3120)
- [3.11.0](#3110)
- [3.10.0](#3100)
- [3.9.0](#390)
- [3.8.0](#380)
- [3.7.0](#370)
- [3.6.0](#360)
- [3.5.0](#350)
- [3.4.0](#340)
- [3.3.0](#330)
- [3.2.1](#321)
- [3.2.0](#320)
- [3.1.0](#310)
- [3.0.0](#300)
- [3.0.0-beta](#300-beta)
- [2.15.3](#2153)
- [2.15.2](#2152)
- [2.15.1](#2151)
- [2.15.0](#2150)
- [2.14.1](#2141)
- [2.14.0](#2140)
- [2.13.3](#2133)
- [2.13.2](#2132)
- [2.13.1](#2131)
- [2.13.0](#2130)
- [2.12.1](#2121)
- [2.12.0](#2120)
- [2.11.0](#2110)
- [2.10.5](#2105)
- [2.10.4](#2104)
- [2.10.3](#2103)
- [2.10.2](#2102)
- [2.10.1](#2101)
- [2.10.0](#2100)
- [2.9.0](#290)
- [2.8.0](#280)
- [2.7.0](#270)
- [2.6.0](#260)
- [2.5.0](#250)
- [2.4.0](#240)
- [2.3.0](#230)
- [2.2.0](#220)
- [2.1.0](#210)
- [2.0.0](#200)
- [1.5.0](#150)
- [1.4.1](#141)
- [1.4.0](#140)
- [1.3.0](#130)
- [1.2.0](#120)
- [1.1.0](#110)
- [1.0.0](#100)
- [0.9.0](#090)
- [0.8.0](#080)
- [0.7.0](#070)
- [0.6.0](#060)

## 3.15.0

**The changes marked with :warning: are not backward compatible.**

### Change

- :warning: fix: disallow creating duplicate plugins in global rules [#12800](https://github.com/apache/apisix/pull/12800)

### Core

- feat: kubernetes discovery readiness check [#12852](https://github.com/apache/apisix/pull/12852)
- feat: standalone mode status api [#12810](https://github.com/apache/apisix/pull/12810)
- feat: add validate API to standalone mode [#12718](https://github.com/apache/apisix/pull/12718)
- feat: add dependency protocol checking and deletion checking for stream routing [#12794](https://github.com/apache/apisix/pull/12794)
- feat: relax resource name length restriction to 256 [#11822](https://github.com/apache/apisix/pull/11822)
- feat: add support for wildcard on SNIs for SSL [#12668](https://github.com/apache/apisix/pull/12668)
- refactor: use secret URI as key for cache and refactor lrucache [#12682](https://github.com/apache/apisix/pull/12682)
- fix: maintain node_version for independent upstream [#12856](https://github.com/apache/apisix/pull/12856)
- fix: request failure during reload after any Eureka node fails [#12906](https://github.com/apache/apisix/pull/12906)
- fix: nacos service discovery request lacks retries after failure [#12734](https://github.com/apache/apisix/pull/12734)
- fix: load full data during init_worker phase require a new apisix-runtime [#12678](https://github.com/apache/apisix/pull/12678)
- chore: upgrade lua-resty-logger-socket [#12898](https://github.com/apache/apisix/pull/12898)
- chore: upgrade lua-resty-dns-client to 7.1.0 [#12851](https://github.com/apache/apisix/pull/12851)
- change: remove lua-resty-worker-events from the core dependencies [#12930](https://github.com/apache/apisix/pull/12930)

### Plugins

- feat: rate limiting plugins support setting keepalive for redis policy [#12861](https://github.com/apache/apisix/pull/12861)
- feat: support `apisix_request_id` variable with request-id plugin [#12931](https://github.com/apache/apisix/pull/12931)
- feat: support vertex-ai [#12933](https://github.com/apache/apisix/pull/12933)
- feat: support gemini openai api [#12883](https://github.com/apache/apisix/pull/12883)
- feat: support anthropic openai api [#12881](https://github.com/apache/apisix/pull/12881)
- feat: add support for openrouter [#12878](https://github.com/apache/apisix/pull/12878)
- feat: auth plugins respond with `www-authenticate` header with realm [#12864](https://github.com/apache/apisix/pull/12864)
- feat: allow grpc web in non prefix based routes [#12830](https://github.com/apache/apisix/pull/12830)
- feat(file-logger): add path properties to file-logger plugin metadata [#12825](https://github.com/apache/apisix/pull/12825)
- feat(log): add nested log format support for logger plugins [#12697](https://github.com/apache/apisix/pull/12697)
- feat: add max pending entries to all logger plugins [#12709](https://github.com/apache/apisix/pull/12709)
- feat(kafka-logger): add support for scram for authentication [#12693](https://github.com/apache/apisix/pull/12693)
- fix(limit-conn): implement configurable redis key expiry [#12872](https://github.com/apache/apisix/pull/12872)
- fix(skywalking): start timer when route is hit [#12855](https://github.com/apache/apisix/pull/12855)
- fix: eliminate deepcopy when destroying prometheus [#12905](https://github.com/apache/apisix/pull/12905)
- fix(limit-req): ensure safe eviction of keys in redis [#12911](https://github.com/apache/apisix/pull/12911)
- fix(limit-count): use meta parent to identify plugin source [#12900](https://github.com/apache/apisix/pull/12900)
- fix: Make protocol_name optional and default to 'MQTT' for mqtt plugin [#12831](https://github.com/apache/apisix/pull/12831)
- fix(batch-requests): the number of sub-responses does not match that of sub-requests [#12779](https://github.com/apache/apisix/pull/12779)
- fix(ai-proxy): correct logging schema key in ai-proxy-multi [#12795](https://github.com/apache/apisix/pull/12795)
- fix(plugin_metadata): ensure enable_data_encryption initialization & querying issue [#12624](https://github.com/apache/apisix/pull/12624)

### Bugfixes

- fix: correct handling of endpointSlices in Kubernetes service discovery [#12634](https://github.com/apache/apisix/pull/12634)
- fix: Adding request-id header in case of empty header value in request [#12837](https://github.com/apache/apisix/pull/12837)
- fix(docker): adjust permissions for apisix directory to run in openshift without anyuid command [#12824](https://github.com/apache/apisix/pull/12824)
- fix: correct pre/post hook typos in Kubernetes discovery and improve cleanup safety [#12288](https://github.com/apache/apisix/pull/12288)
- fix(performance): move the ipv6 check to schema validation [#12714](https://github.com/apache/apisix/pull/12714)
- fix(authz-keycloak): strip query string when resolving resources with lazy_load_paths [#12914](https://github.com/apache/apisix/pull/12914)

## 3.14.1

### Bugfixes

- fix: port conflict in worker process for prometheus port [#12667](https://github.com/apache/apisix/pull/12667)

### Core

- fix: add warning log when skipping check for disabled plugin [#12655](https://github.com/apache/apisix/pull/12655)
- chore: add test for verifying lua-resty-openssl bug fix [#12656](https://github.com/apache/apisix/pull/12656)

## Doc improvements

- docs: remove unnecessary sentence in opentelemetry plugin doc [#12660](https://github.com/apache/apisix/pull/12660)

## 3.14.0

**The changes marked with :warning: are not backward compatible.**

### Change

- :warning: feat: admin api no longer populates default values when writing [#12603](https://github.com/apache/apisix/pull/12603)
- :warning: change(jwt-auth): when algorithm is not RS256 or ES256, require the user to fill in secret [#12611](https://github.com/apache/apisix/pull/12611)
- :warning: change(openid-connect): when bearer_only is false, require the user to fill in session.secret [#12609](https://github.com/apache/apisix/pull/12609)

### Bugfixes

- fix: redact encrypted fields from error log [#12629](https://github.com/apache/apisix/pull/12629)
- fix: run init_worker of apisix.admin module in stream subsystem [#12632](https://github.com/apache/apisix/pull/12632)
- fix(ai-proxy-multi): inconsistent resolved nodes for healthcheck [#12594](https://github.com/apache/apisix/pull/12594)
- fix: only trust X-Forwarded-* headers from trusted_addresses [#12551](https://github.com/apache/apisix/pull/12551)
- fix(plugin/redirect): ensure redirect when scheme is not https [#12561](https://github.com/apache/apisix/pull/12561)
- fix: fix ui redirect error when behind proxy [#12566](https://github.com/apache/apisix/pull/12566)
- fix(secret): refresh stale lru cache item in background [#12614](https://github.com/apache/apisix/pull/12614)
- fix: healthcheck manager missing runtime information [#12607](https://github.com/apache/apisix/pull/12607)
- fix(standalone): support stream route in admin api mode [#12604](https://github.com/apache/apisix/pull/12604)
- fix: only log response body when include_resp_body is enabled [#12599](https://github.com/apache/apisix/pull/12599)
- fix: correct spelling error in get_healthcheck_events_module function name [#12587](https://github.com/apache/apisix/pull/12587)
- fix: typo in ai-proxy-multi [#12601](https://github.com/apache/apisix/pull/12601)
- fix(ai-proxy-multi): panic when instance dont have custom endpoint [#12584](https://github.com/apache/apisix/pull/12584)
- fix(ai-prompt-decorator): prevent message accumulation across requests [#12582](https://github.com/apache/apisix/pull/12582)
- fix: docker entrypoint remove stream_worker_events.sock if exists [#12546](https://github.com/apache/apisix/pull/12546)
- fix: add exptime to ewma shared dict items [#12557](https://github.com/apache/apisix/pull/12557)
- fix(ai-proxy): catch malformed override endpoint in schema validation [#12563](https://github.com/apache/apisix/pull/12563)
- fix: missing ctx.llm_raw_usage in non-stream mode [#12564](https://github.com/apache/apisix/pull/12564)
- fix(ai-proxy): set llm variables default value to 0 [#12549](https://github.com/apache/apisix/pull/12549)
- fix(ai-proxy): check type of choices/usage/content fields before use it [#12548](https://github.com/apache/apisix/pull/12548)
- fix(discovery/kubernetes): adjust id length [#12536](https://github.com/apache/apisix/pull/12536)
- fix: basic auth scheme supports case insensitivity [#12539](https://github.com/apache/apisix/pull/12539)
- fix: when only tls.verify, skip the logic of judging client cert [#12527](https://github.com/apache/apisix/pull/12527)
- fix(etcd): load full data from etcd while worker restart [#12523](https://github.com/apache/apisix/pull/12523)
- fix(etcd): upgrade revision when watch request timeout [#12514](https://github.com/apache/apisix/pull/12514)
- fix: enable issue of endpointslices for k8s discovery [#11654](https://github.com/apache/apisix/pull/11654)
- fix(grpc-web): missing trailers when empty resp body [#12490](https://github.com/apache/apisix/pull/12490)
- fix: can not get hostname in redhat [#12267](https://github.com/apache/apisix/pull/12267)
- fix: batch processor cache not working when configure plugin in service [#12474](https://github.com/apache/apisix/pull/12474)
- fix(forward-auth): extra_headers not resolving variable on $post_arg. [#12435](https://github.com/apache/apisix/pull/12435)
- fix: skipped failing bailedout tests in CI [#12462](https://github.com/apache/apisix/pull/12462)
- fix(api-breaker): inconsistent circuit breaking due to premature breaker_time increment [#12451](https://github.com/apache/apisix/pull/12451)
- fix(standalone): lack of configuration validation in api [#12424](https://github.com/apache/apisix/pull/12424)
- fix(log-rotate): skip access log when enable_access_log is set to false [#11310](https://github.com/apache/apisix/pull/11310)
- fix(opentelemetry): remove plugin attr set_ngx_var [#12411](https://github.com/apache/apisix/pull/12411)
- fix: broken mcp-bridge test cases [#12425](https://github.com/apache/apisix/pull/12425)
- fix(request-validation): support Content-Type header with charset for urlencoded data [#12406](https://github.com/apache/apisix/pull/12406)
- fix: zipkin trace_id and span_id format in ngx_var [#12403](https://github.com/apache/apisix/pull/12403)
- fix(consumer): missed consumer update due to wrong version in cache [#12413](https://github.com/apache/apisix/pull/12413)
- revert: fix: forward-auth request body too large [#12404](https://github.com/apache/apisix/pull/12404)
- fix: get_keys only return first 1024 items in shared dict by default [#12380](https://github.com/apache/apisix/pull/12380)

### Core

- ci: migrate docker image for testing to bitnamilegacy repo [#12562](https://github.com/apache/apisix/pull/12562)
- chore: remove redundant profile.apisix_home assignment in start [#12529](https://github.com/apache/apisix/pull/12529)
- chore: upgrade deps to solve vulnerability alerts [#12473](https://github.com/apache/apisix/pull/12473)
- refactor: add healthcheck manager to decouple upstream [#12426](https://github.com/apache/apisix/pull/12426)
- feat: add last modified and digest metadata to standalone API [#12526](https://github.com/apache/apisix/pull/12526)
- feat: support ctx.var.post_arg for vars based route matching on request body [#12388](https://github.com/apache/apisix/pull/12388)
- feat: add a global switch to disable upstream health check [#12407](https://github.com/apache/apisix/pull/12407)
- feat: support multiple json.delay_encode objects in single log [#12395](https://github.com/apache/apisix/pull/12395)

### Plugins

- feat: support OIDC claim validator [#11824](https://github.com/apache/apisix/pull/11824)
- feat: support traffic split plugin for stream routes [#12630](https://github.com/apache/apisix/pull/12630)
- feat: add ksuid algorithm on request-id plugin [#12573](https://github.com/apache/apisix/pull/12573)
- feat: add fallback mechanism for specific error codes in ai-proxy-multi [#12571](https://github.com/apache/apisix/pull/12571)
- feat(ai-proxy): add upstream_response_time in access log [#12555](https://github.com/apache/apisix/pull/12555)
- feat(ai-proxy): add new ctx variable for request llm model [#12554](https://github.com/apache/apisix/pull/12554)
- feat: add support for azure-ai driver [#12565](https://github.com/apache/apisix/pull/12565)
- feat(ai-proxy): add support for pushing logs in ai-proxy plugins [#12515](https://github.com/apache/apisix/pull/12515)
- feat: add ai-aliyun-content-moderation plugin [#12530](https://github.com/apache/apisix/pull/12530)
- feat: allow to use environment variables for openid-connect plugin [#11451](https://github.com/apache/apisix/pull/11451)
- feat(ai-proxy-multi): add support for healthcheck [#12509](https://github.com/apache/apisix/pull/12509)
- feat(ai-proxy): add latency and usage in access log and prometheus metrics [#12518](https://github.com/apache/apisix/pull/12518)
- feat: support limit-conn in workflow plugin [#12465](https://github.com/apache/apisix/pull/12465)
- feat(datadog): Improve Datadog plugin tag support [#11943](https://github.com/apache/apisix/pull/11943)
- feat: decoupled prometheus exporter's calculation and output [#12383](https://github.com/apache/apisix/pull/12383)
- feat: add support for extra_headers in forward-auth plugin [#12405](https://github.com/apache/apisix/pull/12405)
- feat: Add AIMLAPI provider support to AI plugins [#12379](https://github.com/apache/apisix/pull/12379)

## Doc improvements

- docs: update admin api documentation for plugin metadata list endpoint [#12621](https://github.com/apache/apisix/pull/12621)
- docs: add new dashboard documentation [#12616](https://github.com/apache/apisix/pull/12616)
- docs: update note for API-drive standalone mode [#12612](https://github.com/apache/apisix/pull/12612)
- docs: Improve chaitin-waf plugin docs and remove unintended highlights [#12608](https://github.com/apache/apisix/pull/12608)
- docs: remove outdate dashboard doc [#12596](https://github.com/apache/apisix/pull/12596)
- docs: update apisix_upstream_response_time and request_llm_model in access log info [#12583](https://github.com/apache/apisix/pull/12583)
- docs: remove LLM variable in access log examples [#12503](https://github.com/apache/apisix/pull/12503)
- docs: update jwt-auth docs [#12450](https://github.com/apache/apisix/pull/12450)
- docs: update rpm installation guide [#12460](https://github.com/apache/apisix/pull/12460)
- docs: fix typo in credentials doc [#12434](https://github.com/apache/apisix/pull/12434)
- docs: add dashboard ui tips [#12420](https://github.com/apache/apisix/pull/12420)
- docs: correct minor typo for openwhisk [#12401](https://github.com/apache/apisix/pull/12401)
- docs: update changelog with breakchange notices [#12396](https://github.com/apache/apisix/pull/12396)
- docs: improve openid-connect plugin doc and add keycloak OIDC tutorial [#11889](https://github.com/apache/apisix/pull/11889)

## 3.13.0

**The changes marked with :warning: are not backward compatible.**

### Change

- :warning: mark server-info plugin as deprecated [#12244](https://github.com/apache/apisix/pull/12244)
- :warning: fill in the metadata of resource schema [#12224](https://github.com/apache/apisix/pull/12224).
This PR sets additionalProperties to false for consumer credentials.

### Bugfixes

- fix: running stale healthchecker when new node count <= 1 [#12118](https://github.com/apache/apisix/pull/12118)
- fix: release healthchecker on 0 nodes [#12126](https://github.com/apache/apisix/pull/12126)
- fix: only parse and validate apisix.yaml in cli when startup [#12216](https://github.com/apache/apisix/pull/12216)
- fix(standalone): API-driven mode does not properly handle consumer schema [#12256](https://github.com/apache/apisix/pull/12256)
- fix: added restriction for TLSv1.3 cross-SNI session resumption [#12366](https://github.com/apache/apisix/pull/12366)
- fix: flaky t/admin/filter.t due to url encoding for query params [#12370](https://github.com/apache/apisix/pull/12370)
- fix(workflow/push-dev-image-on-commit): remove already defined uses [#12365](https://github.com/apache/apisix/pull/12365)
- fix(workflow): use runners with different architectures instead of QEMU [#12322](https://github.com/apache/apisix/pull/12322)
- fix: kubernetes service discovery single mode data dump [#12284](https://github.com/apache/apisix/pull/12284)
- fix: handle consul nil port cases by defaulting to port 80 [#12304](https://github.com/apache/apisix/pull/12304)
- fix: check if config contains duplicate resources in API-driven standalone mode [#12317](https://github.com/apache/apisix/pull/12317)
- fix: original key being modified causing cache inconsistency [#12299](https://github.com/apache/apisix/pull/12299)
- fix: access to the apisix dashboard in dev returns 404 [#12376](https://github.com/apache/apisix/pull/12376)

### Core

- feat(consumer): consumer username allows - in it [#12296](https://github.com/apache/apisix/pull/12296)
- chore: change log level to debug to avoid unnecessary logs [#12361](https://github.com/apache/apisix/pull/12361)
- chore: change log level from warn to info for stale batch processor removal [#12297](https://github.com/apache/apisix/pull/12297)
- feat(standalone): allow more characters in credential_id for API-driven mode [#12295](https://github.com/apache/apisix/pull/12295)
- feat: add standalone admin api [#12179](https://github.com/apache/apisix/pull/12179)
- feat: support health checker for stream subsystem [#12180](https://github.com/apache/apisix/pull/12180)
- feat(standalone): support revision in API-driven standalone mode like etcd [#12214](https://github.com/apache/apisix/pull/12214)
- feat: add healthcheck for sync configuration [#12200](https://github.com/apache/apisix/pull/12200)
- perf: compare service discovery nodes by address [#12258](https://github.com/apache/apisix/pull/12258)
- feat: fill in the metadata of resource schema [#12224](https://github.com/apache/apisix/pull/12224)
- feat: add embedded apisix dashboard ui [#12276](https://github.com/apache/apisix/pull/12276)
- feat: add apisix dashboard to dev image [#12369](https://github.com/apache/apisix/pull/12369)
- feat: add max pending entries option to batch-processor [#12338](https://github.com/apache/apisix/pull/12338)
- feat(standalone): support JSON format [#12333](https://github.com/apache/apisix/pull/12333)
- feat: enhance admin api filter [#12291](https://github.com/apache/apisix/pull/12291)
- feat: add warning for data plane writing to etcd [#12241](https://github.com/apache/apisix/pull/12241)
- chore: upgrade openresty version to v1.27.1.2 [#12307](https://github.com/apache/apisix/pull/12307)
- chore: upgrade luarocks version to 3.12.0 [#12305](https://github.com/apache/apisix/pull/12305)

### Plugins

- refactor(ai-proxy): move read_response into ai_driver.request function [#12101](https://github.com/apache/apisix/pull/12101)
- refactor: mcp server framework implementation [#12168](https://github.com/apache/apisix/pull/12168)
- feat: add mcp-bridge plugin [#12151](https://github.com/apache/apisix/pull/12151)
- feat: add lago plugin [#12196](https://github.com/apache/apisix/pull/12196)
- feat: add headers attribute for loki-logger [#12243](https://github.com/apache/apisix/pull/12243)
- feat: expose apisix version in prometheus node info metric [#12367](https://github.com/apache/apisix/pull/12367)

## Doc improvements

- docs: update stream proxy doc for proxy_mode and some formatting [#12108](https://github.com/apache/apisix/pull/12108)
- docs: improve loki-logger plugin docs [#11921](https://github.com/apache/apisix/pull/11921)
- docs: improve ua-restriction plugin docs [#11956](https://github.com/apache/apisix/pull/11956)
- docs: improve elasticsearch-logger plugin docs [#11922](https://github.com/apache/apisix/pull/11922)
- fix file logger example wrong data structure [#12125](https://github.com/apache/apisix/pull/12125)
- docs: improve limit-req plugin docs [#11873](https://github.com/apache/apisix/pull/11873)
- docs: improve body-transformer plugin docs [#11856](https://github.com/apache/apisix/pull/11856)
- docs: update ai-rate-limiting and ai-rag docs [#12107](https://github.com/apache/apisix/pull/12107)
- docs: improve basic-auth docs and update docs for anonymous consumer [#11859](https://github.com/apache/apisix/pull/11859)
- docs: improve key-auth docs and update docs for anonymous consumer [#11860](https://github.com/apache/apisix/pull/11860)
- docs: improve hmac-auth plugin docs and update docs for anonymous consumer [#11867](https://github.com/apache/apisix/pull/11867)
- docs: improve jwt-auth plugin docs and update docs for anonymous consumer [#11865](https://github.com/apache/apisix/pull/11865)
- docs: improve request-validation plugin docs [#11853](https://github.com/apache/apisix/pull/11853)
- docs: update variable in building apisix from source [#11640](https://github.com/apache/apisix/pull/11640)
- docs: update readme with APISIX AI Gateway product link and MCP feature [#12166](https://github.com/apache/apisix/pull/12166)
- docs: improve plugin-develop docs [#12242](https://github.com/apache/apisix/pull/12242)
- docs: fix typo in real-ip.md [#12236](https://github.com/apache/apisix/pull/12236)
- docs: the configuration type of the WASM plugin can be an object. [#12251](https://github.com/apache/apisix/pull/12251)

## Developer productivity

- feat: support devcontainer for containerized development of APISIX [#11765](https://github.com/apache/apisix/pull/11765)

## 3.12.0

**The changes marked with :warning: are not backward compatible.**

### Change

- :warning: replace plugin attribute with plugin metadata in `opentelemetry` plugin [#11940](https://github.com/apache/apisix/pull/11940)
- :warning: refactor: ai-content-moderation to ai-aws-content-moderation [#12010](https://github.com/apache/apisix/pull/12010)
- add expiration time for all Prometheus metrics [#11838](https://github.com/apache/apisix/pull/11838)
- allow workflow config without case [#11787](https://github.com/apache/apisix/pull/11787)
- unify google-cloud-oauth.lua file [#11596](https://github.com/apache/apisix/pull/11596)
- :warning: ai-proxy remove passthrough [#12014](https://github.com/apache/apisix/pull/12014)
- :warning: remove model options' `stream` default value [#12013](https://github.com/apache/apisix/pull/12013)
- :warning: grpc-web response contains two trailer chunks [#11988](https://github.com/apache/apisix/pull/11988).
This PR returns `405 Method not allowed` instead of `400 Bad Request` when request HTTP method errors.
- :warning: disallow empty key configuration attributes [#11852](https://github.com/apache/apisix/pull/11852)
- :warning: set default value of ssl_trusted_certificate to system [#11993](https://github.com/apache/apisix/pull/11993)

### Bugfixes

- Fix: timeout risk in usages of lua-resty-aws [#12070](https://github.com/apache/apisix/pull/12070)
- Fix: ai-rate-limiting not allowed to limit to a single instance [#12061](https://github.com/apache/apisix/pull/12061)
- Fix: update watch_ctx.revision to avoid multiple resyncs [#12021](https://github.com/apache/apisix/pull/12021)
- Fix: ai-proxy remove passthrough [#12014](https://github.com/apache/apisix/pull/12014)
- Fix: ai-proxy dead loop when retrying [#12012](https://github.com/apache/apisix/pull/12012)
- Fix: error while trying to log table in ai-content-moderation plugin [#11994](https://github.com/apache/apisix/pull/11994)
- Fix: resync etcd when a lower revision is found [#12015](https://github.com/apache/apisix/pull/12015)
- Fix: remove model options' `stream` default value [#12013](https://github.com/apache/apisix/pull/12013)
- Fix: grpc-web response contains two trailer chunks [#11988](https://github.com/apache/apisix/pull/11988)
- Fix: event_id is nil in chaitin-waf [#11651](https://github.com/apache/apisix/pull/11651)
- Fix: race condition problem while update upstream.nodes [#11916](https://github.com/apache/apisix/pull/11916)
- Fix: `upstream_obj.upstream` should not be a string [#11932](https://github.com/apache/apisix/pull/11932)
- Fix: query params in override.endpoint not being sent to LLMs [#11863](https://github.com/apache/apisix/pull/11863)
- Fix: add support for ignoring "load" global variable [#11862](https://github.com/apache/apisix/pull/11862)
- Fix: corrupt data in routes() response due to healthchecker data [#11844](https://github.com/apache/apisix/pull/11844)
- Fix: deepcopy should copy same table exactly only once [#11861](https://github.com/apache/apisix/pull/11861)
- Fix: disallow empty key configuration attributes [#11852](https://github.com/apache/apisix/pull/11852)
- Fix: etcd watch restart when receive invalid revision [#11833](https://github.com/apache/apisix/pull/11833)
- Fix: missing parsed_url nil check [#11637](https://github.com/apache/apisix/pull/11637)
- Fix: use `plugin.get` to fetch plugin configured in multi-auth plugin [#11794](https://github.com/apache/apisix/pull/11794)
- Fix: allow special characters in uri params [#11788](https://github.com/apache/apisix/pull/11788)
- Fix: add nil check to conf in body-transformer [#11768](https://github.com/apache/apisix/pull/11768)
- Fix: use max_req_body_bytes field in custom_format [#11771](https://github.com/apache/apisix/pull/11771)
- Fix: health checker can't be released due to health parent being released early [#11760](https://github.com/apache/apisix/pull/11760)
- Fix: use right modifiedIndex for consumer when use credential [#11649](https://github.com/apache/apisix/pull/11649)

### Core

- set default value of ssl_trusted_certificate to system [#11993](https://github.com/apache/apisix/pull/11993)
- upgrade openresty version to v1.27.11 [#11936](https://github.com/apache/apisix/pull/11936)
- Support the use of system-provided CA certs in `ssl_trusted_certificate` [#11809](https://github.com/apache/apisix/pull/11809)
- support _meta.pre_function to execute custom logic before execution of each phase [#11793](https://github.com/apache/apisix/pull/11793)
- support anonymous consumer [#11917](https://github.com/apache/apisix/pull/11917)
- accelerate the creation of the consumer cache [#11840](https://github.com/apache/apisix/pull/11840)
- replace 'string.find' with 'core.string.find' [#11886](https://github.com/apache/apisix/pull/11886)
- workflow plugin registration [#11832](https://github.com/apache/apisix/pull/11832)

### Plugins

- refactor ai-proxy and ai-proxy-multi [#12030](https://github.com/apache/apisix/pull/12030)
- support embeddings API [#12062](https://github.com/apache/apisix/pull/12062)
- implement rate limiting based fallback strategy [#12047](https://github.com/apache/apisix/pull/12047)
- ai-rate-limiting plugin [#12037](https://github.com/apache/apisix/pull/12037)
- add `valid_issuers` field in `openid-connect` plugin [#12002](https://github.com/apache/apisix/pull/12002)
- add ai-prompt-guard plugin [#12008](https://github.com/apache/apisix/pull/12008)
- add jwt audience validator [#11987](https://github.com/apache/apisix/pull/11987)
- store JWT in the request context [#11675](https://github.com/apache/apisix/pull/11675)
- support proxying openai compatible LLMs [#12004](https://github.com/apache/apisix/pull/12004)
- add `ai-proxy-multi` plugin [#11986](https://github.com/apache/apisix/pull/11986) [#12030](https://github.com/apache/apisix/pull/12030)
- make rate limiting response header names configurable [#11831](https://github.com/apache/apisix/pull/11831)
- support mulipart content-type in `body-transformer` [#11767](https://github.com/apache/apisix/pull/11767)
- plugins in multi-auth returns error instead of logging it [#11775](https://github.com/apache/apisix/pull/11775)
- support configuring `key_claim_name` [#11772](https://github.com/apache/apisix/pull/11772)
- add Total request per second panel in grafana dashboard [#11692](https://github.com/apache/apisix/pull/11692)
- add ai-rag plugin [#11568](https://github.com/apache/apisix/pull/11568)
- add ai-content-moderation plugin [#11541](https://github.com/apache/apisix/pull/11541)
- use setmetatable to set hidden variables without effecting serialisation [#11770](https://github.com/apache/apisix/pull/11770)

## 3.11.0

**The changes marked with :warning: are not backward compatible.**

### Change

- :warning: remove JWT signing endpoint and no longer require a private key to be uploaded in the jwt-auth plugin. [#11597](https://github.com/apache/apisix/pull/11597)
- :warning: rewrite hmac-auth plugin for usability [#11581](https://github.com/apache/apisix/pull/11581)

### Plugins

- allow configuring keepalive_timeout in splunk-logger [#11611](https://github.com/apache/apisix/pull/11611)
- add plugin attach-consmer-label [#11604](https://github.com/apache/apisix/pull/11604)
- ai-proxy plugin [#11499](https://github.com/apache/apisix/pull/11499)
- ai-prompt-decorator plugin [#11515](https://github.com/apache/apisix/pull/11515)
- ai-prompt-template plugin [#11517](https://github.com/apache/apisix/pull/11517)

### Bugfixes

- Fix: adjust the position of enums in pb_option_def [#11448](https://github.com/apache/apisix/pull/11448)
- Fix: encryption/decryption for non-auth plugins in consumer [#11600](https://github.com/apache/apisix/pull/11600)
- Fix: confusion when substituting ENV in config file [#11545](https://github.com/apache/apisix/pull/11545)

### Core

- support gcp secret manager [#11436](https://github.com/apache/apisix/pull/11436)
- support aws secret manager [#11417](https://github.com/apache/apisix/pull/11417)
- add credential resource and include `X-Consumer-Username`, `X-Credential-Identifier`, and `X-Consumer-Custom-ID` headers in requests to upstream services [#11601](https://github.com/apache/apisix/pull/11601)

## 3.10.0

**The changes marked with :warning: are not backward compatible.**

### Change

- :warning: remove `core.grpc` module [#11427](https://github.com/apache/apisix/pull/11427)
- add max req/resp body size attributes [#11133](https://github.com/apache/apisix/pull/11133)
- :warning: autogenerate admin api key if not passed [#11080](https://github.com/apache/apisix/pull/11080)
- :warning: enable sensitive fields encryption by default [#11076](https://github.com/apache/apisix/pull/11076)
- support more sensitive fields for encryption [#11095](https://github.com/apache/apisix/pull/11095)
- :warning: avoid overwriting `Access-Control-Expose-Headers` response header [#11136](https://github.com/apache/apisix/pull/11136)
This change removes the default `*` value for `expose_headers` and only sets the header when explicitly configured.
- :warning: add a default limit of 100 for `get_headers()` [#11140](https://github.com/apache/apisix/pull/11140)
- :warning: core.request.header return strings instead of table [#11127](https://github.com/apache/apisix/pull/11127)
This function now always returns strings, previously it returned tables when duplicate headers existed.

### Plugins

- allow set headers in introspection request [#11090](https://github.com/apache/apisix/pull/11090)

### Bugfixes

- Fix: add libyaml-dev dependency for apt [#11291](https://github.com/apache/apisix/pull/11291)
- Fix: etcd sync data checker should work [#11457](https://github.com/apache/apisix/pull/11457)
- Fix: plugin metadata add id value for etcd checker [#11452](https://github.com/apache/apisix/pull/11452)
- Fix: allow trailing period in SNI and CN for SSL [#11414](https://github.com/apache/apisix/pull/11414)
- Fix: filter out illegal INT(string) formats [#11367](https://github.com/apache/apisix/pull/11367)
- Fix: make the message clearer when API key is missing [#11370](https://github.com/apache/apisix/pull/11370)
- Fix: report consumer username tag in datadog [#11354](https://github.com/apache/apisix/pull/11354)
- Fix: after updating the header, get the old value from the ctx.var [#11329](https://github.com/apache/apisix/pull/11329)
- Fix: ssl key rotation caused request failure [#11305](https://github.com/apache/apisix/pull/11305)
- Fix: validation fails causing etcd events not to be handled correctly [#11268](https://github.com/apache/apisix/pull/11268)
- Fix: stream route matcher is nil after first match [#11269](https://github.com/apache/apisix/pull/11269)
- Fix: rectify the way to fetch secret resource by id [#11164](https://github.com/apache/apisix/pull/11164)
- Fix: multi-auth raise 500 error when use default conf [#11145](https://github.com/apache/apisix/pull/11145)
- Fix: avoid overwriting `Access-Control-Expose-Headers` response header [#11136](https://github.com/apache/apisix/pull/11136)
- Fix: close session in case of error to avoid blocked session [#11089](https://github.com/apache/apisix/pull/11089)
- Fix: restore `pb.state` appropriately [#11135](https://github.com/apache/apisix/pull/11135)
- Fix: add a default limit of 100 for `get_headers()` [#11140](https://github.com/apache/apisix/pull/11140)
- Fix: disable features when prometheus plugin is turned off [#11117](https://github.com/apache/apisix/pull/11117)
- Fix: add post request headers only if auth request method is POST [#11021](https://github.com/apache/apisix/pull/11021)
- Fix: core.request.header return strings instead of table [#11127](https://github.com/apache/apisix/pull/11127)
- Fix: brotli partial response [#11087](https://github.com/apache/apisix/pull/11087)
- Fix: the port value greater than 65535 should not be allowed [#11043](https://github.com/apache/apisix/pull/11043)

### Core

- upgrade openresty version to 1.25.3.2 [#11419](https://github.com/apache/apisix/pull/11419)
- move config-default.yaml to hardcoded lua file [#11343](https://github.com/apache/apisix/pull/11343)
- warn log when sending requests to external services insecurely [#11403](https://github.com/apache/apisix/pull/11403)
- update casbin to 1.41.9 [#11400](https://github.com/apache/apisix/pull/11400)
- update lua-resty-t1k to 1.1.5 [#11391](https://github.com/apache/apisix/pull/11391)
- support store ssl.keys ssl.certs in secrets mamager [#11339](https://github.com/apache/apisix/pull/11339)
- move tinyyaml to lyaml [#11312](https://github.com/apache/apisix/pull/11312)
- support hcv namespace [#11277](https://github.com/apache/apisix/pull/11277)
- add discovery k8s dump data interface [#11111](https://github.com/apache/apisix/pull/11111)
- make fetch_secrets use cache for performance [#11201](https://github.com/apache/apisix/pull/11201)
- replace 'string.len' with '#' [#11078](https://github.com/apache/apisix/pull/11078)

## 3.9.0

**The changes marked with :warning: are not backward compatible.**

### Change

- :warning: use apisix.enable_http2 to enable HTTP/2 in APISIX [#11032](https://github.com/apache/apisix/pull/11032)
- :warning: unify the keyring and key_encrypt_salt fields [#10771](https://github.com/apache/apisix/pull/10771)

### Core

- :sunrise: Support HTTP3/QUIC
  - [#10989](https://github.com/apache/apisix/pull/10989)
  - [#11010](https://github.com/apache/apisix/pull/11010)
  - [#11027](https://github.com/apache/apisix/pull/11027)
- :sunrise: add plugins/reload to control api [#10905](https://github.com/apache/apisix/pull/10905)
- :sunrise: consul deduplicate and sort [#10941](https://github.com/apache/apisix/pull/10941)
- :sunrise: support uri_arg_ when use radixtree_uri_with_parameter [#10645](https://github.com/apache/apisix/pull/10645)

### Plugins

- :sunrise: add session.cookie configuration [#10919](https://github.com/apache/apisix/pull/10919)
- :sunrise: support endpointslices in kubernetes discovery [#10916](https://github.com/apache/apisix/pull/10916)
- :sunrise: add redis and redis-cluster in limit-req [#10874](https://github.com/apache/apisix/pull/10874)
- :sunrise: support expire prometheus metrics [#10869](https://github.com/apache/apisix/pull/10869)
- :sunrise: add redis and redis-cluster in limit-conn [#10866](https://github.com/apache/apisix/pull/10866)
- :sunrise: allow configuring allow-headers in grpc-web plugin [#10904](https://github.com/apache/apisix/pull/10904)
- :sunrise: Add forward-auth plugin exception configuration status_on_error [#10898](https://github.com/apache/apisix/pull/10898)
- :sunrise: add option to include request body and response body in log util [#10888](https://github.com/apache/apisix/pull/10888)
- :sunrise: support compressed responses in loggers [#10884](https://github.com/apache/apisix/pull/10884)
- :sunrise: add http-dubbo plugin [#10703](https://github.com/apache/apisix/pull/10703)
- :sunrise: support built-in variables in response_headers in mocking plugin [#10872](https://github.com/apache/apisix/pull/10872)
- :sunrise: support other data formats without warnings [#10862](https://github.com/apache/apisix/pull/10862)
- :sunrise: add ocsp-stapling plugin [#10817](https://github.com/apache/apisix/pull/10817)

### Bug Fixes

- Fix: keep different strategy response header consistency [#11048](https://github.com/apache/apisix/pull/11048)
- Fix: add apisix/plugin/limit-req to makefile [#10955](https://github.com/apache/apisix/pull/10959)
- Fix: wrong namespace related endpoint in k8s [#10917](https://github.com/apache/apisix/pull/10917)
- Fix: when delete the secret cause 500 error [#10902](https://github.com/apache/apisix/pull/10902)
- Fix: jwe-decrypt secret length restriction [#10928](https://github.com/apache/apisix/pull/10928)
- Fix: unnecessary YAML Config reloads [#9065](https://github.com/apache/apisix/pull/9065)
- Fix: real_payload was overridden by malicious payload [#10982](https://github.com/apache/apisix/pull/10982)
- Fix: all origins could pass when allow_origins_by_metadata is set [#10948](https://github.com/apache/apisix/pull/10948)
- Fix: add compatibility headers [#10828](https://github.com/apache/apisix/pull/10828)
- Fix: missing trailers issue [#10851](https://github.com/apache/apisix/pull/10851)
- Fix: decryption failure [#10843](https://github.com/apache/apisix/pull/10843)
- Fix: linux-install-luarocks are not compatible with the openresty environment [#10813](https://github.com/apache/apisix/pull/10813)
- Fix: server-side sessions locked by not calling explicit session:close() [#10788](https://github.com/apache/apisix/pull/10788)
- Fix: skip brotli compression for upstream compressed response [#10740](https://github.com/apache/apisix/pull/10740)
- Fix: use_jwks breaking authentication header [#10670](https://github.com/apache/apisix/pull/10670)
- Fix: authz_keycloak plugin giving 500 error [#10763](https://github.com/apache/apisix/pull/10763)

## 3.8.0

### Core

- :sunrise: Support the use of lua-resty-events module for better performance:
  - [#10550](https://github.com/apache/apisix/pull/10550)
  - [#10558](https://github.com/apache/apisix/pull/10558)
- :sunrise: Upgrade OpenSSL 1.1.1 to OpenSSL 3: [#10724](https://github.com/apache/apisix/pull/10724)

### Plugins

- :sunrise: Add jwe-decrypt plugin: [#10252](https://github.com/apache/apisix/pull/10252)
- :sunrise: Support brotli when use filters.regex option (response-rewrite): [#10733](https://github.com/apache/apisix/pull/10733)
- :sunrise: Add multi-auth plugin: [#10482](https://github.com/apache/apisix/pull/10482)
- :sunrise: Add `required scopes` configuration property to `openid-connect` plugin: [#10493](https://github.com/apache/apisix/pull/10493)
- :sunrise: Support for the Timing-Allow-Origin header (cors): [#9365](https://github.com/apache/apisix/pull/9365)
- :sunrise: Add brotli plugin: [#10515](https://github.com/apache/apisix/pull/10515)
- :sunrise: Body-transformer plugin enhancement(#10472): [#10496](https://github.com/apache/apisix/pull/10496)
- :sunrise: Set minLength of redis_cluster_nodes to 1 for limit-count plugin: [#10612](https://github.com/apache/apisix/pull/10612)
- :sunrise: Allow to use environment variables for limit-count plugin settings: [#10607](https://github.com/apache/apisix/pull/10607)

### Bugfixes

- Fix: When the upstream nodes are of array type, the port should be an optional field: [#10477](https://github.com/apache/apisix/pull/10477)
- Fix: Incorrect variable extraction in fault-injection plugin: [#10485](https://github.com/apache/apisix/pull/10485)
- Fix: All consumers should share the same counter (limit-count): [#10541](https://github.com/apache/apisix/pull/10541)
- Fix: Safely remove upstream when sending route to opa plugin: [#10552](https://github.com/apache/apisix/pull/10552)
- Fix: Missing etcd init_dir and unable to list resource: [#10569](https://github.com/apache/apisix/pull/10569)
- Fix: Forward-auth request body is too large: [#10589](https://github.com/apache/apisix/pull/10589)
- Fix: Memory leak caused by timer that never quit: [#10614](https://github.com/apache/apisix/pull/10614)
- Fix: Do not invoke add_header if value resolved as nil in proxy-rewrite plugin: [#10619](https://github.com/apache/apisix/pull/10619)
- Fix: Frequent traversal of all keys in etcd leads to high CPU usage: [#10671](https://github.com/apache/apisix/pull/10671)
- Fix: For prometheus upstream_status metrics, mostly_healthy is healthy: [#10639](https://github.com/apache/apisix/pull/10639)
- Fix: Avoid getting a nil value in log phase in zipkin: [#10666](https://github.com/apache/apisix/pull/10666)
- Fix: Enable openid-connect plugin without redirect_uri got 500 error: [#7690](https://github.com/apache/apisix/pull/7690)
- Fix: Add redirect_after_logout_uri for ODIC that do not have an end_session_endpoint: [#10653](https://github.com/apache/apisix/pull/10653)
- Fix: Response-rewrite filters.regex does not apply when content-encoding is gzip: [#10637](https://github.com/apache/apisix/pull/10637)
- Fix: The leak of prometheus metrics: [#10655](https://github.com/apache/apisix/pull/10655)
- Fix: Authz-keycloak add return detail err: [#10691](https://github.com/apache/apisix/pull/10691)
- Fix: upstream nodes was not updated correctly by service discover: [#10722](https://github.com/apache/apisix/pull/10722)
- Fix: apisix restart failed: [#10696](https://github.com/apache/apisix/pull/10696)

## 3.7.0

**The changes marked with :warning: are not backward compatible.**

### Change

- :warning: Creating core resources does not allow passing in `create_time` and `update_time`: [#10232](https://github.com/apache/apisix/pull/10232)
- :warning: Remove self-contained info fields `exptime` and `validity_start` and `validity_end` from ssl schema: [10323](https://github.com/apache/apisix/pull/10323)
- :warning: Replace `route` with `apisix.route_name`, `service` with `apisix.service_name` in the attributes of opentelemetry plugin to follow the standards for span name and attributes: [#10393](https://github.com/apache/apisix/pull/10393)

### Core

- :sunrise: Added token to support access control for consul discovery: [#10278](https://github.com/apache/apisix/pull/10278)
- :sunrise: Support configuring `service_id` in stream_route to reference service resources: [#10298](https://github.com/apache/apisix/pull/10298)
- :sunrise: Using `apisix-runtime` as the apisix runtime:
  - [#10415](https://github.com/apache/apisix/pull/10415)
  - [#10427](https://github.com/apache/apisix/pull/10427)

### Plugins

- :sunrise: Add tests for authz-keycloak with apisix secrets: [#10353](https://github.com/apache/apisix/pull/10353)
- :sunrise: Add authorization params to openid-connect plugin: [#10058](https://github.com/apache/apisix/pull/10058)
- :sunrise: Support set variable in zipkin plugin: [#10361](https://github.com/apache/apisix/pull/10361)
- :sunrise: Support Nacos ak/sk authentication: [#10445](https://github.com/apache/apisix/pull/10445)

### Bugfixes

- Fix: Use warn log for get healthcheck target status failure:
  - [#10156](https://github.com/apache/apisix/pull/10156)
- Fix: Keep healthcheck target state when upstream changes:
  - [#10312](https://github.com/apache/apisix/pull/10312)
  - [#10307](https://github.com/apache/apisix/pull/10307)
- Fix: Add name field in plugin_config schema for consistency: [#10315](https://github.com/apache/apisix/pull/10315)
- Fix: Optimize tls in upstream_schema and wrong variable: [#10269](https://github.com/apache/apisix/pull/10269)
- Fix(consul): Failed to exit normally: [#10342](https://github.com/apache/apisix/pull/10342)
- Fix: The request header with `Content-Type: application/x-www-form-urlencoded;charset=utf-8` will cause vars condition `post_arg_xxx` matching to failed: [#10372](https://github.com/apache/apisix/pull/10372)
- Fix: Make install failed on mac: [#10403](https://github.com/apache/apisix/pull/10403)
- Fix(log-rotate): Log compression timeout caused data loss: [#8620](https://github.com/apache/apisix/pull/8620)
- Fix(kafka-logger): Remove 0 from enum of required_acks: [#10469](https://github.com/apache/apisix/pull/10469)

## 3.6.0

**The changes marked with :warning: are not backward compatible.**

### Change

- :warning: Remove gRPC support between APISIX and etcd and remove `etcd.use_grpc` configuration option: [#10015](https://github.com/apache/apisix/pull/10015)
- :warning: Remove conf server. The data plane no longer supports direct communication with the control plane, and the configuration should be adjusted from `config_provider: control_plane` to `config_provider: etcd`: [#10012](https://github.com/apache/apisix/pull/10012)
- :warning: Enforce strict schema validation on the properties of the core APISIX resources: [#10233](https://github.com/apache/apisix/pull/10233)

### Core

- :sunrise: Support configuring the buffer size of the access log: [#10225](https://github.com/apache/apisix/pull/10225)
- :sunrise: Support the use of local DNS resolvers in service discovery by configuring `resolv_conf`: [#9770](https://github.com/apache/apisix/pull/9770)
- :sunrise: Remove Rust dependency for installation: [#10121](https://github.com/apache/apisix/pull/10121)
- :sunrise: Support Dubbo protocol in xRPC [#9660](https://github.com/apache/apisix/pull/9660)

### Plugins

- :sunrise: Support https in traffic-split plugin: [#9115](https://github.com/apache/apisix/pull/9115)
- :sunrise: Support rewrite request body in external plugin:[#9990](https://github.com/apache/apisix/pull/9990)
- :sunrise: Support set nginx variables in opentelemetry plugin: [#8871](https://github.com/apache/apisix/pull/8871)
- :sunrise: Support unix sock host pattern in the chaitin-waf plugin: [#10161](https://github.com/apache/apisix/pull/10161)

### Bugfixes

- Fix GraphQL POST request route matching exception: [#10198](https://github.com/apache/apisix/pull/10198)
- Fix error on array of multiline string in `apisix.yaml`: [#10193](https://github.com/apache/apisix/pull/10193)
- Add error handlers for invalid `cache_zone` configuration in the `proxy-cache` plugin: [#10138](https://github.com/apache/apisix/pull/10138)

## 3.5.0

**The changes marked with :warning: are not backward compatible.**

### Change

- :warning: remove snowflake algorithm in the request-id plugin: [#9715](https://github.com/apache/apisix/pull/9715)
- :warning: No longer compatible with OpenResty 1.19, it needs to be upgraded to 1.21+: [#9913](https://github.com/apache/apisix/pull/9913)
- :warning: Remove the configuration item `apisix.stream_proxy.only`, the L4/L7 proxy needs to be enabled through the configuration item `apisix.proxy_mode`: [#9607](https://github.com/apache/apisix/pull/9607)
- :warning: The admin-api `/apisix/admin/plugins?all=true` marked as deprecated: [#9580](https://github.com/apache/apisix/pull/9580)
- :warning: allowlist and denylist can't be enabled at the same time in ua-restriction plugin: [#9841](https://github.com/apache/apisix/pull/9841)

### Core

- :sunrise: Support host level dynamic setting of tls protocol version: [#9903](https://github.com/apache/apisix/pull/9903)
- :sunrise: Support force delete resource: [#9810](https://github.com/apache/apisix/pull/9810)
- :sunrise: Support pulling env vars from yaml keys: [#9855](https://github.com/apache/apisix/pull/9855)
- :sunrise: Add schema validate API in admin-api: [#10065](https://github.com/apache/apisix/pull/10065)

### Plugins

- :sunrise: Add chaitin-waf plugin: [#9838](https://github.com/apache/apisix/pull/9838)
- :sunrise: Support vars for file-logger plugin: [#9712](https://github.com/apache/apisix/pull/9712)
- :sunrise: Support adding response headers for mock plugin: [#9720](https://github.com/apache/apisix/pull/9720)
- :sunrise: Support regex_uri with unsafe_uri for proxy-rewrite plugin: [#9813](https://github.com/apache/apisix/pull/9813)
- :sunrise: Support set client_email field for google-cloud-logging plugin: [#9813](https://github.com/apache/apisix/pull/9813)
- :sunrise: Support sending headers upstream returned by OPA server for opa plugin: [#9710](https://github.com/apache/apisix/pull/9710)
- :sunrise: Support configuring proxy server for openid-connect plugin: [#9948](https://github.com/apache/apisix/pull/9948)

### Bugfixes

- Fix(log-rotate): the max_kept configuration doesn't work when using custom name: [#9749](https://github.com/apache/apisix/pull/9749)
- Fix(limit_conn): do not use the http variable in stream mode: [#9816](https://github.com/apache/apisix/pull/9816)
- Fix(loki-logger): getting an error with log_labels: [#9850](https://github.com/apache/apisix/pull/9850)
- Fix(limit-count): X-RateLimit-Reset shouldn't be set to 0 after request be rejected: [#9978](https://github.com/apache/apisix/pull/9978)
- Fix(nacos): attempt to index upvalue 'applications' (a nil value): [#9960](https://github.com/apache/apisix/pull/9960)
- Fix(etcd): can't sync etcd data if key has special character: [#9967](https://github.com/apache/apisix/pull/9967)
- Fix(tencent-cloud-cls): dns parsing failure: [#9843](https://github.com/apache/apisix/pull/9843)
- Fix(reload): worker not exited when executing quit or reload command [#9909](https://github.com/apache/apisix/pull/9909)
- Fix(traffic-split): upstream_id validity verification [#10008](https://github.com/apache/apisix/pull/10008)

## 3.4.0

### Core

- :sunrise: Support route-level MTLS [#9322](https://github.com/apache/apisix/pull/9322)
- :sunrise: Support id schema for global_rules [#9517](https://github.com/apache/apisix/pull/9517)
- :sunrise: Support use a single long http connection to watch all resources for etcd [#9456](https://github.com/apache/apisix/pull/9456)
- :sunrise: Support max len 256 for ssl label [#9301](https://github.com/apache/apisix/pull/9301)

### Plugins

- :sunrise: Support multiple regex pattern matching for proxy_rewrite plugin [#9194](https://github.com/apache/apisix/pull/9194)
- :sunrise: Add loki-logger plugin [#9399](https://github.com/apache/apisix/pull/9399)
- :sunrise: Allow user configure DEFAULT_BUCKETS for prometheus plugin [#9673](https://github.com/apache/apisix/pull/9673)

### Bugfixes

- Fix(body-transformer): xml2lua: replace empty table with empty string [#9669](https://github.com/apache/apisix/pull/9669)
- Fix: opentelemetry and grpc-transcode plugins cannot work together [#9606](https://github.com/apache/apisix/pull/9606)
- Fix(skywalking-logger, error-log-logger): support $hostname in skywalking service_instance_name [#9401](https://github.com/apache/apisix/pull/9401)
- Fix(admin): fix secrets do not support to update attributes by PATCH [#9510](https://github.com/apache/apisix/pull/9510)
- Fix(http-logger): default request path should be '/' [#9472](https://github.com/apache/apisix/pull/9472)
- Fix: syslog plugin doesn't work [#9425](https://github.com/apache/apisix/pull/9425)
- Fix: wrong log format for splunk-hec-logging [#9478](https://github.com/apache/apisix/pull/9478)
- Fix(etcd): reuse cli and enable keepalive [#9420](https://github.com/apache/apisix/pull/9420)
- Fix: upstream key config add mqtt_client_id support [#9450](https://github.com/apache/apisix/pull/9450)
- Fix: body-transformer plugin return raw body anytime [#9446](https://github.com/apache/apisix/pull/9446)
- Fix(wolf-rbac): other plugin in consumer not effective when consumer used wolf-rbac plugin [#9298](https://github.com/apache/apisix/pull/9298)
- Fix: always parse domain when host is domain name [#9332](https://github.com/apache/apisix/pull/9332)
- Fix: response-rewrite plugin can't add only one character [#9372](https://github.com/apache/apisix/pull/9372)
- Fix(consul): support to fetch only health endpoint [#9204](https://github.com/apache/apisix/pull/9204)

## 3.3.0

**The changes marked with :warning: are not backward compatible.**

### Change

- :warning: Change the default router from `radixtree_uri` to `radixtree_host_uri`: [#9047](https://github.com/apache/apisix/pull/9047)
- :warning: CORS plugin will add `Vary: Origin` header when `allow_origin` is not `*`: [#9010](https://github.com/apache/apisix/pull/9010)

### Core

- :sunrise: Support store route's cert in secrets manager: [#9247](https://github.com/apache/apisix/pull/9247)
- :sunrise: Support bypassing Admin API Auth by configuration: [#9147](https://github.com/apache/apisix/pull/9147)

### Plugins

- :sunrise: Support header injection for `fault-injection` plugin: [#9039](https://github.com/apache/apisix/pull/9039)
- :sunrise: Support variable when rewrite header in `proxy-rewrite` plugin: [#9112](https://github.com/apache/apisix/pull/9112)
- :sunrise: `limit-count` plugin supports `username` and `ssl` for redis policy: [#9185](https://github.com/apache/apisix/pull/9185)

### Bugfixes

- Fix etcd data sync exception: [#8493](https://github.com/apache/apisix/pull/8493)
- Fix invalidate cache in `core.request.add_header` and fix some calls: [#8824](https://github.com/apache/apisix/pull/8824)
- Fix the high CPU and memory usage cause by healthcheck impl: [#9015](https://github.com/apache/apisix/pull/9015)
- Consider using `allow_origins_by_regex` only when it is not `nil`: [#9028](https://github.com/apache/apisix/pull/9028)
- Check upstream reference in `traffic-split` plugin when delete upstream: [#9044](https://github.com/apache/apisix/pull/9044)
- Fix failing to connect to etcd at startup: [#9077](https://github.com/apache/apisix/pull/9077)
- Fix health checker leak for domain nodes: [#9090](https://github.com/apache/apisix/pull/9090)
- Prevent non `127.0.0.0/24` to access admin api with empty admin_key: [#9146](https://github.com/apache/apisix/pull/9146)
- Ensure `hold_body_chunk` should use separate buffer for each plugin in case of pollution: [#9266](https://github.com/apache/apisix/pull/9266)
- Ensure `batch-requests` plugin read trailer headers if existed: [#9289](https://github.com/apache/apisix/pull/9289)
- Ensure `proxy-rewrite` should set `ngx.var.uri`: [#9309](https://github.com/apache/apisix/pull/9309)

## 3.2.1

**This is an LTS maintenance release and you can see the CHANGELOG in `release/3.2` branch.**

[https://github.com/apache/apisix/blob/release/3.2/CHANGELOG.md#321](https://github.com/apache/apisix/blob/release/3.2/CHANGELOG.md#321)

## 3.2.0

### Change

- Deprecated separate Vault configuration in jwt-auth. Users can use secret to achieve the same function: [#8660](https://github.com/apache/apisix/pull/8660)

### Core

- :sunrise: Support Vault token to configure secret through environment variables: [#8866](https://github.com/apache/apisix/pull/8866)
- :sunrise: Supports service discovery on stream subsystem:
     - [#8583](https://github.com/apache/apisix/pull/8583)
     - [#8593](https://github.com/apache/apisix/pull/8593)
     - [#8584](https://github.com/apache/apisix/pull/8584)
     - [#8640](https://github.com/apache/apisix/pull/8640)
     - [#8633](https://github.com/apache/apisix/pull/8633)
     - [#8696](https://github.com/apache/apisix/pull/8696)
     - [#8826](https://github.com/apache/apisix/pull/8826)

### Plugins

- :sunrise: Add RESTful to graphQL conversion plugin: [#8959](https://github.com/apache/apisix/pull/8959)
- :sunrise: Supports setting the log format on each log plugin:
     - [#8806](https://github.com/apache/apisix/pull/8806)
     - [#8643](https://github.com/apache/apisix/pull/8643)
- :sunrise: Add request body/response body conversion plugin: [#8766](https://github.com/apache/apisix/pull/8766)
- :sunrise: Support sending error logs to Kafka: [#8693](https://github.com/apache/apisix/pull/8693)
- :sunrise: limit-count plugin supports X-RateLimit-Reset: [#8578](https://github.com/apache/apisix/pull/8578)
- :sunrise: limit-count plugin supports setting TLS to access Redis cluster: [#8558](https://github.com/apache/apisix/pull/8558)
- :sunrise: consumer-restriction plugin supports permission control via consumer_group_id: [#8567](https://github.com/apache/apisix/pull/8567)

### Bugfixes

- Fix mTLS protection when the host and SNI mismatch: [#8967](https://github.com/apache/apisix/pull/8967)
- The proxy-rewrite plugin should escape URI parameter parts if they do not come from user config: [#8888](https://github.com/apache/apisix/pull/8888)
- Admin API PATCH operation should return 200 status code after success: [#8855](https://github.com/apache/apisix/pull/8855)
- Under certain conditions, the reload after etcd synchronization failure does not take effect: [#8736](https://github.com/apache/apisix/pull/8736)
- Fix the problem that the nodes found by the Consul service discovery are incomplete: [#8651](https://github.com/apache/apisix/pull/8651)
- Fix grpc-transcode plugin's conversion of Map data: [#8731](https://github.com/apache/apisix/pull/8731)
- External plugins should be able to set the content-type response header: [#8588](https://github.com/apache/apisix/pull/8588)
- When hotloading plugins, redundant timers may be left behind if the request-id plugin initializes the snowflake generator incorrectly: [#8556](https://github.com/apache/apisix/pull/8556)
- Close previous proto synchronizer for grpc-transcode when hotloading plugins: [#8557](https://github.com/apache/apisix/pull/8557)

## 3.1.0

### Core

- :sunrise: Support for etcd configuration synchronization via gRPC:
    - [#8485](https://github.com/apache/apisix/pull/8485)
    - [#8450](https://github.com/apache/apisix/pull/8450)
    - [#8411](https://github.com/apache/apisix/pull/8411)
- :sunrise: Support for configuring encrypted fields in plugins:
    - [#8487](https://github.com/apache/apisix/pull/8487)
    - [#8403](https://github.com/apache/apisix/pull/8403)
- :sunrise: Support for placing partial fields in Vault or environment variable using secret resources:
    - [#8448](https://github.com/apache/apisix/pull/8448)
    - [#8421](https://github.com/apache/apisix/pull/8421)
    - [#8412](https://github.com/apache/apisix/pull/8412)
    - [#8394](https://github.com/apache/apisix/pull/8394)
    - [#8390](https://github.com/apache/apisix/pull/8390)
- :sunrise: Allows upstream configuration in the stream subsystem as a domain name: [#8500](https://github.com/apache/apisix/pull/8500)
- :sunrise: Support Consul service discovery: [#8380](https://github.com/apache/apisix/pull/8380)

### Plugin

- :sunrise: Optimize resource usage for prometheus collection: [#8434](https://github.com/apache/apisix/pull/8434)
- :sunrise: Add inspect plugin for easy debugging: [#8400](https://github.com/apache/apisix/pull/8400)
- :sunrise: jwt-auth plugin supports parameters to hide authentication token from upstream : [#8206](https://github.com/apache/apisix/pull/8206)
- :sunrise: proxy-rewrite plugin supports adding new request headers without overwriting existing request headers with the same name: [#8336](https://github.com/apache/apisix/pull/8336)
- :sunrise: grpc-transcode plugin supports setting the grpc-status-details-bin response header into the response body: [#7639](https://github.com/apache/apisix/pull/7639)
- :sunrise: proxy-mirror plugin supports setting the prefix: [#8261](https://github.com/apache/apisix/pull/8261)

### Bugfix

- Fix the problem that the plug-in configured under service object cannot take effect in time under some circumstances: [#8482](https://github.com/apache/apisix/pull/8482)
- Fix an occasional 502 problem when http and grpc share the same upstream connection due to connection pool reuse: [#8364](https://github.com/apache/apisix/pull/8364)
- file-logger should avoid buffer-induced log truncation when writing logs: [#7884](https://github.com/apache/apisix/pull/7884)
- max_kept parameter of log-rotate plugin should take effect on compressed files: [#8366](https://github.com/apache/apisix/pull/8366)
- Fix userinfo not being set when use_jwks is true in the openid-connect plugin: [#8347](https://github.com/apache/apisix/pull/8347)
- Fix an issue where x-forwarded-host cannot be changed in the proxy-rewrite plugin: [#8200](https://github.com/apache/apisix/pull/8200)
- Fix a bug where disabling the v3 admin API resulted in missing response bodies under certain circumstances: [#8349](https://github.com/apache/apisix/pull/8349)
- In zipkin plugin, pass trace ID even if there is a rejected sampling decision: [#8099](https://github.com/apache/apisix/pull/8099)
- Fix `_meta.filter` in plugin configuration not working with variables assigned after upstream response and custom variables in APISIX.
    - [#8162](https://github.com/apache/apisix/pull/8162)
    - [#8256](https://github.com/apache/apisix/pull/8256)

## 3.0.0

### Change

- `enable_cpu_affinity` is disabled by default to avoid this configuration affecting the behavior of APSISIX deployed in the container: [#8074](https://github.com/apache/apisix/pull/8074)

### Core

- :sunrise: Added Consumer Group entity to manage multiple consumers: [#7980](https://github.com/apache/apisix/pull/7980)
- :sunrise: Supports configuring the order in which DNS resolves domain name types: [#7935](https://github.com/apache/apisix/pull/7935)
- :sunrise: Support configuring multiple `key_encrypt_salt` for rotation: [#7925](https://github.com/apache/apisix/pull/7925)

### Plugin

- :sunrise: Added ai plugin to dynamically optimize the execution path of APISIX according to the scene:
    - [#8102](https://github.com/apache/apisix/pull/8102)
    - [#8113](https://github.com/apache/apisix/pull/8113)
    - [#8120](https://github.com/apache/apisix/pull/8120)
    - [#8128](https://github.com/apache/apisix/pull/8128)
    - [#8130](https://github.com/apache/apisix/pull/8130)
    - [#8149](https://github.com/apache/apisix/pull/8149)
    - [#8157](https://github.com/apache/apisix/pull/8157)
- :sunrise: Support `session_secret` in openid-connect plugin to resolve the inconsistency of `session_secret` among multiple workers: [#8068](https://github.com/apache/apisix/pull/8068)
- :sunrise: Support sasl config in kafka-logger plugin: [#8050](https://github.com/apache/apisix/pull/8050)
- :sunrise: Support set resolve domain in proxy-mirror plugin: [#7861](https://github.com/apache/apisix/pull/7861)
- :sunrise: Support `brokers` property in kafka-logger plugin, which supports different broker to set the same host: [#7999](https://github.com/apache/apisix/pull/7999)
- :sunrise: Support get response body in ext-plugin-post-resp: [#7947](https://github.com/apache/apisix/pull/7947)
- :sunrise: Added cas-auth plugin to support CAS authentication: [#7932](https://github.com/apache/apisix/pull/7932)

### Bugfix

- Conditional expressions of workflow plugin should support operators: [#8121](https://github.com/apache/apisix/pull/8121)
- Fix loading problem of batch processor plugin when prometheus plugin is disabled: [#8079](https://github.com/apache/apisix/pull/8079)
- When APISIX starts, delete the old conf server sock file if it exists: [#8022](https://github.com/apache/apisix/pull/8022)
- Disable core.grpc when gRPC-client-nginx-module module is not compiled: [#8007](https://github.com/apache/apisix/pull/8007)

## 3.0.0-beta

Here we use 2.99.0 as the version number in the source code instead of the code name
`3.0.0-beta` for two reasons:

1. avoid unexpected errors when some programs try to compare the
version, as `3.0.0-beta` contains `3.0.0` and is longer than it.
2. some package system might not allow package which has a suffix
after the version number.

### Change

#### Moves the config_center, etcd and Admin API configuration to the deployment

We've adjusted the configuration in the static configuration file, so you need to update the configuration in `config.yaml` as well:

- The `config_center` function is now implemented by `config_provider` under `deployment`: [#7901](https://github.com/apache/apisix/pull/7901)
- The `etcd` field is moved to `deployment`: [#7860](https://github.com/apache/apisix/pull/7860)
- The following Admin API configuration is moved to the `admin` field under `deployment`: [#7823](https://github.com/apache/apisix/pull/7823)
    - admin_key
    - enable_admin_cors
    - allow_admin
    - admin_listen
    - https_admin
    - admin_api_mtls
    - admin_api_version

You can refer to the latest `config-default.yaml` for details.

#### Removing multiple deprecated configurations

With the new 3.0 release, we took the opportunity to clean out many configurations that were previously marked as deprecated.

In the static configuration, we removed several fields as follows:

- Removed `enable_http2` and `listen_port` from `apisix.ssl`: [#7717](https://github.com/apache/apisix/pull/7717)
- Removed `apisix.port_admin`: [#7716](https://github.com/apache/apisix/pull/7716)
- Removed `etcd.health_check_retry`: [#7676](https://github.com/apache/apisix/pull/7676)
- Removed `nginx_config.http.lua_shared_dicts`: [#7677](https://github.com/apache/apisix/pull/7677)
- Removed `apisix.real_ip_header`: [#7696](https://github.com/apache/apisix/pull/7696)

In the dynamic configuration, we made the following adjustments:

- Moved `disable` of the plugin configuration under `_meta`: [#7707](https://github.com/apache/apisix/pull/7707)
- Removed `service_protocol` from the Route: [#7701](https://github.com/apache/apisix/pull/7701)

There are also specific plugin level changes:

- Removed `audience` field from authz-keycloak: [#7683](https://github.com/apache/apisix/pull/7683)
- Removed `upstream` field from mqtt-proxy: [#7694](https://github.com/apache/apisix/pull/7694)
- tcp-related configuration placed under the `tcp` field in error-log-logger: [#7700](https://github.com/apache/apisix/pull/7700)
- Removed `max_retry_times` and `retry_interval` fields from syslog: [#7699](https://github.com/apache/apisix/pull/7699)
- The `scheme` field has been removed from proxy-rewrite: [#7695](https://github.com/apache/apisix/pull/7695)

#### New Admin API response format

We have adjusted the response format of the Admin API in several PRs as follows:

- [#7630](https://github.com/apache/apisix/pull/7630)
- [#7622](https://github.com/apache/apisix/pull/7622)

The new response format is shown below:

Returns a single configuration:

```json
{
  "modifiedIndex": 2685183,
  "value": {
    "id": "1",
    ...
  },
  "key": "/apisix/routes/1",
  "createdIndex": 2684956
}
```

Returns multiple configurations:

```json
{
  "list": [
    {
      "modifiedIndex": 2685183,
      "value": {
        "id": "1",
        ...
      },
      "key": "/apisix/routes/1",
      "createdIndex": 2684956
    },
    {
      "modifiedIndex": 2685163,
      "value": {
        "id": "2",
        ...
      },
      "key": "/apisix/routes/2",
      "createdIndex": 2685163
    }
  ],
  "total": 2
}
```

#### Other

- Port of Admin API changed to 9180: [#7806](https://github.com/apache/apisix/pull/7806)
- We only support OpenResty 1.19.3.2 and above: [#7625](https://github.com/apache/apisix/pull/7625)
- Adjusted the priority of the Plugin Config object so that the priority of a plugin configuration with the same name changes from Consumer > Plugin Config > Route > Service to Consumer > Route > Plugin Config > Service: [#7614](https://github.com/apache/apisix/pull/7614)

### Core

- Integrating grpc-client-nginx-module to APISIX: [#7917](https://github.com/apache/apisix/pull/7917)
- k8s service discovery support for configuring multiple clusters: [#7895](https://github.com/apache/apisix/pull/7895)

### Plugin

- Support for injecting header with specified prefix in opentelemetry plugin: [#7822](https://github.com/apache/apisix/pull/7822)
- Added openfunction plugin: [#7634](https://github.com/apache/apisix/pull/7634)
- Added elasticsearch-logger plugin: [#7643](https://github.com/apache/apisix/pull/7643)
- response-rewrite plugin supports adding response bodies: [#7794](https://github.com/apache/apisix/pull/7794)
- log-rorate supports specifying the maximum size to cut logs: [#7749](https://github.com/apache/apisix/pull/7749)
- Added workflow plug-in.
    - [#7760](https://github.com/apache/apisix/pull/7760)
    - [#7771](https://github.com/apache/apisix/pull/7771)
- Added Tencent Cloud Log Service plugin: [#7593](https://github.com/apache/apisix/pull/7593)
- jwt-auth supports ES256 algorithm: [#7627](https://github.com/apache/apisix/pull/7627)
- ldap-auth internal implementation, switching from lualdap to lua-resty-ldap: [#7590](https://github.com/apache/apisix/pull/7590)
- http request metrics within the prometheus plugin supports setting additional labels via variables: [#7549](https://github.com/apache/apisix/pull/7549)
- The clickhouse-logger plugin supports specifying multiple clickhouse endpoints: [#7517](https://github.com/apache/apisix/pull/7517)

### Bugfix

- gRPC proxy sets :authority request header to configured upstream Host: [#7939](https://github.com/apache/apisix/pull/7939)
- response-rewrite writing to an empty body may cause AIPSIX to fail to respond to the request: [#7836](https://github.com/apache/apisix/pull/7836)
- Fix the problem that when using Plugin Config and Consumer at the same time, there is a certain probability that the plugin configuration is not updated: [#7965](https://github.com/apache/apisix/pull/7965)
- Only reopen log files once when log cutting: [#7869](https://github.com/apache/apisix/pull/7869)
- Passive health checks should not be enabled by default: [#7850](https://github.com/apache/apisix/pull/7850)
- The zipkin plugin should pass trace IDs upstream even if it does not sample: [#7833](https://github.com/apache/apisix/pull/7833)
- Correction of opentelemetry span kind to server: [#7830](https://github.com/apache/apisix/pull/7830)
- in limit-count plugin, different routes with the same configuration should not share the same counter: [#7750](https://github.com/apache/apisix/pull/7750)
- Fix occasional exceptions thrown when removing clean_handler: [#7648](https://github.com/apache/apisix/pull/7648)
- Allow direct use of IPv6 literals when configuring upstream nodes: [#7594](https://github.com/apache/apisix/pull/7594)
- The wolf-rbac plugin adjusts the way it responds to errors:
    - [#7561](https://github.com/apache/apisix/pull/7561)
    - [#7497](https://github.com/apache/apisix/pull/7497)
- the phases after proxy didn't run when 500 error happens before proxy: [#7703](https://github.com/apache/apisix/pull/7703)
- avoid error when multiple plugins associated with consumer and have rewrite phase: [#7531](https://github.com/apache/apisix/pull/7531)
- upgrade lua-resty-etcd to 1.8.3 which fixes various issues: [#7565](https://github.com/apache/apisix/pull/7565)

## 2.15.3

**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.15` branch.**

[https://github.com/apache/apisix/blob/release/2.15/CHANGELOG.md#2153](https://github.com/apache/apisix/blob/release/2.15/CHANGELOG.md#2153)

## 2.15.2

**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.15` branch.**

[https://github.com/apache/apisix/blob/release/2.15/CHANGELOG.md#2152](https://github.com/apache/apisix/blob/release/2.15/CHANGELOG.md#2152)

## 2.15.1

**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.15` branch.**

[https://github.com/apache/apisix/blob/release/2.15/CHANGELOG.md#2151](https://github.com/apache/apisix/blob/release/2.15/CHANGELOG.md#2151)

## 2.15.0

### Change

- We now map the grpc error code OUT_OF_RANGE to http code 400 in grpc-transcode plugin: [#7419](https://github.com/apache/apisix/pull/7419)
- Rename health_check_retry configuration in etcd section of `config-default.yaml` to startup_retry: [#7304](https://github.com/apache/apisix/pull/7304)
- Remove `upstream.enable_websocket` which is deprecated since 2020: [#7222](https://github.com/apache/apisix/pull/7222)

### Core

- Support running plugins conditionally: [#7453](https://github.com/apache/apisix/pull/7453)
- Allow users to specify plugin execution priority: [#7273](https://github.com/apache/apisix/pull/7273)
- Support getting upstream certificate from ssl object: [#7221](https://github.com/apache/apisix/pull/7221)
- Allow customizing error response in the plugin: [#7128](https://github.com/apache/apisix/pull/7128)
- Add metrics to xRPC Redis proxy: [#7183](https://github.com/apache/apisix/pull/7183)
- Introduce deployment role to simplify the deployment of APISIX:
    - [#7405](https://github.com/apache/apisix/pull/7405)
    - [#7417](https://github.com/apache/apisix/pull/7417)
    - [#7392](https://github.com/apache/apisix/pull/7392)
    - [#7365](https://github.com/apache/apisix/pull/7365)
    - [#7249](https://github.com/apache/apisix/pull/7249)

### Plugin

- Add ngx.shared.dict statistic in promethues plugin: [#7412](https://github.com/apache/apisix/pull/7412)
- Allow using unescaped raw URL in proxy-rewrite plugin: [#7401](https://github.com/apache/apisix/pull/7401)
- Add PKCE support to the openid-connect plugin: [#7370](https://github.com/apache/apisix/pull/7370)
- Support custom log format in sls-logger plugin: [#7328](https://github.com/apache/apisix/pull/7328)
- Export some params for kafka-client in kafka-logger plugin: [#7266](https://github.com/apache/apisix/pull/7266)
- Add support for capturing OIDC refresh tokens in openid-connect plugin: [#7220](https://github.com/apache/apisix/pull/7220)
- Add prometheus plugin in stream subsystem: [#7174](https://github.com/apache/apisix/pull/7174)

### Bugfix

- clear remain state from the latest try before retrying in Kubernetes discovery: [#7506](https://github.com/apache/apisix/pull/7506)
- the query string was repeated twice when enabling both http_to_https and append_query_string in the redirect plugin: [#7433](https://github.com/apache/apisix/pull/7433)
- don't send empty Authorization header by default in http-logger: [#7444](https://github.com/apache/apisix/pull/7444)
- ensure both `group` and `disable` configurations can be used in limit-count: [#7384](https://github.com/apache/apisix/pull/7384)
- adjust the execution priority of request-id so the tracing plugins can use the request id: [#7281](https://github.com/apache/apisix/pull/7281)
- correct the transcode of repeated Message in grpc-transcode: [#7231](https://github.com/apache/apisix/pull/7231)
- var missing in proxy-cache cache key should be ignored: [#7168](https://github.com/apache/apisix/pull/7168)
- reduce memory usage when abnormal weights are given in chash: [#7103](https://github.com/apache/apisix/pull/7103)
- cache should be bypassed when the method mismatch in proxy-cache: [#7111](https://github.com/apache/apisix/pull/7111)
- Upstream keepalive should consider TLS param:
    - [#7054](https://github.com/apache/apisix/pull/7054)
    - [#7466](https://github.com/apache/apisix/pull/7466)
- The redirect plugin sets a correct port during redirecting HTTP to HTTPS:
    - [#7065](https://github.com/apache/apisix/pull/7065)

## 2.14.1

### Bugfix

- The "unix:" in the `real_ip_from` configuration should not break the batch-requests plugin: [#7106](https://github.com/apache/apisix/pull/7106)

## 2.14.0

### Change

- To adapt the change of OpenTelemetry spec, the default port of OTLP/HTTP is changed to 4318: [#7007](https://github.com/apache/apisix/pull/7007)

### Core

- Introduce an experimental feature to allow subscribing Kafka message via APISIX. This feature is based on the pubsub framework running above websocket:
    - [#7028](https://github.com/apache/apisix/pull/7028)
    - [#7032](https://github.com/apache/apisix/pull/7032)
- Introduce an experimental framework called xRPC to manage non-HTTP L7 traffic:
    - [#6885](https://github.com/apache/apisix/pull/6885)
    - [#6901](https://github.com/apache/apisix/pull/6901)
    - [#6919](https://github.com/apache/apisix/pull/6919)
    - [#6960](https://github.com/apache/apisix/pull/6960)
    - [#6965](https://github.com/apache/apisix/pull/6965)
    - [#7040](https://github.com/apache/apisix/pull/7040)
- Now we support adding delay according to the command & key during proxying Redis traffic, which is built above xRPC:
    - [#6999](https://github.com/apache/apisix/pull/6999)
- Introduce an experimental support to configure APISIX via xDS:
    - [#6614](https://github.com/apache/apisix/pull/6614)
    - [#6759](https://github.com/apache/apisix/pull/6759)
- Add `normalize_uri_like_servlet` option to normalize uri like servlet: [#6984](https://github.com/apache/apisix/pull/6984)
- Zookeeper service discovery via apisix-seed: [#6751](https://github.com/apache/apisix/pull/6751)

### Plugin

- The real-ip plugin supports recursive IP search like `real_ip_recursive`: [#6988](https://github.com/apache/apisix/pull/6988)
- The api-breaker plugin allows configuring response: [#6949](https://github.com/apache/apisix/pull/6949)
- The response-rewrite plugin supports body filters: [#6750](https://github.com/apache/apisix/pull/6750)
- The request-id plugin adds nanoid algorithm to generate ID: [#6779](https://github.com/apache/apisix/pull/6779)
- The file-logger plugin can cache & reopen file handler: [#6721](https://github.com/apache/apisix/pull/6721)
- Add casdoor plugin: [#6382](https://github.com/apache/apisix/pull/6382)
- The authz-keycloak plugin supports password grant: [#6586](https://github.com/apache/apisix/pull/6586)

### Bugfix

- Upstream keepalive should consider TLS param: [#7054](https://github.com/apache/apisix/pull/7054)
- Do not expose internal error message to the client:
    - [#6982](https://github.com/apache/apisix/pull/6982)
    - [#6859](https://github.com/apache/apisix/pull/6859)
    - [#6854](https://github.com/apache/apisix/pull/6854)
    - [#6853](https://github.com/apache/apisix/pull/6853)
    - [#6846](https://github.com/apache/apisix/pull/6846)
- DNS supports SRV record with port 0: [#6739](https://github.com/apache/apisix/pull/6739)
- client mTLS was ignored sometimes in TLS session reuse: [#6906](https://github.com/apache/apisix/pull/6906)
- The grpc-web plugin doesn't override Access-Control-Allow-Origin header in response: [#6842](https://github.com/apache/apisix/pull/6842)
- The syslog plugin's default timeout is corrected: [#6807](https://github.com/apache/apisix/pull/6807)
- The authz-keycloak plugin's `access_denied_redirect_uri` was bypassed sometimes: [#6794](https://github.com/apache/apisix/pull/6794)
- Handle `USR2` signal properly: [#6758](https://github.com/apache/apisix/pull/6758)
- The redirect plugin set a correct port during redirecting HTTP to HTTPS:
    - [#7065](https://github.com/apache/apisix/pull/7065)
    - [#6686](https://github.com/apache/apisix/pull/6686)
- Admin API rejects unknown stream plugin: [#6813](https://github.com/apache/apisix/pull/6813)

## 2.13.3

**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.13` branch.**

[https://github.com/apache/apisix/blob/release/2.13/CHANGELOG.md#2133](https://github.com/apache/apisix/blob/release/2.13/CHANGELOG.md#2133)

## 2.13.2

**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.13` branch.**

[https://github.com/apache/apisix/blob/release/2.13/CHANGELOG.md#2132](https://github.com/apache/apisix/blob/release/2.13/CHANGELOG.md#2132)

## 2.13.1

**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.13` branch.**

[https://github.com/apache/apisix/blob/release/2.13/CHANGELOG.md#2131](https://github.com/apache/apisix/blob/release/2.13/CHANGELOG.md#2131)

## 2.13.0

### Change

- change(syslog): correct the configuration [#6551](https://github.com/apache/apisix/pull/6551)
- change(server-info): use a new approach(keepalive) to report DP info [#6202](https://github.com/apache/apisix/pull/6202)
- change(admin): empty nodes should be encoded as array [#6384](https://github.com/apache/apisix/pull/6384)
- change(prometheus): replace wrong apisix_nginx_http_current_connections{state="total"} label [#6327](https://github.com/apache/apisix/pull/6327)
- change: don't expose public API by default & remove plugin interceptor [#6196](https://github.com/apache/apisix/pull/6196)

### Core

- :sunrise: feat: add delayed_body_filter phase [#6605](https://github.com/apache/apisix/pull/6605)
- :sunrise: feat: support for reading environment variables from yaml configuration files [#6505](https://github.com/apache/apisix/pull/6505)
- :sunrise: feat: rerun rewrite phase for newly added plugins in consumer [#6502](https://github.com/apache/apisix/pull/6502)
- :sunrise: feat: add config to control write all status to x-upsream-apisix-status [#6392](https://github.com/apache/apisix/pull/6392)
- :sunrise: feat: add kubernetes discovery module [#4880](https://github.com/apache/apisix/pull/4880)
- :sunrise: feat(graphql): support http get and post json request [#6343](https://github.com/apache/apisix/pull/6343)

### Plugin

- :sunrise: feat: jwt-auth support custom parameters [#6561](https://github.com/apache/apisix/pull/6561)
- :sunrise: feat: set cors allow origins by plugin metadata [#6546](https://github.com/apache/apisix/pull/6546)
- :sunrise: feat: support post_logout_redirect_uri config in openid-connect plugin [#6455](https://github.com/apache/apisix/pull/6455)
- :sunrise: feat: mocking plugin [#5940](https://github.com/apache/apisix/pull/5940)
- :sunrise: feat(error-log-logger): add clickhouse for error-log-logger [#6256](https://github.com/apache/apisix/pull/6256)
- :sunrise: feat: clickhouse logger [#6215](https://github.com/apache/apisix/pull/6215)
- :sunrise: feat(grpc-transcode): support .pb file [#6264](https://github.com/apache/apisix/pull/6264)
- :sunrise: feat: development of Loggly logging plugin [#6113](https://github.com/apache/apisix/pull/6113)
- :sunrise: feat: add opentelemetry plugin [#6119](https://github.com/apache/apisix/pull/6119)
- :sunrise: feat: add public api plugin [#6145](https://github.com/apache/apisix/pull/6145)
- :sunrise: feat: add CSRF plugin [#5727](https://github.com/apache/apisix/pull/5727)

### Bugfix

- fix(skywalking,opentelemetry): trace request rejected by auth [#6617](https://github.com/apache/apisix/pull/6617)
- fix(log-rotate): should rotate logs strictly hourly(or minutely) [#6521](https://github.com/apache/apisix/pull/6521)
- fix: deepcopy doesn't copy the metatable [#6623](https://github.com/apache/apisix/pull/6623)
- fix(request-validate): handle duplicate key in JSON [#6625](https://github.com/apache/apisix/pull/6625)
- fix(prometheus): conflict between global rule and route configure [#6579](https://github.com/apache/apisix/pull/6579)
- fix(proxy-rewrite): when conf.headers are missing,conf.method can make effect [#6300](https://github.com/apache/apisix/pull/6300)
- fix(traffic-split): failed to match rule when the first rule failed [#6292](https://github.com/apache/apisix/pull/6292)
- fix(config_etcd): skip resync_delay while etcd watch timeout [#6259](https://github.com/apache/apisix/pull/6259)
- fix(proto): avoid sharing state [#6199](https://github.com/apache/apisix/pull/6199)
- fix(limit-count): keep the counter if the plugin conf is the same [#6151](https://github.com/apache/apisix/pull/6151)
- fix(admin): correct the count field of plugin-metadata/global-rule [#6155](https://github.com/apache/apisix/pull/6155)
- fix: add missing labels after merging route and service [#6177](https://github.com/apache/apisix/pull/6177)

## 2.12.1

**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.12` branch.**

[https://github.com/apache/apisix/blob/release/2.12/CHANGELOG.md#2121](https://github.com/apache/apisix/blob/release/2.12/CHANGELOG.md#2121)

## 2.12.0

### Change

- change(serverless): rename "balancer" phase to "before_proxy" [#5992](https://github.com/apache/apisix/pull/5992)
- change: don't promise to support Tengine [#5961](https://github.com/apache/apisix/pull/5961)
- change: enable HTTP when stream proxy is set and enable_admin is true [#5867](https://github.com/apache/apisix/pull/5867)

### Core

- :sunrise: feat(L4): support TLS over TCP upstream [#6030](https://github.com/apache/apisix/pull/6030)
- :sunrise: feat: support registering custom variable [#5941](https://github.com/apache/apisix/pull/5941)
- :sunrise: feat(vault): vault lua module, integration with jwt-auth authentication plugin [#5745](https://github.com/apache/apisix/pull/5745)
- :sunrise: feat: enable L4 stream logging [#5768](https://github.com/apache/apisix/pull/5768)
- :sunrise: feat: add http_server_location_configuration_snippet configuration [#5740](https://github.com/apache/apisix/pull/5740)
- :sunrise: feat: support resolve default value when environment not set [#5675](https://github.com/apache/apisix/pull/5675)
- :sunrise: feat(wasm): run in http header_filter [#5544](https://github.com/apache/apisix/pull/5544)

### Plugin

- :sunrise: feat: support hide the authentication header in basic-auth with  a config [#6039](https://github.com/apache/apisix/pull/6039)
- :sunrise: feat: set proxy_request_buffering dynamically [#6075](https://github.com/apache/apisix/pull/6075)
- :sunrise: feat(mqtt): balance by client id [#6079](https://github.com/apache/apisix/pull/6079)
- :sunrise: feat: add forward-auth plugin [#6037](https://github.com/apache/apisix/pull/6037)
- :sunrise: feat(grpc-web): support gRPC-Web Proxy [#5964](https://github.com/apache/apisix/pull/5964)
- :sunrise: feat(limit-count): add constant key type [#5984](https://github.com/apache/apisix/pull/5984)
- :sunrise: feat(limit-count): allow sharing counter [#5881](https://github.com/apache/apisix/pull/5881)
- :sunrise: feat(splunk): support splunk hec logging plugin [#5819](https://github.com/apache/apisix/pull/5819)
- :sunrise: feat: basic support OPA plugin [#5734](https://github.com/apache/apisix/pull/5734)
- :sunrise: feat: rocketmq logger [#5653](https://github.com/apache/apisix/pull/5653)
- :sunrise: feat(mqtt-proxy): support using route's upstream [#5666](https://github.com/apache/apisix/pull/5666)
- :sunrise: feat(ext-plugin): support to get request body [#5600](https://github.com/apache/apisix/pull/5600)
- :sunrise: feat(plugins): aws lambda serverless [#5594](https://github.com/apache/apisix/pull/5594)
- :sunrise: feat(http/kafka-logger): support to log response body [#5550](https://github.com/apache/apisix/pull/5550)
- :sunrise: feat: Apache OpenWhisk plugin [#5518](https://github.com/apache/apisix/pull/5518)
- :sunrise: feat(plugin): support google cloud logging service [#5538](https://github.com/apache/apisix/pull/5538)

### Bugfix

- fix: the prometheus labels are inconsistent when error-log-logger is enabled [#6055](https://github.com/apache/apisix/pull/6055)
- fix(ipv6): allow disabling IPv6 resolve [#6023](https://github.com/apache/apisix/pull/6023)
- fix(mqtt): handle properties for MQTT 5 [#5916](https://github.com/apache/apisix/pull/5916)
- fix(sls-logger): unable to get millisecond part of the timestamp [#5820](https://github.com/apache/apisix/pull/5820)
- fix(mqtt-proxy): client id can be empty [#5816](https://github.com/apache/apisix/pull/5816)
- fix(ext-plugin): don't use stale key [#5782](https://github.com/apache/apisix/pull/5782)
- fix(log-rotate): race between reopen log & compression [#5715](https://github.com/apache/apisix/pull/5715)
- fix(batch-processor): we didn't free stale object actually [#5700](https://github.com/apache/apisix/pull/5700)
- fix: data pollution after passive health check is changed [#5589](https://github.com/apache/apisix/pull/5589)

## 2.11.0

### Change

- change(wolf-rbac): change default port number and add `authType` parameter to documentation [#5477](https://github.com/apache/apisix/pull/5477)

### Core

- :sunrise: feat: support advanced matching based on post form [#5409](https://github.com/apache/apisix/pull/5409)
- :sunrise: feat: initial wasm support [#5288](https://github.com/apache/apisix/pull/5288)
- :sunrise: feat(control): expose services[#5271](https://github.com/apache/apisix/pull/5271)
- :sunrise: feat(control): add dump upstream api [#5259](https://github.com/apache/apisix/pull/5259)
- :sunrise: feat: etcd cluster single node failure APISIX startup failure [#5158](https://github.com/apache/apisix/pull/5158)
- :sunrise: feat: support specify custom sni in etcd conf [#5206](https://github.com/apache/apisix/pull/5206)

### Plugin

- :sunrise: feat(plugin): azure serverless functions [#5479](https://github.com/apache/apisix/pull/5479)
- :sunrise: feat(kafka-logger): supports logging request body [#5501](https://github.com/apache/apisix/pull/5501)
- :sunrise: feat: provide skywalking logger plugin [#5478](https://github.com/apache/apisix/pull/5478)
- :sunrise: feat(plugins): Datadog for metrics collection [#5372](https://github.com/apache/apisix/pull/5372)
- :sunrise: feat(limit-* plugin):  fallback to remote_addr when key is missing [#5422](https://github.com/apache/apisix/pull/5422)
- :sunrise: feat(limit-count): support multiple variables as key [#5378](https://github.com/apache/apisix/pull/5378)
- :sunrise: feat(limit-conn): support multiple variables as key [#5354](https://github.com/apache/apisix/pull/5354)
- :sunrise: feat(proxy-rewrite): rewrite method [#5292](https://github.com/apache/apisix/pull/5292)
- :sunrise: feat(limit-req): support multiple variables as key [#5302](https://github.com/apache/apisix/pull/5302)
- :sunrise: feat(proxy-cache): support memory-based strategy [#5028](https://github.com/apache/apisix/pull/5028)
- :sunrise: feat(ext-plugin): avoid sending conf request more times [#5183](https://github.com/apache/apisix/pull/5183)
- :sunrise: feat: Add ldap-auth plugin [#3894](https://github.com/apache/apisix/pull/3894)

## 2.10.5

**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.10` branch.**

[https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2105](https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2105)

## 2.10.4

**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.10` branch.**

[https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2104](https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2104)

## 2.10.3

**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.10` branch.**

[https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2103](https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2103)

## 2.10.2

**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.10` branch.**

[https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2102](https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2102)

## 2.10.1

**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.10` branch.**

[https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2101](https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2101)

## 2.10.0

### Change

- change(debug): move 'enable_debug' form config.yaml to debug.yaml [#5046](https://github.com/apache/apisix/pull/5046)
- change: use a new name to customize lua_shared_dict in nginx.conf [#5030](https://github.com/apache/apisix/pull/5030)
- change: drop the support of shell script installation [#4985](https://github.com/apache/apisix/pull/4985)

### Core

- :sunrise: feat(debug-mode): add dynamic debug mode [#5012](https://github.com/apache/apisix/pull/5012)
- :sunrise: feat: allow injecting logic to APISIX's method [#5068](https://github.com/apache/apisix/pull/5068)
- :sunrise: feat: allow configuring fallback SNI [#5000](https://github.com/apache/apisix/pull/5000)
- :sunrise: feat(stream_route): support CIDR in ip match [#4980](https://github.com/apache/apisix/pull/4980)
- :sunrise: feat: allow route to inherit hosts from service [#4977](https://github.com/apache/apisix/pull/4977)
- :sunrise: feat: support configurating the node listening address[#4856](https://github.com/apache/apisix/pull/4856)

### Plugin

- :sunrise: feat(hmac-auth): Add validate request body for hmac auth plugin [#5038](https://github.com/apache/apisix/pull/5038)
- :sunrise: feat(proxy-mirror): support mirror requests sample_ratio [#4965](https://github.com/apache/apisix/pull/4965)
- :sunrise: feat(referer-restriction): add blacklist and message [#4916](https://github.com/apache/apisix/pull/4916)
- :sunrise: feat(kafka-logger): add cluster name support [#4876](https://github.com/apache/apisix/pull/4876)
- :sunrise: feat(kafka-logger): add required_acks option [#4878](https://github.com/apache/apisix/pull/4878)
- :sunrise: feat(uri-blocker): add case insensitive switch [#4868](https://github.com/apache/apisix/pull/4868)

### Bugfix

- fix(radixtree_host_uri): correct matched host [#5124](https://github.com/apache/apisix/pull/5124)
- fix(radixtree_host_uri): correct matched path [#5104](https://github.com/apache/apisix/pull/5104)
- fix(nacos): distinguish services that has same name but in different groups or namespaces [#5083](https://github.com/apache/apisix/pull/5083)
- fix(nacos): continue to process other services when request failed [#5112](https://github.com/apache/apisix/pull/5112)
- fix(ssl): match sni in case-insensitive way [#5074](https://github.com/apache/apisix/pull/5074)
- fix(upstream): should not override default keepalive value [#5054](https://github.com/apache/apisix/pull/5054)
- fix(DNS): prefer SRV in service discovery [#4992](https://github.com/apache/apisix/pull/4992)
- fix(consul): retry connecting after a delay [#4979](https://github.com/apache/apisix/pull/4979)
- fix: avoid copying unwanted data when the domain's IP changed [#4952](https://github.com/apache/apisix/pull/4952)
- fix(plugin_config): recover plugin when plugin_config changed [#4888](https://github.com/apache/apisix/pull/4888)

## 2.9.0

### Change

- change: rename plugin's balancer method to before_proxy [#4697](https://github.com/apache/apisix/pull/4697)

### Core

- :sunrise: feat: increase timers limitation [#4843](https://github.com/apache/apisix/pull/4843)
- :sunrise: feat: make A/B test APISIX easier by removing "additionalProperties = false" [#4797](https://github.com/apache/apisix/pull/4797)
- :sunrise: feat: support dash in args (#4519) [#4676](https://github.com/apache/apisix/pull/4676)
- :sunrise: feat(admin): reject invalid proto [#4750](https://github.com/apache/apisix/pull/4750)

### Plugin

- :sunrise: feat(ext-plugin): support ExtraInfo [#4835](https://github.com/apache/apisix/pull/4835)
- :sunrise: feat(gzip): support special * to match any type [#4817](https://github.com/apache/apisix/pull/4817)
- :sunrise: feat(real-ip): implement the first version [#4813](https://github.com/apache/apisix/pull/4813)
- :sunrise: feat(limit-*): add custom reject-message for traffic control [#4808](https://github.com/apache/apisix/pull/4808)
- :sunrise: feat: Request-ID plugin add snowflake algorithm [#4559](https://github.com/apache/apisix/pull/4559)
- :sunrise: feat: Added authz-casbin plugin and doc and tests for it [#4710](https://github.com/apache/apisix/pull/4710)
- :sunrise: feat: add error log skywalking reporter [#4633](https://github.com/apache/apisix/pull/4633)
- :sunrise: feat(ext-plugin): send the idempotent key when preparing conf [#4736](https://github.com/apache/apisix/pull/4736)

### Bugfix

- fix: the issue that plugins in global rule may be cached to route [#4867](https://github.com/apache/apisix/pull/4867)
- fix(grpc-transcode): support converting nested message [#4859](https://github.com/apache/apisix/pull/4859)
- fix(authz-keycloak): set permissions as empty table when lazy_load_path is false [#4845](https://github.com/apache/apisix/pull/4845)
- fix(proxy-cache): keep cache_method same with nginx's proxy_cache_methods [#4814](https://github.com/apache/apisix/pull/4814)
- fix(admin): inject updatetime when the request is PATCH with sub path [#4765](https://github.com/apache/apisix/pull/4765)
- fix(admin): check username for updating consumer [#4756](https://github.com/apache/apisix/pull/4756)
- fix(error-log-logger): avoid sending stale error log [#4690](https://github.com/apache/apisix/pull/4690)
- fix(grpc-transcode): handle enum type [#4706](https://github.com/apache/apisix/pull/4706)
- fix: when a request caused a 500 error, the status was converted to 405 [#4696](https://github.com/apache/apisix/pull/4696)

## 2.8.0

### Change

- change: enable stream proxy only by default [#4580](https://github.com/apache/apisix/pull/4580)

### Core

- :sunrise: feat: allow user-defined balancer with metadata in node [#4605](https://github.com/apache/apisix/pull/4605)
- :sunrise: feat: Add option retry_timeout that like nginx's proxy_next_upstream_timeout [#4574](https://github.com/apache/apisix/pull/4574)
- :sunrise: feat: enable balancer phase for plugins [#4549](https://github.com/apache/apisix/pull/4549)
- :sunrise: feat: allow setting separate keepalive pool [#4506](https://github.com/apache/apisix/pull/4506)
- :sunrise: feat: enable etcd health-check [#4191](https://github.com/apache/apisix/pull/4191)

### Plugin

- :sunrise: feat: add gzip plugin [#4640](https://github.com/apache/apisix/pull/4640)
- :sunrise: feat(plugin): Add new plugin ua-restriction for bot spider restriction [#4587](https://github.com/apache/apisix/pull/4587)
- :sunrise: feat(stream): add ip-restriction [#4602](https://github.com/apache/apisix/pull/4602)
- :sunrise: feat(stream): add limit-conn [#4515](https://github.com/apache/apisix/pull/4515)
- :sunrise: feat: increase ext-plugin timeout to 60s [#4557](https://github.com/apache/apisix/pull/4557)
- :sunrise: feat(key-auth): supporting key-auth plugin to get key from query string [#4490](https://github.com/apache/apisix/pull/4490)
- :sunrise: feat(kafka-logger): support for specified the log formats via admin API. [#4483](https://github.com/apache/apisix/pull/4483)

### Bugfix

- fix(stream): sni router is broken when session reuses [#4607](https://github.com/apache/apisix/pull/4607)
- fix: the limit-conn plugin cannot effectively intercept requests in special scenarios [#4585](https://github.com/apache/apisix/pull/4585)
- fix: ref check while deleting proto via Admin API [#4575](https://github.com/apache/apisix/pull/4575)
- fix(skywalking): handle conflict between global rule and route [#4589](https://github.com/apache/apisix/pull/4589)
- fix: `ctx.var.cookie_*` cookie not found log [#4564](https://github.com/apache/apisix/pull/4564)
- fix(request-id): we can use different ids with the same request [#4479](https://github.com/apache/apisix/pull/4479)

## 2.7.0

### Change

- change: check metadata_schema with check_schema like the other schema [#4381](https://github.com/apache/apisix/pull/4381)
- change(echo): remove odd auth_value [#4055](https://github.com/apache/apisix/pull/4055)
- fix(admin): correct the resources' count field and change its type to integer [#4385](https://github.com/apache/apisix/pull/4385)

### Core

- :sunrise: feat(stream): support client certificate verification [#4445](https://github.com/apache/apisix/pull/4445)
- :sunrise: feat(stream): accept tls over tcp [#4409](https://github.com/apache/apisix/pull/4409)
- :sunrise: feat(stream): support domain in the upstream [#4386](https://github.com/apache/apisix/pull/4386)
- :sunrise: feat(cli): wrap nginx quit cmd [#4360](https://github.com/apache/apisix/pull/4360)
- :sunrise: feat: allow to set custom timeout for route [#4340](https://github.com/apache/apisix/pull/4340)
- :sunrise: feat: nacos discovery support group [#4325](https://github.com/apache/apisix/pull/4325)
- :sunrise: feat: nacos discovery support namespace [#4313](https://github.com/apache/apisix/pull/4313)

### Plugin

- :sunrise: feat(client-control): set client_max_body_size dynamically [#4423](https://github.com/apache/apisix/pull/4423)
- :sunrise: feat(ext-plugin): stop the runner with SIGTERM [#4367](https://github.com/apache/apisix/pull/4367)
- :sunrise: feat(limit-req) support nodelay [#4395](https://github.com/apache/apisix/pull/4395)
- :sunrise: feat(mqtt-proxy): support domain [#4391](https://github.com/apache/apisix/pull/4391)
- :sunrise: feat(redirect): support appending query string [#4298](https://github.com/apache/apisix/pull/4298)

### Bugfix

- fix: solve memory leak when the client aborts [#4405](https://github.com/apache/apisix/pull/4405)
- fix(etcd): check res.body.error before accessing the data [#4371](https://github.com/apache/apisix/pull/4371)
- fix(ext-plugin): when token is stale, refresh token and try again [#4345](https://github.com/apache/apisix/pull/4345)
- fix(ext-plugin): pass environment variables [#4349](https://github.com/apache/apisix/pull/4349)
- fix: ensure the plugin is always reloaded [#4319](https://github.com/apache/apisix/pull/4319)

## 2.6.0

### Change

- change(prometheus): redesign the latency metrics & update grafana [#3993](https://github.com/apache/apisix/pull/3993)
- change(prometheus): don't expose metrics to internet [#3994](https://github.com/apache/apisix/pull/3994)
- change(limit-count): ensure redis cluster name is set correctly [#3910](https://github.com/apache/apisix/pull/3910)
- change: drop support of OpenResty 1.15 [#3960](https://github.com/apache/apisix/pull/3960)

### Core

- :sunrise: feat: support passing different host headers in multiple nodes [#4208](https://github.com/apache/apisix/pull/4208)
- :sunrise: feat: add 50x html for error page [#4164](https://github.com/apache/apisix/pull/4164)
- :sunrise: feat: support to use upstream_id in stream_route [#4121](https://github.com/apache/apisix/pull/4121)
- :sunrise: feat: support client certificate verification [#4034](https://github.com/apache/apisix/pull/4034)
- :sunrise: feat: add nacos support [#3820](https://github.com/apache/apisix/pull/3820)
- :sunrise: feat: patch tcp.sock.connect to use our DNS resolver [#4114](https://github.com/apache/apisix/pull/4114)

### Plugin

- :sunrise: feat(redirect): support uri encoding [#4244](https://github.com/apache/apisix/pull/4244)
- :sunrise: feat(key-auth): allow customizing header [#4013](https://github.com/apache/apisix/pull/4013)
- :sunrise: feat(response-rewrite): allow using variable in the header [#4194](https://github.com/apache/apisix/pull/4194)
- :sunrise: feat(ext-plugin): APISIX can support Java, Go and other languages to implement custom plugin [#4183](https://github.com/apache/apisix/pull/4183)

### Bugfix

- fix(DNS): support IPv6 resolver [#4242](https://github.com/apache/apisix/pull/4242)
- fix(healthcheck): only one_loop is needed in the passive health check report [#4116](https://github.com/apache/apisix/pull/4116)
- fix(traffic-split): configure multiple "rules", the request will be confused between upstream [#4092](https://github.com/apache/apisix/pull/4092)
- fix: ensure upstream with domain is cached [#4061](https://github.com/apache/apisix/pull/4061)
- fix: be compatible with the router created before 2.5 [#4056](https://github.com/apache/apisix/pull/4056)
- fix(standalone): the conf should be available during start [#4027](https://github.com/apache/apisix/pull/4027)
- fix: ensure atomic operation in limit-count plugin [#3991](https://github.com/apache/apisix/pull/3991)

## 2.5.0

**The changes marked with :warning: are not backward compatible.**
**Please upgrade your data accordingly before upgrading to this version.**
**[#3809](https://github.com/apache/apisix/pull/3809) Means that empty vars will make the route fail to match any requests.**

### Change

- :warning: change: remove unused consumer.id  [#3868](https://github.com/apache/apisix/pull/3868)
- :warning: change: remove deprecated upstream.enable_websocket [#3854](https://github.com/apache/apisix/pull/3854)
- change(zipkin): rearrange the child span [#3877](https://github.com/apache/apisix/pull/3877)

### Core

- :sunrise: feat: support mTLS with etcd [#3905](https://github.com/apache/apisix/pull/3905)
- :warning: feat: upgrade lua-resty-expr/radixtree to support logical expression [#3809](https://github.com/apache/apisix/pull/3809)
- :sunrise: feat: load etcd configuration when apisix starts [#3799](https://github.com/apache/apisix/pull/3799)
- :sunrise: feat: let balancer support priority [#3755](https://github.com/apache/apisix/pull/3755)
- :sunrise: feat: add control api for discovery module [#3742](https://github.com/apache/apisix/pull/3742)

### Plugin

- :sunrise: feat(skywalking):  allow destroy and configure report interval for reporter [#3925](https://github.com/apache/apisix/pull/3925)
- :sunrise: feat(traffic-split): the upstream pass_host needs to support IP mode [#3870](https://github.com/apache/apisix/pull/3870)
- :sunrise: feat: Add filter on HTTP methods for consumer-restriction plugin [#3691](https://github.com/apache/apisix/pull/3691)
- :sunrise: feat: add allow_origins_by_regex to cors plugin [#3839](https://github.com/apache/apisix/pull/3839)
- :sunrise: feat: support conditional response rewrite [#3577](https://github.com/apache/apisix/pull/3577)

### Bugfix

- fix(error-log-logger): the logger should be run in each process [#3912](https://github.com/apache/apisix/pull/3912)
- fix: use the builtin server by default [#3907](https://github.com/apache/apisix/pull/3907)
- fix(traffic-split): binding upstream via upstream_id is invalid [#3842](https://github.com/apache/apisix/pull/3842)
- fix: correct the validation for ssl_trusted_certificate [#3832](https://github.com/apache/apisix/pull/3832)
- fix: don't override cache relative headers [#3789](https://github.com/apache/apisix/pull/3789)
- fix: fail to run `make deps` on macOS [#3718](https://github.com/apache/apisix/pull/3718)

## 2.4.0

### Change

- change: global rules should not be executed on the internal api by default [#3396](https://github.com/apache/apisix/pull/3396)
- change: default to cache DNS record according to the TTL [#3530](https://github.com/apache/apisix/pull/3530)

### Core

- :sunrise: feat: support SRV record [#3686](https://github.com/apache/apisix/pull/3686)
- :sunrise: feat: add dns discovery [#3629](https://github.com/apache/apisix/pull/3629)
- :sunrise: feat: add consul kv discovery module [#3615](https://github.com/apache/apisix/pull/3615)
- :sunrise: feat: support to bind plugin config by `plugin_config_id` [#3567](https://github.com/apache/apisix/pull/3567)
- :sunrise: feat: support listen http2 with plaintext [#3547](https://github.com/apache/apisix/pull/3547)
- :sunrise: feat: support DNS AAAA record [#3484](https://github.com/apache/apisix/pull/3484)

### Plugin

- :sunrise: feat: the traffic-split plugin supports upstream_id [#3512](https://github.com/apache/apisix/pull/3512)
- :sunrise: feat(zipkin): support b3 req header [#3551](https://github.com/apache/apisix/pull/3551)

### Bugfix

- fix(chash): ensure retry can try every node [#3651](https://github.com/apache/apisix/pull/3651)
- fix: script does not work when the route is bound to a service [#3678](https://github.com/apache/apisix/pull/3678)
- fix: use openssl111 in openresty dir in precedence [#3603](https://github.com/apache/apisix/pull/3603)
- fix(zipkin): don't cache the per-req sample ratio [#3522](https://github.com/apache/apisix/pull/3522)

For more changes, please refer to [Milestone](https://github.com/apache/apisix/milestone/13)

## 2.3.0

### Change

- fix: use luajit by default when run apisix [#3335](https://github.com/apache/apisix/pull/3335)
- feat: use luasocket instead of curl in etcd.lua [#2965](https://github.com/apache/apisix/pull/2965)

### Core

- :sunrise: feat: support to communicate with etcd by TLS without verification in command line [#3415](https://github.com/apache/apisix/pull/3415)
- :sunrise: feat: chaos test on route could still works when etcd is down [#3404](https://github.com/apache/apisix/pull/3404)
- :sunrise: feat: ewma use p2c to improve performance [#3300](https://github.com/apache/apisix/pull/3300)
- :sunrise: feat: support specifying https in upstream to talk with https backend [#3430](https://github.com/apache/apisix/pull/3430)
- :sunrise: feat: allow customizing lua_package_path & lua_package_cpath [#3417](https://github.com/apache/apisix/pull/3417)
- :sunrise: feat: allow to pass SNI in HTTPS proxy [#3420](https://github.com/apache/apisix/pull/3420)
- :sunrise: feat: support gRPCS [#3411](https://github.com/apache/apisix/pull/3411)
- :sunrise: feat: allow getting upstream health check status via control API [#3345](https://github.com/apache/apisix/pull/3345)
- :sunrise: feat: support dubbo [#3224](https://github.com/apache/apisix/pull/3224)
- :sunrise: feat: load balance by least connections [#3304](https://github.com/apache/apisix/pull/3304)

### Plugin

- :sunrise: feat: kafka-logger implemented reuse kafka producer [#3429](https://github.com/apache/apisix/pull/3429)
- :sunrise: feat(authz-keycloak): dynamic scope and resource mapping. [#3308](https://github.com/apache/apisix/pull/3308)
- :sunrise: feat: proxy-rewrite host support host with port [#3428](https://github.com/apache/apisix/pull/3428)
- :sunrise: feat(fault-injection): support conditional fault injection using nginx variables [#3363](https://github.com/apache/apisix/pull/3363)

### Bugfix

- fix(standalone): require consumer's id to be the same as username [#3394](https://github.com/apache/apisix/pull/3394)
- fix: support upstream_id & consumer with grpc [#3387](https://github.com/apache/apisix/pull/3387)
- fix: set conf info when global rule is hit without matched rule [#3332](https://github.com/apache/apisix/pull/3332)
- fix: avoid caching outdated discovery upstream nodes [#3295](https://github.com/apache/apisix/pull/3295)
- fix: create the health checker in `access` phase [#3240](https://github.com/apache/apisix/pull/3240)
- fix: make set_more_retries() work when upstream_type is chash [#2676](https://github.com/apache/apisix/pull/2676)

For more changes, please refer to [Milestone](https://github.com/apache/apisix/milestone/12)

## 2.2.0

### Change

- disable node-status plugin by default [#2968](https://github.com/apache/apisix/pull/2968)
- k8s_deployment_info is no longer allowed in upstream [#3098](https://github.com/apache/apisix/pull/3098)
- don't treat route segment with ':' as parameter by default [#3154](https://github.com/apache/apisix/pull/3154)

### Core

- :sunrise: allow create consumers with multiple auth plugins [#2898](https://github.com/apache/apisix/pull/2898)
- :sunrise: increase the delay before resync etcd [#2977](https://github.com/apache/apisix/pull/2977)
- :sunrise: support enable/disable route [#2943](https://github.com/apache/apisix/pull/2943)
- :sunrise: route according to the graphql attributes [#2964](https://github.com/apache/apisix/pull/2964)
- :sunrise: share etcd auth token [#2932](https://github.com/apache/apisix/pull/2932)
- :sunrise: add control API [#3048](https://github.com/apache/apisix/pull/3048)

### Plugin

- :sunrise: feat(limt-count): use 'remote_addr' as default key [#2927](https://github.com/apache/apisix/pull/2927)
- :sunrise: feat(fault-injection): support Nginx variable in abort.body [#2986](https://github.com/apache/apisix/pull/2986)
- :sunrise: feat: implement new plugin `server-info` [#2926](https://github.com/apache/apisix/pull/2926)
- :sunrise: feat: add batch process metrics [#3070](https://github.com/apache/apisix/pull/3070)
- :sunrise: feat: Implement traffic splitting plugin [#2935](https://github.com/apache/apisix/pull/2935)
- :sunrise: feat:  the proxy-rewrite plugin  support pass nginx variable within header [#3144](https://github.com/apache/apisix/pull/3144)
- :sunrise: feat: Make headers to add to request in openid-connect plugin configurable [#2903](https://github.com/apache/apisix/pull/2903)
- :sunrise: feat: support var in upstream_uri on proxy-rewrite plugin [#3139](https://github.com/apache/apisix/pull/3139)

### Bugfix

- basic-auth plugin should run in rewrite phases. [#2905](https://github.com/apache/apisix/pull/2905)
- fixed the non effective config update in http/udp-logger [#2901](https://github.com/apache/apisix/pull/2901)
- always necessary to save the data of the limit concurrency, and release the statistical status in the log phase [#2465](https://github.com/apache/apisix/pull/2465)
- avoid duplicate auto-generated id [#3003](https://github.com/apache/apisix/pull/3003)
- fix: ctx being contaminated due to a new feature of openresty 1.19. **For openresty 1.19 users, it is recommended to upgrade the APISIX version as soon as possible.** [#3105](https://github.com/apache/apisix/pull/3105)
- fix: correct the validation of route.vars [#3124](https://github.com/apache/apisix/pull/3124)

For more changes, please refer to [Milestone](https://github.com/apache/apisix/milestone/10)

## 2.1.0

### Core

- :sunrise: **support ENV variable in configuration.** [#2743](https://github.com/apache/apisix/pull/2743)
- :sunrise: **support TLS connection with etcd.** [#2548](https://github.com/apache/apisix/pull/2548)
- generate create/update_time automatically. [#2740](https://github.com/apache/apisix/pull/2740)
- add a deprecate log for enable_websocket in upstream.[#2691](https://github.com/apache/apisix/pull/2691)
- add a deprecate log for consumer id.[#2829](https://github.com/apache/apisix/pull/2829)
- Added `X-APISIX-Upstream-Status` header to distinguish 5xx errors from upstream or APISIX itself. [#2817](https://github.com/apache/apisix/pull/2817)
- support Nginx configuration snippet. [#2803](https://github.com/apache/apisix/pull/2803)

### Plugin

- :sunrise: **Upgrade protocol to support Apache Skywalking 8.0**[#2389](https://github.com/apache/apisix/pull/2389). So this version only supports skywalking 8.0 protocol. This plugin is disabled by default, you need to modify config.yaml to enable, which is not backward compatible.
- :sunrise: add aliyun sls logging plugin.[#2169](https://github.com/apache/apisix/issues/2169)
- proxy-cache: the cache_zone field in the schema should be optional.[#2776](https://github.com/apache/apisix/pull/2776)
- fix: validate plugin configuration in the DP [#2856](https://github.com/apache/apisix/pull/2856)

### Bugfix

- :bug: fix(etcd): handle etcd compaction.[#2687](https://github.com/apache/apisix/pull/2687)
- fix: move `conf/cert` to `t/certs` and disable ssl by default, which is not backward compatible. [#2112](https://github.com/apache/apisix/pull/2112)
- fix: check decrypt key to prevent lua thread aborted [#2815](https://github.com/apache/apisix/pull/2815)

### Not downward compatible features in future versions

-In the 2.3 release, the consumer will only support user names and discard the id. The consumer needs to manually clean up the id field in etcd, otherwise the schema verification will report an error during use
-In the 2.3 release, opening websocket on upstream will no longer be supported
-In version 3.0, the data plane and control plane will be separated into two independent ports, that is, the current port 9080 will only process data plane requests, and no longer process admin API requests

For more changes, please refer to [Milestone](https://github.com/apache/apisix/milestone/8)

## 2.0.0

This is release candidate.

### Core

- :sunrise: **Migrate from etcd v2 to v3 protocol, which is not backward compatible. Apache APISIX only supports etcd 3.4 and above versions.** [#2036](https://github.com/apache/apisix/pull/2036)
- add labels for upstream object.[#2279](https://github.com/apache/apisix/pull/2279)
- add managed fields in json schema for resources, such as create_time and update_time.[#2444](https://github.com/apache/apisix/pull/2444)
- use interceptors to protect plugin's route[#2416](https://github.com/apache/apisix/pull/2416)
- support multiple ports for http and https listen.[#2409](https://github.com/apache/apisix/pull/2409)
- implement `core.sleep`.[#2397](https://github.com/apache/apisix/pull/2397)

### Plugin

- :sunrise: **add AK/SK(HMAC) auth plugin.**[#2192](https://github.com/apache/apisix/pull/2192)
- :sunrise: add referer-restriction plugin.[#2352](https://github.com/apache/apisix/pull/2352)
- `limit-count` support to use `redis` cluster.[#2406](https://github.com/apache/apisix/pull/2406)
- feat(proxy-cache): store the temporary file under cache directory. [#2317](https://github.com/apache/apisix/pull/2317)
- feat(http-logger): support for specified the log formats via admin API [#2309](https://github.com/apache/apisix/pull/2309)

### Bugfix

- :bug: **`high priority`** When the data plane receives an instruction to delete a resource(router or upstream etc.), it does not properly clean up the cache, resulting in the existing resources cannot be found. This problem only occurs in the case of long and frequent deletion operations.[#2168](https://github.com/apache/apisix/pull/2168)
- fix routing priority does not take effect.[#2447](https://github.com/apache/apisix/pull/2447)
- set random seed for each worker process at `init_worker` phase, only `init` phase is not enough.[#2357](https://github.com/apache/apisix/pull/2357)
- remove unsupported algorithm in jwt plugin.[#2356](https://github.com/apache/apisix/pull/2356)
- return correct response code when `http_to_https` enabled in redirect plugin.[#2311](https://github.com/apache/apisix/pull/2311)

For more changes, please refer to [Milestone](https://github.com/apache/apisix/milestone/7)

### CVE

- Fixed Admin API default access token vulnerability

## 1.5.0

### Core

- Admin API: support authentication with SSL certificates. [1747](https://github.com/apache/apisix/pull/1747)
- Admin API: support both standard `PATCH` and sub path `PATCH`. [1930](https://github.com/apache/apisix/pull/1930)
- HealthCheck: supports custom host port. [1914](https://github.com/apache/apisix/pull/1914)
- Upstream: supports turning off the default retry mechanism. [1919](https://github.com/apache/apisix/pull/1919)
- URI: supports delete the '/' at the end of the `URI`. [1766](https://github.com/apache/apisix/pull/1766)

### New Plugin

- :sunrise: **Request Validator** [1709](https://github.com/apache/apisix/pull/1709)

### Improvements

- change: nginx worker_shutdown_timeout is changed from 3s to recommended value 240s. [1883](https://github.com/apache/apisix/pull/1883)
- change: the `healthcheck` timeout time type changed from `integer` to `number`. [1892](https://github.com/apache/apisix/pull/1892)
- change: the `request-validation` plugin input parameter supports `Schema` validation. [1920](https://github.com/apache/apisix/pull/1920)
- change: add comments for Makefile `install` command. [1912](https://github.com/apache/apisix/pull/1912)
- change: update comment for config.yaml `etcd.timeout` configuration. [1929](https://github.com/apache/apisix/pull/1929)
- change: add more prometheus metrics. [1888](https://github.com/apache/apisix/pull/1888)
- change: add more configuration options for `cors` plugin. [1963](https://github.com/apache/apisix/pull/1963)

### Bugfix

- fixed: failed to get `host` in health check configuration. [1871](https://github.com/apache/apisix/pull/1871)
- fixed: should not save the runtime data of plugin into `etcd`. [1910](https://github.com/apache/apisix/pull/1910)
- fixed: run `apisix start` several times will start multi nginx processes. [1913](https://github.com/apache/apisix/pull/1913)
- fixed: read the request body from the temporary file if it was cached. [1863](https://github.com/apache/apisix/pull/1863)
- fixed: batch processor name and error return type. [1927](https://github.com/apache/apisix/pull/1927)
- fixed: failed to read redis.ttl in `limit-count` plugin. [1928](https://github.com/apache/apisix/pull/1928)
- fixed: passive health check seems never provide a healthy report. [1918](https://github.com/apache/apisix/pull/1918)
- fixed: avoid to modify the original plugin conf. [1958](https://github.com/apache/apisix/pull/1958)
- fixed: the test case of `invalid-upstream` is unstable and sometimes fails to run. [1925](https://github.com/apache/apisix/pull/1925)

### Doc

- doc: added APISIX Lua Coding Style Guide. [1874](https://github.com/apache/apisix/pull/1874)
- doc: fixed link syntax in README.md. [1894](https://github.com/apache/apisix/pull/1894)
- doc: fixed image links in zh-cn benchmark. [1896](https://github.com/apache/apisix/pull/1896)
- doc: fixed typos in `FAQ`、`admin-api`、`architecture-design`、`discovery`、`prometheus`、`proxy-rewrite`、`redirect`、`http-logger` documents. [1916](https://github.com/apache/apisix/pull/1916)
- doc: added improvements for OSx unit tests and request validation plugin. [1926](https://github.com/apache/apisix/pull/1926)
- doc: fixed typos in `architecture-design` document. [1938](https://github.com/apache/apisix/pull/1938)
- doc: added the default import path of `Nginx` for unit testing in `Linux` and `macOS` systems in the `how-to-build` document. [1936](https://github.com/apache/apisix/pull/1936)
- doc: add `request-validation` plugin chinese document. [1932](https://github.com/apache/apisix/pull/1932)
- doc: fixed file path of `gRPC transcoding` in `README`. [1945](https://github.com/apache/apisix/pull/1945)
- doc: fixed `uri-blocker` plugin path error in `README`. [1950](https://github.com/apache/apisix/pull/1950)
- doc: fixed `grpc-transcode` plugin path error in `README`. [1946](https://github.com/apache/apisix/pull/1946)
- doc: removed unnecessary configurations for `k8s` document. [1891](https://github.com/apache/apisix/pull/1891)

## 1.4.1

### Bugfix

- Fix: multiple SSL certificates are configured, but only one certificate working fine. [1818](https://github.com/apache/incubator-apisix/pull/1818)

## 1.4.0

### Core

- Admin API: Support unique names for routes [1655](https://github.com/apache/incubator-apisix/pull/1655)
- Optimization of log buffer size and flush time [1570](https://github.com/apache/incubator-apisix/pull/1570)

### New plugins

- :sunrise: **Apache Skywalking plugin** [1241](https://github.com/apache/incubator-apisix/pull/1241)
- :sunrise: **Keycloak Identity Server Plugin** [1701](https://github.com/apache/incubator-apisix/pull/1701)
- :sunrise: **Echo Plugin** [1632](https://github.com/apache/incubator-apisix/pull/1632)
- :sunrise: **Consume Restriction Plugin** [1437](https://github.com/apache/incubator-apisix/pull/1437)

### Improvements

- Batch Request : Copy all headers to every request [1697](https://github.com/apache/incubator-apisix/pull/1697)
- SSL private key encryption [1678](https://github.com/apache/incubator-apisix/pull/1678)
- Improvement of docs for multiple plugins

## 1.3.0

The 1.3 version is mainly for security update.

### Security

- reject invalid header[#1462](https://github.com/apache/incubator-apisix/pull/1462) and uri safe encode[#1461](https://github.com/apache/incubator-apisix/pull/1461)
- only allow 127.0.0.1 access admin API and dashboard by default. [#1458](https://github.com/apache/incubator-apisix/pull/1458)

### Plugin

- :sunrise: **add batch request plugin**. [#1388](https://github.com/apache/incubator-apisix/pull/1388)
- implemented plugin `sys logger`. [#1414](https://github.com/apache/incubator-apisix/pull/1414)

## 1.2.0

The 1.2 version brings many new features, including core and plugins.

### Core

- :sunrise: **support etcd cluster**. [#1283](https://github.com/apache/incubator-apisix/pull/1283)
- using the local DNS resolver by default, which is friendly for k8s. [#1387](https://github.com/apache/incubator-apisix/pull/1387)
- support to run `header_filter`, `body_filter` and `log` phases for global rules. [#1364](https://github.com/apache/incubator-apisix/pull/1364)
- changed the `lua/apisix` dir to `apisix`(**not backward compatible**). [#1351](https://github.com/apache/incubator-apisix/pull/1351)
- add dashboard as submodule. [#1360](https://github.com/apache/incubator-apisix/pull/1360)
- allow adding custom shared dict. [#1367](https://github.com/apache/incubator-apisix/pull/1367)

### Plugin

- :sunrise: **add Apache Kafka plugin**. [#1312](https://github.com/apache/incubator-apisix/pull/1312)
- :sunrise: **add CORS plugin**. [#1327](https://github.com/apache/incubator-apisix/pull/1327)
- :sunrise: **add TCP logger plugin**. [#1221](https://github.com/apache/incubator-apisix/pull/1221)
- :sunrise: **add UDP logger plugin**. [1070](https://github.com/apache/incubator-apisix/pull/1070)
- :sunrise: **add proxy mirror plugin**. [#1288](https://github.com/apache/incubator-apisix/pull/1288)
- :sunrise: **add proxy cache plugin**. [#1153](https://github.com/apache/incubator-apisix/pull/1153)
- drop websocket enable control in proxy-rewrite plugin(**not backward compatible**). [1332](https://github.com/apache/incubator-apisix/pull/1332)
- Adding support to public key based introspection for OAuth plugin. [#1266](https://github.com/apache/incubator-apisix/pull/1266)
- response-rewrite plugin support binary data to client by base64. [#1381](https://github.com/apache/incubator-apisix/pull/1381)
- plugin `grpc-transcode` supports grpc deadline. [#1149](https://github.com/apache/incubator-apisix/pull/1149)
- support password auth for limit-count-redis. [#1150](https://github.com/apache/incubator-apisix/pull/1150)
- Zipkin plugin add service name and report local server IP. [#1386](https://github.com/apache/incubator-apisix/pull/1386)
- add `change_pwd` and `user_info` for Wolf-Rbac plugin. [#1204](https://github.com/apache/incubator-apisix/pull/1204)

### Admin API

- :sunrise: support key-based authentication for Admin API(**not backward compatible**). [#1169](https://github.com/apache/incubator-apisix/pull/1169)
- hide SSL private key in admin API. [#1240](https://github.com/apache/incubator-apisix/pull/1240)

### Bugfix

- missing `clear` table before to reuse table (**will cause memory leak**). [#1134](https://github.com/apache/incubator-apisix/pull/1134)
- print warning error message if the yaml route file is invalid. [#1141](https://github.com/apache/incubator-apisix/pull/1141)
- the balancer IP may be nil, use an empty string instead. [#1166](https://github.com/apache/incubator-apisix/pull/1166)
- plugin node-status and heartbeat don't have schema. [#1249](https://github.com/apache/incubator-apisix/pull/1249)
- the plugin basic-auth needs required field. [#1251](https://github.com/apache/incubator-apisix/pull/1251)
- check the count of upstream valid node. [#1292](https://github.com/apache/incubator-apisix/pull/1292)

## 1.1.0

This release is mainly to strengthen the stability of the code and add more documentation.

### Core

- always specify perl include path when running test cases. [#1097](https://github.com/apache/incubator-apisix/pull/1097)
- Feature: Add support for PROXY Protocol. [#1113](https://github.com/apache/incubator-apisix/pull/1113)
- enhancement: add verify command to verify apisix configuration(nginx.conf). [#1112](https://github.com/apache/incubator-apisix/pull/1112)
- feature: increase the default size of the core file. [#1105](https://github.com/apache/incubator-apisix/pull/1105)
- feature: make the number of file is as configurable as the connections. [#1098](https://github.com/apache/incubator-apisix/pull/1098)
- core: improve the core.log module. [#1093](https://github.com/apache/incubator-apisix/pull/1093)
- Modify bin/apisix to support the SO_REUSEPORT. [#1085](https://github.com/apache/incubator-apisix/pull/1085)

### Doc

- doc: add link to download grafana meta data. [#1119](https://github.com/apache/incubator-apisix/pull/1119)
- doc: Update README.md. [#1118](https://github.com/apache/incubator-apisix/pull/1118)
- doc: doc: add wolf-rbac plugin. [#1116](https://github.com/apache/incubator-apisix/pull/1116)
- doc: update the download link of rpm. [#1108](https://github.com/apache/incubator-apisix/pull/1108)
- doc: add more english article. [#1092](https://github.com/apache/incubator-apisix/pull/1092)
- Adding contribution guidelines for the documentation. [#1086](https://github.com/apache/incubator-apisix/pull/1086)
- doc: getting-started.md check. [#1084](https://github.com/apache/incubator-apisix/pull/1084)
- Added additional information and refactoring sentences. [#1078](https://github.com/apache/incubator-apisix/pull/1078)
- Update admin-api-cn.md. [#1067](https://github.com/apache/incubator-apisix/pull/1067)
- Update architecture-design-cn.md. [#1065](https://github.com/apache/incubator-apisix/pull/1065)

### CI

- ci: remove patch which is no longer necessary and removed in the upst. [#1090](https://github.com/apache/incubator-apisix/pull/1090)
- fix path error when install with luarocks. [#1068](https://github.com/apache/incubator-apisix/pull/1068)
- travis: run a apisix instance which intalled by luarocks. [#1063](https://github.com/apache/incubator-apisix/pull/1063)

### Plugins

- feature: Add wolf rbac plugin. [#1095](https://github.com/apache/incubator-apisix/pull/1095)
- Adding UDP logger plugin. [#1070](https://github.com/apache/incubator-apisix/pull/1070)
- enhancement: using internal request instead of external request in node-status plugin. [#1109](https://github.com/apache/incubator-apisix/pull/1109)

## 1.0.0

This release is mainly to strengthen the stability of the code and add more documentation.

### Core

- :sunrise: Support routing priority. You can match different upstream services based on conditions such as header, args, priority, etc. under the same URI. [#998](https://github.com/apache/incubator-apisix/pull/998)
- When no route is matched, an error message is returned. To distinguish it from other 404 requests. [#1013](https://github.com/apache/incubator-apisix/pull/1013)
- The address of the dashboard `/apisix/admin` supports CORS. [#982](https://github.com/apache/incubator-apisix/pull/982)
- The jsonschema validator returns a clearer error message. [#1011](https://github.com/apache/incubator-apisix/pull/1011)
- Upgrade the `ngx_var` module to version 0.5. [#1005](https://github.com/apache/incubator-apisix/pull/1005)
- Upgrade the `lua-resty-etcd` module to version 0.8. [#980](https://github.com/apache/incubator-apisix/pull/980)
- In development mode, the number of workers is automatically adjusted to 1. [#926](https://github.com/apache/incubator-apisix/pull/926)
- Remove the nginx.conf file from the code repository. It is automatically generated every time and cannot be modified manually. [#974](https://github.com/apache/incubator-apisix/pull/974)

### Doc

- Added documentation on how to customize development plugins. [#909](https://github.com/apache/incubator-apisix/pull/909)
- fixed example's bugs in the serverless plugin documentation. [#1006](https://github.com/apache/incubator-apisix/pull/1006)
- Added documentation for using the Oauth plugin. [#987](https://github.com/apache/incubator-apisix/pull/987)
- Added dashboard compiled documentation. [#985](https://github.com/apache/incubator-apisix/pull/985)
- Added documentation on how to perform a/b testing. [#957](https://github.com/apache/incubator-apisix/pull/957)
- Added documentation on how to enable the MQTT plugin. [#916](https://github.com/apache/incubator-apisix/pull/916)

### Test case

- Add test cases for key-auth plugin under normal circumstances. [#964](https://github.com/apache/incubator-apisix/pull/964/)
- Added tests for gRPC transcode pb options. [#920](https://github.com/apache/incubator-apisix/pull/920)

## 0.9.0

This release brings many new features, such as support for running APISIX with Tengine,
an advanced debugging mode that is more developer friendly, and a new URI redirection plugin.

### Core

- :sunrise: Supported to run APISIX with tengine. [#683](https://github.com/apache/incubator-apisix/pull/683)
- :sunrise: Enabled HTTP2 and supported to set ssl_protocols. [#663](https://github.com/apache/incubator-apisix/pull/663)
- :sunrise: Advanced Debug Mode, Target module function's input arguments or returned value would be printed once this option is enabled. [#614](https://github.com/apache/incubator-apisix/pull/641)
- Support to install APISIX without dashboard. [#686](https://github.com/apache/incubator-apisix/pull/686)
- Removed router R3 [#725](https://github.com/apache/incubator-apisix/pull/725)

### Plugins

- [Redirect URI](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/plugins/redirect.md): Redirect URI plugin. [#732](https://github.com/apache/incubator-apisix/pull/732)
- [Proxy Rewrite](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/plugins/proxy-rewrite.md): Supported remove `header` feature. [#658](https://github.com/apache/incubator-apisix/pull/658)
- [Limit Count](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/plugins/limit-count.md): Supported global limit count with `Redis Server`.[#624](https://github.com/apache/incubator-apisix/pull/624)

### lua-resty-*

- lua-resty-radixtree
  - Support for `host + uri` as an index.
- lua-resty-jsonschema
  - This extension is a JSON data validator that replaces the existing `lua-rapidjson` extension.

### Bugfix

- key-auth plugin cannot run accurately in the case of multiple consumers. [#826](https://github.com/apache/incubator-apisix/pull/826)
- Exported schema for plugin serverless. [#787](https://github.com/apache/incubator-apisix/pull/787)
- Discard args of uri when using proxy-write plugin [#642](https://github.com/apache/incubator-apisix/pull/642)
- Zipkin plugin not set tracing data to request header. [#715](https://github.com/apache/incubator-apisix/pull/715)
- Skipped check cjson for luajit environment in apisix CLI. [#652](https://github.com/apache/incubator-apisix/pull/652)
- Skipped to init etcd if use local file as config center. [#737](https://github.com/apache/incubator-apisix/pull/737)
- Support more built-in parameters when set chash balancer. [#775](https://github.com/apache/incubator-apisix/pull/775)

### Dependencies

- Replace the `lua-rapidjson` module with `lua-resty-jsonschema` global,  `lua-resty-jsonschema` is faster and easier to compile.

## 0.8.0

> Released on 2019/09/30

This release brings many new features, such as stream proxy, support MQTT protocol proxy,
and support for ARM platform, and proxy rewrite plugin.

### Core

- :sunrise: **[support standalone mode](https://github.com/apache/apisix/blob/master/docs/en/latest/deployment-modes.md#standalone)**: using yaml to update configurations of APISIX, more friendly to kubernetes. [#464](https://github.com/apache/incubator-apisix/pull/464)
- :sunrise: **[support stream proxy](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/stream-proxy.md)**. [#513](https://github.com/apache/incubator-apisix/pull/513)
- :sunrise: support consumer bind plugins. [#544](https://github.com/apache/incubator-apisix/pull/544)
- support domain name in upstream, not only IP. [#522](https://github.com/apache/incubator-apisix/pull/522)
- ignored upstream node when it's weight is 0. [#536](https://github.com/apache/incubator-apisix/pull/536)

### Plugins

- :sunrise: **[MQTT Proxy](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/plugins/mqtt-proxy.md)**: support to load balance MQTT by `client_id`, both support MQTT 3.1 and 5.0. [#513](https://github.com/apache/incubator-apisix/pull/513)
- [proxy-rewrite](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/plugins/proxy-rewrite.md): rewrite uri,
 schema, host for upstream. [#594](https://github.com/apache/incubator-apisix/pull/594)

### ARM

- :sunrise: **APISIX can run normally under Ubuntu 18.04 of ARM64 architecture**, so you can use APISIX as IoT gateway with MQTT plugin.

### lua-resty-*

- lua-resty-ipmatcher
  - support IPv6
  - IP white/black list, route.
- lua-resty-radixtree
  - allow to specify multiple host, remote_addr and uri.
  - allow to define user-function to filter request.
  - use `lua-resty-ipmatcher` instead of `lua-resty-iputils`, `lua-resty-ipmatcher` matches fast and support IPv6.

### Bugfix

- healthcheck: the checker name is wrong if APISIX works under multiple processes. [#568](https://github.com/apache/incubator-apisix/issues/568)

### Dependencies

- removed `lua-tinyyaml` from source code base, and install through Luarocks.

## 0.7.0

> Released on 2019/09/06

This release brings many new features, such as IP black and white list, gPRC protocol transcoding, IPv6, IdP (identity provider) services, serverless, Change the default route to radix tree (**not downward compatible**), and more.

### Core

- :sunrise: **[gRPC transcoding](https://github.com/apache/apisix/blob/master/docs/en/latest/plugins/grpc-transcode.md)**: supports protocol transcoding so that clients can access your gRPC API by using HTTP/JSON. [#395](https://github.com/apache/incubator-apisix/issues/395)
- :sunrise: **[radix tree router](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/router-radixtree.md)**: The radix tree is used as the default router implementation. It supports the uri, host, cookie, request header, request parameters, Nginx built-in variables, etc. as the routing conditions, and supports common operators such as equal, greater than, less than, etc., more powerful and flexible.**IMPORTANT: This change is not downward compatible. All users who use historical versions need to manually modify their routing to work properly.** [#414](https://github.com/apache/incubator-apisix/issues/414)
- Dynamic upstream supports more parameters, you can specify the upstream uri and host, and whether to enable websocket. [#451](https://github.com/apache/incubator-apisix/pull/451)
- Support for get values from cookies directly from `ctx.var`. [#449](https://github.com/apache/incubator-apisix/pull/449)
- Routing support IPv6. [#331](https://github.com/apache/incubator-apisix/issues/331)

### Plugins

- :sunrise: **[serverless](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/plugins/serverless.md)**: With serverless support, users can dynamically run any Lua function on a gateway node. Users can also use this feature as a lightweight plugin.[#86](https://github.com/apache/incubator-apisix/pull/86)
- :sunrise: **support IdP**: Support external authentication services, such as Auth0, okta, etc., users can use this to connect to Oauth2.0 and other authentication methods. [#447](https://github.com/apache/incubator-apisix/pull/447)
- [rate limit](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/plugins/limit-conn.md): Support for more restricted keys, such as `X-Forwarded-For` and `X-Real-IP`, and allows users to use Nginx variables, request headers, and request parameters as keys. [#228](https://github.com/apache/incubator-apisix/issues/228)
- [IP black and white list](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/plugins/ip-restriction.md) Support IP black and white list for security. [#398](https://github.com/apache/incubator-apisix/pull/398)

### CLI

- Add the `version` directive to get the version number of APISIX. [#420](https://github.com/apache/incubator-apisix/issues/420)

### Admin

- The `PATCH` API is supported and can be modified individually for a configuration without submitting the entire configuration. [#365](https://github.com/apache/incubator-apisix/pull/365)

### Dashboard

- :sunrise: **Add the online version of the dashboard**,users can [experience APISIX](http://apisix.iresty.com/) without install. [#374](https://github.com/apache/incubator-apisix/issues/374)

[Back to TOC](#table-of-contents)

## 0.6.0

> Released on 2019/08/05

This release brings many new features such as health check and circuit breaker, debug mode, opentracing and JWT auth. And add **built-in dashboard**.

### Core

- :sunrise: **[Health Check and Circuit Breaker](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/tutorials/health-check.md)**: Enable health check on the upstream node, and will automatically filter unhealthy nodes during load balancing to ensure system stability. [#249](https://github.com/apache/incubator-apisix/pull/249)
- Anti-ReDoS(Regular expression Denial of Service). [#252](https://github.com/apache/incubator-apisix/pull/250)
- supported debug mode. [#319](https://github.com/apache/incubator-apisix/pull/319)
- allowed to use different router. [#364](https://github.com/apache/incubator-apisix/pull/364)
- supported to match route by host + uri. [#325](https://github.com/apache/incubator-apisix/pull/325)
- allowed plugins to handler balance phase. [#299](https://github.com/apache/incubator-apisix/pull/299)
- added desc for upstream and service in schema. [#289](https://github.com/apache/incubator-apisix/pull/289)

### Plugins

- :sunrise: **[OpenTracing](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/plugins/zipkin.md)**: support Zipkin and Apache SkyWalking. [#304](https://github.com/apache/incubator-apisix/pull/304)
- [JWT auth](https://github.com/apache/apisix/blob/master/docs/en/latest/plugins/jwt-auth.md). [#303](https://github.com/apache/incubator-apisix/pull/303)

### CLI

- support multiple ips of `allow`. [#340](https://github.com/apache/incubator-apisix/pull/340)
- supported real_ip configure in nginx.conf and added functions to get ip and remote ip. [#236](https://github.com/apache/incubator-apisix/pull/236)

### Dashboard

- :sunrise: **add built-in dashboard**. [#327](https://github.com/apache/incubator-apisix/pull/327)

### Test

- support OSX in Travis CI. [#217](https://github.com/apache/incubator-apisix/pull/217)
- installed all of the dependencies to `deps` folder. [#248](https://github.com/apache/incubator-apisix/pull/248)

[Back to TOC](#table-of-contents)


================================================
FILE: CODE_OF_CONDUCT.md
================================================
<!--
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
-->

*The following is copied for your convenience from <https://www.apache.org/foundation/policies/conduct.html>. If there's a discrepancy between the two, let us know or submit a PR to fix it.*

# Code of Conduct #

## Introduction ##

This code of conduct applies to all spaces managed by the Apache
Software Foundation, including IRC, all public and private mailing
lists, issue trackers, wikis, blogs, Twitter, and any other
communication channel used by our communities. A code of conduct which
is specific to in-person events (ie., conferences) is codified in the
published ASF anti-harassment policy.

We expect this code of conduct to be honored by everyone who
participates in the Apache community formally or informally, or claims
any affiliation with the Foundation, in any Foundation-related
activities and especially when representing the ASF, in any role.

This code __is not exhaustive or complete__. It serves to distill our
common understanding of a collaborative, shared environment and goals.
We expect it to be followed in spirit as much as in the letter, so that
it can enrich all of us and the technical communities in which we participate.

## Specific Guidelines ##

We strive to:

1. __Be open.__ We invite anyone to participate in our community. We preferably use public methods of communication for project-related messages, unless discussing something sensitive. This applies to messages for help or project-related support, too; not only is a public support request much more likely to result in an answer to a question, it also makes sure that any inadvertent mistakes made by people answering will be more easily detected and corrected.

2. __Be `empathetic`, welcoming, friendly, and patient.__ We work together to resolve conflict, assume good intentions, and do our best to act in an empathetic fashion. We may all experience some frustration from time to time, but we do not allow frustration to turn into a personal attack. A community where people feel uncomfortable or threatened is not a productive one. We should be respectful when dealing with other community members as well as with people outside our community.

3. __Be collaborative.__ Our work will be used by other people, and in turn we will depend on the work of others. When we make something for the benefit of the project, we are willing to explain to others how it works, so that they can build on the work to make it even better. Any decision we make will affect users and colleagues, and we take those consequences seriously when making decisions.

4. __Be inquisitive.__ Nobody knows everything! Asking questions early avoids many problems later, so questions are encouraged, though they may be directed to the appropriate forum. Those who are asked should be responsive and helpful, within the context of our shared goal of improving Apache project code.

5. __Be careful in the words that we choose.__ Whether we are participating as professionals or volunteers, we value professionalism in all interactions, and take responsibility for our own speech. Be kind to others. Do not insult or put down other participants. Harassment and other exclusionary behaviour are not acceptable. This includes, but is not limited to:

       * Violent threats or language directed against another person.
       * Sexist, racist, or otherwise discriminatory jokes and language.
       * Posting sexually explicit or violent material.
       * Posting (or threatening to post) other people's personally identifying information ("doxing").
       * Sharing private content, such as emails sent privately or non-publicly, or unlogged forums such as IRC channel history.
       * Personal insults, especially those using racist or sexist terms.
       * Unwelcome sexual attention.
       * Excessive or unnecessary profanity.
       * Repeated harassment of others. In general, if someone asks you to stop, then stop.
       * Advocating for, or encouraging, any of the above behaviour.

6. __Be concise.__ Keep in mind that what you write once will be read by hundreds of people. Writing a short email means people can understand the conversation as efficiently as possible. Short emails should always strive to be empathetic, welcoming, friendly and patient. When a long explanation is necessary, consider adding a summary.</p>

      Try to bring new ideas to a conversation so that each mail adds something unique to the thread, keeping in mind that the rest of the thread still contains the other messages with arguments that have already been made.

      Try to stay on topic, especially in discussions that are already fairly large.

7. __Step down considerately.__ Members of every project come and go. When somebody leaves or disengages from the project they should tell people they are leaving and take the proper steps to ensure that others can pick up where they left off. In doing so, they should remain respectful of those who continue to participate in the project and should not misrepresent the project's goals or achievements. Likewise, community members should respect any individual's choice to leave the project.</p>

## Diversity Statement ##

Apache welcomes and encourages participation by everyone. We are committed to being a community that everyone feels good about joining. Although we may not be able to satisfy everyone, we will always work to treat everyone well.

No matter how you identify yourself or how others perceive you: we welcome you. Though no list can hope to be comprehensive, we explicitly honour diversity in: age, culture, ethnicity, genotype, gender identity or expression, language, national origin, neurotype, phenotype, political beliefs, profession, race, religion, sexual orientation, socioeconomic status, subculture and technical ability.

Though we welcome people fluent in all languages, Apache development is conducted in English.

Standards for behaviour in the Apache community are detailed in the Code of Conduct above. We expect participants in our community to meet these standards in all their interactions and to help others to do so as well.

## Reporting Guidelines ##

While this code of conduct should be adhered to by participants, we recognize that sometimes people may have a bad day, or be unaware of some of the guidelines in this code of conduct. When that happens, you may reply to them and point out this code of conduct. Such messages may be in public or in private, whatever is most appropriate. However, regardless of whether the message is public or not, it should still adhere to the relevant parts of this code of conduct; in particular, it should not be abusive or disrespectful.

If you believe someone is violating this code of conduct, you may reply to
them and point out this code of conduct. Such messages may be in public or in
private, whatever is most appropriate. Assume good faith; it is more likely
that participants are unaware of their bad behaviour than that they
intentionally try to degrade the quality of the discussion.  Should there be
difficulties in dealing with the situation, you may report your compliance
issues in confidence to either:

 * President of the Apache Software Foundation: Sam Ruby (rubys at intertwingly dot net)

or one of our volunteers:

  * [Mark Thomas](http://home.apache.org/~markt/coc.html)
  * [Joan Touzet](http://home.apache.org/~wohali/)
  * [Sharan Foga](http://home.apache.org/~sharan/coc.html)

If the violation is in documentation or code, for example inappropriate pronoun usage or word choice within official documentation, we ask that people report these privately to the project in question at private@<em>project</em>.apache.org, and, if they have sufficient ability within the project, to resolve or remove the concerning material, being mindful of the perspective of the person originally reporting the issue.

## End Notes ##

This Code defines __empathy__ as "a vicarious participation in the emotions, ideas, or opinions of others; the ability to imagine oneself in the condition or predicament of another." __Empathetic__ is the adjectival form of empathy.

This statement thanks the following, on which it draws for content and inspiration:

  * [CouchDB Project Code of conduct](http://couchdb.apache.org/conduct.html)
  * [Fedora Project Code of Conduct](http://fedoraproject.org/code-of-conduct)
  * [Django Code of Conduct](https://www.djangoproject.com/conduct/)
  * [Debian Code of Conduct](http://www.debian.org/vote/2014/vote_002)
  * [Twitter Open Source Code of Conduct](https://github.com/twitter/code-of-conduct/blob/master/code-of-conduct.md)
  * [Mozilla Code of Conduct/Draft](https://wiki.mozilla.org/Code_of_Conduct/Draft#Conflicts_of_Interest)
  * [Python Diversity Appendix](https://www.python.org/community/diversity/)
  * [Python Mentors Home Page](http://pythonmentors.com/)


================================================
FILE: CODE_STYLE.md
================================================
---
title: APISIX Lua Coding Style Guide
---

<!--
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
-->

## Indentation

Use 4 spaces as an indent:

```lua
--No
if a then
ngx.say("hello")
end
```

```lua
--Yes
if a then
    ngx.say("hello")
end
```

You can simplify the operation by changing the tab to 4 spaces in the editor you are using.

## Space

On both sides of the operator, you need to use a space to separate:

```lua
--No
local i=1
local s    =    "apisix"
```

```lua
--Yes
local i = 1
local s = "apisix"
```

## Blank line

Many developers will add a semicolon at the end of the line:

```lua
--No
if a then
    ngx.say("hello");
end;
```

Adding a semicolon will make the Lua code look ugly and unnecessary. Also, don't want to save the number of lines in the code, the latter turns the multi-line code into one line in order to appear "simple". This will not know when the positioning error is in the end of the code:

```lua
--No
if a then ngx.say("hello") end
```

```lua
--Yes
if a then
    ngx.say("hello")
end
```

The functions needs to be separated by two blank lines:

```lua
--No
local function foo()
end
local function bar()
end
```

```lua
--Yes
local function foo()
end


local function bar()
end
```

If there are multiple if elseif branches, they need a blank line to separate them:

```lua
--No
if a == 1 then
    foo()
elseif a== 2 then
    bar()
elseif a == 3 then
    run()
else
    error()
end
```

```lua
--Yes
if a == 1 then
    foo()

elseif a == 2 then
    bar()

elseif a == 3 then
    run()

else
    error()
end
```

## Maximum length per line

Each line cannot exceed 100 characters. If it exceeds, you need to wrap and align:

```lua
--No
return limit_conn_new("plugin-limit-conn", conf.conn, conf.burst, conf.default_conn_delay)
```

```lua
--Yes
return limit_conn_new("plugin-limit-conn", conf.conn, conf.burst,
                      conf.default_conn_delay)
```

When the linefeed is aligned, the correspondence between the upper and lower lines should be reflected. For the example above, the parameters of the second line of functions are to the right of the left parenthesis of the first line.

If it is a string stitching alignment, you need to put `..` in the next line:

```lua
--No
return limit_conn_new("plugin-limit-conn" ..  "plugin-limit-conn" ..
                      "plugin-limit-conn")
```

```lua
--Yes
return limit_conn_new("plugin-limit-conn" .. "plugin-limit-conn"
                      .. "plugin-limit-conn")
```

```lua
--Yes
return "param1", "plugin-limit-conn"
                 .. "plugin-limit-conn"
```

## Variable

Local variables should always be used, not global variables:

```lua
--No
i = 1
s = "apisix"
```

```lua
--Yes
local i = 1
local s = "apisix"
```

Variable naming uses the `snake_case` style:

```lua
--No
local IndexArr = 1
local str_Name = "apisix"
```

```lua
--Yes
local index_arr = 1
local str_name = "apisix"
```

Use all capitalization for constants:

```lua
--No
local max_int = 65535
local server_name = "apisix"
```

```lua
--Yes
local MAX_INT = 65535
local SERVER_NAME = "apisix"
```

## Table

Use `table.new` to pre-allocate the table:

```lua
--No
local t = {}
for i = 1, 100 do
    t[i] = i
end
```

```lua
--Yes
local new_tab = require "table.new"
local t = new_tab(100, 0)
for i = 1, 100 do
    t[i] = i
end
```

Don't use `nil` in an array:

```lua
--No
local t = {1, 2, nil, 3}
```

If you must use null values, use `ngx.null` to indicate:

```lua
--Yes
local t = {1, 2, ngx.null, 3}
```

## String

Do not splicing strings on the hot code path:

```lua
--No
local s = ""
for i = 1, 100000 do
    s = s .. "a"
end
```

```lua
--Yes
local new_tab = require "table.new"
local t = new_tab(100000, 0)
for i = 1, 100000 do
    t[i] = "a"
end
local s = table.concat(t, "")
```

## Function

The naming of functions also follows `snake_case`:

```lua
--No
local function testNginx()
end
```

```lua
--Yes
local function test_nginx()
end
```

The function should return as early as possible:

```lua
--No
local function check(age, name)
    local ret = true
    if age < 20 then
        ret = false
    end

    if name == "a" then
        ret = false
    end
    -- do something else
    return ret
end
```

```lua
--Yes
local function check(age, name)
    if age < 20 then
        return false
    end

    if name == "a" then
        return false
    end
    -- do something else
    return true
end
```

The function should return `<boolean>`, `err`.
The first return value means successful or not, if not, the second return value specifies the error message.
The error message can be ignored in some cases.

```lua
--No
local function check()
    return "failed"
end
```

```lua
--Yes
local function check()
    return false, "failed"
end
```

## Module

All require libraries must be localized:

```lua
--No
local function foo()
    local ok, err = ngx.timer.at(delay, handler)
end
```

```lua
--Yes
local timer_at = ngx.timer.at

local function foo()
    local ok, err = timer_at(delay, handler)
end
```

For style unification, `require` and `ngx` also need to be localized:

```lua
--No
local core = require("apisix.core")
local timer_at = ngx.timer.at

local function foo()
    local ok, err = timer_at(delay, handler)
end
```

```lua
--Yes
local ngx = ngx
local require = require
local core = require("apisix.core")
local timer_at = ngx.timer.at

local function foo()
    local ok, err = timer_at(delay, handler)
end
```

## Error handling

For functions that return with error information, the error information must be judged and processed:

```lua
--No
local sock = ngx.socket.tcp()
local ok = sock:connect("www.google.com", 80)
ngx.say("successfully connected to google!")
```

```lua
--Yes
local sock = ngx.socket.tcp()
local ok, err = sock:connect("www.google.com", 80)
if not ok then
    ngx.say("failed to connect to google: ", err)
    return
end
ngx.say("successfully connected to google!")
```

The function you wrote yourself, the error message is to be returned as a second parameter in the form of a string:

```lua
--No
local function foo()
    local ok, err = func()
    if not ok then
        return false
    end
    return true
end
```

```lua
--No
local function foo()
    local ok, err = func()
    if not ok then
        return false, {msg = err}
    end
    return true
end
```

```lua
--Yes
local function foo()
    local ok, err = func()
    if not ok then
        return false, "failed to call func(): " .. err
    end
    return true
end
```


================================================
FILE: CONTRIBUTING.md
================================================
<!--
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
-->

# Contributing to APISIX

Firstly, thanks for your interest in contributing! I hope that this will be a pleasant first experience for you, and that you will return to continue
contributing.

## How to contribute?

Most of the contributions that we receive are code contributions, but you can also contribute to the documentation or simply report solid bugs for us to fix. Nor is code the only way to contribute to the project. We strongly value documentation, integration with other project, and gladly accept improvements for these aspects.

For new contributors, please take a look at issues with a tag called [Good first issue](https://github.com/apache/apisix/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) or [Help wanted](https://github.com/apache/apisix/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22).

## How to report a bug?

* **Ensure the bug was not already reported** by searching on GitHub under [Issues](https://github.com/apache/apisix/issues).

* If you're unable to find an open issue addressing the problem, [open a new one](https://github.com/apache/apisix/issues/new). Be sure to include a **title and clear description**, as much relevant information as possible, and a **code sample** or an **executable test case** demonstrating the expected behavior that is not occurring.

## How to add a new feature or change an existing one

_Before making any significant changes, please [open an issue](https://github.com/apache/apisix/issues)._ Discussing your proposed changes ahead of time will make the contribution process smooth for everyone.

Once we've discussed your changes and you've got your code ready, make sure that tests are passing and open your pull request. Your PR is most likely to be accepted if it:

* Update the README.md with details of changes to the interface.
* Includes tests for new functionality.
* References the original issue in the description, e.g. "Resolves #123".
* Has a [good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html).
* Ensure your pull request's title starts from one of the word in the `types` section of [semantic.yml](https://github.com/apache/apisix/blob/master/.github/workflows/semantic.yml).
* Follow the [PR manners](https://raw.githubusercontent.com/apache/apisix/master/.github/PULL_REQUEST_TEMPLATE.md)

## Contribution Guidelines for Documentation

* Linting/Style

    For linting both our Markdown and YAML files we use:

    - npm based [markdownlint-cli](https://www.npmjs.com/package/markdownlint-cli)

    For linting all files' license header we use:

    - [license-eye](https://github.com/apache/skywalking-eyes)

    For linting our shell files we use:

    - [shellcheck](https://github.com/koalaman/shellcheck)

    For linting our zh document files we use:

    - [autocorrect](https://github.com/huacnlee/autocorrect)

* Active Voice

    In general, use active voice when formulating the sentence instead of passive voice. A sentence written in the active voice will emphasize
    the person or thing who is performing an action (eg.The dog chased the ball).  In contrast, the passive voice will highlight
    the recipient of the action (The ball was chased by the dog). Therefore use the passive voice, only when it's less important
    who or what completed the action and more important that the action was completed. For example:

    - Recommended: The key-auth plugin authenticates the requests.
    - Not recommended: The requests are authenticated by the key-auth plugin.

* Capitalization:

    * For titles of a section, capitalize the first letter of each word except for the [closed-class words](https://en.wikipedia.org/wiki/Part_of_speech#Open_and_closed_classes)
      such as determiners, pronouns, conjunctions, and prepositions. Use the following [link](https://capitalizemytitle.com/#Chicago) for guidance.
      - Recommended: Authentication **with** APISIX

    * For normal sentences, don't [capitalize](https://www.grammarly.com/blog/capitalization-rules/) random words in the middle of the sentences.
      Use the Chicago manual for capitalization rules for the documentation.

* Second Person

    In general, use second person in your docs rather than first person. For example:

    - Recommended: You are recommended to use the docker based deployment.
    - Not Recommended: We recommend to use the docker based deployment.

* Spellings

    Use [American spellings](https://www.oxfordinternationalenglish.com/differences-in-british-and-american-spelling/) when
    contributing to the documentation.

* Voice

    * Use a friendly and conversational tone. Always use simple sentences. If the sentence is lengthy try to break it in to smaller sentences.

## Check code style and test case style

* code style
    * Please take a look at [APISIX Lua Coding Style Guide](CODE_STYLE.md).
    * Use tool to check your code statically by command: `make lint`.

```shell
        # install `luacheck` first before run it
        $ luarocks install luacheck
        # check source code
        $ make lint
        ./utils/check-lua-code-style.sh
        + luacheck -q apisix t/lib
        Total: 0 warnings / 0 errors in 146 files
        + find apisix -name *.lua ! -wholename apisix/cli/ngx_tpl.lua -exec ./utils/lj-releng {} +
        + grep -E ERROR.*.lua: /tmp/check.log
        + true
        + [ -s /tmp/error.log ]
        ./utils/check-test-code-style.sh
        + find t -name '*.t' -exec grep -E '\-\-\-\s+(SKIP|ONLY|LAST|FIRST)$' '{}' +
        + true
        + '[' -s /tmp/error.log ']'
        + find t -name '*.t' -exec ./utils/reindex '{}' +
        + grep done. /tmp/check.log
        + true
        + '[' -s /tmp/error.log ']'
```

      The `lj-releng` and `reindex` will be downloaded automatically by `make lint` if not exists.

* test case style
    * Use tool to check your test case style statically by command, eg: `make lint`.
    * When the test file is too large, for example > 800 lines, you should split it to a new file.
      Please take a look at `t/plugin/limit-conn.t` and `t/plugin/limit-conn2.t`.
    * For more details, see the [testing framework](https://github.com/apache/apisix/blob/master/docs/en/latest/internal/testing-framework.md)

## Contributor gifts

If you have contributed to Apache APISIX, no matter it is a code contribution to fix a bug or a feature request, or a documentation change, Congratulations! You are eligible to receive the APISIX special gifts with a digital certificate! It's always been the community effort that has made Apache APISIX be understood and used by more developers.

![Contributor gifts](https://static.apiseven.com/2022/12/29/63acfb2f208e1.png)

Contributors can request gifts by filling out this [Google form](https://forms.gle/DhPL96LnJwuaHjHU7) or [QQ Form](https://wj.qq.com/s2/11438041/7b07/). After filling in the form, please wait patiently. The community needs some time to review submissions.

## Do you have questions about the source code?

- **QQ Group**: 781365357(recommended), 578997126, 552030619
- Join in `apisix` channel at [Apache Slack](http://s.apache.org/slack-invite). If the link is not working, find the latest one at [Apache INFRA WIKI](https://cwiki.apache.org/confluence/display/INFRA/Slack+Guest+Invites).


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

=======================================================================
Apache APISIX Subcomponents:

The Apache APISIX project contains subcomponents with separate copyright
notices and license terms. Your use of the source code for the these
subcomponents is subject to the terms and conditions of the following
licenses.

========================================================================
Apache 2.0 licenses
========================================================================

The following components are provided under the Apache License. See project link for details.
The text of each license is the standard Apache 2.0 license.

   ewma.lua file from kubernetes/ingress-nginx: https://github.com/kubernetes/ingress-nginx Apache 2.0
   hello.go file from OpenFunction/samples: https://github.com/OpenFunction/samples Apache 2.0


================================================
FILE: MAINTAIN.md
================================================
<!--
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
-->

## Release steps

### Release patch version

1. Create a [pull request](https://github.com/apache/apisix/commit/7db31a1a7186b966bc0f066539d4de8011871012) (contains the changelog and version change) to master
   > The changelog only needs to provide a link to the minor branch.
2. Create a [pull request](https://github.com/apache/apisix/commit/21d7673c6e8ff995677456cdebc8ded5afbb3d0a) (contains the backport commits, and the change in step 1) to minor branch
   > This should include those PRs that contain the `need backport` tag since the last patch release. Also, the title of these PRs need to be added to the changelog of the minor branch.
3. Merge it into minor branch
4. Package a vote artifact to Apache's dev-apisix repo. The artifact can be created via `VERSION=x.y.z make release-src`
5. Send the [vote email](https://lists.apache.org/thread/vq4qtwqro5zowpdqhx51oznbjy87w9d0) to dev@apisix.apache.org
   > After executing the `VERSION=x.y.z make release-src` command, the content of the vote email will be automatically generated in the `./release` directory named `apache-apisix-${x.y.z}-vote-contents`
6. When the vote is passed, send the [vote result email](https://lists.apache.org/thread/k2frnvj4zj9oynsbr7h7nd6n6m3q5p89) to dev@apisix.apache.org
7. Move the vote artifact to Apache's apisix repo
8. Register the release info in https://reporter.apache.org/addrelease.html?apisix
9. Create a [GitHub release](https://github.com/apache/apisix/releases/tag/2.10.2) from the minor branch
10. Update [APISIX's website](https://github.com/apache/apisix-website/commit/f9104bdca50015722ab6e3714bbcd2d17e5c5bb3) if the version number is the largest
11. Update APISIX rpm package
    > Go to [apisix-build-tools](https://github.com/api7/apisix-build-tools) repository and create a new tag named `apisix-${x.y.z}` to automatically submit the
    package to yum repo
12. - If the version number is the largest, update [APISIX docker](https://github.com/apache/apisix-docker/commit/829d45559c303bea7edde5bebe9fcf4938071601) in [APISIX docker repository](https://github.com/apache/apisix-docker), after PR merged, then create a new branch from master, named as `release/apisix-${version}`, e.g. `release/apisix-2.10.2`.
    - If released an LTS version and the version number less than the current largest(e.g. the current largest version number is 2.14.1, but the LTS version 2.13.2 is to be released), submit a PR like [APISIX docker](https://github.com/apache/apisix-docker/pull/322) in [APISIX docker repository](https://github.com/apache/apisix-docker) and named as `release/apisix-${version}`, e.g. `release/apisix-2.13.2`, after PR reviewed, don't need to merged PR, just close the PR and push the branch to APISIX docker repository.
13. Update [APISIX helm chart](https://github.com/apache/apisix-helm-chart/pull/234) if the version number is the largest
14. Send the [ANNOUNCE email](https://lists.apache.org/thread.html/ree7b06e6eac854fd42ba4f302079661a172f514a92aca2ef2f1aa7bb%40%3Cdev.apisix.apache.org%3E) to dev@apisix.apache.org & announce@apache.org

### Release minor version

1. Create a minor branch, and create [pull request](https://github.com/apache/apisix/commit/bc6ddf51f15e41fffea6c5bd7d01da9838142b66) to master branch from it
2. Package a vote artifact to Apache's dev-apisix repo. The artifact can be created via `VERSION=x.y.z make release-src`
3. Send the [vote email](https://lists.apache.org/thread/q8zq276o20r5r9qjkg074nfzb77xwry9) to dev@apisix.apache.org
   > After executing the `VERSION=x.y.z make release-src` command, the content of the vote email will be automatically generated in the `./release` directory named `apache-apisix-${x.y.z}-vote-contents`
4. When the vote is passed, send the [vote result email](https://lists.apache.org/thread/p1m9s116rojlhb91g38cj8646393qkz7) to dev@apisix.apache.org
5. Move the vote artifact to Apache's apisix repo
6. Register the release info in https://reporter.apache.org/addrelease.html?apisix
7. Create a [GitHub release](https://github.com/apache/apisix/releases/tag/2.10.0) from the minor branch
8. Merge the pull request into master branch
9. Update [APISIX's website](https://github.com/apache/apisix-website/commit/7bf0ab5a1bbd795e6571c4bb89a6e646115e7ca3)
10. Update APISIX rpm package.
    > Go to [apisix-build-tools](https://github.com/api7/apisix-build-tools) repository and create a new tag named `apisix-${x.y.z}` to automatically submit the rpm package to yum repo
11. - If the version number is the largest, update [APISIX docker](https://github.com/apache/apisix-docker/commit/829d45559c303bea7edde5bebe9fcf4938071601) in [APISIX docker repository](https://github.com/apache/apisix-docker), after PR merged, then create a new branch from master, named as `release/apisix-${version}`, e.g. `release/apisix-2.10.2`.
    - If released an LTS version and the version number less than the current largest(e.g. the current largest version number is 2.14.1, but the LTS version 2.13.2 is to be released), submit a PR like [APISIX docker](https://github.com/apache/apisix-docker/pull/322) in [APISIX docker repository](https://github.com/apache/apisix-docker) and named as `release/apisix-${version}`, e.g. `release/apisix-2.13.2`, after PR reviewed, don't need to merged PR, just close the PR and push the branch to APISIX docker repository.
12. Update [APISIX helm chart](https://github.com/apache/apisix-helm-chart/pull/234)
13. Send the [ANNOUNCE email](https://lists.apache.org/thread/4s4msqwl1tq13p9dnv3hx7skbgpkozw1) to dev@apisix.apache.org & announce@apache.org


================================================
FILE: Makefile
================================================
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# Makefile basic env setting
.DEFAULT_GOAL := help
# add pipefail support for default shell
SHELL := /bin/bash -o pipefail


# Project basic setting
VERSION                ?= master
project_name           ?= apache-apisix
project_release_name   ?= $(project_name)-$(VERSION)-src

OTEL_CONFIG ?= ./ci/pod/otelcol-contrib/data-otlp.json

# Hyperconverged Infrastructure
ENV_OS_NAME            ?= $(shell uname -s | tr '[:upper:]' '[:lower:]')
ENV_OS_ARCH            ?= $(shell uname -m | tr '[:upper:]' '[:lower:]')
ENV_APISIX             ?= $(CURDIR)/bin/apisix
ENV_GIT                ?= git
ENV_TAR                ?= tar
ENV_INSTALL            ?= install
ENV_RM                 ?= rm -vf
ENV_DOCKER             ?= docker
ENV_DOCKER_COMPOSE     ?= docker compose --project-directory $(CURDIR) -p $(project_name) -f $(project_compose_ci)
ENV_NGINX              ?= $(ENV_NGINX_EXEC) -p $(CURDIR) -c $(CURDIR)/conf/nginx.conf
ENV_NGINX_EXEC         := $(shell command -v openresty 2>/dev/null || command -v nginx 2>/dev/null)
ENV_OPENSSL_PREFIX     ?= /usr/local/openresty/openssl3
ENV_LIBYAML_INSTALL_PREFIX ?= /usr
ENV_LUAROCKS           ?= luarocks
## These variables can be injected by luarocks
ENV_INST_PREFIX        ?= /usr
ENV_INST_LUADIR        ?= $(ENV_INST_PREFIX)/share/lua/5.1
ENV_INST_BINDIR        ?= $(ENV_INST_PREFIX)/bin
ENV_RUNTIME_VER	     ?= $(shell $(ENV_NGINX_EXEC) -V 2>&1 | tr ' ' '\n'  | grep 'APISIX_RUNTIME_VER' | cut -d '=' -f2)

IMAGE_NAME = apache/apisix
ENV_APISIX_IMAGE_TAG_NAME  ?= $(IMAGE_NAME):$(VERSION)

-include .requirements
export

ifneq ($(shell whoami), root)
	ENV_LUAROCKS_FLAG_LOCAL := --local
endif

ifdef ENV_LUAROCKS_SERVER
	ENV_LUAROCKS_SERVER_OPT := --server $(ENV_LUAROCKS_SERVER)
endif

ifneq ($(shell test -d $(ENV_OPENSSL_PREFIX) && echo -n yes), yes)
	ENV_NGINX_PREFIX := $(shell $(ENV_NGINX_EXEC) -V 2>&1 | grep -Eo 'prefix=(.*)/nginx\s+' | grep -Eo '/.*/')
	ifeq ($(shell test -d $(addprefix $(ENV_NGINX_PREFIX), openssl3) && echo -n yes), yes)
		ENV_OPENSSL_PREFIX := $(addprefix $(ENV_NGINX_PREFIX), openssl3)
	endif
endif


# Makefile basic extension function
_color_red    =\E[1;31m
_color_green  =\E[1;32m
_color_yellow =\E[1;33m
_color_blue   =\E[1;34m
_color_wipe   =\E[0m


define func_echo_status
	printf "[%b info %b] %s\n" "$(_color_blue)" "$(_color_wipe)" $(1)
endef


define func_echo_warn_status
	printf "[%b info %b] %s\n" "$(_color_yellow)" "$(_color_wipe)" $(1)
endef


define func_echo_success_status
	printf "[%b info %b] %s\n" "$(_color_green)" "$(_color_wipe)" $(1)
endef


define func_check_folder
	if [[ ! -d $(1) ]]; then \
		mkdir -p $(1); \
		$(call func_echo_status, 'folder check -> create `$(1)`'); \
	else \
		$(call func_echo_success_status, 'folder check -> found `$(1)`'); \
	fi
endef


# Makefile target
.PHONY: runtime
runtime:
ifeq ($(ENV_NGINX_EXEC), )
ifeq ("$(wildcard /usr/local/openresty/bin/openresty)", "")
	@$(call func_echo_warn_status, "WARNING: OpenResty not found. You have to install OpenResty and add the binary file to PATH before install Apache APISIX.")
	exit 1
else
	$(eval ENV_NGINX_EXEC := /usr/local/openresty/bin/openresty)
	@$(call func_echo_status, "Use openresty as default runtime")
endif
endif


### help : Show Makefile rules
### 	If there're awk failures, please make sure
### 	you are using awk or gawk
.PHONY: help
help:
	@$(call func_echo_success_status, "Makefile rules:")
	@awk '{ if(match($$0, /^\s*#{3}\s*([^:]+)\s*:\s*(.*)$$/, res)){ printf("    make %-15s : %-10s\n", res[1], res[2]) } }' Makefile


### deps : Installing dependencies
.PHONY: deps
deps: install-runtime
	$(eval ENV_LUAROCKS_VER := $(shell $(ENV_LUAROCKS) --version | grep -E -o "luarocks [0-9]+."))
	@if [ '$(ENV_LUAROCKS_VER)' = 'luarocks 3.' ]; then \
		mkdir -p ~/.luarocks; \
		$(ENV_LUAROCKS) config $(ENV_LUAROCKS_FLAG_LOCAL) variables.OPENSSL_LIBDIR $(addprefix $(ENV_OPENSSL_PREFIX), /lib); \
		$(ENV_LUAROCKS) config $(ENV_LUAROCKS_FLAG_LOCAL) variables.OPENSSL_INCDIR $(addprefix $(ENV_OPENSSL_PREFIX), /include); \
		$(ENV_LUAROCKS) config $(ENV_LUAROCKS_FLAG_LOCAL) variables.YAML_DIR $(ENV_LIBYAML_INSTALL_PREFIX); \
		$(ENV_LUAROCKS) install apisix-master-0.rockspec --tree deps --only-deps $(ENV_LUAROCKS_SERVER_OPT); \
	else \
		$(call func_echo_warn_status, "WARNING: You're not using LuaRocks 3.x; please remove the luarocks and reinstall it via https://raw.githubusercontent.com/apache/apisix/master/utils/linux-install-luarocks.sh"); \
		exit 1; \
	fi


### undeps : Uninstalling dependencies
.PHONY: undeps
undeps: uninstall-rocks uninstall-runtime


.PHONY: uninstall-rocks
uninstall-rocks:
	@$(call func_echo_status, "$@ -> [ Start ]")
	$(ENV_LUAROCKS) purge --tree=deps
	@$(call func_echo_success_status, "$@ -> [ Done ]")


### utils : Installation tools
.PHONY: utils
utils:
ifeq ("$(wildcard utils/lj-releng)", "")
	wget -qP utils https://raw.githubusercontent.com/iresty/openresty-devel-utils/master/lj-releng
	chmod a+x utils/lj-releng
endif
ifeq ("$(wildcard utils/reindex)", "")
	wget -qP utils https://raw.githubusercontent.com/iresty/openresty-devel-utils/master/reindex
	chmod a+x utils/reindex
endif


### lint : Lint source code
.PHONY: lint
lint: utils
	@$(call func_echo_status, "$@ -> [ Start ]")
	./utils/check-lua-code-style.sh
	./utils/check-test-code-style.sh
	@$(call func_echo_success_status, "$@ -> [ Done ]")


### init : Initialize the runtime environment
.PHONY: init
init: runtime
	@$(call func_echo_status, "$@ -> [ Start ]")
	$(ENV_APISIX) init
	$(ENV_APISIX) init_etcd
	@$(call func_echo_success_status, "$@ -> [ Done ]")


### run : Start the apisix server
.PHONY: run
run: runtime
	@$(call func_echo_status, "$@ -> [ Start ]")
	$(ENV_APISIX) start
	@$(call func_echo_success_status, "$@ -> [ Done ]")


### quit : Stop the apisix server, exit gracefully
.PHONY: quit
quit: runtime
	@$(call func_echo_status, "$@ -> [ Start ]")
	$(ENV_APISIX) quit
	@$(call func_echo_success_status, "$@ -> [ Done ]")


### stop : Stop the apisix server, exit immediately
.PHONY: stop
stop: runtime
	@$(call func_echo_status, "$@ -> [ Start ]")
	$(ENV_APISIX) stop
	@$(call func_echo_success_status, "$@ -> [ Done ]")


### verify : Verify the configuration of apisix server
.PHONY: verify
verify: runtime
	@$(call func_echo_status, "$@ -> [ Start ]")
	$(ENV_NGINX) -t
	@$(call func_echo_success_status, "$@ -> [ Done ]")


### clean : Remove generated files
.PHONY: clean
clean:
	@$(call func_echo_status, "$@ -> [ Start ]")
	rm -rf logs/
	@$(call func_echo_success_status, "$@ -> [ Done ]")


### reload : Reload the apisix server
.PHONY: reload
reload: runtime
	@$(call func_echo_status, "$@ -> [ Start ]")
	$(ENV_APISIX) reload
	@$(call func_echo_success_status, "$@ -> [ Done ]")

.PHONY: install-runtime
install-runtime:
ifneq ($(ENV_RUNTIME_VER), $(APISIX_RUNTIME))
	./utils/install-dependencies.sh
	@sudo $(ENV_INSTALL) /usr/local/openresty/bin/openresty $(ENV_INST_BINDIR)/openresty
endif

.PHONY: uninstall-runtime
uninstall-runtime:
	./utils/install-dependencies.sh uninstall
	rm -rf /usr/local/openresty
	rm -f $(ENV_INST_BINDIR)/openresty

### install : Install the apisix (only for luarocks)
.PHONY: install
install: runtime
	$(ENV_INSTALL) -d /usr/local/apisix/
	$(ENV_INSTALL) -d /usr/local/apisix/logs/
	$(ENV_INSTALL) -d /usr/local/apisix/conf/cert
	$(ENV_INSTALL) conf/mime.
Download .txt
gitextract_li5ku6pd/

├── .gitmodules
├── .ignore_words
├── .licenserc.yaml
├── .markdownlint.yml
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CODE_STYLE.md
├── CONTRIBUTING.md
├── LICENSE
├── MAINTAIN.md
├── Makefile
├── NOTICE
├── README.md
├── THREAT_MODEL.md
├── Vision-and-Milestones.md
├── apisix/
│   ├── admin/
│   │   ├── consumer_group.lua
│   │   ├── consumers.lua
│   │   ├── credentials.lua
│   │   ├── global_rules.lua
│   │   ├── init.lua
│   │   ├── plugin_config.lua
│   │   ├── plugin_metadata.lua
│   │   ├── plugins.lua
│   │   ├── proto.lua
│   │   ├── resource.lua
│   │   ├── routes.lua
│   │   ├── schema.lua
│   │   ├── secrets.lua
│   │   ├── services.lua
│   │   ├── ssl.lua
│   │   ├── standalone.lua
│   │   ├── stream_routes.lua
│   │   ├── upstreams.lua
│   │   ├── utils.lua
│   │   └── v3_adapter.lua
│   ├── api_router.lua
│   ├── balancer/
│   │   ├── chash.lua
│   │   ├── ewma.lua
│   │   ├── least_conn.lua
│   │   ├── priority.lua
│   │   └── roundrobin.lua
│   ├── balancer.lua
│   ├── cli/
│   │   ├── apisix.lua
│   │   ├── config.lua
│   │   ├── env.lua
│   │   ├── etcd.lua
│   │   ├── file.lua
│   │   ├── ip.lua
│   │   ├── ngx_tpl.lua
│   │   ├── ops.lua
│   │   ├── schema.lua
│   │   └── util.lua
│   ├── constants.lua
│   ├── consumer.lua
│   ├── consumer_group.lua
│   ├── control/
│   │   ├── router.lua
│   │   └── v1.lua
│   ├── core/
│   │   ├── config_etcd.lua
│   │   ├── config_local.lua
│   │   ├── config_util.lua
│   │   ├── config_xds.lua
│   │   ├── config_yaml.lua
│   │   ├── ctx.lua
│   │   ├── dns/
│   │   │   └── client.lua
│   │   ├── env.lua
│   │   ├── etcd.lua
│   │   ├── event.lua
│   │   ├── id.lua
│   │   ├── io.lua
│   │   ├── ip.lua
│   │   ├── json.lua
│   │   ├── log.lua
│   │   ├── lrucache.lua
│   │   ├── math.lua
│   │   ├── os.lua
│   │   ├── profile.lua
│   │   ├── pubsub.lua
│   │   ├── request.lua
│   │   ├── resolver.lua
│   │   ├── response.lua
│   │   ├── schema.lua
│   │   ├── string.lua
│   │   ├── table.lua
│   │   ├── timer.lua
│   │   ├── utils.lua
│   │   └── version.lua
│   ├── core.lua
│   ├── debug.lua
│   ├── discovery/
│   │   ├── consul/
│   │   │   ├── init.lua
│   │   │   └── schema.lua
│   │   ├── consul_kv/
│   │   │   ├── init.lua
│   │   │   └── schema.lua
│   │   ├── dns/
│   │   │   ├── init.lua
│   │   │   └── schema.lua
│   │   ├── eureka/
│   │   │   ├── init.lua
│   │   │   └── schema.lua
│   │   ├── init.lua
│   │   ├── kubernetes/
│   │   │   ├── informer_factory.lua
│   │   │   ├── init.lua
│   │   │   └── schema.lua
│   │   ├── nacos/
│   │   │   ├── init.lua
│   │   │   └── schema.lua
│   │   └── tars/
│   │       ├── init.lua
│   │       └── schema.lua
│   ├── events.lua
│   ├── global_rules.lua
│   ├── healthcheck_manager.lua
│   ├── http/
│   │   ├── route.lua
│   │   ├── router/
│   │   │   ├── radixtree_host_uri.lua
│   │   │   ├── radixtree_uri.lua
│   │   │   └── radixtree_uri_with_parameter.lua
│   │   └── service.lua
│   ├── include/
│   │   └── apisix/
│   │       └── model/
│   │           └── pubsub.proto
│   ├── init.lua
│   ├── inspect/
│   │   ├── dbg.lua
│   │   └── init.lua
│   ├── patch.lua
│   ├── plugin.lua
│   ├── plugin_config.lua
│   ├── plugins/
│   │   ├── ai-aliyun-content-moderation.lua
│   │   ├── ai-aws-content-moderation.lua
│   │   ├── ai-drivers/
│   │   │   ├── aimlapi.lua
│   │   │   ├── anthropic.lua
│   │   │   ├── azure-openai.lua
│   │   │   ├── deepseek.lua
│   │   │   ├── gemini.lua
│   │   │   ├── openai-base.lua
│   │   │   ├── openai-compatible.lua
│   │   │   ├── openai.lua
│   │   │   ├── openrouter.lua
│   │   │   ├── schema.lua
│   │   │   ├── sse.lua
│   │   │   └── vertex-ai.lua
│   │   ├── ai-prompt-decorator.lua
│   │   ├── ai-prompt-guard.lua
│   │   ├── ai-prompt-template.lua
│   │   ├── ai-proxy/
│   │   │   ├── base.lua
│   │   │   └── schema.lua
│   │   ├── ai-proxy-multi.lua
│   │   ├── ai-proxy.lua
│   │   ├── ai-rag/
│   │   │   ├── embeddings/
│   │   │   │   └── azure_openai.lua
│   │   │   └── vector-search/
│   │   │       └── azure_ai_search.lua
│   │   ├── ai-rag.lua
│   │   ├── ai-rate-limiting.lua
│   │   ├── ai-request-rewrite.lua
│   │   ├── ai.lua
│   │   ├── api-breaker.lua
│   │   ├── attach-consumer-label.lua
│   │   ├── authz-casbin.lua
│   │   ├── authz-casdoor.lua
│   │   ├── authz-keycloak.lua
│   │   ├── aws-lambda.lua
│   │   ├── azure-functions.lua
│   │   ├── basic-auth.lua
│   │   ├── batch-requests.lua
│   │   ├── body-transformer.lua
│   │   ├── brotli.lua
│   │   ├── cas-auth.lua
│   │   ├── chaitin-waf.lua
│   │   ├── clickhouse-logger.lua
│   │   ├── client-control.lua
│   │   ├── consumer-restriction.lua
│   │   ├── cors.lua
│   │   ├── csrf.lua
│   │   ├── datadog.lua
│   │   ├── degraphql.lua
│   │   ├── dubbo-proxy.lua
│   │   ├── echo.lua
│   │   ├── elasticsearch-logger.lua
│   │   ├── error-log-logger.lua
│   │   ├── example-plugin.lua
│   │   ├── ext-plugin/
│   │   │   ├── helper.lua
│   │   │   └── init.lua
│   │   ├── ext-plugin-post-req.lua
│   │   ├── ext-plugin-post-resp.lua
│   │   ├── ext-plugin-pre-req.lua
│   │   ├── fault-injection.lua
│   │   ├── file-logger.lua
│   │   ├── forward-auth.lua
│   │   ├── gm.lua
│   │   ├── google-cloud-logging.lua
│   │   ├── grpc-transcode/
│   │   │   ├── proto.lua
│   │   │   ├── request.lua
│   │   │   ├── response.lua
│   │   │   └── util.lua
│   │   ├── grpc-transcode.lua
│   │   ├── grpc-web.lua
│   │   ├── gzip.lua
│   │   ├── hmac-auth.lua
│   │   ├── http-dubbo.lua
│   │   ├── http-logger.lua
│   │   ├── inspect.lua
│   │   ├── ip-restriction/
│   │   │   └── init.lua
│   │   ├── ip-restriction.lua
│   │   ├── jwe-decrypt.lua
│   │   ├── jwt-auth/
│   │   │   └── parser.lua
│   │   ├── jwt-auth.lua
│   │   ├── kafka-logger.lua
│   │   ├── kafka-proxy.lua
│   │   ├── key-auth.lua
│   │   ├── lago.lua
│   │   ├── ldap-auth.lua
│   │   ├── limit-conn/
│   │   │   ├── init.lua
│   │   │   ├── limit-conn-redis-cluster.lua
│   │   │   ├── limit-conn-redis.lua
│   │   │   └── util.lua
│   │   ├── limit-conn.lua
│   │   ├── limit-count/
│   │   │   ├── init.lua
│   │   │   ├── limit-count-local.lua
│   │   │   ├── limit-count-redis-cluster.lua
│   │   │   └── limit-count-redis.lua
│   │   ├── limit-count.lua
│   │   ├── limit-req/
│   │   │   ├── limit-req-redis-cluster.lua
│   │   │   ├── limit-req-redis.lua
│   │   │   └── util.lua
│   │   ├── limit-req.lua
│   │   ├── log-rotate.lua
│   │   ├── loggly.lua
│   │   ├── loki-logger.lua
│   │   ├── mcp/
│   │   │   ├── broker/
│   │   │   │   ├── shared_dict.lua
│   │   │   │   └── utils.lua
│   │   │   ├── server.lua
│   │   │   ├── server_wrapper.lua
│   │   │   └── transport/
│   │   │       └── sse.lua
│   │   ├── mcp-bridge.lua
│   │   ├── mocking.lua
│   │   ├── multi-auth.lua
│   │   ├── node-status.lua
│   │   ├── ocsp-stapling.lua
│   │   ├── opa/
│   │   │   └── helper.lua
│   │   ├── opa.lua
│   │   ├── openfunction.lua
│   │   ├── openid-connect.lua
│   │   ├── opentelemetry.lua
│   │   ├── openwhisk.lua
│   │   ├── prometheus/
│   │   │   └── exporter.lua
│   │   ├── prometheus.lua
│   │   ├── proxy-cache/
│   │   │   ├── disk_handler.lua
│   │   │   ├── init.lua
│   │   │   ├── memory.lua
│   │   │   ├── memory_handler.lua
│   │   │   └── util.lua
│   │   ├── proxy-control.lua
│   │   ├── proxy-mirror.lua
│   │   ├── proxy-rewrite.lua
│   │   ├── public-api.lua
│   │   ├── real-ip.lua
│   │   ├── redirect.lua
│   │   ├── referer-restriction.lua
│   │   ├── request-id.lua
│   │   ├── request-validation.lua
│   │   ├── response-rewrite.lua
│   │   ├── rocketmq-logger.lua
│   │   ├── server-info.lua
│   │   ├── serverless/
│   │   │   ├── generic-upstream.lua
│   │   │   └── init.lua
│   │   ├── serverless-post-function.lua
│   │   ├── serverless-pre-function.lua
│   │   ├── skywalking-logger.lua
│   │   ├── skywalking.lua
│   │   ├── sls-logger.lua
│   │   ├── splunk-hec-logging.lua
│   │   ├── syslog/
│   │   │   └── init.lua
│   │   ├── syslog.lua
│   │   ├── tcp-logger.lua
│   │   ├── tencent-cloud-cls/
│   │   │   └── cls-sdk.lua
│   │   ├── tencent-cloud-cls.lua
│   │   ├── traffic-split.lua
│   │   ├── ua-restriction.lua
│   │   ├── udp-logger.lua
│   │   ├── uri-blocker.lua
│   │   ├── wolf-rbac.lua
│   │   ├── workflow.lua
│   │   ├── zipkin/
│   │   │   ├── codec.lua
│   │   │   ├── random_sampler.lua
│   │   │   └── reporter.lua
│   │   └── zipkin.lua
│   ├── pubsub/
│   │   └── kafka.lua
│   ├── resource.lua
│   ├── router.lua
│   ├── schema_def.lua
│   ├── script.lua
│   ├── secret/
│   │   ├── aws.lua
│   │   ├── gcp.lua
│   │   └── vault.lua
│   ├── secret.lua
│   ├── ssl/
│   │   └── router/
│   │       └── radixtree_sni.lua
│   ├── ssl.lua
│   ├── stream/
│   │   ├── plugins/
│   │   │   ├── ip-restriction.lua
│   │   │   ├── limit-conn.lua
│   │   │   ├── mqtt-proxy.lua
│   │   │   ├── prometheus.lua
│   │   │   ├── syslog.lua
│   │   │   └── traffic-split.lua
│   │   ├── router/
│   │   │   └── ip_port.lua
│   │   ├── xrpc/
│   │   │   ├── metrics.lua
│   │   │   ├── protocols/
│   │   │   │   ├── dubbo/
│   │   │   │   │   ├── init.lua
│   │   │   │   │   └── schema.lua
│   │   │   │   └── redis/
│   │   │   │       ├── commands.lua
│   │   │   │       ├── init.lua
│   │   │   │       ├── metrics.lua
│   │   │   │       └── schema.lua
│   │   │   ├── runner.lua
│   │   │   └── sdk.lua
│   │   └── xrpc.lua
│   ├── timers.lua
│   ├── tracer.lua
│   ├── upstream.lua
│   ├── utils/
│   │   ├── auth.lua
│   │   ├── batch-processor-manager.lua
│   │   ├── batch-processor.lua
│   │   ├── content-decode.lua
│   │   ├── google-cloud-oauth.lua
│   │   ├── log-util.lua
│   │   ├── noop_span.lua
│   │   ├── redis-schema.lua
│   │   ├── redis.lua
│   │   ├── rediscluster.lua
│   │   ├── rfc5424.lua
│   │   ├── router.lua
│   │   ├── span.lua
│   │   ├── trusted-addresses.lua
│   │   └── upstream.lua
│   └── wasm.lua
├── apisix-master-0.rockspec
├── autodocs/
│   ├── config.ld
│   ├── generate.sh
│   └── ldoc.ltp
├── benchmark/
│   ├── fake-apisix/
│   │   ├── conf/
│   │   │   ├── cert/
│   │   │   │   ├── apisix.crt
│   │   │   │   ├── apisix.key
│   │   │   │   └── openssl.conf
│   │   │   └── nginx.conf
│   │   └── lua/
│   │       └── apisix.lua
│   ├── run.sh
│   └── server/
│       └── conf/
│           └── nginx.conf
├── bin/
│   └── apisix
├── ci/
│   ├── backup-docker-images.sh
│   ├── check_changelog_prs.ts
│   ├── common.sh
│   ├── free_disk_space.sh
│   ├── init-common-test-service.sh
│   ├── init-last-test-service.sh
│   ├── init-plugin-test-service.sh
│   ├── kubernetes-ci.sh
│   ├── linux-install-etcd-client.sh
│   ├── linux-install-openresty.sh
│   ├── linux_apisix_current_luarocks_in_customed_nginx_runner.sh
│   ├── linux_apisix_current_luarocks_runner.sh
│   ├── linux_openresty_common_runner.sh
│   ├── linux_openresty_runner.sh
│   ├── linux_openresty_tongsuo_runner.sh
│   ├── pod/
│   │   ├── docker-compose.common.yml
│   │   ├── docker-compose.first.yml
│   │   ├── docker-compose.last.yml
│   │   ├── docker-compose.plugin.yml
│   │   ├── etcd/
│   │   │   └── env/
│   │   │       └── common.env
│   │   ├── eureka/
│   │   │   └── env/
│   │   │       └── common.env
│   │   ├── kafka/
│   │   │   ├── kafka-server/
│   │   │   │   ├── env/
│   │   │   │   │   ├── common.env
│   │   │   │   │   ├── common2.env
│   │   │   │   │   ├── common3-scram.env
│   │   │   │   │   └── last.env
│   │   │   │   ├── kafka_jaas.conf
│   │   │   │   └── kafka_scram_jaas.conf
│   │   │   └── zookeeper-server/
│   │   │       └── env/
│   │   │           └── common.env
│   │   ├── keycloak/
│   │   │   ├── kcadm_configure_basic.sh
│   │   │   ├── kcadm_configure_cas.sh
│   │   │   ├── kcadm_configure_university.sh
│   │   │   ├── server.crt.pem
│   │   │   └── server.key.pem
│   │   ├── nacos/
│   │   │   ├── env/
│   │   │   │   ├── common.env
│   │   │   │   └── service.env
│   │   │   ├── healthcheck/
│   │   │   │   ├── Dockerfile
│   │   │   │   ├── nacos-server-healthcheck.sh
│   │   │   │   └── nacos-service-healthcheck.sh
│   │   │   └── service/
│   │   │       └── Dockerfile
│   │   ├── opa/
│   │   │   ├── data.json
│   │   │   ├── echo.rego
│   │   │   ├── example.rego
│   │   │   └── with_route.rego
│   │   ├── openfunction/
│   │   │   ├── build-function-image.sh
│   │   │   └── function-example/
│   │   │       ├── test-body/
│   │   │       │   ├── go.mod
│   │   │       │   ├── go.sum
│   │   │       │   └── hello.go
│   │   │       ├── test-header/
│   │   │       │   ├── go.mod
│   │   │       │   └── hello.go
│   │   │       └── test-uri/
│   │   │           ├── go.mod
│   │   │           ├── go.sum
│   │   │           └── hello.go
│   │   ├── otelcol-contrib/
│   │   │   └── config.yaml
│   │   └── vector/
│   │       └── vector.toml
│   ├── prepare_filesystem_mcp.sh
│   ├── redhat-ci.sh
│   └── tars-ci.sh
├── conf/
│   ├── cert/
│   │   ├── ssl_PLACE_HOLDER.crt
│   │   └── ssl_PLACE_HOLDER.key
│   ├── config.yaml
│   ├── config.yaml.example
│   ├── debug.yaml
│   └── mime.types
├── docker/
│   ├── compose/
│   │   ├── apisix_conf/
│   │   │   └── master/
│   │   │       └── config.yaml
│   │   └── docker-compose-master.yaml
│   └── debian-dev/
│       ├── Dockerfile
│       ├── docker-entrypoint.sh
│       └── install-brotli.sh
├── docs/
│   ├── assets/
│   │   └── other/
│   │       ├── apisix-plugin-design.graffle
│   │       └── json/
│   │           └── apisix-grafana-dashboard.json
│   ├── en/
│   │   └── latest/
│   │       ├── FAQ.md
│   │       ├── admin-api.md
│   │       ├── apisix-variable.md
│   │       ├── architecture-design/
│   │       │   └── apisix.md
│   │       ├── aws.md
│   │       ├── batch-processor.md
│   │       ├── benchmark.md
│   │       ├── build-apisix-dev-environment-devcontainers.md
│   │       ├── build-apisix-dev-environment-on-mac.md
│   │       ├── building-apisix.md
│   │       ├── certificate.md
│   │       ├── config.json
│   │       ├── control-api.md
│   │       ├── customize-nginx-configuration.md
│   │       ├── dashboard.md
│   │       ├── debug-function.md
│   │       ├── debug-mode.md
│   │       ├── deployment-modes.md
│   │       ├── discovery/
│   │       │   ├── consul.md
│   │       │   ├── consul_kv.md
│   │       │   ├── control-plane-service-discovery.md
│   │       │   ├── dns.md
│   │       │   ├── eureka.md
│   │       │   ├── kubernetes.md
│   │       │   └── nacos.md
│   │       ├── discovery.md
│   │       ├── examples/
│   │       │   └── plugins-hmac-auth-generate-signature.md
│   │       ├── external-plugin.md
│   │       ├── getting-started/
│   │       │   ├── README.md
│   │       │   ├── configure-routes.md
│   │       │   ├── key-authentication.md
│   │       │   ├── load-balancing.md
│   │       │   └── rate-limiting.md
│   │       ├── grpc-proxy.md
│   │       ├── http3.md
│   │       ├── install-dependencies.md
│   │       ├── installation-guide.md
│   │       ├── internal/
│   │       │   ├── plugin-runner.md
│   │       │   └── testing-framework.md
│   │       ├── mtls.md
│   │       ├── plugin-develop.md
│   │       ├── plugins/
│   │       │   ├── ai-aliyun-content-moderation.md
│   │       │   ├── ai-aws-content-moderation.md
│   │       │   ├── ai-prompt-decorator.md
│   │       │   ├── ai-prompt-guard.md
│   │       │   ├── ai-prompt-template.md
│   │       │   ├── ai-proxy-multi.md
│   │       │   ├── ai-proxy.md
│   │       │   ├── ai-rag.md
│   │       │   ├── ai-rate-limiting.md
│   │       │   ├── ai-request-rewrite.md
│   │       │   ├── api-breaker.md
│   │       │   ├── attach-consumer-label.md
│   │       │   ├── authz-casbin.md
│   │       │   ├── authz-casdoor.md
│   │       │   ├── authz-keycloak.md
│   │       │   ├── aws-lambda.md
│   │       │   ├── azure-functions.md
│   │       │   ├── basic-auth.md
│   │       │   ├── batch-requests.md
│   │       │   ├── body-transformer.md
│   │       │   ├── brotli.md
│   │       │   ├── cas-auth.md
│   │       │   ├── chaitin-waf.md
│   │       │   ├── clickhouse-logger.md
│   │       │   ├── client-control.md
│   │       │   ├── consumer-restriction.md
│   │       │   ├── cors.md
│   │       │   ├── csrf.md
│   │       │   ├── datadog.md
│   │       │   ├── degraphql.md
│   │       │   ├── dubbo-proxy.md
│   │       │   ├── echo.md
│   │       │   ├── elasticsearch-logger.md
│   │       │   ├── error-log-logger.md
│   │       │   ├── ext-plugin-post-req.md
│   │       │   ├── ext-plugin-post-resp.md
│   │       │   ├── ext-plugin-pre-req.md
│   │       │   ├── fault-injection.md
│   │       │   ├── file-logger.md
│   │       │   ├── forward-auth.md
│   │       │   ├── gm.md
│   │       │   ├── google-cloud-logging.md
│   │       │   ├── grpc-transcode.md
│   │       │   ├── grpc-web.md
│   │       │   ├── gzip.md
│   │       │   ├── hmac-auth.md
│   │       │   ├── http-dubbo.md
│   │       │   ├── http-logger.md
│   │       │   ├── inspect.md
│   │       │   ├── ip-restriction.md
│   │       │   ├── jwe-decrypt.md
│   │       │   ├── jwt-auth.md
│   │       │   ├── kafka-logger.md
│   │       │   ├── kafka-proxy.md
│   │       │   ├── key-auth.md
│   │       │   ├── lago.md
│   │       │   ├── ldap-auth.md
│   │       │   ├── limit-conn.md
│   │       │   ├── limit-count.md
│   │       │   ├── limit-req.md
│   │       │   ├── log-rotate.md
│   │       │   ├── loggly.md
│   │       │   ├── loki-logger.md
│   │       │   ├── mocking.md
│   │       │   ├── mqtt-proxy.md
│   │       │   ├── multi-auth.md
│   │       │   ├── node-status.md
│   │       │   ├── ocsp-stapling.md
│   │       │   ├── opa.md
│   │       │   ├── openfunction.md
│   │       │   ├── openid-connect.md
│   │       │   ├── opentelemetry.md
│   │       │   ├── openwhisk.md
│   │       │   ├── prometheus.md
│   │       │   ├── proxy-cache.md
│   │       │   ├── proxy-control.md
│   │       │   ├── proxy-mirror.md
│   │       │   ├── proxy-rewrite.md
│   │       │   ├── public-api.md
│   │       │   ├── real-ip.md
│   │       │   ├── redirect.md
│   │       │   ├── referer-restriction.md
│   │       │   ├── request-id.md
│   │       │   ├── request-validation.md
│   │       │   ├── response-rewrite.md
│   │       │   ├── rocketmq-logger.md
│   │       │   ├── server-info.md
│   │       │   ├── serverless.md
│   │       │   ├── skywalking-logger.md
│   │       │   ├── skywalking.md
│   │       │   ├── sls-logger.md
│   │       │   ├── splunk-hec-logging.md
│   │       │   ├── syslog.md
│   │       │   ├── tcp-logger.md
│   │       │   ├── tencent-cloud-cls.md
│   │       │   ├── traffic-split.md
│   │       │   ├── ua-restriction.md
│   │       │   ├── udp-logger.md
│   │       │   ├── uri-blocker.md
│   │       │   ├── wolf-rbac.md
│   │       │   ├── workflow.md
│   │       │   └── zipkin.md
│   │       ├── profile.md
│   │       ├── pubsub/
│   │       │   └── kafka.md
│   │       ├── pubsub.md
│   │       ├── router-radixtree.md
│   │       ├── ssl-protocol.md
│   │       ├── status-api.md
│   │       ├── stream-proxy.md
│   │       ├── support-fips-in-apisix.md
│   │       ├── terminology/
│   │       │   ├── api-gateway.md
│   │       │   ├── consumer-group.md
│   │       │   ├── consumer.md
│   │       │   ├── credential.md
│   │       │   ├── global-rule.md
│   │       │   ├── plugin-config.md
│   │       │   ├── plugin-metadata.md
│   │       │   ├── plugin.md
│   │       │   ├── route.md
│   │       │   ├── router.md
│   │       │   ├── script.md
│   │       │   ├── secret.md
│   │       │   ├── service.md
│   │       │   └── upstream.md
│   │       ├── tutorials/
│   │       │   ├── add-multiple-api-versions.md
│   │       │   ├── cache-api-responses.md
│   │       │   ├── client-to-apisix-mtls.md
│   │       │   ├── expose-api.md
│   │       │   ├── health-check.md
│   │       │   ├── keycloak-oidc.md
│   │       │   ├── manage-api-consumers.md
│   │       │   ├── monitor-api-health-check.md
│   │       │   ├── observe-your-api.md
│   │       │   ├── protect-api.md
│   │       │   └── websocket-authentication.md
│   │       ├── upgrade-guide-from-2.15.x-to-3.0.0.md
│   │       ├── wasm.md
│   │       ├── xrpc/
│   │       │   └── redis.md
│   │       └── xrpc.md
│   └── zh/
│       └── latest/
│           ├── CHANGELOG.md
│           ├── CODE_STYLE.md
│           ├── FAQ.md
│           ├── README.md
│           ├── admin-api.md
│           ├── apisix-variable.md
│           ├── architecture-design/
│           │   └── apisix.md
│           ├── batch-processor.md
│           ├── benchmark.md
│           ├── build-apisix-dev-environment-on-mac.md
│           ├── building-apisix.md
│           ├── certificate.md
│           ├── config.json
│           ├── control-api.md
│           ├── customize-nginx-configuration.md
│           ├── dashboard.md
│           ├── debug-function.md
│           ├── debug-mode.md
│           ├── discovery/
│           │   ├── control-plane-service-discovery.md
│           │   ├── dns.md
│           │   ├── eureka.md
│           │   ├── kubernetes.md
│           │   └── nacos.md
│           ├── discovery.md
│           ├── external-plugin.md
│           ├── getting-started/
│           │   ├── README.md
│           │   ├── configure-routes.md
│           │   ├── key-authentication.md
│           │   ├── load-balancing.md
│           │   └── rate-limiting.md
│           ├── grpc-proxy.md
│           ├── http3.md
│           ├── install-dependencies.md
│           ├── installation-guide.md
│           ├── mtls.md
│           ├── plugin-develop.md
│           ├── plugins/
│           │   ├── ai-aliyun-content-moderation.md
│           │   ├── ai-aws-content-moderation.md
│           │   ├── ai-prompt-decorator.md
│           │   ├── ai-prompt-guard.md
│           │   ├── ai-prompt-template.md
│           │   ├── ai-proxy-multi.md
│           │   ├── ai-proxy.md
│           │   ├── ai-rag.md
│           │   ├── ai-rate-limiting.md
│           │   ├── ai-request-rewrite.md
│           │   ├── api-breaker.md
│           │   ├── attach-consumer-label.md
│           │   ├── authz-casbin.md
│           │   ├── authz-casdoor.md
│           │   ├── authz-keycloak.md
│           │   ├── aws-lambda.md
│           │   ├── azure-functions.md
│           │   ├── basic-auth.md
│           │   ├── batch-requests.md
│           │   ├── body-transformer.md
│           │   ├── brotli.md
│           │   ├── chaitin-waf.md
│           │   ├── clickhouse-logger.md
│           │   ├── client-control.md
│           │   ├── consumer-restriction.md
│           │   ├── cors.md
│           │   ├── csrf.md
│           │   ├── datadog.md
│           │   ├── dubbo-proxy.md
│           │   ├── echo.md
│           │   ├── elasticsearch-logger.md
│           │   ├── error-log-logger.md
│           │   ├── ext-plugin-post-req.md
│           │   ├── ext-plugin-post-resp.md
│           │   ├── ext-plugin-pre-req.md
│           │   ├── fault-injection.md
│           │   ├── file-logger.md
│           │   ├── forward-auth.md
│           │   ├── gm.md
│           │   ├── google-cloud-logging.md
│           │   ├── grpc-transcode.md
│           │   ├── grpc-web.md
│           │   ├── gzip.md
│           │   ├── hmac-auth.md
│           │   ├── http-dubbo.md
│           │   ├── http-logger.md
│           │   ├── ip-restriction.md
│           │   ├── jwe-decrypt.md
│           │   ├── jwt-auth.md
│           │   ├── kafka-logger.md
│           │   ├── key-auth.md
│           │   ├── ldap-auth.md
│           │   ├── limit-conn.md
│           │   ├── limit-count.md
│           │   ├── limit-req.md
│           │   ├── log-rotate.md
│           │   ├── loggly.md
│           │   ├── loki-logger.md
│           │   ├── mocking.md
│           │   ├── mqtt-proxy.md
│           │   ├── multi-auth.md
│           │   ├── node-status.md
│           │   ├── ocsp-stapling.md
│           │   ├── opa.md
│           │   ├── openfunction.md
│           │   ├── openid-connect.md
│           │   ├── opentelemetry.md
│           │   ├── openwhisk.md
│           │   ├── prometheus.md
│           │   ├── proxy-cache.md
│           │   ├── proxy-control.md
│           │   ├── proxy-mirror.md
│           │   ├── proxy-rewrite.md
│           │   ├── public-api.md
│           │   ├── real-ip.md
│           │   ├── redirect.md
│           │   ├── referer-restriction.md
│           │   ├── request-id.md
│           │   ├── request-validation.md
│           │   ├── response-rewrite.md
│           │   ├── rocketmq-logger.md
│           │   ├── server-info.md
│           │   ├── serverless.md
│           │   ├── skywalking-logger.md
│           │   ├── skywalking.md
│           │   ├── sls-logger.md
│           │   ├── splunk-hec-logging.md
│           │   ├── syslog.md
│           │   ├── tcp-logger.md
│           │   ├── tencent-cloud-cls.md
│           │   ├── traffic-split.md
│           │   ├── ua-restriction.md
│           │   ├── udp-logger.md
│           │   ├── uri-blocker.md
│           │   ├── wolf-rbac.md
│           │   ├── workflow.md
│           │   └── zipkin.md
│           ├── profile.md
│           ├── router-radixtree.md
│           ├── ssl-protocol.md
│           ├── status-api.md
│           ├── stream-proxy.md
│           ├── support-fips-in-apisix.md
│           ├── terminology/
│           │   ├── api-gateway.md
│           │   ├── consumer-group.md
│           │   ├── consumer.md
│           │   ├── credential.md
│           │   ├── global-rule.md
│           │   ├── plugin-config.md
│           │   ├── plugin-metadata.md
│           │   ├── plugin.md
│           │   ├── route.md
│           │   ├── router.md
│           │   ├── script.md
│           │   ├── secret.md
│           │   ├── service.md
│           │   └── upstream.md
│           ├── tutorials/
│           │   ├── cache-api-responses.md
│           │   ├── client-to-apisix-mtls.md
│           │   ├── expose-api.md
│           │   ├── health-check.md
│           │   ├── keycloak-oidc.md
│           │   ├── manage-api-consumers.md
│           │   ├── observe-your-api.md
│           │   └── protect-api.md
│           ├── upgrade-guide-from-2.15.x-to-3.0.0.md
│           └── wasm.md
├── example/
│   ├── apisix/
│   │   ├── plugins/
│   │   │   └── 3rd-party.lua
│   │   └── stream/
│   │       └── plugins/
│   │           └── 3rd-party.lua
│   ├── build-dev-image.dockerfile
│   └── my_hook.lua
├── powered-by.md
├── t/
│   ├── APISIX.pm
│   ├── admin/
│   │   ├── api.t
│   │   ├── balancer.t
│   │   ├── consumer-credentials.t
│   │   ├── consumer-group-force-delete.t
│   │   ├── consumer-group.t
│   │   ├── consumers.t
│   │   ├── consumers2.t
│   │   ├── credentials.t
│   │   ├── filter.t
│   │   ├── global-rules-conflict.t
│   │   ├── global-rules.t
│   │   ├── global-rules2.t
│   │   ├── health-check.t
│   │   ├── metadata.spec.ts
│   │   ├── metadata.t
│   │   ├── plugin-configs-force-delete.t
│   │   ├── plugin-configs.t
│   │   ├── plugin-metadata.t
│   │   ├── plugin-metadata2.t
│   │   ├── plugin-metadata3.t
│   │   ├── plugins-reload.t
│   │   ├── plugins.t
│   │   ├── protos-force-delete.t
│   │   ├── protos.t
│   │   ├── resources.t
│   │   ├── response_body_format.t
│   │   ├── routes-array-nodes.t
│   │   ├── routes.t
│   │   ├── routes2.t
│   │   ├── routes3.t
│   │   ├── routes4.t
│   │   ├── routes_request_body.t
│   │   ├── schema-validate.t
│   │   ├── schema.t
│   │   ├── secrets.t
│   │   ├── services-array-nodes.t
│   │   ├── services-force-delete.t
│   │   ├── services-string-id.t
│   │   ├── services.t
│   │   ├── services2.t
│   │   ├── ssl.t
│   │   ├── ssl2.t
│   │   ├── ssl3.t
│   │   ├── ssl4.t
│   │   ├── ssl5.t
│   │   ├── ssls.t
│   │   ├── standalone-healthcheck.t
│   │   ├── standalone-plugin-validation.t
│   │   ├── standalone.spec.ts
│   │   ├── standalone.t
│   │   ├── stream-routes-disable.t
│   │   ├── stream-routes-subordinate.t
│   │   ├── stream-routes.t
│   │   ├── token.t
│   │   ├── upstream-array-nodes.t
│   │   ├── upstream-force-delete.t
│   │   ├── upstream.t
│   │   ├── upstream2.t
│   │   ├── upstream3.t
│   │   ├── upstream4.t
│   │   └── upstream5.t
│   ├── apisix.luacov
│   ├── assets/
│   │   ├── ai-proxy-response.json
│   │   ├── content-moderation-responses.json
│   │   ├── embeddings.json
│   │   └── openai-compatible-api-response.json
│   ├── certs/
│   │   ├── apisix.crt
│   │   ├── apisix.key
│   │   ├── apisix_admin_ssl.crt
│   │   ├── apisix_admin_ssl.key
│   │   ├── apisix_ecc.crt
│   │   ├── apisix_ecc.key
│   │   ├── client_enc.crt
│   │   ├── client_enc.key
│   │   ├── client_sign.crt
│   │   ├── client_sign.key
│   │   ├── etcd.key
│   │   ├── etcd.pem
│   │   ├── gm_ca.crt
│   │   ├── incorrect.crt
│   │   ├── incorrect.key
│   │   ├── localhost_slapd_cert.pem
│   │   ├── localhost_slapd_key.pem
│   │   ├── mtls_ca.crt
│   │   ├── mtls_ca.key
│   │   ├── mtls_client.crt
│   │   ├── mtls_client.key
│   │   ├── mtls_server.crt
│   │   ├── mtls_server.key
│   │   ├── ocsp/
│   │   │   ├── ecc_good.crt
│   │   │   ├── ecc_good.key
│   │   │   ├── index.txt
│   │   │   ├── rsa_good.crt
│   │   │   ├── rsa_good.key
│   │   │   ├── rsa_revoked.crt
│   │   │   ├── rsa_revoked.key
│   │   │   ├── rsa_unknown.crt
│   │   │   ├── rsa_unknown.key
│   │   │   ├── signer.crt
│   │   │   └── signer.key
│   │   ├── openssl-test2.conf
│   │   ├── openssl.conf
│   │   ├── private.pem
│   │   ├── public.pem
│   │   ├── server_1024.crt
│   │   ├── server_1024.key
│   │   ├── server_enc.crt
│   │   ├── server_enc.key
│   │   ├── server_sign.crt
│   │   ├── server_sign.key
│   │   ├── test-dot.crt
│   │   ├── test-dot.key
│   │   ├── test2.crt
│   │   ├── test2.key
│   │   ├── vector_logs_ca.crt
│   │   ├── vector_logs_ca.key
│   │   ├── vector_logs_server.crt
│   │   └── vector_logs_server.key
│   ├── chaos/
│   │   ├── delayetcd/
│   │   │   └── delayetcd.go
│   │   ├── e2e.go
│   │   ├── e2e_test.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   ├── killetcd/
│   │   │   └── killetcd.go
│   │   ├── kubernetes/
│   │   │   ├── deployment.yaml
│   │   │   └── service.yaml
│   │   └── utils/
│   │       ├── Dockerfile
│   │       ├── kube_utils.go
│   │       ├── setup_chaos_utils.sh
│   │       └── utils.go
│   ├── cli/
│   │   ├── cli.t
│   │   ├── cli_envsubst_confusion.t
│   │   ├── common.sh
│   │   ├── docker-compose-etcd-cluster.yaml
│   │   ├── test_access_log.sh
│   │   ├── test_admin.sh
│   │   ├── test_admin_mtls.sh
│   │   ├── test_admin_ui.sh
│   │   ├── test_apisix_mirror.sh
│   │   ├── test_ci_only.sh
│   │   ├── test_cmd.sh
│   │   ├── test_control.sh
│   │   ├── test_core_config.sh
│   │   ├── test_deployment_control_plane.sh
│   │   ├── test_deployment_data_plane.sh
│   │   ├── test_deployment_data_plane_with_readonly_etcd.sh
│   │   ├── test_deployment_traditional.sh
│   │   ├── test_dns.sh
│   │   ├── test_dubbo.sh
│   │   ├── test_etcd.sh
│   │   ├── test_etcd_healthcheck.sh
│   │   ├── test_etcd_mtls.sh
│   │   ├── test_etcd_sync_event_handle.sh
│   │   ├── test_etcd_tls.sh
│   │   ├── test_http_config.sh
│   │   ├── test_kubernetes.sh
│   │   ├── test_limit_conn_redis_ttl.sh
│   │   ├── test_limit_req_redis_ttl.sh
│   │   ├── test_load_full_data_init_worker.sh
│   │   ├── test_main.sh
│   │   ├── test_makefile.sh
│   │   ├── test_opentelemetry_set_ngx_var.sh
│   │   ├── test_prometheus.sh
│   │   ├── test_prometheus_reload.sh
│   │   ├── test_prometheus_stream.sh
│   │   ├── test_proxy_mirror_timeout.sh
│   │   ├── test_route_match_with_graphql.sh
│   │   ├── test_serverless.sh
│   │   ├── test_snippet.sh
│   │   ├── test_standalone.sh
│   │   ├── test_standalone_docker.sh
│   │   ├── test_standalone_yaml_format.sh
│   │   ├── test_status_api.sh
│   │   ├── test_status_api_standalone.sh
│   │   ├── test_stream_config.sh
│   │   ├── test_tls_over_tcp.sh
│   │   ├── test_upstream_mtls.sh
│   │   ├── test_validate_config.sh
│   │   ├── test_wasm.sh
│   │   └── test_zipkin_set_ngx_var.sh
│   ├── config-center-json/
│   │   ├── consumer-group.t
│   │   ├── consumer.t
│   │   ├── global-rule.t
│   │   ├── plugin-configs.t
│   │   ├── plugin-metadata.t
│   │   ├── plugin.t
│   │   ├── route-service.t
│   │   ├── route-upstream.t
│   │   ├── route.t
│   │   ├── secret.t
│   │   ├── ssl.t
│   │   └── stream-route.t
│   ├── config-center-yaml/
│   │   ├── consumer-group.t
│   │   ├── consumer.t
│   │   ├── global-rule.t
│   │   ├── plugin-configs.t
│   │   ├── plugin-metadata.t
│   │   ├── plugin.t
│   │   ├── route-service.t
│   │   ├── route-upstream.t
│   │   ├── route.t
│   │   ├── secret.t
│   │   ├── ssl.t
│   │   └── stream-route.t
│   ├── control/
│   │   ├── control-healthcheck-bug-fix.t
│   │   ├── discovery.t
│   │   ├── gc.t
│   │   ├── healthcheck.t
│   │   ├── plugin-api.t
│   │   ├── plugin-metadata.t
│   │   ├── plugins-reload.t
│   │   ├── routes.t
│   │   ├── schema.t
│   │   ├── services.t
│   │   └── upstreams.t
│   ├── core/
│   │   ├── config-default.t
│   │   ├── config.t
│   │   ├── config_etcd.t
│   │   ├── config_util.t
│   │   ├── ctx.t
│   │   ├── ctx2.t
│   │   ├── ctx3.t
│   │   ├── ctx4.t
│   │   ├── ctx_with_params.t
│   │   ├── env.t
│   │   ├── etcd-auth-fail.t
│   │   ├── etcd-auth.t
│   │   ├── etcd-mtls.t
│   │   ├── etcd-sync.t
│   │   ├── etcd-write.t
│   │   ├── etcd.t
│   │   ├── json.t
│   │   ├── log.t
│   │   ├── lrucache.t
│   │   ├── lrucache2.t
│   │   ├── os.t
│   │   ├── profile.t
│   │   ├── random.t
│   │   ├── request.t
│   │   ├── resolver.t
│   │   ├── response.t
│   │   ├── schema.t
│   │   ├── schema_def.t
│   │   ├── string.t
│   │   ├── table.t
│   │   ├── timer.t
│   │   ├── trusted-addresses.t
│   │   ├── uid.t
│   │   └── utils.t
│   ├── coredns/
│   │   ├── Corefile
│   │   └── db.test.local
│   ├── debug/
│   │   ├── debug-mode.t
│   │   ├── dynamic-hook.t
│   │   └── hook.t
│   ├── discovery/
│   │   ├── consul.t
│   │   ├── consul2.t
│   │   ├── consul_dump.t
│   │   ├── consul_kv.t
│   │   ├── consul_kv_dump.t
│   │   ├── dns/
│   │   │   ├── mix.t
│   │   │   └── sanity.t
│   │   ├── eureka.t
│   │   ├── kubernetes_schema.t
│   │   ├── nacos.t
│   │   ├── nacos2.t
│   │   ├── nacos3.t
│   │   ├── reset-healthchecker.t
│   │   └── stream/
│   │       ├── consul.t
│   │       ├── consul_kv.t
│   │       ├── dns.t
│   │       ├── eureka.t
│   │       └── nacos.t
│   ├── error_page/
│   │   └── error_page.t
│   ├── fake-plugin-exit.lua
│   ├── fuzzing/
│   │   ├── client_abort.py
│   │   ├── http_upstream.py
│   │   ├── public.py
│   │   ├── requirements.txt
│   │   ├── serverless_route_test.py
│   │   ├── simple_http.py
│   │   ├── simpleroute_test.py
│   │   ├── upstream/
│   │   │   └── nginx.conf
│   │   └── vars_route_test.py
│   ├── gm/
│   │   └── gm.t
│   ├── grpc_server_example/
│   │   ├── echo.pb
│   │   ├── go.mod
│   │   ├── go.sum
│   │   ├── main.go
│   │   ├── proto/
│   │   │   ├── echo.pb.go
│   │   │   ├── echo.proto
│   │   │   ├── echo_grpc.pb.go
│   │   │   ├── helloworld.pb.go
│   │   │   ├── helloworld.proto
│   │   │   ├── helloworld_grpc.pb.go
│   │   │   ├── import.pb.go
│   │   │   ├── import.proto
│   │   │   ├── src.pb.go
│   │   │   ├── src.proto
│   │   │   └── src_grpc.pb.go
│   │   └── proto.pb
│   ├── http3/
│   │   └── admin/
│   │       └── basic.t
│   ├── jest.config.ts
│   ├── kubernetes/
│   │   ├── configs/
│   │   │   ├── account.yaml
│   │   │   ├── endpoint.yaml
│   │   │   ├── endpointslices.yaml
│   │   │   └── kind.yaml
│   │   └── discovery/
│   │       ├── kubernetes.t
│   │       ├── kubernetes2.t
│   │       ├── kubernetes3.t
│   │       ├── kubernetes4.t
│   │       └── stream/
│   │           └── kubernetes.t
│   ├── lib/
│   │   ├── apisix/
│   │   │   └── plugins/
│   │   │       ├── jwt-auth.lua
│   │   │       └── prometheus/
│   │   │           └── exporter.lua
│   │   ├── chaitin_waf_server.lua
│   │   ├── dubbo-backend/
│   │   │   ├── dubbo-backend-interface/
│   │   │   │   ├── pom.xml
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           └── java/
│   │   │   │               └── org/
│   │   │   │                   └── apache/
│   │   │   │                       └── dubbo/
│   │   │   │                           └── backend/
│   │   │   │                               └── DemoService.java
│   │   │   ├── dubbo-backend-provider/
│   │   │   │   ├── pom.xml
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           ├── java/
│   │   │   │           │   └── org/
│   │   │   │           │       └── apache/
│   │   │   │           │           └── dubbo/
│   │   │   │           │               └── backend/
│   │   │   │           │                   └── provider/
│   │   │   │           │                       ├── DemoServiceImpl.java
│   │   │   │           │                       └── Provider.java
│   │   │   │           └── resources/
│   │   │   │               ├── META-INF/
│   │   │   │               │   └── spring/
│   │   │   │               │       └── dubbo-demo-provider.xml
│   │   │   │               ├── dubbo.properties
│   │   │   │               └── log4j.properties
│   │   │   └── pom.xml
│   │   ├── dubbo-serialization-backend/
│   │   │   ├── dubbo-serialization-backend-interface/
│   │   │   │   ├── pom.xml
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           └── java/
│   │   │   │               └── org/
│   │   │   │                   └── apache/
│   │   │   │                       └── dubbo/
│   │   │   │                           └── backend/
│   │   │   │                               ├── DubboSerializationTestService.java
│   │   │   │                               └── PoJo.java
│   │   │   ├── dubbo-serialization-backend-provider/
│   │   │   │   ├── pom.xml
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           ├── java/
│   │   │   │           │   └── org/
│   │   │   │           │       └── apache/
│   │   │   │           │           └── dubbo/
│   │   │   │           │               └── backend/
│   │   │   │           │                   └── provider/
│   │   │   │           │                       ├── DubboSerializationTestServiceImpl.java
│   │   │   │           │                       └── Provider.java
│   │   │   │           └── resources/
│   │   │   │               ├── META-INF/
│   │   │   │               │   └── spring/
│   │   │   │               │       └── dubbo-demo-provider.xml
│   │   │   │               ├── dubbo.properties
│   │   │   │               └── log4j.properties
│   │   │   └── pom.xml
│   │   ├── etcd.proto
│   │   ├── ext-plugin.lua
│   │   ├── grafana_loki.lua
│   │   ├── keycloak.lua
│   │   ├── keycloak_cas.lua
│   │   ├── mock_layer4.lua
│   │   ├── pubsub.lua
│   │   ├── server.lua
│   │   ├── test_admin.lua
│   │   ├── test_inspect.lua
│   │   ├── test_otel.lua
│   │   └── test_redis.lua
│   ├── misc/
│   │   ├── patch.t
│   │   ├── pre-function.t
│   │   └── timers.t
│   ├── node/
│   │   ├── chash-balance.t
│   │   ├── chash-hashon.t
│   │   ├── client-mtls-openresty.t
│   │   ├── client-mtls.t
│   │   ├── consumer-group.t
│   │   ├── consumer-plugin.t
│   │   ├── consumer-plugin2.t
│   │   ├── consumer-plugin3.t
│   │   ├── credential-plugin-basic-auth.t
│   │   ├── credential-plugin-incremental-effective.t
│   │   ├── credential-plugin-jwt-auth.t
│   │   ├── credential-plugin-key-auth.t
│   │   ├── credential-plugin-multi-credentials.t
│   │   ├── credential-plugin-set-request-header.t
│   │   ├── credential-plugin-work-with-other-plugin.t
│   │   ├── data_encrypt.t
│   │   ├── data_encrypt2.t
│   │   ├── ewma.t
│   │   ├── filter_func.t
│   │   ├── global-rule.t
│   │   ├── grpc-proxy-mtls.t
│   │   ├── grpc-proxy-stream.t
│   │   ├── grpc-proxy-unary.t
│   │   ├── grpc-proxy.t
│   │   ├── healthcheck-discovery.t
│   │   ├── healthcheck-dns.t
│   │   ├── healthcheck-global-switch.t
│   │   ├── healthcheck-https.t
│   │   ├── healthcheck-ipv6.t
│   │   ├── healthcheck-leak-bugfix.t
│   │   ├── healthcheck-multiple-worker.t
│   │   ├── healthcheck-passive-resty-events.t
│   │   ├── healthcheck-service-discovery.t
│   │   ├── healthcheck-stop-checker.t
│   │   ├── healthcheck.t
│   │   ├── healthcheck2.t
│   │   ├── healthcheck3.t
│   │   ├── healthchecker-independent-upstream.t
│   │   ├── hosts.t
│   │   ├── http_host.t
│   │   ├── https-proxy.t
│   │   ├── invalid-port.t
│   │   ├── invalid-route.t
│   │   ├── invalid-service.t
│   │   ├── invalid-upstream.t
│   │   ├── least_conn.t
│   │   ├── least_conn2.t
│   │   ├── merge-route.t
│   │   ├── not-exist-service.t
│   │   ├── not-exist-upstream.t
│   │   ├── plugin-configs.t
│   │   ├── plugin.t
│   │   ├── plugin1.t
│   │   ├── priority-balancer/
│   │   │   ├── health-checker.t
│   │   │   └── sanity.t
│   │   ├── remote-addr-ipv6.t
│   │   ├── remote-addr.t
│   │   ├── remote_addrs.t
│   │   ├── route-delete.t
│   │   ├── route-domain-with-local-dns.t
│   │   ├── route-domain.t
│   │   ├── route-filter-func.t
│   │   ├── route-host.t
│   │   ├── route-status.t
│   │   ├── route-uris.t
│   │   ├── rr-balance.t
│   │   ├── sanity-radixtree.t
│   │   ├── service-empty.t
│   │   ├── ssl-protocols.t
│   │   ├── ssl.t
│   │   ├── timeout-upstream.t
│   │   ├── upstream-array-nodes.t
│   │   ├── upstream-discovery-dynamic.t
│   │   ├── upstream-discovery.t
│   │   ├── upstream-domain-with-special-dns.t
│   │   ├── upstream-domain-with-special-ipv6-dns.t
│   │   ├── upstream-domain.t
│   │   ├── upstream-ipv6.t
│   │   ├── upstream-keepalive-pool.t
│   │   ├── upstream-mtls.t
│   │   ├── upstream-node-dns.t
│   │   ├── upstream-retries.t
│   │   ├── upstream-status-5xx.t
│   │   ├── upstream-status-all.t
│   │   ├── upstream-websocket.t
│   │   ├── upstream.t
│   │   ├── vars.t
│   │   └── wildcard-host.t
│   ├── package.json
│   ├── plugin/
│   │   ├── ai-aliyun-content-moderation.t
│   │   ├── ai-aws-content-moderation-secrets.t
│   │   ├── ai-aws-content-moderation.t
│   │   ├── ai-aws-content-moderation2.t
│   │   ├── ai-prompt-decorator.t
│   │   ├── ai-prompt-guard.t
│   │   ├── ai-prompt-template.t
│   │   ├── ai-proxy-anthropic.t
│   │   ├── ai-proxy-azure-openai.t
│   │   ├── ai-proxy-gemini.t
│   │   ├── ai-proxy-kafka-log.t
│   │   ├── ai-proxy-multi.balancer.t
│   │   ├── ai-proxy-multi.openai-compatible.t
│   │   ├── ai-proxy-multi.t
│   │   ├── ai-proxy-multi2.t
│   │   ├── ai-proxy-multi3.t
│   │   ├── ai-proxy-openrouter.t
│   │   ├── ai-proxy-vertex-ai.t
│   │   ├── ai-proxy.openai-compatible.t
│   │   ├── ai-proxy.t
│   │   ├── ai-proxy2.t
│   │   ├── ai-proxy3.t
│   │   ├── ai-rag.t
│   │   ├── ai-rate-limiting-consumer-isolation.t
│   │   ├── ai-rate-limiting.t
│   │   ├── ai-request-rewrite.t
│   │   ├── ai-request-rewrite2.t
│   │   ├── ai.t
│   │   ├── ai2.t
│   │   ├── ai3.t
│   │   ├── ai4.t
│   │   ├── ai5.t
│   │   ├── api-breaker.t
│   │   ├── attach-consumer-label.t
│   │   ├── authz-casbin/
│   │   │   ├── model.conf
│   │   │   └── policy.csv
│   │   ├── authz-casbin.t
│   │   ├── authz-casdoor.t
│   │   ├── authz-keycloak.t
│   │   ├── authz-keycloak2.t
│   │   ├── authz-keycloak3.t
│   │   ├── authz-keycloak4.t
│   │   ├── aws-lambda.t
│   │   ├── azure-functions.t
│   │   ├── basic-auth-anonymous-consumer.t
│   │   ├── basic-auth-realm.t
│   │   ├── basic-auth.t
│   │   ├── batch-requests-grpc.t
│   │   ├── batch-requests.t
│   │   ├── batch-requests2.t
│   │   ├── body-transformer-multipart.t
│   │   ├── body-transformer.t
│   │   ├── body-transformer2.t
│   │   ├── brotli.t
│   │   ├── cas-auth.t
│   │   ├── chaitin-waf-reject.t
│   │   ├── chaitin-waf-timeout.t
│   │   ├── chaitin-waf.t
│   │   ├── clickhouse-logger.t
│   │   ├── clickhouse-logger2.t
│   │   ├── clickhouse-logger3.t
│   │   ├── client-control.t
│   │   ├── consumer-bug-fix.t
│   │   ├── consumer-restriction.t
│   │   ├── consumer-restriction2.t
│   │   ├── cors.t
│   │   ├── cors2.t
│   │   ├── cors3.t
│   │   ├── cors4.t
│   │   ├── csrf.t
│   │   ├── custom_sort_plugins.t
│   │   ├── datadog.t
│   │   ├── degraphql.t
│   │   ├── dubbo-proxy/
│   │   │   ├── route.t
│   │   │   └── upstream.t
│   │   ├── echo.t
│   │   ├── elasticsearch-logger.t
│   │   ├── elasticsearch-logger2.t
│   │   ├── error-log-logger-clickhouse.t
│   │   ├── error-log-logger-kafka.t
│   │   ├── error-log-logger-skywalking.t
│   │   ├── error-log-logger.t
│   │   ├── example.t
│   │   ├── ext-plugin/
│   │   │   ├── conf_token.t
│   │   │   ├── extra-info.t
│   │   │   ├── http-req-call.t
│   │   │   ├── request-body.t
│   │   │   ├── response.t
│   │   │   ├── runner.sh
│   │   │   ├── runner_can_not_terminated.sh
│   │   │   ├── sanity.t
│   │   │   └── sanity2.t
│   │   ├── fault-injection.t
│   │   ├── fault-injection2.t
│   │   ├── file-logger-reopen.t
│   │   ├── file-logger.t
│   │   ├── file-logger2.t
│   │   ├── forward-auth.t
│   │   ├── forward-auth2.t
│   │   ├── google-cloud-logging/
│   │   │   ├── config-https-domain.json
│   │   │   ├── config-https-ip.json
│   │   │   └── config.json
│   │   ├── google-cloud-logging.t
│   │   ├── google-cloud-logging2.t
│   │   ├── google-cloud-logging3.t
│   │   ├── grpc-transcode-reload-bugfix.t
│   │   ├── grpc-transcode.t
│   │   ├── grpc-transcode2.t
│   │   ├── grpc-transcode3.t
│   │   ├── grpc-web/
│   │   │   ├── a6/
│   │   │   │   ├── buf.gen.yaml
│   │   │   │   ├── buf.yaml
│   │   │   │   ├── package.json
│   │   │   │   └── route.proto
│   │   │   ├── client.cts
│   │   │   ├── go.mod
│   │   │   ├── go.sum
│   │   │   ├── server.go
│   │   │   └── setup.sh
│   │   ├── grpc-web.t
│   │   ├── gzip.t
│   │   ├── hmac-auth-anonymous-consumer.t
│   │   ├── hmac-auth-realm.t
│   │   ├── hmac-auth.t
│   │   ├── hmac-auth2.t
│   │   ├── hmac-auth3.t
│   │   ├── hmac-auth4.t
│   │   ├── http-dubbo.t
│   │   ├── http-logger-json.t
│   │   ├── http-logger-large-body.t
│   │   ├── http-logger-log-format.t
│   │   ├── http-logger-new-line.t
│   │   ├── http-logger.t
│   │   ├── http-logger2.t
│   │   ├── http-logger3.t
│   │   ├── inspect.t
│   │   ├── ip-restriction.t
│   │   ├── jwe-decrypt.t
│   │   ├── jwt-auth-anonymous-consumer.t
│   │   ├── jwt-auth-more-algo.t
│   │   ├── jwt-auth-realm.t
│   │   ├── jwt-auth.t
│   │   ├── jwt-auth2.t
│   │   ├── jwt-auth3.t
│   │   ├── jwt-auth4.t
│   │   ├── kafka-logger-large-body.t
│   │   ├── kafka-logger-log-format.t
│   │   ├── kafka-logger.t
│   │   ├── kafka-logger2.t
│   │   ├── kafka-logger3.t
│   │   ├── kafka-logger4.t
│   │   ├── kafka-proxy.t
│   │   ├── key-auth-anonymous-consumer.t
│   │   ├── key-auth-realm.t
│   │   ├── key-auth-upstream-domain-node.t
│   │   ├── key-auth.t
│   │   ├── lago.spec.mts
│   │   ├── lago.t
│   │   ├── ldap-auth-realm.t
│   │   ├── ldap-auth.t
│   │   ├── limit-conn-redis-cluster.t
│   │   ├── limit-conn-redis.t
│   │   ├── limit-conn-variable.t
│   │   ├── limit-conn.t
│   │   ├── limit-conn2.t
│   │   ├── limit-conn3.t
│   │   ├── limit-count-consumer-group-credentials.t
│   │   ├── limit-count-consumer-isolation.t
│   │   ├── limit-count-redis-cluster.t
│   │   ├── limit-count-redis-cluster2.t
│   │   ├── limit-count-redis-cluster3.t
│   │   ├── limit-count-redis.t
│   │   ├── limit-count-redis2.t
│   │   ├── limit-count-redis3.t
│   │   ├── limit-count-redis4.t
│   │   ├── limit-count-rules.t
│   │   ├── limit-count-variable.t
│   │   ├── limit-count.t
│   │   ├── limit-count2.t
│   │   ├── limit-count3.t
│   │   ├── limit-count4.t
│   │   ├── limit-count5.t
│   │   ├── limit-req-redis-cluster.t
│   │   ├── limit-req-redis.t
│   │   ├── limit-req-shared-counter.t
│   │   ├── limit-req.t
│   │   ├── limit-req2.t
│   │   ├── limit-req3.t
│   │   ├── log-rotate.t
│   │   ├── log-rotate2.t
│   │   ├── log-rotate3.t
│   │   ├── loggly.t
│   │   ├── loki-logger.t
│   │   ├── loki-logger2.t
│   │   ├── mcp/
│   │   │   └── assets/
│   │   │       └── bridge-list-tools.json
│   │   ├── mcp-bridge.spec.mts
│   │   ├── mcp-bridge.t
│   │   ├── mocking.t
│   │   ├── multi-auth.t
│   │   ├── multi-auth2.t
│   │   ├── node-status.t
│   │   ├── ocsp-stapling.t
│   │   ├── opa.t
│   │   ├── opa2.t
│   │   ├── openfunction.t
│   │   ├── openid-connect/
│   │   │   └── configuration.json
│   │   ├── openid-connect-redis.t
│   │   ├── openid-connect.t
│   │   ├── openid-connect2.t
│   │   ├── openid-connect3.t
│   │   ├── openid-connect4.t
│   │   ├── openid-connect5.t
│   │   ├── openid-connect6.t
│   │   ├── openid-connect7.t
│   │   ├── openid-connect8.t
│   │   ├── openid-connect9.t
│   │   ├── opentelemetry.t
│   │   ├── opentelemetry2.t
│   │   ├── opentelemetry3.t
│   │   ├── opentelemetry4-bugfix-pb-state.t
│   │   ├── opentelemetry5.t
│   │   ├── opentelemetry6.t
│   │   ├── openwhisk.t
│   │   ├── plugin.t
│   │   ├── prometheus-ai-proxy.t
│   │   ├── prometheus-metric-expire.t
│   │   ├── prometheus.t
│   │   ├── prometheus2.t
│   │   ├── prometheus3.t
│   │   ├── prometheus4.t
│   │   ├── proxy-cache/
│   │   │   ├── disk.t
│   │   │   └── memory.t
│   │   ├── proxy-control.t
│   │   ├── proxy-mirror.t
│   │   ├── proxy-mirror2.t
│   │   ├── proxy-mirror3.t
│   │   ├── proxy-rewrite.t
│   │   ├── proxy-rewrite2.t
│   │   ├── proxy-rewrite3.t
│   │   ├── public-api.t
│   │   ├── real-ip.t
│   │   ├── redirect.t
│   │   ├── redirect2.t
│   │   ├── referer-restriction.t
│   │   ├── request-id.t
│   │   ├── request-id2.t
│   │   ├── request-id3.t
│   │   ├── request-validation.t
│   │   ├── request-validation2.t
│   │   ├── response-rewrite.t
│   │   ├── response-rewrite2.t
│   │   ├── response-rewrite3.t
│   │   ├── rocketmq-logger-log-format.t
│   │   ├── rocketmq-logger.t
│   │   ├── rocketmq-logger2.t
│   │   ├── security-warning.t
│   │   ├── security-warning2.t
│   │   ├── server-info.t
│   │   ├── serverless.t
│   │   ├── skywalking-logger.t
│   │   ├── skywalking-logger2.t
│   │   ├── skywalking.t
│   │   ├── skywalking2.t
│   │   ├── sls-logger.t
│   │   ├── splunk-hec-logging.t
│   │   ├── splunk-hec-logging2.t
│   │   ├── syslog.t
│   │   ├── tcp-logger.t
│   │   ├── tencent-cloud-cls.t
│   │   ├── traffic-split.t
│   │   ├── traffic-split2.t
│   │   ├── traffic-split3.t
│   │   ├── traffic-split4.t
│   │   ├── traffic-split5.t
│   │   ├── ua-restriction.t
│   │   ├── udp-logger.t
│   │   ├── uri-blocker.t
│   │   ├── wolf-rbac.t
│   │   ├── workflow-without-case.t
│   │   ├── workflow.t
│   │   ├── workflow2.t
│   │   ├── workflow3.t
│   │   ├── zipkin.t
│   │   ├── zipkin2.t
│   │   └── zipkin3.t
│   ├── pubsub/
│   │   ├── kafka.t
│   │   └── pubsub.t
│   ├── router/
│   │   ├── graphql.t
│   │   ├── multi-ssl-certs.t
│   │   ├── radixtree-host-uri-priority.t
│   │   ├── radixtree-host-uri.t
│   │   ├── radixtree-host-uri2.t
│   │   ├── radixtree-host-uri3.t
│   │   ├── radixtree-method.t
│   │   ├── radixtree-sni.t
│   │   ├── radixtree-sni2.t
│   │   ├── radixtree-sni3.t
│   │   ├── radixtree-uri-host.t
│   │   ├── radixtree-uri-keep-end-slash.t
│   │   ├── radixtree-uri-multiple.t
│   │   ├── radixtree-uri-priority.t
│   │   ├── radixtree-uri-sanity.t
│   │   ├── radixtree-uri-vars.t
│   │   ├── radixtree-uri-with-parameter.t
│   │   └── radixtree-uri-with-parameter2.t
│   ├── script/
│   │   ├── script.t
│   │   ├── script_distribute.t
│   │   └── script_test.lua
│   ├── secret/
│   │   ├── aws.t
│   │   ├── conf/
│   │   │   ├── error.json
│   │   │   └── success.json
│   │   ├── gcp.t
│   │   ├── secret_lru.t
│   │   └── vault.t
│   ├── sse_server_example/
│   │   ├── go.mod
│   │   └── main.go
│   ├── stream-node/
│   │   ├── control-api-healthcheck.t
│   │   ├── healthcheck-resty-events.t
│   │   ├── mtls.t
│   │   ├── priority-balancer.t
│   │   ├── random.t
│   │   ├── sanity-repeat.t
│   │   ├── sanity-with-service.t
│   │   ├── sanity.t
│   │   ├── sni.t
│   │   ├── tls.t
│   │   ├── upstream-domain.t
│   │   └── upstream-tls.t
│   ├── stream-plugin/
│   │   ├── ip-restriction.t
│   │   ├── limit-conn.t
│   │   ├── limit-conn2.t
│   │   ├── mqtt-proxy.t
│   │   ├── mqtt-proxy2.t
│   │   ├── plugin.t
│   │   ├── prometheus.t
│   │   ├── syslog.t
│   │   └── traffic-split.t
│   ├── tars/
│   │   ├── conf/
│   │   │   └── tars.sql
│   │   └── discovery/
│   │       ├── stream/
│   │       │   └── tars.t
│   │       └── tars.t
│   ├── ts/
│   │   ├── admin_api.ts
│   │   └── utils.ts
│   ├── tsconfig.json
│   ├── utils/
│   │   ├── batch-processor.t
│   │   └── rfc5424.t
│   ├── wasm/
│   │   ├── fault-injection/
│   │   │   └── main.go
│   │   ├── fault-injection.t
│   │   ├── forward-auth.go
│   │   ├── forward-auth.t
│   │   ├── global-rule.t
│   │   ├── go.mod
│   │   ├── go.sum
│   │   ├── log/
│   │   │   └── main.go
│   │   ├── request-body/
│   │   │   └── main.go
│   │   ├── request-body.t
│   │   ├── response-rewrite/
│   │   │   └── main.go
│   │   ├── response-rewrite.t
│   │   └── route.t
│   ├── xds-library/
│   │   ├── config_xds.t
│   │   ├── config_xds_2.t
│   │   ├── export.go
│   │   ├── main.go
│   │   └── xds.h
│   └── xrpc/
│       ├── apisix/
│       │   └── stream/
│       │       └── xrpc/
│       │           └── protocols/
│       │               └── pingpong/
│       │                   ├── init.lua
│       │                   └── schema.lua
│       ├── dubbo.t
│       ├── pingpong.t
│       ├── pingpong2.t
│       ├── pingpong3.t
│       ├── prometheus.t
│       ├── redis.t
│       └── redis2.t
└── utils/
    ├── check-category.py
    ├── check-lua-code-style.sh
    ├── check-merge-conflict.sh
    ├── check-plugins-code.sh
    ├── check-test-code-style.sh
    ├── check-version.sh
    ├── fix-zh-doc-segment.py
    ├── gen-vote-contents.sh
    ├── install-dependencies.sh
    └── linux-install-luarocks.sh
Download .txt
SYMBOL INDEX (436 symbols across 46 files)

FILE: ci/check_changelog_prs.ts
  type Version (line 23) | interface Version {
  type PR (line 28) | interface PR {
  constant IGNORE_TYPES (line 35) | const IGNORE_TYPES = [
  constant IGNORE_PRS (line 42) | const IGNORE_PRS = [
  function getGitRef (line 60) | function getGitRef(version: string): string {
  function extractVersionsFromChangelog (line 69) | function extractVersionsFromChangelog(): Version[] {
  function extractPRsFromChangelog (line 87) | function extractPRsFromChangelog(startTag: string, endTag: string): numb...
  function shouldIgnoreCommitMessage (line 113) | function shouldIgnoreCommitMessage(message: string): boolean {
  function extractPRsFromGitLog (line 134) | function extractPRsFromGitLog(oldRef: string, newRef: string): PR[] {
  function findMissingPRs (line 161) | function findMissingPRs(changelogPRs: number[], gitPRs: PR[]): PR[] {
  function versionGreaterThan (line 166) | function versionGreaterThan(v1: string, v2: string): boolean {
  function main (line 189) | async function main() {

FILE: ci/pod/openfunction/function-example/test-body/hello.go
  function init (line 30) | func init() {
  function HelloWorld (line 34) | func HelloWorld(w http.ResponseWriter, r *http.Request) {

FILE: ci/pod/openfunction/function-example/test-header/hello.go
  function HelloWorld (line 27) | func HelloWorld(w http.ResponseWriter, r *http.Request) {

FILE: ci/pod/openfunction/function-example/test-uri/hello.go
  function init (line 30) | func init() {
  function HelloWorld (line 35) | func HelloWorld(w http.ResponseWriter, r *http.Request) {

FILE: t/admin/standalone.spec.ts
  constant ENDPOINT (line 20) | const ENDPOINT = '/apisix/admin/configs';
  constant VALIDATE_ENDPOINT (line 21) | const VALIDATE_ENDPOINT = '/apisix/admin/configs/validate';
  constant HEADER_LAST_MODIFIED (line 22) | const HEADER_LAST_MODIFIED = 'x-last-modified';
  constant HEADER_DIGEST (line 23) | const HEADER_DIGEST = 'x-digest';

FILE: t/chaos/delayetcd/delayetcd.go
  function getEtcdDelayChaos (line 38) | func getEtcdDelayChaos(delay int) *v1alpha1.NetworkChaos {
  function setRouteMultipleTimes (line 59) | func setRouteMultipleTimes(e *httpexpect.Expect, times int, status httpe...
  function setRouteMultipleTimesIgnoreError (line 72) | func setRouteMultipleTimesIgnoreError(e *httpexpect.Expect, times int) (...
  function deleteChaosAndCheck (line 82) | func deleteChaosAndCheck(eSilent *httpexpect.Expect, cliSet *utils.Clien...

FILE: t/chaos/e2e.go
  function runChaos (line 25) | func runChaos() {}

FILE: t/chaos/e2e_test.go
  function TestRunChaos (line 27) | func TestRunChaos(t *testing.T) {

FILE: t/chaos/killetcd/killetcd.go
  function getEtcdKillChaos (line 46) | func getEtcdKillChaos() *v1alpha1.PodChaos {

FILE: t/chaos/utils/kube_utils.go
  type ClientSet (line 39) | type ClientSet struct
  function InitClientSet (line 44) | func InitClientSet() (*ClientSet, error) {
  function GetPods (line 62) | func GetPods(cli client.Client, ns string, listOption client.MatchingLab...
  function ExecInPod (line 71) | func ExecInPod(cli *kubernetes.Clientset, pod *corev1.Pod, cmd string) (...
  function Log (line 113) | func Log(pod *corev1.Pod, c *kubernetes.Clientset, sinceTime time.Time) ...

FILE: t/chaos/utils/utils.go
  type httpTestCase (line 57) | type httpTestCase struct
  function caseCheck (line 69) | func caseCheck(tc httpTestCase) *httpexpect.Response {
  function SetRoute (line 113) | func SetRoute(e *httpexpect.Expect, expectStatusRange httpexpect.StatusR...
  function SetRouteIgnoreError (line 124) | func SetRouteIgnoreError(e *httpexpect.Expect) *httpexpect.Response {
  function GetRoute (line 135) | func GetRoute(e *httpexpect.Expect, expectStatus int) *httpexpect.Respon...
  function GetRouteIgnoreError (line 144) | func GetRouteIgnoreError(e *httpexpect.Expect) *httpexpect.Response {
  function GetRouteList (line 153) | func GetRouteList(e *httpexpect.Expect, expectStatus int) *httpexpect.Re...
  function DeleteRoute (line 164) | func DeleteRoute(e *httpexpect.Expect) *httpexpect.Response {
  function SetPrometheusMetricsPublicAPI (line 173) | func SetPrometheusMetricsPublicAPI(e *httpexpect.Expect) *httpexpect.Res...
  function TestPrometheusEtcdMetric (line 194) | func TestPrometheusEtcdMetric(e *httpexpect.Expect, expectEtcd int) *htt...
  function getPrometheusMetric (line 204) | func getPrometheusMetric(e *httpexpect.Expect, key string) string {
  function GetEgressBandwidthPerSecond (line 223) | func GetEgressBandwidthPerSecond(e *httpexpect.Expect) (float64, float64) {
  function GetSilentHttpexpectClient (line 241) | func GetSilentHttpexpectClient() *httpexpect.Expect {
  function WaitUntilMethodSucceed (line 251) | func WaitUntilMethodSucceed(e *httpexpect.Expect, method string, interva...
  function RoughCompare (line 270) | func RoughCompare(a float64, b float64) bool {
  type silentPrinter (line 278) | type silentPrinter struct
    method Request (line 287) | func (p silentPrinter) Request(req *http.Request) {
    method Response (line 291) | func (silentPrinter) Response(*http.Response, time.Duration) {
  function newSilentPrinter (line 282) | func newSilentPrinter(logger httpexpect.Logger) silentPrinter {

FILE: t/fuzzing/client_abort.py
  function get_admin_key_from_yaml (line 27) | def get_admin_key_from_yaml(yaml_file_path):
  function create_route (line 36) | def create_route():
  function req (line 54) | def req():
  function run_in_thread (line 60) | def run_in_thread():
  function run (line 65) | def run():

FILE: t/fuzzing/http_upstream.py
  function get_admin_key_from_yaml (line 32) | def get_admin_key_from_yaml(yaml_file_path):
  function create_route (line 40) | def create_route():
  function req (line 72) | def req():
  function run_in_thread (line 85) | def run_in_thread():
  function run (line 90) | def run():

FILE: t/fuzzing/public.py
  function cur_dir (line 26) | def cur_dir():
  function apisix_pwd (line 29) | def apisix_pwd():
  function connect_admin (line 33) | def connect_admin():
  function check_log (line 37) | def check_log():
  function check_process (line 51) | def check_process():
  function initfuzz (line 60) | def initfuzz():
  function sum_memory (line 72) | def sum_memory():
  function get_linear_regression_sloped (line 79) | def get_linear_regression_sloped(samples):
  function gc (line 90) | def gc():
  function leak_count (line 95) | def leak_count():
  function check_leak (line 100) | def check_leak(f):
  function run_test (line 128) | def run_test(create_route, run):

FILE: t/fuzzing/serverless_route_test.py
  function get_admin_key_from_yaml (line 25) | def get_admin_key_from_yaml(yaml_file_path):
  function create_route (line 34) | def create_route():
  function run (line 58) | def run():

FILE: t/fuzzing/simple_http.py
  function get_admin_key_from_yaml (line 32) | def get_admin_key_from_yaml(yaml_file_path):
  function create_route (line 41) | def create_route():
  function req (line 104) | def req():
  function run_in_thread (line 120) | def run_in_thread():
  function run (line 125) | def run():

FILE: t/fuzzing/simpleroute_test.py
  function get_admin_key_from_yaml (line 26) | def get_admin_key_from_yaml(yaml_file_path):
  function create_route (line 38) | def create_route():
  function run (line 58) | def run():

FILE: t/fuzzing/vars_route_test.py
  function get_admin_key_from_yaml (line 25) | def get_admin_key_from_yaml(yaml_file_path):
  function create_route (line 33) | def create_route():
  function run (line 55) | def run():

FILE: t/grpc_server_example/main.go
  function init (line 66) | func init() {
  type server (line 77) | type server struct
    method SayHello (line 85) | func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*...
    method GetErrResp (line 108) | func (s *server) GetErrResp(ctx context.Context, in *pb.HelloRequest) ...
    method SayHelloAfterDelay (line 122) | func (s *server) SayHelloAfterDelay(ctx context.Context, in *pb.HelloR...
    method Plus (line 140) | func (s *server) Plus(ctx context.Context, in *pb.PlusRequest) (*pb.Pl...
    method EchoStruct (line 145) | func (s *server) EchoStruct(ctx context.Context, in *pb.StructRequest)...
    method SayHelloServerStream (line 154) | func (s *server) SayHelloServerStream(req *pb.HelloRequest, stream pb....
    method SayHelloClientStream (line 169) | func (s *server) SayHelloClientStream(stream pb.Greeter_SayHelloClient...
    method SayHelloBidirectionalStream (line 185) | func (s *server) SayHelloBidirectionalStream(stream pb.Greeter_SayHell...
    method SayMultipleHello (line 207) | func (s *server) SayMultipleHello(ctx context.Context, in *pb.Multiple...
    method Run (line 231) | func (s *server) Run(ctx context.Context, in *pb.Request) (*pb.Respons...
  function gRPCAndHTTPFunc (line 235) | func gRPCAndHTTPFunc(grpcServer *grpc.Server) http.Handler {
  function main (line 250) | func main() {

FILE: t/grpc_server_example/proto/echo.pb.go
  constant _ (line 36) | _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
  constant _ (line 38) | _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
  type StructRequest (line 41) | type StructRequest struct
    method Reset (line 49) | func (x *StructRequest) Reset() {
    method String (line 58) | func (x *StructRequest) String() string {
    method ProtoMessage (line 62) | func (*StructRequest) ProtoMessage() {}
    method ProtoReflect (line 64) | func (x *StructRequest) ProtoReflect() protoreflect.Message {
    method Descriptor (line 77) | func (*StructRequest) Descriptor() ([]byte, []int) {
    method GetData (line 81) | func (x *StructRequest) GetData() *_struct.Struct {
  type StructReply (line 88) | type StructReply struct
    method Reset (line 96) | func (x *StructReply) Reset() {
    method String (line 105) | func (x *StructReply) String() string {
    method ProtoMessage (line 109) | func (*StructReply) ProtoMessage() {}
    method ProtoReflect (line 111) | func (x *StructReply) ProtoReflect() protoreflect.Message {
    method Descriptor (line 124) | func (*StructReply) Descriptor() ([]byte, []int) {
    method GetData (line 128) | func (x *StructReply) GetData() *_struct.Struct {
  function file_proto_echo_proto_rawDescGZIP (line 162) | func file_proto_echo_proto_rawDescGZIP() []byte {
  function init (line 187) | func init() { file_proto_echo_proto_init() }
  function file_proto_echo_proto_init (line 188) | func file_proto_echo_proto_init() {

FILE: t/grpc_server_example/proto/echo_grpc.pb.go
  constant _ (line 19) | _ = grpc.SupportPackageIsVersion7
  type EchoClient (line 24) | type EchoClient interface
  type echoClient (line 28) | type echoClient struct
    method EchoStruct (line 36) | func (c *echoClient) EchoStruct(ctx context.Context, in *StructRequest...
  function NewEchoClient (line 32) | func NewEchoClient(cc grpc.ClientConnInterface) EchoClient {
  type EchoServer (line 48) | type EchoServer interface
  type UnimplementedEchoServer (line 54) | type UnimplementedEchoServer struct
    method EchoStruct (line 57) | func (UnimplementedEchoServer) EchoStruct(context.Context, *StructRequ...
    method mustEmbedUnimplementedEchoServer (line 60) | func (UnimplementedEchoServer) mustEmbedUnimplementedEchoServer() {}
  type UnsafeEchoServer (line 65) | type UnsafeEchoServer interface
  function RegisterEchoServer (line 69) | func RegisterEchoServer(s grpc.ServiceRegistrar, srv EchoServer) {
  function _Echo_EchoStruct_Handler (line 73) | func _Echo_EchoStruct_Handler(srv interface{}, ctx context.Context, dec ...

FILE: t/grpc_server_example/proto/helloworld.pb.go
  constant _ (line 35) | _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
  constant _ (line 37) | _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
  type Gender (line 40) | type Gender
    method Enum (line 62) | func (x Gender) Enum() *Gender {
    method String (line 68) | func (x Gender) String() string {
    method Descriptor (line 72) | func (Gender) Descriptor() protoreflect.EnumDescriptor {
    method Type (line 76) | func (Gender) Type() protoreflect.EnumType {
    method Number (line 80) | func (x Gender) Number() protoreflect.EnumNumber {
    method EnumDescriptor (line 85) | func (Gender) EnumDescriptor() ([]byte, []int) {
  constant Gender_GENDER_UNKNOWN (line 43) | Gender_GENDER_UNKNOWN Gender = 0
  constant Gender_GENDER_MALE (line 44) | Gender_GENDER_MALE    Gender = 1
  constant Gender_GENDER_FEMALE (line 45) | Gender_GENDER_FEMALE  Gender = 2
  type Person (line 89) | type Person struct
    method Reset (line 98) | func (x *Person) Reset() {
    method String (line 107) | func (x *Person) String() string {
    method ProtoMessage (line 111) | func (*Person) ProtoMessage() {}
    method ProtoReflect (line 113) | func (x *Person) ProtoReflect() protoreflect.Message {
    method Descriptor (line 126) | func (*Person) Descriptor() ([]byte, []int) {
    method GetName (line 130) | func (x *Person) GetName() string {
    method GetAge (line 137) | func (x *Person) GetAge() int32 {
  type HelloRequest (line 144) | type HelloRequest struct
    method Reset (line 155) | func (x *HelloRequest) Reset() {
    method String (line 164) | func (x *HelloRequest) String() string {
    method ProtoMessage (line 168) | func (*HelloRequest) ProtoMessage() {}
    method ProtoReflect (line 170) | func (x *HelloRequest) ProtoReflect() protoreflect.Message {
    method Descriptor (line 183) | func (*HelloRequest) Descriptor() ([]byte, []int) {
    method GetName (line 187) | func (x *HelloRequest) GetName() string {
    method GetItems (line 194) | func (x *HelloRequest) GetItems() []string {
    method GetGender (line 201) | func (x *HelloRequest) GetGender() Gender {
    method GetPerson (line 208) | func (x *HelloRequest) GetPerson() *Person {
  type HelloReply (line 215) | type HelloReply struct
    method Reset (line 225) | func (x *HelloReply) Reset() {
    method String (line 234) | func (x *HelloReply) String() string {
    method ProtoMessage (line 238) | func (*HelloReply) ProtoMessage() {}
    method ProtoReflect (line 240) | func (x *HelloReply) ProtoReflect() protoreflect.Message {
    method Descriptor (line 253) | func (*HelloReply) Descriptor() ([]byte, []int) {
    method GetMessage (line 257) | func (x *HelloReply) GetMessage() string {
    method GetItems (line 264) | func (x *HelloReply) GetItems() []string {
    method GetGender (line 271) | func (x *HelloReply) GetGender() Gender {
  type PlusRequest (line 278) | type PlusRequest struct
    method Reset (line 287) | func (x *PlusRequest) Reset() {
    method String (line 296) | func (x *PlusRequest) String() string {
    method ProtoMessage (line 300) | func (*PlusRequest) ProtoMessage() {}
    method ProtoReflect (line 302) | func (x *PlusRequest) ProtoReflect() protoreflect.Message {
    method Descriptor (line 315) | func (*PlusRequest) Descriptor() ([]byte, []int) {
    method GetA (line 319) | func (x *PlusRequest) GetA() int64 {
    method GetB (line 326) | func (x *PlusRequest) GetB() int64 {
  type PlusReply (line 333) | type PlusReply struct
    method Reset (line 341) | func (x *PlusReply) Reset() {
    method String (line 350) | func (x *PlusReply) String() string {
    method ProtoMessage (line 354) | func (*PlusReply) ProtoMessage() {}
    method ProtoReflect (line 356) | func (x *PlusReply) ProtoReflect() protoreflect.Message {
    method Descriptor (line 369) | func (*PlusReply) Descriptor() ([]byte, []int) {
    method GetResult (line 373) | func (x *PlusReply) GetResult() int64 {
  type MultipleHelloRequest (line 380) | type MultipleHelloRequest struct
    method Reset (line 391) | func (x *MultipleHelloRequest) Reset() {
    method String (line 400) | func (x *MultipleHelloRequest) String() string {
    method ProtoMessage (line 404) | func (*MultipleHelloRequest) ProtoMessage() {}
    method ProtoReflect (line 406) | func (x *MultipleHelloRequest) ProtoReflect() protoreflect.Message {
    method Descriptor (line 419) | func (*MultipleHelloRequest) Descriptor() ([]byte, []int) {
    method GetName (line 423) | func (x *MultipleHelloRequest) GetName() string {
    method GetItems (line 430) | func (x *MultipleHelloRequest) GetItems() []string {
    method GetGenders (line 437) | func (x *MultipleHelloRequest) GetGenders() []Gender {
    method GetPersons (line 444) | func (x *MultipleHelloRequest) GetPersons() []*Person {
  type MultipleHelloReply (line 451) | type MultipleHelloReply struct
    method Reset (line 461) | func (x *MultipleHelloReply) Reset() {
    method String (line 470) | func (x *MultipleHelloReply) String() string {
    method ProtoMessage (line 474) | func (*MultipleHelloReply) ProtoMessage() {}
    method ProtoReflect (line 476) | func (x *MultipleHelloReply) ProtoReflect() protoreflect.Message {
    method Descriptor (line 489) | func (*MultipleHelloReply) Descriptor() ([]byte, []int) {
    method GetMessage (line 493) | func (x *MultipleHelloReply) GetMessage() string {
    method GetItems (line 500) | func (x *MultipleHelloReply) GetItems() []string {
    method GetGenders (line 507) | func (x *MultipleHelloReply) GetGenders() []Gender {
  type ErrorDetail (line 514) | type ErrorDetail struct
    method Reset (line 524) | func (x *ErrorDetail) Reset() {
    method String (line 533) | func (x *ErrorDetail) String() string {
    method ProtoMessage (line 537) | func (*ErrorDetail) ProtoMessage() {}
    method ProtoReflect (line 539) | func (x *ErrorDetail) ProtoReflect() protoreflect.Message {
    method Descriptor (line 552) | func (*ErrorDetail) Descriptor() ([]byte, []int) {
    method GetCode (line 556) | func (x *ErrorDetail) GetCode() int64 {
    method GetMessage (line 563) | func (x *ErrorDetail) GetMessage() string {
    method GetType (line 570) | func (x *ErrorDetail) GetType() string {
  function file_proto_helloworld_proto_rawDescGZIP (line 679) | func file_proto_helloworld_proto_rawDescGZIP() []byte {
  function init (line 729) | func init() { file_proto_helloworld_proto_init() }
  function file_proto_helloworld_proto_init (line 730) | func file_proto_helloworld_proto_init() {

FILE: t/grpc_server_example/proto/helloworld_grpc.pb.go
  constant _ (line 19) | _ = grpc.SupportPackageIsVersion7
  type GreeterClient (line 24) | type GreeterClient interface
  type greeterClient (line 39) | type greeterClient struct
    method SayHello (line 47) | func (c *greeterClient) SayHello(ctx context.Context, in *HelloRequest...
    method GetErrResp (line 56) | func (c *greeterClient) GetErrResp(ctx context.Context, in *HelloReque...
    method Plus (line 65) | func (c *greeterClient) Plus(ctx context.Context, in *PlusRequest, opt...
    method SayHelloAfterDelay (line 74) | func (c *greeterClient) SayHelloAfterDelay(ctx context.Context, in *He...
    method SayMultipleHello (line 83) | func (c *greeterClient) SayMultipleHello(ctx context.Context, in *Mult...
    method SayHelloServerStream (line 92) | func (c *greeterClient) SayHelloServerStream(ctx context.Context, in *...
    method SayHelloClientStream (line 124) | func (c *greeterClient) SayHelloClientStream(ctx context.Context, opts...
    method SayHelloBidirectionalStream (line 158) | func (c *greeterClient) SayHelloBidirectionalStream(ctx context.Contex...
  function NewGreeterClient (line 43) | func NewGreeterClient(cc grpc.ClientConnInterface) GreeterClient {
  type Greeter_SayHelloServerStreamClient (line 107) | type Greeter_SayHelloServerStreamClient interface
  type greeterSayHelloServerStreamClient (line 112) | type greeterSayHelloServerStreamClient struct
    method Recv (line 116) | func (x *greeterSayHelloServerStreamClient) Recv() (*HelloReply, error) {
  type Greeter_SayHelloClientStreamClient (line 133) | type Greeter_SayHelloClientStreamClient interface
  type greeterSayHelloClientStreamClient (line 139) | type greeterSayHelloClientStreamClient struct
    method Send (line 143) | func (x *greeterSayHelloClientStreamClient) Send(m *HelloRequest) error {
    method CloseAndRecv (line 147) | func (x *greeterSayHelloClientStreamClient) CloseAndRecv() (*HelloRepl...
  type Greeter_SayHelloBidirectionalStreamClient (line 167) | type Greeter_SayHelloBidirectionalStreamClient interface
  type greeterSayHelloBidirectionalStreamClient (line 173) | type greeterSayHelloBidirectionalStreamClient struct
    method Send (line 177) | func (x *greeterSayHelloBidirectionalStreamClient) Send(m *HelloReques...
    method Recv (line 181) | func (x *greeterSayHelloBidirectionalStreamClient) Recv() (*HelloReply...
  type GreeterServer (line 192) | type GreeterServer interface
  type UnimplementedGreeterServer (line 209) | type UnimplementedGreeterServer struct
    method SayHello (line 212) | func (UnimplementedGreeterServer) SayHello(context.Context, *HelloRequ...
    method GetErrResp (line 215) | func (UnimplementedGreeterServer) GetErrResp(context.Context, *HelloRe...
    method Plus (line 218) | func (UnimplementedGreeterServer) Plus(context.Context, *PlusRequest) ...
    method SayHelloAfterDelay (line 221) | func (UnimplementedGreeterServer) SayHelloAfterDelay(context.Context, ...
    method SayMultipleHello (line 224) | func (UnimplementedGreeterServer) SayMultipleHello(context.Context, *M...
    method SayHelloServerStream (line 227) | func (UnimplementedGreeterServer) SayHelloServerStream(*HelloRequest, ...
    method SayHelloClientStream (line 230) | func (UnimplementedGreeterServer) SayHelloClientStream(Greeter_SayHell...
    method SayHelloBidirectionalStream (line 233) | func (UnimplementedGreeterServer) SayHelloBidirectionalStream(Greeter_...
    method mustEmbedUnimplementedGreeterServer (line 236) | func (UnimplementedGreeterServer) mustEmbedUnimplementedGreeterServer(...
  type UnsafeGreeterServer (line 241) | type UnsafeGreeterServer interface
  function RegisterGreeterServer (line 245) | func RegisterGreeterServer(s grpc.ServiceRegistrar, srv GreeterServer) {
  function _Greeter_SayHello_Handler (line 249) | func _Greeter_SayHello_Handler(srv interface{}, ctx context.Context, dec...
  function _Greeter_GetErrResp_Handler (line 267) | func _Greeter_GetErrResp_Handler(srv interface{}, ctx context.Context, d...
  function _Greeter_Plus_Handler (line 285) | func _Greeter_Plus_Handler(srv interface{}, ctx context.Context, dec fun...
  function _Greeter_SayHelloAfterDelay_Handler (line 303) | func _Greeter_SayHelloAfterDelay_Handler(srv interface{}, ctx context.Co...
  function _Greeter_SayMultipleHello_Handler (line 321) | func _Greeter_SayMultipleHello_Handler(srv interface{}, ctx context.Cont...
  function _Greeter_SayHelloServerStream_Handler (line 339) | func _Greeter_SayHelloServerStream_Handler(srv interface{}, stream grpc....
  type Greeter_SayHelloServerStreamServer (line 347) | type Greeter_SayHelloServerStreamServer interface
  type greeterSayHelloServerStreamServer (line 352) | type greeterSayHelloServerStreamServer struct
    method Send (line 356) | func (x *greeterSayHelloServerStreamServer) Send(m *HelloReply) error {
  function _Greeter_SayHelloClientStream_Handler (line 360) | func _Greeter_SayHelloClientStream_Handler(srv interface{}, stream grpc....
  type Greeter_SayHelloClientStreamServer (line 364) | type Greeter_SayHelloClientStreamServer interface
  type greeterSayHelloClientStreamServer (line 370) | type greeterSayHelloClientStreamServer struct
    method SendAndClose (line 374) | func (x *greeterSayHelloClientStreamServer) SendAndClose(m *HelloReply...
    method Recv (line 378) | func (x *greeterSayHelloClientStreamServer) Recv() (*HelloRequest, err...
  function _Greeter_SayHelloBidirectionalStream_Handler (line 386) | func _Greeter_SayHelloBidirectionalStream_Handler(srv interface{}, strea...
  type Greeter_SayHelloBidirectionalStreamServer (line 390) | type Greeter_SayHelloBidirectionalStreamServer interface
  type greeterSayHelloBidirectionalStreamServer (line 396) | type greeterSayHelloBidirectionalStreamServer struct
    method Send (line 400) | func (x *greeterSayHelloBidirectionalStreamServer) Send(m *HelloReply)...
    method Recv (line 404) | func (x *greeterSayHelloBidirectionalStreamServer) Recv() (*HelloReque...

FILE: t/grpc_server_example/proto/import.pb.go
  constant _ (line 35) | _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
  constant _ (line 37) | _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
  type User (line 40) | type User struct
    method Reset (line 48) | func (x *User) Reset() {
    method String (line 57) | func (x *User) String() string {
    method ProtoMessage (line 61) | func (*User) ProtoMessage() {}
    method ProtoReflect (line 63) | func (x *User) ProtoReflect() protoreflect.Message {
    method Descriptor (line 76) | func (*User) Descriptor() ([]byte, []int) {
    method GetName (line 80) | func (x *User) GetName() string {
  type Response (line 87) | type Response struct
    method Reset (line 95) | func (x *Response) Reset() {
    method String (line 104) | func (x *Response) String() string {
    method ProtoMessage (line 108) | func (*Response) ProtoMessage() {}
    method ProtoReflect (line 110) | func (x *Response) ProtoReflect() protoreflect.Message {
    method Descriptor (line 123) | func (*Response) Descriptor() ([]byte, []int) {
    method GetBody (line 127) | func (x *Response) GetBody() string {
  function file_proto_import_proto_rawDescGZIP (line 151) | func file_proto_import_proto_rawDescGZIP() []byte {
  function init (line 171) | func init() { file_proto_import_proto_init() }
  function file_proto_import_proto_init (line 172) | func file_proto_import_proto_init() {

FILE: t/grpc_server_example/proto/src.pb.go
  constant _ (line 35) | _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
  constant _ (line 37) | _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
  type Request (line 40) | type Request struct
    method Reset (line 49) | func (x *Request) Reset() {
    method String (line 58) | func (x *Request) String() string {
    method ProtoMessage (line 62) | func (*Request) ProtoMessage() {}
    method ProtoReflect (line 64) | func (x *Request) ProtoReflect() protoreflect.Message {
    method Descriptor (line 77) | func (*Request) Descriptor() ([]byte, []int) {
    method GetUser (line 81) | func (x *Request) GetUser() *User {
    method GetBody (line 88) | func (x *Request) GetBody() string {
  function file_proto_src_proto_rawDescGZIP (line 117) | func file_proto_src_proto_rawDescGZIP() []byte {
  function init (line 141) | func init() { file_proto_src_proto_init() }
  function file_proto_src_proto_init (line 142) | func file_proto_src_proto_init() {

FILE: t/grpc_server_example/proto/src_grpc.pb.go
  constant _ (line 19) | _ = grpc.SupportPackageIsVersion7
  type TestImportClient (line 24) | type TestImportClient interface
  type testImportClient (line 28) | type testImportClient struct
    method Run (line 36) | func (c *testImportClient) Run(ctx context.Context, in *Request, opts ...
  function NewTestImportClient (line 32) | func NewTestImportClient(cc grpc.ClientConnInterface) TestImportClient {
  type TestImportServer (line 48) | type TestImportServer interface
  type UnimplementedTestImportServer (line 54) | type UnimplementedTestImportServer struct
    method Run (line 57) | func (UnimplementedTestImportServer) Run(context.Context, *Request) (*...
    method mustEmbedUnimplementedTestImportServer (line 60) | func (UnimplementedTestImportServer) mustEmbedUnimplementedTestImportS...
  type UnsafeTestImportServer (line 65) | type UnsafeTestImportServer interface
  function RegisterTestImportServer (line 69) | func RegisterTestImportServer(s grpc.ServiceRegistrar, srv TestImportSer...
  function _TestImport_Run_Handler (line 73) | func _TestImport_Run_Handler(srv interface{}, ctx context.Context, dec f...

FILE: t/lib/dubbo-backend/dubbo-backend-interface/src/main/java/org/apache/dubbo/backend/DemoService.java
  type DemoService (line 21) | public interface DemoService {;
    method hello (line 28) | Map<String, Object> hello(Map<String, Object> context);
    method fail (line 35) | Map<String, Object> fail(Map<String, Object> context);
    method timeout (line 42) | Map<String, Object> timeout(Map<String, Object> context);
    method badStatus (line 49) | Map<String, Object> badStatus(Map<String, Object> context);

FILE: t/lib/dubbo-backend/dubbo-backend-provider/src/main/java/org/apache/dubbo/backend/provider/DemoServiceImpl.java
  class DemoServiceImpl (line 26) | public class DemoServiceImpl implements DemoService {
    method hello (line 27) | @Override
    method fail (line 43) | @Override
    method timeout (line 51) | @Override
    method badStatus (line 62) | @Override

FILE: t/lib/dubbo-backend/dubbo-backend-provider/src/main/java/org/apache/dubbo/backend/provider/Provider.java
  class Provider (line 24) | public class Provider {
    method main (line 31) | public static void main(String[] args) throws Exception {

FILE: t/lib/dubbo-serialization-backend/dubbo-serialization-backend-interface/src/main/java/org/apache/dubbo/backend/DubboSerializationTestService.java
  type DubboSerializationTestService (line 19) | public interface DubboSerializationTestService {
    method testPoJo (line 21) | PoJo testPoJo(PoJo input);
    method testPoJos (line 23) | PoJo[] testPoJos(PoJo[] input);
    method testVoid (line 25) | void testVoid();
    method testFailure (line 27) | void testFailure();
    method testTimeout (line 29) | void testTimeout();

FILE: t/lib/dubbo-serialization-backend/dubbo-serialization-backend-interface/src/main/java/org/apache/dubbo/backend/PoJo.java
  class PoJo (line 22) | public class PoJo {
    method getaString (line 35) | public String getaString() {
    method setaString (line 39) | public void setaString(String aString) {
    method getaBoolean (line 43) | public Boolean getaBoolean() {
    method setaBoolean (line 47) | public void setaBoolean(Boolean aBoolean) {
    method getaByte (line 51) | public Byte getaByte() {
    method setaByte (line 55) | public void setaByte(Byte aByte) {
    method getAcharacter (line 59) | public Character getAcharacter() {
    method setAcharacter (line 63) | public void setAcharacter(Character acharacter) {
    method getaInt (line 67) | public Integer getaInt() {
    method setaInt (line 71) | public void setaInt(Integer aInt) {
    method getaFloat (line 75) | public Float getaFloat() {
    method setaFloat (line 79) | public void setaFloat(Float aFloat) {
    method getaDouble (line 83) | public Double getaDouble() {
    method setaDouble (line 87) | public void setaDouble(Double aDouble) {
    method getaLong (line 91) | public Long getaLong() {
    method setaLong (line 95) | public void setaLong(Long aLong) {
    method getaShort (line 99) | public Short getaShort() {
    method setaShort (line 103) | public void setaShort(Short aShort) {
    method getStringMap (line 107) | public Map<String, String> getStringMap() {
    method setStringMap (line 111) | public void setStringMap(Map<String, String> stringMap) {
    method getStrings (line 115) | public String[] getStrings() {
    method setStrings (line 119) | public void setStrings(String[] strings) {
    method getTestInstance (line 123) | public static PoJo getTestInstance(){

FILE: t/lib/dubbo-serialization-backend/dubbo-serialization-backend-provider/src/main/java/org/apache/dubbo/backend/provider/DubboSerializationTestServiceImpl.java
  class DubboSerializationTestServiceImpl (line 27) | public class DubboSerializationTestServiceImpl implements DubboSerializa...
    method testPoJo (line 29) | @Override
    method testPoJos (line 34) | @Override
    method testVoid (line 39) | @Override
    method testFailure (line 43) | @Override
    method testTimeout (line 48) | @Override

FILE: t/lib/dubbo-serialization-backend/dubbo-serialization-backend-provider/src/main/java/org/apache/dubbo/backend/provider/Provider.java
  class Provider (line 29) | public class Provider {
    method main (line 36) | public static void main(String[] args) throws Exception {

FILE: t/plugin/grpc-web/server.go
  type routeServiceServer (line 33) | type routeServiceServer struct
    method GetRoute (line 38) | func (rss *routeServiceServer) GetRoute(ctx context.Context, req *pb.Q...
    method GetRoutes (line 58) | func (rss *routeServiceServer) GetRoutes(req *pb.Query, srv pb.RouteSe...
    method GetError (line 71) | func (rss *routeServiceServer) GetError(ctx context.Context, req *pb.Q...
    method LoadRoutes (line 75) | func (rss *routeServiceServer) LoadRoutes() {
  function main (line 93) | func main() {

FILE: t/sse_server_example/main.go
  function completionsHandler (line 29) | func completionsHandler(w http.ResponseWriter, r *http.Request) {
  function logRequest (line 121) | func logRequest(next http.HandlerFunc) http.HandlerFunc {
  function main (line 133) | func main() {

FILE: t/tars/conf/tars.sql
  type `t_task_item` (line 486) | CREATE TABLE `t_task_item` (
  type `t_web_release_conf` (line 514) | CREATE TABLE `t_web_release_conf` (

FILE: t/wasm/fault-injection/main.go
  function main (line 30) | func main() {
  type vmContext (line 34) | type vmContext struct
    method NewPluginContext (line 38) | func (*vmContext) NewPluginContext(contextID uint32) types.PluginConte...
  type pluginContext (line 42) | type pluginContext struct
    method OnPluginStart (line 49) | func (ctx *pluginContext) OnPluginStart(pluginConfigurationSize int) t...
    method NewHttpContext (line 83) | func (ctx *pluginContext) NewHttpContext(contextID uint32) types.HttpC...
  type httpLifecycle (line 87) | type httpLifecycle struct
    method OnHttpRequestHeaders (line 96) | func (ctx *httpLifecycle) OnHttpRequestHeaders(numHeaders int, endOfSt...
  function sampleHit (line 92) | func sampleHit(percentage int) bool {

FILE: t/wasm/forward-auth.go
  function main (line 30) | func main() {
  type vmContext (line 34) | type vmContext struct
    method NewPluginContext (line 38) | func (*vmContext) NewPluginContext(contextID uint32) types.PluginConte...
  type pluginContext (line 47) | type pluginContext struct
    method OnPluginStart (line 60) | func (ctx *pluginContext) OnPluginStart(pluginConfigurationSize int) t...
    method NewHttpContext (line 119) | func (pluginCtx *pluginContext) NewHttpContext(contextID uint32) types...
  type httpContext (line 124) | type httpContext struct
    method dispatchHttpCall (line 130) | func (ctx *httpContext) dispatchHttpCall(elem *fastjson.Value) {
    method OnHttpRequestHeaders (line 167) | func (ctx *httpContext) OnHttpRequestHeaders(numHeaders int, endOfStre...
    method httpCallback (line 185) | func (ctx *httpContext) httpCallback(numHeaders int, bodySize int, num...

FILE: t/wasm/log/main.go
  function main (line 25) | func main() {
  type vmContext (line 29) | type vmContext struct
    method NewPluginContext (line 35) | func (*vmContext) NewPluginContext(contextID uint32) types.PluginConte...
  type pluginContext (line 39) | type pluginContext struct
    method OnPluginStart (line 47) | func (ctx *pluginContext) OnPluginStart(pluginConfigurationSize int) t...
    method OnPluginDone (line 58) | func (ctx *pluginContext) OnPluginDone() bool {
    method NewHttpContext (line 63) | func (ctx *pluginContext) NewHttpContext(contextID uint32) types.HttpC...
  type httpLifecycle (line 67) | type httpLifecycle struct
    method OnHttpRequestHeaders (line 76) | func (ctx *httpLifecycle) OnHttpRequestHeaders(numHeaders int, endOfSt...

FILE: t/wasm/request-body/main.go
  function main (line 26) | func main() {
  type vmContext (line 30) | type vmContext struct
    method NewPluginContext (line 34) | func (*vmContext) NewPluginContext(contextID uint32) types.PluginConte...
  type pluginContext (line 38) | type pluginContext struct
    method OnPluginStart (line 46) | func (ctx *pluginContext) OnPluginStart(pluginConfigurationSize int) t...
    method NewHttpContext (line 67) | func (ctx *pluginContext) NewHttpContext(contextID uint32) types.HttpC...
  type httpContext (line 71) | type httpContext struct
    method OnHttpRequestHeaders (line 77) | func (ctx *httpContext) OnHttpRequestHeaders(numHeaders int, endOfStre...
    method OnHttpRequestBody (line 85) | func (ctx *httpContext) OnHttpRequestBody(bodySize int, endOfStream bo...

FILE: t/wasm/response-rewrite/main.go
  function main (line 27) | func main() {
  type vmContext (line 31) | type vmContext struct
    method NewPluginContext (line 35) | func (*vmContext) NewPluginContext(contextID uint32) types.PluginConte...
  type header (line 39) | type header struct
  type pluginContext (line 44) | type pluginContext struct
    method OnPluginStart (line 50) | func (ctx *pluginContext) OnPluginStart(pluginConfigurationSize int) t...
    method NewHttpContext (line 78) | func (ctx *pluginContext) NewHttpContext(contextID uint32) types.HttpC...
  type httpContext (line 82) | type httpContext struct
    method OnHttpResponseHeaders (line 87) | func (ctx *httpContext) OnHttpResponseHeaders(numHeaders int, endOfStr...
    method OnHttpResponseBody (line 100) | func (ctx *httpContext) OnHttpResponseBody(bodySize int, endOfStream b...

FILE: t/xds-library/export.go
  function initial (line 24) | func initial(config_zone unsafe.Pointer, version_zone unsafe.Pointer) {

FILE: t/xds-library/main.go
  function main (line 42) | func main() {
  function write_config (line 45) | func write_config(config_zone unsafe.Pointer, version_zone unsafe.Pointe...
  function get_version (line 97) | func get_version() string {
  function update_conf_version (line 101) | func update_conf_version(zone unsafe.Pointer) {
  function write_shdict (line 117) | func write_shdict(key string, value string, zone unsafe.Pointer) {

FILE: t/xds-library/xds.h
  function ngx_lua_ffi_shdict_store (line 23) | void ngx_lua_ffi_shdict_store(void *zone, int op,

FILE: utils/check-category.py
  function collect_fn (line 31) | def collect_fn(entries, topic):
  function check_category (line 42) | def check_category(root):

FILE: utils/fix-zh-doc-segment.py
  function need_fold (line 24) | def need_fold(pre, cur):
  function check_segment (line 39) | def check_segment(root):
Copy disabled (too large) Download .json
Condensed preview — 1573 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (13,928K chars).
[
  {
    "path": ".gitmodules",
    "chars": 397,
    "preview": "[submodule \"t/toolkit\"]\n\tpath = t/toolkit\n\turl = https://github.com/api7/test-toolkit.git\n[submodule \".github/actions/ac"
  },
  {
    "path": ".ignore_words",
    "chars": 46,
    "preview": "iam\nte\nba\nue\nshttp\nnd\nhel\nnulll\nsmove\naks\nnin\n"
  },
  {
    "path": ".licenserc.yaml",
    "chars": 1798,
    "preview": "#\n# Licensed to the Apache Software Foundation (ASF) under one or more\n# contributor license agreements.  See the NOTICE"
  },
  {
    "path": ".markdownlint.yml",
    "chars": 1007,
    "preview": "#\n# Licensed to the Apache Software Foundation (ASF) under one or more\n# contributor license agreements.  See the NOTICE"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 143831,
    "preview": "---\ntitle: Changelog\n---\n\n<!--\n#\n# Licensed to the Apache Software Foundation (ASF) under one or more\n# contributor lice"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 9631,
    "preview": "<!--\n#\n# Licensed to the Apache Software Foundation (ASF) under one or more\n# contributor license agreements.  See the N"
  },
  {
    "path": "CODE_STYLE.md",
    "chars": 7215,
    "preview": "---\ntitle: APISIX Lua Coding Style Guide\n---\n\n<!--\n#\n# Licensed to the Apache Software Foundation (ASF) under one or mor"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 8088,
    "preview": "<!--\n#\n# Licensed to the Apache Software Foundation (ASF) under one or more\n# contributor license agreements.  See the N"
  },
  {
    "path": "LICENSE",
    "chars": 12204,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "MAINTAIN.md",
    "chars": 6359,
    "preview": "<!--\n#\n# Licensed to the Apache Software Foundation (ASF) under one or more\n# contributor license agreements.  See the N"
  },
  {
    "path": "Makefile",
    "chars": 19503,
    "preview": "#\n# Licensed to the Apache Software Foundation (ASF) under one or more\n# contributor license agreements.  See the NOTICE"
  },
  {
    "path": "NOTICE",
    "chars": 167,
    "preview": "Apache APISIX\nCopyright 2019-2025 The Apache Software Foundation\n\nThis product includes software developed at\nThe Apache"
  },
  {
    "path": "README.md",
    "chars": 17538,
    "preview": "<!--\n#\n# Licensed to the Apache Software Foundation (ASF) under one or more\n# contributor license agreements.  See the N"
  },
  {
    "path": "THREAT_MODEL.md",
    "chars": 2726,
    "preview": "<!--\n#\n# Licensed to the Apache Software Foundation (ASF) under one or more\n# contributor license agreements.  See the N"
  },
  {
    "path": "Vision-and-Milestones.md",
    "chars": 1880,
    "preview": "<!--\n#\n# Licensed to the Apache Software Foundation (ASF) under one or more\n# contributor license agreements.  See the N"
  },
  {
    "path": "apisix/admin/consumer_group.lua",
    "chars": 2456,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/admin/consumers.lua",
    "chars": 2651,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/admin/credentials.lua",
    "chars": 3212,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/admin/global_rules.lua",
    "chars": 3061,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/admin/init.lua",
    "chars": 15489,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/admin/plugin_config.lua",
    "chars": 2434,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/admin/plugin_metadata.lua",
    "chars": 3379,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/admin/plugins.lua",
    "chars": 4171,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/admin/proto.lua",
    "chars": 3969,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/admin/resource.lua",
    "chars": 13319,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/admin/routes.lua",
    "chars": 6494,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/admin/schema.lua",
    "chars": 1155,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/admin/secrets.lua",
    "chars": 1621,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/admin/services.lua",
    "chars": 4885,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/admin/ssl.lua",
    "chars": 1300,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/admin/standalone.lua",
    "chars": 18470,
    "preview": "-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOTICE"
  },
  {
    "path": "apisix/admin/stream_routes.lua",
    "chars": 5337,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/admin/upstreams.lua",
    "chars": 4903,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/admin/utils.lua",
    "chars": 3555,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/admin/v3_adapter.lua",
    "chars": 6663,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/api_router.lua",
    "chars": 3844,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/balancer/chash.lua",
    "chars": 5020,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/balancer/ewma.lua",
    "chars": 6855,
    "preview": "-- Original Authors: Shiv Nagarajan & Scott Francis\n-- Accessed: March 12, 2018\n-- Inspiration drawn from:\n-- https://gi"
  },
  {
    "path": "apisix/balancer/least_conn.lua",
    "chars": 3785,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/balancer/priority.lua",
    "chars": 2695,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/balancer/roundrobin.lua",
    "chars": 3004,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/balancer.lua",
    "chars": 13370,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/cli/apisix.lua",
    "chars": 1622,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/cli/config.lua",
    "chars": 10794,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/cli/env.lua",
    "chars": 4139,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/cli/etcd.lua",
    "chars": 12553,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/cli/file.lua",
    "chars": 10461,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/cli/ip.lua",
    "chars": 1874,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/cli/ngx_tpl.lua",
    "chars": 35103,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/cli/ops.lua",
    "chars": 33026,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/cli/schema.lua",
    "chars": 15527,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/cli/util.lua",
    "chars": 5153,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/constants.lua",
    "chars": 1607,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/consumer.lua",
    "chars": 11221,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/consumer_group.lua",
    "chars": 1808,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/control/router.lua",
    "chars": 6382,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/control/v1.lua",
    "chars": 14294,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/config_etcd.lua",
    "chars": 35875,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/config_local.lua",
    "chars": 2208,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/config_util.lua",
    "chars": 6334,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/config_xds.lua",
    "chars": 10391,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/config_yaml.lua",
    "chars": 17338,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/ctx.lua",
    "chars": 15073,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/dns/client.lua",
    "chars": 5040,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/env.lua",
    "chars": 2865,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/etcd.lua",
    "chars": 17372,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/event.lua",
    "chars": 1199,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/id.lua",
    "chars": 5236,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/io.lua",
    "chars": 1515,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/ip.lua",
    "chars": 2367,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/json.lua",
    "chars": 3905,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/log.lua",
    "chars": 4470,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/lrucache.lua",
    "chars": 8206,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/math.lua",
    "chars": 1170,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/os.lua",
    "chars": 2917,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/profile.lua",
    "chars": 2130,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/pubsub.lua",
    "chars": 6817,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/request.lua",
    "chars": 10391,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/resolver.lua",
    "chars": 2950,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/response.lua",
    "chars": 6026,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/schema.lua",
    "chars": 2106,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/string.lua",
    "chars": 3985,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/table.lua",
    "chars": 6926,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/timer.lua",
    "chars": 2761,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/utils.lua",
    "chars": 12676,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core/version.lua",
    "chars": 899,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/core.lua",
    "chars": 2747,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/debug.lua",
    "chars": 8222,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/discovery/consul/init.lua",
    "chars": 25190,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/discovery/consul/schema.lua",
    "chars": 3245,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/discovery/consul_kv/init.lua",
    "chars": 14040,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/discovery/consul_kv/schema.lua",
    "chars": 2999,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/discovery/dns/init.lua",
    "chars": 2853,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/discovery/dns/schema.lua",
    "chars": 1454,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/discovery/eureka/init.lua",
    "chars": 8317,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/discovery/eureka/schema.lua",
    "chars": 1513,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/discovery/init.lua",
    "chars": 1490,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/discovery/kubernetes/informer_factory.lua",
    "chars": 10250,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/discovery/kubernetes/init.lua",
    "chars": 27169,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/discovery/kubernetes/schema.lua",
    "chars": 7007,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/discovery/nacos/init.lua",
    "chars": 13336,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/discovery/nacos/schema.lua",
    "chars": 2123,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/discovery/tars/init.lua",
    "chars": 10951,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/discovery/tars/schema.lua",
    "chars": 1899,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/events.lua",
    "chars": 2697,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/global_rules.lua",
    "chars": 1887,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/healthcheck_manager.lua",
    "chars": 11557,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/http/route.lua",
    "chars": 5257,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/http/router/radixtree_host_uri.lua",
    "chars": 6540,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/http/router/radixtree_uri.lua",
    "chars": 1982,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/http/router/radixtree_uri_with_parameter.lua",
    "chars": 1998,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/http/service.lua",
    "chars": 1981,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/include/apisix/model/pubsub.proto",
    "chars": 4046,
    "preview": "//\n// Licensed to the Apache Software Foundation (ASF) under one or more\n// contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/init.lua",
    "chars": 43955,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/inspect/dbg.lua",
    "chars": 4330,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/inspect/init.lua",
    "chars": 3509,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/patch.lua",
    "chars": 10478,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugin.lua",
    "chars": 45678,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugin_config.lua",
    "chars": 2750,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-aliyun-content-moderation.lua",
    "chars": 16701,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-aws-content-moderation.lua",
    "chars": 5125,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-drivers/aimlapi.lua",
    "chars": 966,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-drivers/anthropic.lua",
    "chars": 971,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-drivers/azure-openai.lua",
    "chars": 956,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-drivers/deepseek.lua",
    "chars": 967,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-drivers/gemini.lua",
    "chars": 998,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-drivers/openai-base.lua",
    "chars": 14256,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-drivers/openai-compatible.lua",
    "chars": 866,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-drivers/openai.lua",
    "chars": 968,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-drivers/openrouter.lua",
    "chars": 971,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-drivers/schema.lua",
    "chars": 2395,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-drivers/sse.lua",
    "chars": 3412,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-drivers/vertex-ai.lua",
    "chars": 5842,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-prompt-decorator.lua",
    "chars": 3086,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-prompt-guard.lua",
    "chars": 4385,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-prompt-template.lua",
    "chars": 4032,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-proxy/base.lua",
    "chars": 3825,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-proxy/schema.lua",
    "chars": 9017,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-proxy-multi.lua",
    "chars": 15176,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-proxy.lua",
    "chars": 2278,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-rag/embeddings/azure_openai.lua",
    "chars": 2437,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-rag/vector-search/azure_ai_search.lua",
    "chars": 2182,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-rag.lua",
    "chars": 5268,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-rate-limiting.lua",
    "chars": 8848,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai-request-rewrite.lua",
    "chars": 6410,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ai.lua",
    "chars": 11356,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/api-breaker.lua",
    "chars": 7816,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/attach-consumer-label.lua",
    "chars": 1962,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/authz-casbin.lua",
    "chars": 4077,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/authz-casdoor.lua",
    "chars": 5853,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/authz-keycloak.lua",
    "chars": 26413,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/aws-lambda.lua",
    "chars": 6976,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/azure-functions.lua",
    "chars": 2433,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/basic-auth.lua",
    "chars": 5498,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/batch-requests.lua",
    "chars": 8529,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/body-transformer.lua",
    "chars": 7505,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/brotli.lua",
    "chars": 6665,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/cas-auth.lua",
    "chars": 6816,
    "preview": "--\n---- Licensed to the Apache Software Foundation (ASF) under one or more\n---- contributor license agreements.  See the"
  },
  {
    "path": "apisix/plugins/chaitin-waf.lua",
    "chars": 12248,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/clickhouse-logger.lua",
    "chars": 7324,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/client-control.lua",
    "chars": 2203,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/consumer-restriction.lua",
    "chars": 4559,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/cors.lua",
    "chars": 13992,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/csrf.lua",
    "chars": 4552,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/datadog.lua",
    "chars": 9799,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/degraphql.lua",
    "chars": 4113,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/dubbo-proxy.lua",
    "chars": 1871,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/echo.lua",
    "chars": 3300,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/elasticsearch-logger.lua",
    "chars": 9394,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/error-log-logger.lua",
    "chars": 17143,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/example-plugin.lua",
    "chars": 3908,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ext-plugin/helper.lua",
    "chars": 2255,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ext-plugin/init.lua",
    "chars": 31677,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ext-plugin-post-req.lua",
    "chars": 1201,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ext-plugin-post-resp.lua",
    "chars": 4887,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ext-plugin-pre-req.lua",
    "chars": 1201,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/fault-injection.lua",
    "chars": 4995,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/file-logger.lua",
    "chars": 5967,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/forward-auth.lua",
    "chars": 6649,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/gm.lua",
    "chars": 5445,
    "preview": "-- Licensed to the Apache Software Foundation (ASF) under one\n-- or more contributor license agreements.  See the NOTICE"
  },
  {
    "path": "apisix/plugins/google-cloud-logging.lua",
    "chars": 8787,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/grpc-transcode/proto.lua",
    "chars": 8650,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/grpc-transcode/request.lua",
    "chars": 2515,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/grpc-transcode/response.lua",
    "chars": 5016,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/grpc-transcode/util.lua",
    "chars": 6224,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/grpc-transcode.lua",
    "chars": 6119,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/grpc-web.lua",
    "chars": 10437,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/gzip.lua",
    "chars": 4419,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/hmac-auth.lua",
    "chars": 11627,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/http-dubbo.lua",
    "chars": 7836,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/http-logger.lua",
    "chars": 7356,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/inspect.lua",
    "chars": 1583,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ip-restriction/init.lua",
    "chars": 3249,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/ip-restriction.lua",
    "chars": 1039,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/jwe-decrypt.lua",
    "chars": 7368,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/jwt-auth/parser.lua",
    "chars": 9674,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/jwt-auth.lua",
    "chars": 11166,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/kafka-logger.lua",
    "chars": 10226,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/kafka-proxy.lua",
    "chars": 1694,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  },
  {
    "path": "apisix/plugins/key-auth.lua",
    "chars": 3812,
    "preview": "--\n-- Licensed to the Apache Software Foundation (ASF) under one or more\n-- contributor license agreements.  See the NOT"
  }
]

// ... and 1373 more files (download for full content)

About this extraction

This page contains the full source code of the apache/apisix GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1573 files (12.6 MB), approximately 3.4M tokens, and a symbol index with 436 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!