Full Code of Kong/kong for AI

master 58f2daa56b90 cached
2479 files
14.1 MB
3.8M tokens
231 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (15,286K chars total). Download the full file to get everything.
Repository: Kong/kong
Branch: master
Commit: 58f2daa56b90
Files: 2479
Total size: 14.1 MB

Directory structure:
gitextract_m8kek0kp/

├── .bazelignore
├── .bazelrc
├── .bazelversion
├── .busted
├── .ci/
│   ├── ast-grep/
│   │   ├── README.md
│   │   ├── common/
│   │   │   └── .gitkeep
│   │   ├── rules/
│   │   │   ├── .gitkeep
│   │   │   ├── assert-eventually-terminated.yml
│   │   │   ├── helpers-outside-of-setup.yml
│   │   │   └── ngx-log-string-concat.yml
│   │   └── tests/
│   │       ├── .gitkeep
│   │       ├── __snapshots__/
│   │       │   ├── assert-eventually-terminated-snapshot.yml
│   │       │   ├── helpers-outside-of-setup-snapshot.yml
│   │       │   └── ngx-log-string-concat-snapshot.yml
│   │       ├── assert-eventually-terminated-test.yml
│   │       ├── helpers-outside-of-setup-test.yml
│   │       └── ngx-log-string-concat-test.yml
│   ├── luacov-stats-aggregator.lua
│   └── test_suites.json
├── .devcontainer/
│   ├── Dockerfile
│   ├── devcontainer.json
│   └── docker-compose.yml
├── .editorconfig
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yaml
│   │   └── config.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── actions/
│   │   ├── build-cache-key/
│   │   │   └── action.yml
│   │   └── build-wasm-test-filters/
│   │       └── action.yml
│   ├── dependabot.yml
│   ├── labeler.yml
│   ├── matrix-commitly.yml
│   ├── matrix-full.yml
│   └── workflows/
│       ├── add-release-pongo.yml
│       ├── ast-grep.yml
│       ├── auto-assignee.yml
│       ├── autodocs.yml
│       ├── backport-fail-bot.yml
│       ├── backport-v2.yml
│       ├── build.yml
│       ├── build_and_test.yml
│       ├── buildifier.yml
│       ├── changelog-requirement.yml
│       ├── changelog-validation.yml
│       ├── cherry-picks-v2.yml
│       ├── community-stale.yml
│       ├── copyright-check.yml
│       ├── deck-integration.yml
│       ├── label-check.yml
│       ├── label-community-pr.yml
│       ├── label-schema.yml
│       ├── labeler-v2.yml
│       ├── openresty-patches-companion.yml
│       ├── perf.yml
│       ├── release.yml
│       ├── update-ngx-wasm-module.yml
│       ├── update-test-runtime-statistics.yml
│       └── upgrade-tests.yml
├── .gitignore
├── .luacheckrc
├── .luacov
├── .requirements
├── BUILD.bazel
├── CHANGELOG-OLD.md
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── COMMUNITY_PLEDGE.md
├── CONTRIBUTING.md
├── COPYRIGHT
├── DEVELOPER.md
├── LICENSE
├── MODULE.bazel
├── Makefile
├── README.md
├── SECURITY.md
├── UPGRADE.md
├── WORKSPACE
├── autodoc/
│   ├── README.md
│   ├── cli/
│   │   ├── data.lua
│   │   └── generate.lua
│   └── pdk/
│       ├── generate.lua
│       └── ldoc/
│           ├── config.ld
│           ├── filters.lua
│           ├── json.ltp
│           ├── ldoc.ltp
│           └── nav_yml.ltp
├── bin/
│   ├── busted
│   ├── kong
│   └── kong-health
├── build/
│   ├── BUILD.bazel
│   ├── README.md
│   ├── build_system.bzl
│   ├── cross_deps/
│   │   ├── BUILD.bazel
│   │   ├── README.md
│   │   ├── libxcrypt/
│   │   │   ├── 001-4.4.27-enable-hash-all.patch
│   │   │   ├── BUILD.bazel
│   │   │   ├── BUILD.libxcrypt.bazel
│   │   │   └── repositories.bzl
│   │   ├── libyaml/
│   │   │   ├── BUILD.bazel
│   │   │   ├── BUILD.libyaml.bazel
│   │   │   └── repositories.bzl
│   │   ├── repositories.bzl
│   │   └── zlib/
│   │       ├── BUILD.bazel
│   │       ├── BUILD.zlib.bazel
│   │       └── repositories.bzl
│   ├── dockerfiles/
│   │   ├── deb.Dockerfile
│   │   ├── entrypoint.sh
│   │   └── rpm.Dockerfile
│   ├── kong_bindings.bzl
│   ├── kong_crate/
│   │   ├── BUILD.bazel
│   │   ├── crates.bzl
│   │   └── deps.bzl
│   ├── libexpat/
│   │   ├── BUILD.bazel
│   │   ├── BUILD.libexpat.bazel
│   │   └── repositories.bzl
│   ├── luarocks/
│   │   ├── BUILD.bazel
│   │   ├── BUILD.luarocks.bazel
│   │   ├── lua/
│   │   │   ├── BUILD.bazel
│   │   │   ├── BUILD.lua.bazel
│   │   │   ├── lua_repositories.bzl
│   │   │   └── patches/
│   │   │       └── lua-cross.patch
│   │   ├── luarocks_repositories.bzl
│   │   ├── luarocks_wrap_script.lua
│   │   └── templates/
│   │       ├── luarocks_exec.sh
│   │       ├── luarocks_make.sh
│   │       └── luarocks_target.sh
│   ├── nfpm/
│   │   ├── BUILD.bazel
│   │   ├── BUILD.nfpm.bazel
│   │   ├── repositories.bzl
│   │   └── rules.bzl
│   ├── openresty/
│   │   ├── BUILD.bazel
│   │   ├── BUILD.openresty.bazel
│   │   ├── ada/
│   │   │   ├── BUILD.bazel
│   │   │   └── ada_repositories.bzl
│   │   ├── atc_router/
│   │   │   ├── BUILD.atc_router.bazel
│   │   │   ├── BUILD.bazel
│   │   │   └── atc_router_repositories.bzl
│   │   ├── brotli/
│   │   │   ├── BUILD.bazel
│   │   │   └── brotli_repositories.bzl
│   │   ├── lua-resty-lmdb-cross.patch
│   │   ├── openssl/
│   │   │   ├── BUILD.bazel
│   │   │   ├── README.md
│   │   │   ├── openssl.bzl
│   │   │   └── openssl_repositories.bzl
│   │   ├── patches/
│   │   │   ├── LuaJIT-2.1-20250117_01-patch-macro-luajit-version.patch
│   │   │   ├── LuaJIT-2.1-20250117_02-pass-cc-env.patch
│   │   │   ├── LuaJIT-2.1-20250117_03-revert-reflect-override-of-ljlibd.patch
│   │   │   ├── lua-cjson-2.1.0.14_01-error-on-t-end.patch
│   │   │   ├── nginx-1.27.1_01-upstream-client-certificate-and-ssl-verify.patch
│   │   │   ├── nginx-1.27.1_02-remove-server-tokens-from-special-responses-output.patch
│   │   │   ├── nginx-1.27.1_03-stream-upstream-client-certificate-and-ssl-verify.patch
│   │   │   ├── nginx-1.27.1_04-grpc-authority-override.patch
│   │   │   ├── nginx-1.27.1_05-remove-server-headers-from-ngx-header-filter-module.patch
│   │   │   ├── nginx-1.27.1_06-dynamic-log-level.patch
│   │   │   ├── nginx-1.27.1_07-cross.patch
│   │   │   ├── nginx-1.27.1_08-cross-endianness-fix.patch
│   │   │   ├── nginx-1.27.1_09-proxy-upstream-next.patch
│   │   │   ├── nginx-1.27.1_10-refresh-uri-when-proxy-pass-balancer-recreate.patch
│   │   │   ├── nginx-1.27.1_11-upstream-latency-metrics.patch
│   │   │   ├── ngx_lua-0.10.28_01-dynamic-log-level.patch
│   │   │   ├── ngx_lua-0.10.28_02-fix-invalid-hostname.patch
│   │   │   ├── ngx_lua-0.10.28_03-missing-lightud.patch
│   │   │   ├── ngx_stream_lua-0.0.16_01-expose-request-struct.patch
│   │   │   └── openresty_01-custom-prefix-and-cc.patch
│   │   ├── pcre/
│   │   │   ├── BUILD.bazel
│   │   │   ├── BUILD.pcre.bazel
│   │   │   ├── README.md
│   │   │   └── pcre_repositories.bzl
│   │   ├── repositories.bzl
│   │   ├── simdjson_ffi/
│   │   │   ├── BUILD.bazel
│   │   │   └── simdjson_ffi_repositories.bzl
│   │   ├── snappy/
│   │   │   ├── BUILD.bazel
│   │   │   └── snappy_repositories.bzl
│   │   └── wasmx/
│   │       ├── BUILD.bazel
│   │       ├── filters/
│   │       │   ├── BUILD.bazel
│   │       │   ├── repositories.bzl
│   │       │   └── variables.bzl
│   │       ├── rules.bzl
│   │       └── wasmx_repositories.bzl
│   ├── package/
│   │   ├── kong.logrotate
│   │   ├── kong.service
│   │   ├── nfpm.yaml
│   │   └── postinstall.sh
│   ├── patches/
│   │   ├── 01-revert-LD-environment.patch
│   │   └── 02-revert-Reduce-build-times-especially-on-windows.patch
│   ├── platforms/
│   │   └── distro/
│   │       └── BUILD
│   ├── repositories.bzl
│   ├── templates/
│   │   ├── venv-commons
│   │   ├── venv.fish
│   │   └── venv.sh
│   └── toolchain/
│       ├── .gitignore
│       ├── BUILD
│       ├── bindings.bzl
│       ├── cc_toolchain_config.bzl
│       ├── generate_wrappers.sh
│       ├── managed_toolchain.bzl
│       └── repositories.bzl
├── changelog/
│   ├── 3.5.0/
│   │   ├── 3.5.0.md
│   │   └── kong/
│   │       ├── .gitkeep
│   │       ├── 10570.yml
│   │       ├── 11360-1.yml
│   │       ├── 11360-2.yml
│   │       ├── 11402.yml
│   │       ├── 11424.yml
│   │       ├── 11442.yml
│   │       ├── 11464.yml
│   │       ├── 11468.yml
│   │       ├── 11480.yml
│   │       ├── 11484.yml
│   │       ├── 11502.yml
│   │       ├── 11515.yml
│   │       ├── 11518.yml
│   │       ├── 11523.yml
│   │       ├── 11532.yml
│   │       ├── 11538.yml
│   │       ├── 11551-1.yml
│   │       ├── 11551-2.yml
│   │       ├── 11553.yml
│   │       ├── 11566.yml
│   │       ├── 11578.yml
│   │       ├── 11599.yml
│   │       ├── 11613.yml
│   │       ├── 11638.yml
│   │       ├── 11639.yml
│   │       ├── 11727.yml
│   │       ├── aws_lambda_service_cache.yml
│   │       ├── bump_openssl_3.1.4.yml
│   │       ├── dedicated_config_processing.yml
│   │       ├── fix-cve-2023-44487.yml
│   │       ├── fix-opentelemetry-parent-id.yml
│   │       ├── fix-tcp-log-sslhandshake.yml
│   │       ├── fix_dns_enable_dns_no_sync.yml
│   │       ├── fix_patch_order.yml
│   │       ├── lapis_version_bump.yml
│   │       ├── lua_kong_nginx_module_bump.yml
│   │       ├── luajit_ldp_stp_fusion.yml
│   │       ├── ngx_wasm_module_bump.yml
│   │       ├── on_prem_dp_metadata.yml
│   │       ├── per_reqeuest_deubgging.yml
│   │       ├── plugin-configure-phase.yml
│   │       ├── request-aware-table.yml
│   │       ├── request_id.yml
│   │       ├── session_do_not_read_body_by_default.yml
│   │       ├── vault-declarative.yml
│   │       ├── vault-init-warmup.yml
│   │       ├── vault-resurrect.yml
│   │       ├── wasm-filter-config-schemas.yml
│   │       ├── wasm-filter-json-config.yml
│   │       └── wasmtime_version_bump.yml
│   ├── 3.6.0/
│   │   ├── 3.6.0.md
│   │   ├── kong/
│   │   │   ├── .gitkeep
│   │   │   ├── add-ai-prompt-decorator-plugin.yml
│   │   │   ├── add-ai-prompt-guard-plugin.yml
│   │   │   ├── add-ai-prompt-template-plugin.yml
│   │   │   ├── add-ai-proxy-plugin.yml
│   │   │   ├── add-ai-proxy-telemetry.yml
│   │   │   ├── add-ai-request-transformer-plugin.yml
│   │   │   ├── add-ai-response-transformer-plugin.yml
│   │   │   ├── add-gateway-edition-to-root-endpoint-admin-api.yml
│   │   │   ├── add_ngx_brotli_module.yml
│   │   │   ├── atc_reuse_context.yml
│   │   │   ├── basic_www_authenticate.yml
│   │   │   ├── bump-atc-router.yml
│   │   │   ├── bump-cocurrency-limit-of-timer-ng.yml
│   │   │   ├── bump-lapis-1.16.0.1.yml
│   │   │   ├── bump-lpeg-1.1.0.yml
│   │   │   ├── bump-lua-messagepack-0.5.3.yml
│   │   │   ├── bump-lua-messagepack-0.5.4.yml
│   │   │   ├── bump-lua-resty-aws-1.3.6.yml
│   │   │   ├── bump-lua-resty-healthcheck-3.0.1.yml
│   │   │   ├── bump-lua-resty-lmdb-1.4.1.yml
│   │   │   ├── bump-lua-resty-timer-ng-to-0.2.6.yml
│   │   │   ├── bump-ngx-wasm-module.yml
│   │   │   ├── bump-openresty.yml
│   │   │   ├── bump-openssl.yml
│   │   │   ├── bump-resty-openssl.yml
│   │   │   ├── bump-wasmtime.yml
│   │   │   ├── bump_dns_stale_ttl.yml
│   │   │   ├── bump_ngx_brotli.yml
│   │   │   ├── bump_openssl_from_3_1_4_to_3_2_0.yml
│   │   │   ├── ca_certificates_reference_check.yml
│   │   │   ├── clustering-empty-data-plane-hash-fix.yml
│   │   │   ├── cookie-name-validator.yml
│   │   │   ├── cp-expose-dp-cert-details.yml
│   │   │   ├── dao-pk-as-entity.yml
│   │   │   ├── debian-12-support.yml
│   │   │   ├── declarative_config_fix.yml
│   │   │   ├── default_status_port.yml
│   │   │   ├── deps_bump_lua_resty_healthcheck.yml
│   │   │   ├── display-warning-message-for-km-misconfig.yml
│   │   │   ├── enhance_admin_api_auth_error_response.yml
│   │   │   ├── error_handler_494.yml
│   │   │   ├── expression_http_headers_sensitive.yml
│   │   │   ├── expressions_not_operator.yml
│   │   │   ├── feat-add-cipher-to-the-intermediate.yml
│   │   │   ├── fix-declarative-config-flattened-data-loss.yml
│   │   │   ├── fix-error-message-print.yml
│   │   │   ├── fix-ldoc-intermittent-fail.yml
│   │   │   ├── fix-pdk-response-set-header-with-table.yml
│   │   │   ├── fix-upstream-uri-azure-function-plugin.yml
│   │   │   ├── fix-wasm-module-branch.yml
│   │   │   ├── fix_dns_blocking.yml
│   │   │   ├── fix_dns_disable_dns_no_sync.yml
│   │   │   ├── fix_dns_instrument_error_handling.yml
│   │   │   ├── inject-nginx-directives-location.yml
│   │   │   ├── introduce_lmdb_validation_tag.yml
│   │   │   ├── log-serializer-source-property.yml
│   │   │   ├── optimize_keepalive_parameters.yml
│   │   │   ├── pdk-json-encoding-numbers-precision.yml
│   │   │   ├── pdk-response-send-remove-transfer-encoding.yml
│   │   │   ├── perf-tracing-from-timers.yml
│   │   │   ├── plugin-server-instance-leak.yml
│   │   │   ├── postremove.yml
│   │   │   ├── prometheus_expose_no_service_metrics.yml
│   │   │   ├── rate-limiting-fix-redis-sync-rate.yml
│   │   │   ├── respect-custom-proxy_access_log.yml
│   │   │   ├── rl-shared-sync-timer.yml
│   │   │   ├── router-report-yield.yml
│   │   │   ├── serviceless-routes-still-trigger-datalog-plugin.yml
│   │   │   ├── standardize-redis-conifguration-acme.yml
│   │   │   ├── standardize-redis-conifguration-rate-limiting.yml
│   │   │   ├── standardize-redis-conifguration-response-rl.yml
│   │   │   ├── subsystems_do_not_share_router_schemas.yml
│   │   │   ├── support_http_path_segments_field.yml
│   │   │   ├── support_net_src_dst_field_in_expression.yml
│   │   │   ├── tracing-dns-query-patch.yml
│   │   │   ├── tracing-sampling-rate-scope.yml
│   │   │   ├── validate_private_key.yml
│   │   │   ├── wasm-attach.yml
│   │   │   ├── wasm-dynamic-properties.yml
│   │   │   └── wasm-injected-shm-kv.yml
│   │   └── kong-manager/
│   │       ├── entity_form_preview.yml
│   │       ├── redesigned_basic_components.yml
│   │       ├── standardized_notification_format.yml
│   │       └── unified_plugin_pages.yml
│   ├── 3.7.0/
│   │   ├── 3.7.0.md
│   │   ├── kong/
│   │   │   ├── .gitkeep
│   │   │   ├── add-ai-data-report.yml
│   │   │   ├── add-messages-api-to-anthropic.yml
│   │   │   ├── add_tzdata.yml
│   │   │   ├── ai-proxy-client-params.yml
│   │   │   ├── ai-proxy-preserve-mode.yml
│   │   │   ├── analytics-for-anthropic.yml
│   │   │   ├── bump-atc-router.yml
│   │   │   ├── bump-libexpat.yml
│   │   │   ├── bump-lua-kong-nginx-module.yml
│   │   │   ├── bump-lua-protobuf.yml
│   │   │   ├── bump-lua-resty-acme.yml
│   │   │   ├── bump-lua-resty-aws.yml
│   │   │   ├── bump-lua-resty-http-0.17.2.yml
│   │   │   ├── bump-lua-resty-lmdb.yml
│   │   │   ├── bump-lua-resty-openssl.yml
│   │   │   ├── bump-lua-resty-timer-ng.yml
│   │   │   ├── bump-luarocks.yml
│   │   │   ├── bump-ngx-wasm-module.yml
│   │   │   ├── bump-pcre.yml
│   │   │   ├── bump-penlight.yml
│   │   │   ├── bump-v8.yml
│   │   │   ├── bump-wasmtime.yml
│   │   │   ├── cleanup_ai.yml
│   │   │   ├── decrease-cocurrency-limit-of-timer-ng.yml
│   │   │   ├── disable-TLSv1_1-in-openssl3.yml
│   │   │   ├── feat-add-workspace-label-to-prometheus.yml
│   │   │   ├── feat-ai-proxy-add-streaming.yml
│   │   │   ├── feat-emmy-debugger.yml
│   │   │   ├── feat-hybrid-sync-mixed-route-policy.yml
│   │   │   ├── feat-increase-ai-anthropic-regex-expression-length.yml
│   │   │   ├── feat-jwt-eddsa.yml
│   │   │   ├── feat-jwt-es512.yml
│   │   │   ├── feat-wasm-general-shm-kv.yml
│   │   │   ├── fix-acme-renewal-bug.yml
│   │   │   ├── fix-aws-lambda-kong-latency.yml
│   │   │   ├── fix-cjson-t-end.yml
│   │   │   ├── fix-cli-db-timeout-overrides.yml
│   │   │   ├── fix-ctx-host-port.yml
│   │   │   ├── fix-dbless-duplicate-target-error.yml
│   │   │   ├── fix-default-value-of-upstream-keepalive-max-requests.yml
│   │   │   ├── fix-dns-resolv-timeout-zero.yml
│   │   │   ├── fix-external-plugin-instance.yml
│   │   │   ├── fix-file-permission-of-logrotate.yml
│   │   │   ├── fix-hybrid-dp-certificate-with-vault-not-refresh.yml
│   │   │   ├── fix-jwt-plugin-check.yml
│   │   │   ├── fix-migrations-for-redis-plugins-acme.yml
│   │   │   ├── fix-migrations-for-redis-plugins-response-rl.yml
│   │   │   ├── fix-migrations-for-redis-plugins-rl.yml
│   │   │   ├── fix-missing-router-section-of-request-debugging.yml
│   │   │   ├── fix-mlcache-renew-lock-leaks.yml
│   │   │   ├── fix-router-rebuing-flag.yml
│   │   │   ├── fix-snis-tls-passthrough-in-trad-compat.yml
│   │   │   ├── fix-upstream-status-unset.yml
│   │   │   ├── fix-vault-init-worker.yml
│   │   │   ├── fix-vault-secret-update-without-ttl.yml
│   │   │   ├── fix-vault-workspaces.yml
│   │   │   ├── fix-wasm-disable-pwm-lua-resolver.yml
│   │   │   ├── fix_api_405_vaults_validate_endpoint.yml
│   │   │   ├── fix_balancer_healthecker_unexpected_panic.yml
│   │   │   ├── fix_privileged_agent_id_1.yml
│   │   │   ├── flavor-expressions-supports-traditional-fields.yml
│   │   │   ├── key_auth_www_authenticate.yml
│   │   │   ├── log-serializer-kong-latency.yml
│   │   │   ├── log-serializer-receive-latency.yml
│   │   │   ├── otel-increase-queue-max-batch-size.yml
│   │   │   ├── otel-sampling-panic-when-header-trace-id-enable.yml
│   │   │   ├── plugin-schema-deprecation-record.yml
│   │   │   ├── plugin_server_restart.yml
│   │   │   ├── pluginsocket-proto-wrong-type.yml
│   │   │   ├── propagation-module-rework.yml
│   │   │   ├── revert-req-body-limitation-patch.yml
│   │   │   ├── separate_kong_cache_invalidation_cluster_event_channel.yml
│   │   │   ├── set_grpc_tls_seclevel.yml
│   │   │   ├── speed_up_internal_hooking_mechanism.yml
│   │   │   ├── speed_up_router.yml
│   │   │   ├── tracing-pdk-short-trace-ids.yml
│   │   │   ├── update-ai-proxy-telemetry.yml
│   │   │   └── wasm-bundled-filters.yml
│   │   └── kong-manager/
│   │       ├── .gitkeep
│   │       ├── expressions_routes.yml
│   │       ├── plugin_forms_improvements.yml
│   │       └── ui_improvements.yml
│   ├── 3.8.0/
│   │   ├── 3.8.0.md
│   │   ├── kong/
│   │   │   ├── .gitkeep
│   │   │   ├── acl-always-use-authenticated-groups.yml
│   │   │   ├── add-ai-data-latency.yml
│   │   │   ├── add-ai-data-prometheus.yml
│   │   │   ├── admin-api-map-brackets-syntax.yml
│   │   │   ├── ai-plugin-read-file.yml
│   │   │   ├── ai-proxy-add-allow-override-opt.yml
│   │   │   ├── ai-proxy-add-deep-copy-lib.yml
│   │   │   ├── ai-proxy-aws-bedrock.yml
│   │   │   ├── ai-proxy-azure-streaming.yml
│   │   │   ├── ai-proxy-cloud-identity-transformer-plugins.yml
│   │   │   ├── ai-proxy-fix-model-parameter.yml
│   │   │   ├── ai-proxy-fix-nil-response-token-count.yml
│   │   │   ├── ai-proxy-fix-sending-own-model.yml
│   │   │   ├── ai-proxy-fix-tuning-parameter-precedence.yml
│   │   │   ├── ai-proxy-google-gemini.yml
│   │   │   ├── ai-proxy-mistral-ai.yml
│   │   │   ├── ai-proxy-model-header.yml
│   │   │   ├── ai-proxy-proper-model-assignment.yml
│   │   │   ├── bump-lua-protobuf.yml
│   │   │   ├── bump-lua-resty-acme.yml
│   │   │   ├── bump-lua-resty-aws.yml
│   │   │   ├── bump-lua-resty-events.yml
│   │   │   ├── bump-lua-resty-healthcheck.yml
│   │   │   ├── bump-lua-resty-lmdb.yml
│   │   │   ├── bump-lua-resty-openssl.yml
│   │   │   ├── bump-luarocks.yml
│   │   │   ├── bump-ngx-wasm-module.yml
│   │   │   ├── bump-openresty.yml
│   │   │   ├── bump-pcre.yml
│   │   │   ├── bump-wasmtime.yml
│   │   │   ├── certificates_schema_validate.yml
│   │   │   ├── cp-luarocks-admin-to-bin.yml
│   │   │   ├── feat-ai-prompt-guard-all-roles.yml
│   │   │   ├── feat-aws-lambda-configurable-sts-endpoint.yml
│   │   │   ├── feat-aws-lambda-decode-empty-array.yml
│   │   │   ├── feat-pdk-unlimited-body-size.yml
│   │   │   ├── feat-queue-concurrency-limit.yml
│   │   │   ├── feat-response-transformer-json-rename.yml
│   │   │   ├── feat-via.yml
│   │   │   ├── fix-acme-misleading-deprecation-logs.yml
│   │   │   ├── fix-acme-username-password-auth.yml
│   │   │   ├── fix-ai-gzip-content.yml
│   │   │   ├── fix-ai-metrics-prometheus-compat.yml
│   │   │   ├── fix-ai-plugin-no-consumer.yml
│   │   │   ├── fix-ai-prompt-guard-order.yml
│   │   │   ├── fix-ai-proxy-shared-state.yml
│   │   │   ├── fix-aws-lambda-empty-array-mutli-value.yml
│   │   │   ├── fix-aws-lambda-gateway-compat-version-field.yml
│   │   │   ├── fix-clustering-forward-proxy-authentication.yml
│   │   │   ├── fix-cmd-error-log.yml
│   │   │   ├── fix-correlation-id-config-generator.yml
│   │   │   ├── fix-cors-wildcard.yml
│   │   │   ├── fix-db-read-only.yml
│   │   │   ├── fix-deprecate-shorthands-precedence.yml
│   │   │   ├── fix-dns-initialization.yml
│   │   │   ├── fix-filter-finalize-in-send-header-clear-context.yml
│   │   │   ├── fix-for-null-aware-shorthand.yml
│   │   │   ├── fix-grpc-gateway-json-decode-bug.yml
│   │   │   ├── fix-http-log-host-header.yml
│   │   │   ├── fix-log-upstream-status-nil-subrequest.yml
│   │   │   ├── fix-multi-modal.yml
│   │   │   ├── fix-otel-migrations-exception.yml
│   │   │   ├── fix-propagation-remove-redundant-warnings.yml
│   │   │   ├── fix-realm-compat-changes-basic-auth.yml
│   │   │   ├── fix-realm-compat-changes-key-auth.yml
│   │   │   ├── fix-reports-uninitialized-variable-in-400.yml
│   │   │   ├── fix-request-size-limiting-with-chunked-transfer-encoding-and-no-content-length.yml
│   │   │   ├── fix-request-transformer-uri-replace.yml
│   │   │   ├── fix-response-rl-misleading-deprecation-logs.yml
│   │   │   ├── fix-rl-misleading-deprecation-logs.yml
│   │   │   ├── fix-route-set-priority-with-others.yml
│   │   │   ├── fix-service-tls-verify.yml
│   │   │   ├── fix-sni-cache-invalidate.yml
│   │   │   ├── fix-tracing-sampling-rate.yml
│   │   │   ├── fix-type-of-logrotate.yml
│   │   │   ├── fix-vault-reference-parsing-endslash.yml
│   │   │   ├── fix-vault-resurrect-ttl-multi-worker.yml
│   │   │   ├── fix-vault-secret-rotation-log-level.yml
│   │   │   ├── fix-wasm-enable-pwm-lua-resolver.yml
│   │   │   ├── fix_hash.yml
│   │   │   ├── hmac_www_authenticate.yml
│   │   │   ├── host_header.yml
│   │   │   ├── improve-prometheus-error-logging.yml
│   │   │   ├── jwt_www_authenticate.yml
│   │   │   ├── ldap_www_authenticate.yml
│   │   │   ├── make_rpm_relocatable.yml
│   │   │   ├── migration_of_ai_proxy_plugin.yml
│   │   │   ├── move-sockets-to-subdir.yml
│   │   │   ├── oauth2_www_authenticate.yml
│   │   │   ├── otel-formatted-logs.yml
│   │   │   ├── pdk-log-error.yml
│   │   │   ├── pdk-read-file.yml
│   │   │   ├── pdk-telemetry-log.yml
│   │   │   ├── plugins-add-standard-webhooks.yml
│   │   │   ├── proxy-cache-fix-age-header.yml
│   │   │   ├── refactor_dns_client.yml
│   │   │   ├── reject-config-on-deprecated-fields-mismatch.yml
│   │   │   ├── remove_eol_debian_rhel.yml
│   │   │   ├── req-trans-rename.yml
│   │   │   ├── resty-simdjson.yml
│   │   │   ├── revert-dns-behavior.yml
│   │   │   ├── shorten-socket-names.yml
│   │   │   ├── wasm-module-cache.yml
│   │   │   └── yield-in-gzip.yml
│   │   └── kong-manager/
│   │       ├── .gitkeep
│   │       ├── a11y-improvements.yml
│   │       ├── resizable-entity-lists.yml
│   │       ├── sni-field-in-certificate-form.yml
│   │       └── ui-improvements.yml
│   ├── 3.9.0/
│   │   ├── 3.9.0.md
│   │   ├── kong/
│   │   │   ├── .gitkeep
│   │   │   ├── add-noble-numbat.yml
│   │   │   ├── add_multiple_domain_for_gui.yml
│   │   │   ├── ai-anthropic-fix-function-calling.yml
│   │   │   ├── ai-bedrock-fix-function-calling.yml
│   │   │   ├── ai-bedrock-fix-guardrails.yml
│   │   │   ├── ai-cohere-fix-function-calling.yml
│   │   │   ├── ai-gemini-blocks-content-safety.yml
│   │   │   ├── ai-gemini-fix-function-calling.yml
│   │   │   ├── ai-gemini-fix-transformer-plugins.yml
│   │   │   ├── ai-transformers-bad-error-handling.yml
│   │   │   ├── bump-dockerfile-ubi9.yml
│   │   │   ├── bump-lua-kong-nginx-module.yml
│   │   │   ├── bump-lua-resty-aws.yml
│   │   │   ├── bump-lua-resty-events.yml
│   │   │   ├── bump-lua-resty-ljsonschema.yml
│   │   │   ├── bump-lua-resty-lmdb-2.yml
│   │   │   ├── bump-lua-resty-lmdb.yml
│   │   │   ├── bump-ngx-wasm-module.yml
│   │   │   ├── bump-prometheus-latency-bucket.yml
│   │   │   ├── bump-wasmtime.yml
│   │   │   ├── bump_openssl.yml
│   │   │   ├── chore-clustering-log-level.yml
│   │   │   ├── cp-dp-rpc.yml
│   │   │   ├── deprecate_node_id.yml
│   │   │   ├── feat-add-ada.yml
│   │   │   ├── feat-add-huggingface-llm-driver.yml
│   │   │   ├── feat-ai-proxy-disable-h2-alpn.yml
│   │   │   ├── feat-api-yaml-media-type.yml
│   │   │   ├── feat-correlation-id-order.yml
│   │   │   ├── feat-disable-h2-alpn.yml
│   │   │   ├── feat-kong-drain-cmd.yml
│   │   │   ├── feat-pdk-clear-query-arg.yml
│   │   │   ├── feat-request-debguger-finer-resolution-and-total-latency.yml
│   │   │   ├── feat-tracing-pdk-attributes.yml
│   │   │   ├── fix-admin-api-for-empty-tags.yml
│   │   │   ├── fix-ai-proxy-multi-modal-azure.yml
│   │   │   ├── fix-ai-semantic-cache-model.yml
│   │   │   ├── fix-aws-lambda-multi-value-header-null.yml
│   │   │   ├── fix-balancer-health-checker.yml
│   │   │   ├── fix-core-pass-ctx-to-log-init-worker-errors.yml
│   │   │   ├── fix-jwt-plugin-rsa-public-key-b64decoded.yml
│   │   │   ├── fix-key-auth-retain-query-order.yml
│   │   │   ├── fix-loggly-hostname-notfound.yml
│   │   │   ├── fix-ngx-balancer-recreate-request-api-for-balancer-body-refresh.yml
│   │   │   ├── fix-parse-nested-parameters.yml
│   │   │   ├── fix-pdk-inspect-notice.yml
│   │   │   ├── fix-plugin-conf-ws-id.yml
│   │   │   ├── fix-retries-error-message.yml
│   │   │   ├── fix-return-values-mistaken-in-rate-limiting-plugin.yml
│   │   │   ├── fix-rl-plugin-resp-hdr.yml
│   │   │   ├── fix-schema-validation-with-nil-field.yml
│   │   │   ├── fix-vault-array-config.yml
│   │   │   ├── fix-vault-cache-workspace-id.yml
│   │   │   ├── fix-vault-stream-subsystem.yml
│   │   │   ├── fix-wasm-check-missing-filters.yml
│   │   │   ├── plugins-redirect.yml
│   │   │   ├── prometheus-wasmx-metrics.yml
│   │   │   ├── remove-datakit.yml
│   │   │   ├── revert-http2-limitation-buffered-request.yml
│   │   │   └── wasm-filter-plugins.yml
│   │   └── kong-manager/
│   │       ├── .gitkeep
│   │       ├── hide-plugin-scoping.yml
│   │       ├── ui-improvements.yml
│   │       └── unified-redirection.yml
│   ├── Makefile
│   ├── README.md
│   ├── changelog-template.yaml
│   ├── create_pr
│   ├── unreleased/
│   │   ├── kong/
│   │   │   ├── .gitkeep
│   │   │   ├── add-cp-connectivity-metric-prometheus.yml
│   │   │   ├── add_ai_gemini_boto_support.yml
│   │   │   ├── admin-gui-csp-header.yml
│   │   │   ├── backport-resty-balancer-set-upstream.yml
│   │   │   ├── bump-atc-router.yml
│   │   │   ├── bump-kong-nginx-module.yml
│   │   │   ├── bump-libexpat-to-2_6_4.yml
│   │   │   ├── bump-lua-kong-nginx-module-0140.yml
│   │   │   ├── bump-lua-resty-simdjson.yml
│   │   │   ├── bump-luarocks-to-3_12_2.yml
│   │   │   ├── bump-ngx-wasm-module.yml
│   │   │   ├── bump-openresty.yml
│   │   │   ├── bump-pcre.yml
│   │   │   ├── bump-snappy-library.yml
│   │   │   ├── bump_openssl.yml
│   │   │   ├── deprecate-llm-upstream-url.yml
│   │   │   ├── disable-ngx-wasm-module.yml
│   │   │   ├── dynamic-set-tls-in-pdk-set_scheme.yml
│   │   │   ├── feat-cors-skip-return-acao-when-no-origin-in-request.yml
│   │   │   ├── feat-patch-supprt-set_next_upstream.yml
│   │   │   ├── feat-variable-resource-attributes.yml
│   │   │   ├── fix-admin-api-route-path-response-error.yml
│   │   │   ├── fix-ai-analytics-key.yml
│   │   │   ├── fix-ai-azure-incorrect-path-overriding.yml
│   │   │   ├── fix-ai-azure-streaming.yml
│   │   │   ├── fix-ai-chunking.yml
│   │   │   ├── fix-ai-gemini-multimodal.yml
│   │   │   ├── fix-ai-parameters-typo-in-huggingface.yml
│   │   │   ├── fix-ai-proxy-anthropic-tool-choice.yml
│   │   │   ├── fix-ai-proxy-gemini-incorrect-model-name.yml
│   │   │   ├── fix-ai-upstream-url-trailing-empty.yml
│   │   │   ├── fix-certificate-reference.yml
│   │   │   ├── fix-consistent-hashing-for-hyphenated-pascal-case-headers.yml
│   │   │   ├── fix-cors-allow-empty-string-origin.yml
│   │   │   ├── fix-db_resurrect_ttl.yml
│   │   │   ├── fix-dbless-consumer-credential-error.yml
│   │   │   ├── fix-declarative-config-load.yml
│   │   │   ├── fix-downgrade-routes-plugins-rebuilding-log-level.yml
│   │   │   ├── fix-duplicate-content-type.yml
│   │   │   ├── fix-error-flattening-json.yml
│   │   │   ├── fix-error-handle-certificate.yml
│   │   │   ├── fix-escape-dots-in-logging-plugins.yml
│   │   │   ├── fix-header_cache.yml
│   │   │   ├── fix-invalid-hostname.yml
│   │   │   ├── fix-ip-restriction-tcp-error.yml
│   │   │   ├── fix-jwt-www-authenticate-header-delimiter.yml
│   │   │   ├── fix-new-dns-client-timeout.yml
│   │   │   ├── fix-nil-reference-schema-checker.yml
│   │   │   ├── fix-nonexisting-anonymous-error-message.yml
│   │   │   ├── fix-oauth2-header-delimiter.yml
│   │   │   ├── fix-pdk-clear-query-arg-space-encoding.yml
│   │   │   ├── fix-potential-socket-connection-leak.yml
│   │   │   ├── fix-response-ratelimiting-upstream-headers.yml
│   │   │   ├── fix-socket-path-permissions.yml
│   │   │   ├── fix-target-deletion.yml
│   │   │   ├── fix-upstream-keep-alive-pool-name.yml
│   │   │   ├── fix_ai-gemini-truncated-streams.yml
│   │   │   ├── fix_ai-logger-error-handling.yml
│   │   │   ├── fix_ai-plugins-templating.yml
│   │   │   ├── fix_ai-streaming-function-calls.yml
│   │   │   ├── fix_ai_ollama_content_streaming.yml
│   │   │   ├── fix_ai_proxy_config_issue.yml
│   │   │   ├── fix_ai_proxy_preserve_mode.yml
│   │   │   ├── fix_file_path_not_allowed_whitespace.yml
│   │   │   ├── instana-header-support.yml
│   │   │   ├── perf-lmdb-remove-global-query-key.yml
│   │   │   ├── perf-string-splitting.yml
│   │   │   ├── perf-trace-ID-size-lookup.yml
│   │   │   ├── prometheus-upstream-metrics-toggle.yml
│   │   │   ├── refine-pdk-performance.yml
│   │   │   ├── remove-datakit.yml
│   │   │   ├── remove-duplicate-rl-ctx-check.yml
│   │   │   ├── revert-translate-backwards.yml
│   │   │   ├── session_store_metadata.yml
│   │   │   └── upstream-uri-refresh-when-recreate-request.yml
│   │   └── kong-manager/
│   │       └── .gitkeep
│   └── verify-prs
├── crate_locks/
│   └── README.md
├── kong/
│   ├── admin_gui/
│   │   ├── init.lua
│   │   └── utils.lua
│   ├── api/
│   │   ├── api_helpers.lua
│   │   ├── arguments.lua
│   │   ├── arguments_decoder.lua
│   │   ├── endpoints.lua
│   │   ├── init.lua
│   │   └── routes/
│   │       ├── cache.lua
│   │       ├── certificates.lua
│   │       ├── clustering.lua
│   │       ├── config.lua
│   │       ├── consumers.lua
│   │       ├── debug.lua
│   │       ├── dns.lua
│   │       ├── filter_chains.lua
│   │       ├── health.lua
│   │       ├── kong.lua
│   │       ├── plugins.lua
│   │       ├── snis.lua
│   │       ├── tags.lua
│   │       ├── targets.lua
│   │       └── upstreams.lua
│   ├── cache/
│   │   ├── init.lua
│   │   └── warmup.lua
│   ├── cluster_events/
│   │   ├── init.lua
│   │   └── strategies/
│   │       ├── off.lua
│   │       └── postgres.lua
│   ├── clustering/
│   │   ├── compat/
│   │   │   ├── checkers.lua
│   │   │   ├── init.lua
│   │   │   ├── removed_fields.lua
│   │   │   └── version.lua
│   │   ├── config_helper.lua
│   │   ├── control_plane.lua
│   │   ├── data_plane.lua
│   │   ├── events.lua
│   │   ├── init.lua
│   │   ├── rpc/
│   │   │   ├── callbacks.lua
│   │   │   ├── concentrator.lua
│   │   │   ├── future.lua
│   │   │   ├── json_rpc_v2.lua
│   │   │   ├── manager.lua
│   │   │   ├── queue.lua
│   │   │   ├── socket.lua
│   │   │   └── utils.lua
│   │   ├── services/
│   │   │   └── sync/
│   │   │       ├── hooks.lua
│   │   │       ├── init.lua
│   │   │       ├── rpc.lua
│   │   │       ├── strategies/
│   │   │       │   └── postgres.lua
│   │   │       └── validate.lua
│   │   ├── tls.lua
│   │   └── utils.lua
│   ├── cmd/
│   │   ├── check.lua
│   │   ├── config.lua
│   │   ├── drain.lua
│   │   ├── health.lua
│   │   ├── hybrid.lua
│   │   ├── init.lua
│   │   ├── migrations.lua
│   │   ├── prepare.lua
│   │   ├── quit.lua
│   │   ├── reload.lua
│   │   ├── restart.lua
│   │   ├── roar.lua
│   │   ├── start.lua
│   │   ├── stop.lua
│   │   ├── utils/
│   │   │   ├── env.lua
│   │   │   ├── inject_confs.lua
│   │   │   ├── kill.lua
│   │   │   ├── log.lua
│   │   │   ├── migrations.lua
│   │   │   ├── nginx_signals.lua
│   │   │   ├── prefix_handler.lua
│   │   │   ├── process_secrets.lua
│   │   │   ├── timer.lua
│   │   │   └── tty.lua
│   │   ├── vault.lua
│   │   └── version.lua
│   ├── concurrency.lua
│   ├── conf_loader/
│   │   ├── constants.lua
│   │   ├── init.lua
│   │   ├── listeners.lua
│   │   ├── parse.lua
│   │   └── sys.lua
│   ├── constants.lua
│   ├── db/
│   │   ├── dao/
│   │   │   ├── ca_certificates.lua
│   │   │   ├── certificates.lua
│   │   │   ├── init.lua
│   │   │   ├── key_sets.lua
│   │   │   ├── keys.lua
│   │   │   ├── plugins.lua
│   │   │   ├── services.lua
│   │   │   ├── snis.lua
│   │   │   ├── tags.lua
│   │   │   ├── targets.lua
│   │   │   ├── vaults.lua
│   │   │   └── workspaces.lua
│   │   ├── declarative/
│   │   │   ├── export.lua
│   │   │   ├── import.lua
│   │   │   ├── init.lua
│   │   │   ├── marshaller.lua
│   │   │   └── migrations/
│   │   │       ├── init.lua
│   │   │       └── route_path.lua
│   │   ├── errors.lua
│   │   ├── init.lua
│   │   ├── iteration.lua
│   │   ├── migrations/
│   │   │   ├── core/
│   │   │   │   ├── 000_base.lua
│   │   │   │   ├── 003_100_to_110.lua
│   │   │   │   ├── 004_110_to_120.lua
│   │   │   │   ├── 005_120_to_130.lua
│   │   │   │   ├── 006_130_to_140.lua
│   │   │   │   ├── 007_140_to_150.lua
│   │   │   │   ├── 008_150_to_200.lua
│   │   │   │   ├── 009_200_to_210.lua
│   │   │   │   ├── 010_210_to_211.lua
│   │   │   │   ├── 011_212_to_213.lua
│   │   │   │   ├── 012_213_to_220.lua
│   │   │   │   ├── 013_220_to_230.lua
│   │   │   │   ├── 014_230_to_270.lua
│   │   │   │   ├── 015_270_to_280.lua
│   │   │   │   ├── 016_280_to_300.lua
│   │   │   │   ├── 017_300_to_310.lua
│   │   │   │   ├── 018_310_to_320.lua
│   │   │   │   ├── 019_320_to_330.lua
│   │   │   │   ├── 020_330_to_340.lua
│   │   │   │   ├── 021_340_to_350.lua
│   │   │   │   ├── 022_350_to_360.lua
│   │   │   │   ├── 023_360_to_370.lua
│   │   │   │   ├── 024_380_to_390.lua
│   │   │   │   ├── 025_390_to_3100.lua
│   │   │   │   └── init.lua
│   │   │   ├── migrate_path_280_300.lua
│   │   │   ├── operations/
│   │   │   │   ├── 200_to_210.lua
│   │   │   │   ├── 212_to_213.lua
│   │   │   │   ├── 280_to_300.lua
│   │   │   │   └── 331_to_332.lua
│   │   │   ├── state.lua
│   │   │   └── subsystems.lua
│   │   ├── schema/
│   │   │   ├── entities/
│   │   │   │   ├── ca_certificates.lua
│   │   │   │   ├── certificates.lua
│   │   │   │   ├── clustering_data_planes.lua
│   │   │   │   ├── consumers.lua
│   │   │   │   ├── filter_chains.lua
│   │   │   │   ├── key_sets.lua
│   │   │   │   ├── keys.lua
│   │   │   │   ├── parameters.lua
│   │   │   │   ├── plugins.lua
│   │   │   │   ├── routes.lua
│   │   │   │   ├── routes_subschemas.lua
│   │   │   │   ├── services.lua
│   │   │   │   ├── snis.lua
│   │   │   │   ├── tags.lua
│   │   │   │   ├── targets.lua
│   │   │   │   ├── upstreams.lua
│   │   │   │   ├── vaults.lua
│   │   │   │   └── workspaces.lua
│   │   │   ├── entity.lua
│   │   │   ├── init.lua
│   │   │   ├── json.lua
│   │   │   ├── metaschema.lua
│   │   │   ├── others/
│   │   │   │   ├── declarative_config.lua
│   │   │   │   ├── migrations.lua
│   │   │   │   └── wasm_filter.lua
│   │   │   ├── plugin_loader.lua
│   │   │   ├── topological_sort.lua
│   │   │   ├── typedefs.lua
│   │   │   └── vault_loader.lua
│   │   ├── strategies/
│   │   │   ├── connector.lua
│   │   │   ├── init.lua
│   │   │   ├── off/
│   │   │   │   ├── connector.lua
│   │   │   │   ├── init.lua
│   │   │   │   ├── plugins.lua
│   │   │   │   ├── services.lua
│   │   │   │   └── tags.lua
│   │   │   └── postgres/
│   │   │       ├── connector.lua
│   │   │       ├── init.lua
│   │   │       ├── plugins.lua
│   │   │       ├── services.lua
│   │   │       └── tags.lua
│   │   └── utils.lua
│   ├── deprecation.lua
│   ├── dns/
│   │   ├── README.md
│   │   ├── client.lua
│   │   ├── stats.lua
│   │   └── utils.lua
│   ├── dynamic_hook/
│   │   ├── README.md
│   │   └── init.lua
│   ├── error_handlers.lua
│   ├── global.lua
│   ├── globalpatches.lua
│   ├── hooks.lua
│   ├── include/
│   │   ├── kong/
│   │   │   ├── model/
│   │   │   │   ├── ca_certificate.proto
│   │   │   │   ├── certificate.proto
│   │   │   │   ├── config.proto
│   │   │   │   ├── consumer.proto
│   │   │   │   ├── parameter.proto
│   │   │   │   ├── plugin.proto
│   │   │   │   ├── plugin_entities.proto
│   │   │   │   ├── route.proto
│   │   │   │   ├── service.proto
│   │   │   │   ├── sni.proto
│   │   │   │   ├── target.proto
│   │   │   │   ├── upstream.proto
│   │   │   │   └── workspace.proto
│   │   │   └── pluginsocket.proto
│   │   └── opentelemetry/
│   │       └── proto/
│   │           ├── collector/
│   │           │   ├── logs/
│   │           │   │   └── v1/
│   │           │   │       └── logs_service.proto
│   │           │   └── trace/
│   │           │       └── v1/
│   │           │           └── trace_service.proto
│   │           ├── common/
│   │           │   └── v1/
│   │           │       └── common.proto
│   │           ├── logs/
│   │           │   └── v1/
│   │           │       └── logs.proto
│   │           ├── resource/
│   │           │   └── v1/
│   │           │       └── resource.proto
│   │           └── trace/
│   │               └── v1/
│   │                   └── trace.proto
│   ├── init.lua
│   ├── llm/
│   │   ├── adapters/
│   │   │   ├── bedrock.lua
│   │   │   └── gemini.lua
│   │   ├── drivers/
│   │   │   ├── anthropic.lua
│   │   │   ├── azure.lua
│   │   │   ├── bedrock.lua
│   │   │   ├── cohere.lua
│   │   │   ├── gemini.lua
│   │   │   ├── huggingface.lua
│   │   │   ├── llama2.lua
│   │   │   ├── mistral.lua
│   │   │   ├── openai.lua
│   │   │   └── shared.lua
│   │   ├── init.lua
│   │   ├── plugin/
│   │   │   ├── base.lua
│   │   │   ├── crud_handler.lua
│   │   │   ├── ctx.lua
│   │   │   ├── observability.lua
│   │   │   └── shared-filters/
│   │   │       ├── enable-buffering.lua
│   │   │       ├── normalize-json-response.lua
│   │   │       ├── normalize-request.lua
│   │   │       ├── normalize-response-header.lua
│   │   │       ├── normalize-sse-chunk.lua
│   │   │       ├── parse-json-response.lua
│   │   │       ├── parse-request.lua
│   │   │       ├── parse-sse-chunk.lua
│   │   │       └── serialize-analytics.lua
│   │   └── schemas/
│   │       └── init.lua
│   ├── meta.lua
│   ├── observability/
│   │   ├── logs.lua
│   │   ├── otlp/
│   │   │   ├── init.lua
│   │   │   └── proto.lua
│   │   └── tracing/
│   │       ├── instrumentation.lua
│   │       ├── propagation/
│   │       │   ├── extractors/
│   │       │   │   ├── _base.lua
│   │       │   │   ├── aws.lua
│   │       │   │   ├── b3.lua
│   │       │   │   ├── datadog.lua
│   │       │   │   ├── gcp.lua
│   │       │   │   ├── instana.lua
│   │       │   │   ├── jaeger.lua
│   │       │   │   ├── ot.lua
│   │       │   │   └── w3c.lua
│   │       │   ├── init.lua
│   │       │   ├── injectors/
│   │       │   │   ├── _base.lua
│   │       │   │   ├── aws.lua
│   │       │   │   ├── b3-single.lua
│   │       │   │   ├── b3.lua
│   │       │   │   ├── datadog.lua
│   │       │   │   ├── gcp.lua
│   │       │   │   ├── instana.lua
│   │       │   │   ├── jaeger.lua
│   │       │   │   ├── ot.lua
│   │       │   │   └── w3c.lua
│   │       │   ├── schema.lua
│   │       │   └── utils.lua
│   │       ├── request_id.lua
│   │       └── tracing_context.lua
│   ├── pdk/
│   │   ├── client/
│   │   │   └── tls.lua
│   │   ├── client.lua
│   │   ├── cluster.lua
│   │   ├── ctx.lua
│   │   ├── init.lua
│   │   ├── ip.lua
│   │   ├── log.lua
│   │   ├── nginx.lua
│   │   ├── node.lua
│   │   ├── plugin.lua
│   │   ├── private/
│   │   │   ├── checks.lua
│   │   │   ├── node.lua
│   │   │   ├── phases.lua
│   │   │   └── rate_limiting.lua
│   │   ├── request.lua
│   │   ├── response.lua
│   │   ├── router.lua
│   │   ├── service/
│   │   │   ├── request.lua
│   │   │   └── response.lua
│   │   ├── service.lua
│   │   ├── table.lua
│   │   ├── telemetry.lua
│   │   ├── tracing.lua
│   │   └── vault.lua
│   ├── plugins/
│   │   ├── acl/
│   │   │   ├── acls.lua
│   │   │   ├── api.lua
│   │   │   ├── daos.lua
│   │   │   ├── groups.lua
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_acl.lua
│   │   │   │   ├── 002_130_to_140.lua
│   │   │   │   ├── 003_200_to_210.lua
│   │   │   │   ├── 004_212_to_213.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── acme/
│   │   │   ├── api.lua
│   │   │   ├── client.lua
│   │   │   ├── clustering/
│   │   │   │   └── compat/
│   │   │   │       └── redis_translation.lua
│   │   │   ├── daos.lua
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_acme.lua
│   │   │   │   ├── 001_280_to_300.lua
│   │   │   │   ├── 002_320_to_330.lua
│   │   │   │   ├── 003_350_to_360.lua
│   │   │   │   └── init.lua
│   │   │   ├── reserved_words.lua
│   │   │   ├── schema.lua
│   │   │   └── storage/
│   │   │       ├── config_adapters/
│   │   │       │   ├── init.lua
│   │   │       │   └── redis.lua
│   │   │       └── kong.lua
│   │   ├── ai-prompt-decorator/
│   │   │   ├── filters/
│   │   │   │   └── decorate-prompt.lua
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── ai-prompt-guard/
│   │   │   ├── filters/
│   │   │   │   └── guard-prompt.lua
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── ai-prompt-template/
│   │   │   ├── filters/
│   │   │   │   └── render-prompt-template.lua
│   │   │   ├── handler.lua
│   │   │   ├── schema.lua
│   │   │   └── templater.lua
│   │   ├── ai-proxy/
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 001_360_to_370.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── ai-request-transformer/
│   │   │   ├── filters/
│   │   │   │   └── transform-request.lua
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── ai-response-transformer/
│   │   │   ├── filters/
│   │   │   │   └── transform-response.lua
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── aws-lambda/
│   │   │   ├── handler.lua
│   │   │   ├── request-util.lua
│   │   │   └── schema.lua
│   │   ├── azure-functions/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── basic-auth/
│   │   │   ├── access.lua
│   │   │   ├── crypto.lua
│   │   │   ├── daos.lua
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_basic_auth.lua
│   │   │   │   ├── 002_130_to_140.lua
│   │   │   │   ├── 003_200_to_210.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── bot-detection/
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 001_200_to_210.lua
│   │   │   │   └── init.lua
│   │   │   ├── rules.lua
│   │   │   └── schema.lua
│   │   ├── correlation-id/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── cors/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── datadog/
│   │   │   ├── handler.lua
│   │   │   ├── schema.lua
│   │   │   └── statsd_logger.lua
│   │   ├── file-log/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── grpc-gateway/
│   │   │   ├── deco.lua
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── grpc-web/
│   │   │   ├── deco.lua
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── hmac-auth/
│   │   │   ├── access.lua
│   │   │   ├── daos.lua
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_hmac_auth.lua
│   │   │   │   ├── 002_130_to_140.lua
│   │   │   │   ├── 003_200_to_210.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── http-log/
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 001_280_to_300.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── ip-restriction/
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 001_200_to_210.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── jwt/
│   │   │   ├── daos.lua
│   │   │   ├── handler.lua
│   │   │   ├── jwt_parser.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_jwt.lua
│   │   │   │   ├── 002_130_to_140.lua
│   │   │   │   ├── 003_200_to_210.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── key-auth/
│   │   │   ├── daos.lua
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_key_auth.lua
│   │   │   │   ├── 002_130_to_140.lua
│   │   │   │   ├── 003_200_to_210.lua
│   │   │   │   ├── 004_320_to_330.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── ldap-auth/
│   │   │   ├── access.lua
│   │   │   ├── asn1.lua
│   │   │   ├── handler.lua
│   │   │   ├── ldap.lua
│   │   │   └── schema.lua
│   │   ├── loggly/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── oauth2/
│   │   │   ├── access.lua
│   │   │   ├── daos/
│   │   │   │   └── oauth2_tokens.lua
│   │   │   ├── daos.lua
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_oauth2.lua
│   │   │   │   ├── 003_130_to_140.lua
│   │   │   │   ├── 004_200_to_210.lua
│   │   │   │   ├── 005_210_to_211.lua
│   │   │   │   ├── 006_320_to_330.lua
│   │   │   │   ├── 007_320_to_330.lua
│   │   │   │   └── init.lua
│   │   │   ├── schema.lua
│   │   │   └── secret.lua
│   │   ├── opentelemetry/
│   │   │   ├── handler.lua
│   │   │   ├── logs.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 001_331_to_332.lua
│   │   │   │   └── init.lua
│   │   │   ├── schema.lua
│   │   │   ├── traces.lua
│   │   │   └── utils.lua
│   │   ├── post-function/
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 001_280_to_300.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── pre-function/
│   │   │   ├── _handler.lua
│   │   │   ├── _schema.lua
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 001_280_to_300.lua
│   │   │   │   ├── _001_280_to_300.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── prometheus/
│   │   │   ├── api.lua
│   │   │   ├── exporter.lua
│   │   │   ├── grafana/
│   │   │   │   ├── README.md
│   │   │   │   └── kong-official.json
│   │   │   ├── handler.lua
│   │   │   ├── prometheus.lua
│   │   │   ├── schema.lua
│   │   │   ├── serve.lua
│   │   │   ├── status_api.lua
│   │   │   └── wasmx.lua
│   │   ├── proxy-cache/
│   │   │   ├── api.lua
│   │   │   ├── cache_key.lua
│   │   │   ├── handler.lua
│   │   │   ├── schema.lua
│   │   │   └── strategies/
│   │   │       ├── init.lua
│   │   │       └── memory.lua
│   │   ├── rate-limiting/
│   │   │   ├── clustering/
│   │   │   │   └── compat/
│   │   │   │       └── redis_translation.lua
│   │   │   ├── daos.lua
│   │   │   ├── expiration.lua
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_rate_limiting.lua
│   │   │   │   ├── 003_10_to_112.lua
│   │   │   │   ├── 004_200_to_210.lua
│   │   │   │   ├── 005_320_to_330.lua
│   │   │   │   ├── 006_350_to_360.lua
│   │   │   │   └── init.lua
│   │   │   ├── policies/
│   │   │   │   ├── cluster.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── redirect/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── request-size-limiting/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── request-termination/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── request-transformer/
│   │   │   ├── access.lua
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── common.lua
│   │   │   │   └── postgres.lua
│   │   │   └── schema.lua
│   │   ├── response-ratelimiting/
│   │   │   ├── access.lua
│   │   │   ├── clustering/
│   │   │   │   └── compat/
│   │   │   │       └── redis_translation.lua
│   │   │   ├── handler.lua
│   │   │   ├── header_filter.lua
│   │   │   ├── log.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_response_rate_limiting.lua
│   │   │   │   ├── 001_350_to_360.lua
│   │   │   │   └── init.lua
│   │   │   ├── policies/
│   │   │   │   ├── cluster.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── response-transformer/
│   │   │   ├── body_transformer.lua
│   │   │   ├── handler.lua
│   │   │   ├── header_transformer.lua
│   │   │   └── schema.lua
│   │   ├── session/
│   │   │   ├── access.lua
│   │   │   ├── daos/
│   │   │   │   └── session_metadatas.lua
│   │   │   ├── daos.lua
│   │   │   ├── handler.lua
│   │   │   ├── header_filter.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_session.lua
│   │   │   │   ├── 001_add_ttl_index.lua
│   │   │   │   ├── 002_320_to_330.lua
│   │   │   │   ├── 003_330_to_3100.lua
│   │   │   │   └── init.lua
│   │   │   ├── schema.lua
│   │   │   ├── session.lua
│   │   │   ├── storage/
│   │   │   │   └── kong.lua
│   │   │   └── strategies/
│   │   │       └── postgres/
│   │   │           └── session_metadatas.lua
│   │   ├── standard-webhooks/
│   │   │   ├── handler.lua
│   │   │   ├── internal.lua
│   │   │   └── schema.lua
│   │   ├── statsd/
│   │   │   ├── constants.lua
│   │   │   ├── handler.lua
│   │   │   ├── log.lua
│   │   │   ├── schema.lua
│   │   │   └── statsd_logger.lua
│   │   ├── syslog/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── tcp-log/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── udp-log/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   └── zipkin/
│   │       ├── README.md
│   │       ├── handler.lua
│   │       ├── reporter.lua
│   │       ├── request_tags.lua
│   │       ├── schema.lua
│   │       └── span.lua
│   ├── reports.lua
│   ├── resty/
│   │   ├── ctx.lua
│   │   ├── dns/
│   │   │   ├── client.lua
│   │   │   └── utils.lua
│   │   └── mlcache/
│   │       ├── init.lua
│   │       └── ipc.lua
│   ├── router/
│   │   ├── atc.lua
│   │   ├── compat.lua
│   │   ├── expressions.lua
│   │   ├── fields.lua
│   │   ├── init.lua
│   │   ├── traditional.lua
│   │   ├── transform.lua
│   │   └── utils.lua
│   ├── runloop/
│   │   ├── balancer/
│   │   │   ├── balancers.lua
│   │   │   ├── consistent_hashing.lua
│   │   │   ├── healthcheckers.lua
│   │   │   ├── init.lua
│   │   │   ├── latency.lua
│   │   │   ├── least_connections.lua
│   │   │   ├── round_robin.lua
│   │   │   ├── targets.lua
│   │   │   └── upstreams.lua
│   │   ├── certificate.lua
│   │   ├── events.lua
│   │   ├── handler.lua
│   │   ├── log_level.lua
│   │   ├── plugin_servers/
│   │   │   ├── init.lua
│   │   │   ├── plugin.lua
│   │   │   ├── process.lua
│   │   │   └── rpc/
│   │   │       ├── init.lua
│   │   │       ├── mp_rpc.lua
│   │   │       ├── pb_rpc.lua
│   │   │       └── util.lua
│   │   ├── plugins_iterator.lua
│   │   ├── upstream_retry.lua
│   │   ├── upstream_ssl.lua
│   │   ├── wasm/
│   │   │   ├── plugins.lua
│   │   │   └── properties.lua
│   │   └── wasm.lua
│   ├── status/
│   │   ├── init.lua
│   │   └── ready.lua
│   ├── templates/
│   │   ├── kong_defaults.lua
│   │   ├── kong_yml.lua
│   │   ├── nginx.lua
│   │   ├── nginx_inject.lua
│   │   ├── nginx_kong.lua
│   │   ├── nginx_kong_gui_include.lua
│   │   ├── nginx_kong_inject.lua
│   │   ├── nginx_kong_stream.lua
│   │   ├── nginx_kong_stream_inject.lua
│   │   └── wasmtime_cache_config.lua
│   ├── timing/
│   │   ├── context.lua
│   │   ├── hooks/
│   │   │   ├── dns.lua
│   │   │   ├── http.lua
│   │   │   ├── init.lua
│   │   │   ├── redis.lua
│   │   │   └── socket.lua
│   │   └── init.lua
│   ├── tools/
│   │   ├── aws_stream.lua
│   │   ├── cjson.lua
│   │   ├── dns.lua
│   │   ├── emmy_debugger.lua
│   │   ├── grpc.lua
│   │   ├── gzip.lua
│   │   ├── http.lua
│   │   ├── ip.lua
│   │   ├── kong-lua-sandbox.lua
│   │   ├── mime_type.lua
│   │   ├── module.lua
│   │   ├── protobuf.lua
│   │   ├── queue.lua
│   │   ├── queue_schema.lua
│   │   ├── rand.lua
│   │   ├── redis/
│   │   │   └── schema.lua
│   │   ├── request_aware_table.lua
│   │   ├── sandbox/
│   │   │   ├── environment/
│   │   │   │   ├── handler.lua
│   │   │   │   ├── init.lua
│   │   │   │   ├── lua.lua
│   │   │   │   └── schema.lua
│   │   │   ├── init.lua
│   │   │   ├── kong.lua
│   │   │   └── require/
│   │   │       ├── handler.lua
│   │   │       ├── init.lua
│   │   │       ├── lua.lua
│   │   │       └── schema.lua
│   │   ├── sha256.lua
│   │   ├── stream_api.lua
│   │   ├── string.lua
│   │   ├── system.lua
│   │   ├── table.lua
│   │   ├── time.lua
│   │   ├── timestamp.lua
│   │   ├── uri.lua
│   │   ├── utils.lua
│   │   ├── uuid.lua
│   │   └── yield.lua
│   ├── vaults/
│   │   └── env/
│   │       ├── init.lua
│   │       └── schema.lua
│   └── workspaces/
│       └── init.lua
├── kong-latest.rockspec
├── kong.conf.default
├── scripts/
│   ├── Dockerfile
│   ├── autodoc
│   ├── build-wasm-test-filters.sh
│   ├── changelog-helper.lua
│   ├── check-labeler.pl
│   ├── check_spec_files_spelling.sh
│   ├── dependency_services/
│   │   ├── 00-create-pg-db.sh
│   │   ├── common.sh
│   │   ├── docker-compose-test-services.yml
│   │   ├── up.fish
│   │   └── up.sh
│   ├── explain_manifest/
│   │   ├── .gitignore
│   │   ├── config.py
│   │   ├── docker_image_filelist.txt
│   │   ├── expect.py
│   │   ├── explain.py
│   │   ├── filelist.txt
│   │   ├── fixtures/
│   │   │   ├── amazonlinux-2-amd64.txt
│   │   │   ├── amazonlinux-2023-amd64.txt
│   │   │   ├── amazonlinux-2023-arm64.txt
│   │   │   ├── debian-11-amd64.txt
│   │   │   ├── debian-12-amd64.txt
│   │   │   ├── el8-amd64.txt
│   │   │   ├── el9-amd64.txt
│   │   │   ├── el9-arm64.txt
│   │   │   ├── ubuntu-20.04-amd64.txt
│   │   │   ├── ubuntu-22.04-amd64.txt
│   │   │   ├── ubuntu-22.04-arm64.txt
│   │   │   ├── ubuntu-24.04-amd64.txt
│   │   │   └── ubuntu-24.04-arm64.txt
│   │   ├── main.py
│   │   ├── requirements.txt
│   │   └── suites.py
│   ├── grep-kong-version.sh
│   ├── make-release
│   ├── release-kong.sh
│   ├── release-lib.sh
│   ├── update-copyright
│   ├── upgrade-tests/
│   │   ├── docker-compose.yml
│   │   ├── luarocks-system-lua
│   │   ├── source-versions
│   │   └── test-upgrade-path.sh
│   └── validate-rockspec
├── sgconfig.yml
├── spec/
│   ├── 01-unit/
│   │   ├── 01-db/
│   │   │   ├── 01-schema/
│   │   │   │   ├── 01-schema_spec.lua
│   │   │   │   ├── 02-metaschema_spec.lua
│   │   │   │   ├── 03-typedefs_spec.lua
│   │   │   │   ├── 04-entities_schema_spec.lua
│   │   │   │   ├── 05-services_spec.lua
│   │   │   │   ├── 06-routes_spec.lua
│   │   │   │   ├── 07-plugins_spec.lua
│   │   │   │   ├── 08-targets_spec.lua
│   │   │   │   ├── 09-upstreams_spec.lua
│   │   │   │   ├── 10-migrations_spec.lua
│   │   │   │   ├── 11-declarative_config/
│   │   │   │   │   ├── 01-validate_spec.lua
│   │   │   │   │   ├── 02-process_auto_fields_spec.lua
│   │   │   │   │   ├── 03-flatten_spec.lua
│   │   │   │   │   ├── 04-on-the-fly-migration_spec.lua
│   │   │   │   │   └── 05-error-flattening_spec.lua
│   │   │   │   ├── 11-snis_spec.lua
│   │   │   │   ├── 12-topological_sort_spec.lua
│   │   │   │   ├── 13-cluster_status_spec.lua
│   │   │   │   ├── 14-consumers_spec.lua
│   │   │   │   └── 15-workspaces_spec.lua
│   │   │   ├── 02-db-errors_spec.lua
│   │   │   ├── 03-arguments_spec.lua
│   │   │   ├── 04-dao_spec.lua
│   │   │   ├── 06-postgres_spec.lua
│   │   │   ├── 07-dao/
│   │   │   │   ├── 01-plugins_spec.lua
│   │   │   │   └── 02-tags_spec.lua
│   │   │   ├── 07-db_spec.lua
│   │   │   ├── 08-cache_warmup_spec.lua
│   │   │   ├── 09-no_broadcast_crud_event_spec.lua
│   │   │   ├── 10-declarative_spec.lua
│   │   │   ├── 11-declarative_lmdb_spec.lua
│   │   │   ├── 12-missing-migrations_spec.lua
│   │   │   └── 13-off/
│   │   │       └── 01-select-by-ca-certificate_spec.lua
│   │   ├── 02-rockspec_meta_spec.lua
│   │   ├── 03-conf_loader_spec.lua
│   │   ├── 04-prefix_handler_spec.lua
│   │   ├── 05-utils_spec.lua
│   │   ├── 06-timestamp_spec.lua
│   │   ├── 07-api_helpers_spec.lua
│   │   ├── 08-router_spec.lua
│   │   ├── 09-balancer/
│   │   │   ├── 01-generic_spec.lua
│   │   │   ├── 02-least_connections_spec.lua
│   │   │   ├── 03-consistent_hashing_spec.lua
│   │   │   ├── 04-round_robin_spec.lua
│   │   │   ├── 05-worker_consistency_spec.lua
│   │   │   └── 06-latency_spec.lua
│   │   ├── 10-log_serializer_spec.lua
│   │   ├── 11-reports_spec.lua
│   │   ├── 12-plugins_order_spec.lua
│   │   ├── 13-plugins_version_spec.lua
│   │   ├── 14-dns_spec.lua
│   │   ├── 16-runloop_handler_spec.lua
│   │   ├── 17-concurrency_spec.lua
│   │   ├── 18-tools_uri_spec.lua
│   │   ├── 19-hooks_spec.lua
│   │   ├── 19-hybrid/
│   │   │   ├── 02-clustering_spec.lua
│   │   │   ├── 03-compat_spec.lua
│   │   │   ├── 04-validate_deltas_spec.lua
│   │   │   └── 05-validate-versions_spec.lua
│   │   ├── 20-sandbox_spec.lua
│   │   ├── 21-dns-client/
│   │   │   ├── 01-utils_spec.lua
│   │   │   ├── 02-client_spec.lua
│   │   │   └── 03-client_cache_spec.lua
│   │   ├── 22-grpc-utils_spec.lua
│   │   ├── 23-vaults_spec.lua
│   │   ├── 24-runloop_certificate_spec.lua
│   │   ├── 25-msgpack_rpc_spec.lua
│   │   ├── 26-mime-type_spec.lua
│   │   ├── 26-observability/
│   │   │   ├── 01-tracer_pdk_spec.lua
│   │   │   ├── 02-propagation_strategies_spec.lua
│   │   │   ├── 03-propagation_module_spec.lua
│   │   │   ├── 04-request-id_spec.lua
│   │   │   ├── 05-logs_spec.lua
│   │   │   └── 06-telemetry-pdk_spec.lua
│   │   ├── 27-queue_spec.lua
│   │   ├── 28-inject_confs_spec.lua
│   │   ├── 28-plugins-iterator/
│   │   │   ├── 01-compound_key_spec.lua
│   │   │   └── 02-lookup_cfg_spec.lua
│   │   ├── 29-admin_gui/
│   │   │   ├── 01-admin_gui_spec.lua
│   │   │   └── 02-admin_gui_template_spec.lua
│   │   ├── 29-lua_cjson_large_str_spec.lua
│   │   ├── 30-new-dns-client/
│   │   │   ├── 01-utils_spec.lua
│   │   │   ├── 02-old_client_spec.lua
│   │   │   ├── 03-old_client_cache_spec.lua
│   │   │   ├── 04-client_ipc_spec.lua
│   │   │   └── 05-client_stat_spec.lua
│   │   ├── 30-standardized_redis_config_spec.lua
│   │   ├── 31-ada-url_spec.lua
│   │   ├── 31-simdjson/
│   │   │   ├── 01-cjson_compatibility_spec.lua
│   │   │   └── 02-yield_spec.lua
│   │   └── 32-tools_string_spec.lua
│   ├── 02-integration/
│   │   ├── 01-helpers/
│   │   │   ├── 01-helpers_spec.lua
│   │   │   ├── 02-blueprints_spec.lua
│   │   │   ├── 03-http_mock_spec.lua
│   │   │   ├── 04-redis_helper_spec.lua
│   │   │   └── 05-rpc-mock_spec.lua
│   │   ├── 02-cmd/
│   │   │   ├── 01-cmds_spec.lua
│   │   │   ├── 02-start_stop_spec.lua
│   │   │   ├── 03-reload_spec.lua
│   │   │   ├── 04-version_spec.lua
│   │   │   ├── 05-check_spec.lua
│   │   │   ├── 06-restart_spec.lua
│   │   │   ├── 07-health_spec.lua
│   │   │   ├── 08-quit_spec.lua
│   │   │   ├── 09-prepare_spec.lua
│   │   │   ├── 10-migrations_spec.lua
│   │   │   ├── 11-config_spec.lua
│   │   │   ├── 12-hybrid_spec.lua
│   │   │   ├── 13-signals_spec.lua
│   │   │   ├── 14-vault_spec.lua
│   │   │   ├── 15-utils_spec.lua
│   │   │   ├── 16-verbose_spec.lua
│   │   │   └── 17-drain_spec.lua
│   │   ├── 03-db/
│   │   │   ├── 01-db_spec.lua
│   │   │   ├── 02-db_core_entities_spec.lua
│   │   │   ├── 03-plugins_spec.lua
│   │   │   ├── 04-db_cluster_mutex_spec.lua
│   │   │   ├── 06-migrations_state_spec.lua
│   │   │   ├── 07-tags_spec.lua
│   │   │   ├── 08-declarative_spec.lua
│   │   │   ├── 09-query-semaphore_spec.lua
│   │   │   ├── 10-db_unique_foreign_spec.lua
│   │   │   ├── 11-db_transformations_spec.lua
│   │   │   ├── 11-postgres-ro_spec.lua
│   │   │   ├── 12-dao_hooks_spec.lua
│   │   │   ├── 13-cluster_status_spec.lua
│   │   │   ├── 14-dao_spec.lua
│   │   │   ├── 15-connection_pool_spec.lua
│   │   │   ├── 18-keys_spec.lua
│   │   │   ├── 19-key-sets_spec.lua
│   │   │   ├── 20-ttl-cleanup_spec.lua
│   │   │   ├── 21-services_spec.lua
│   │   │   ├── 22-ca_certificates_spec.lua
│   │   │   └── 23-shorthand_fields_translate_backwards_spec.lua
│   │   ├── 04-admin_api/
│   │   │   ├── 01-admin_api_spec.lua
│   │   │   ├── 02-kong_routes_spec.lua
│   │   │   ├── 03-consumers_routes_spec.lua
│   │   │   ├── 04-plugins_routes_spec.lua
│   │   │   ├── 05-cache_routes_spec.lua
│   │   │   ├── 06-certificates_routes_spec.lua
│   │   │   ├── 07-upstreams_routes_spec.lua
│   │   │   ├── 08-targets_routes_spec.lua
│   │   │   ├── 09-routes_routes_spec.lua
│   │   │   ├── 10-services_routes_spec.lua
│   │   │   ├── 11-reports_spec.lua
│   │   │   ├── 12-plugins-conf_spec.lua
│   │   │   ├── 13-plugin-endpoints_spec.lua
│   │   │   ├── 14-tags_spec.lua
│   │   │   ├── 15-off_spec.lua
│   │   │   ├── 16-ca_certificates_routes_spec.lua
│   │   │   ├── 17-foreign-entity_spec.lua
│   │   │   ├── 19-vaults_spec.lua
│   │   │   ├── 20-timers_spec.lua
│   │   │   ├── 21-admin-api-keys_spec.lua
│   │   │   ├── 21-truncated_arguments_spec.lua
│   │   │   ├── 22-debug_spec.lua
│   │   │   ├── 23-cors_spec.lua
│   │   │   ├── 25-max_safe_integer_spec.lua
│   │   │   └── 25-workspaces_spec.lua
│   │   ├── 05-proxy/
│   │   │   ├── 01-proxy_spec.lua
│   │   │   ├── 02-router_spec.lua
│   │   │   ├── 03-upstream_headers_spec.lua
│   │   │   ├── 04-plugins_triggering_spec.lua
│   │   │   ├── 05-dns_spec.lua
│   │   │   ├── 06-ssl_spec.lua
│   │   │   ├── 07-upstream_timeouts_spec.lua
│   │   │   ├── 08-uri_encoding_spec.lua
│   │   │   ├── 09-websockets_spec.lua
│   │   │   ├── 10-balancer/
│   │   │   │   ├── 01-healthchecks_spec.lua
│   │   │   │   ├── 02-least-connections_spec.lua
│   │   │   │   ├── 03-consistent-hashing_spec.lua
│   │   │   │   ├── 04-round-robin_spec.lua
│   │   │   │   ├── 05-recreate-request_spec.lua
│   │   │   │   ├── 05-stress.lua
│   │   │   │   ├── 06-stream_spec.lua
│   │   │   │   └── 07-latency_spec.lua
│   │   │   ├── 11-handler_spec.lua
│   │   │   ├── 12-error_default_type_spec.lua
│   │   │   ├── 13-error_handlers_spec.lua
│   │   │   ├── 14-server_tokens_spec.lua
│   │   │   ├── 15-upstream-status-header_spec.lua
│   │   │   ├── 16-custom_nginx_directive_spec.lua
│   │   │   ├── 18-upstream_tls_spec.lua
│   │   │   ├── 19-grpc_proxy_spec.lua
│   │   │   ├── 21-grpc_plugins_triggering_spec.lua
│   │   │   ├── 22-reports_spec.lua
│   │   │   ├── 23-context_spec.lua
│   │   │   ├── 24-buffered_spec.lua
│   │   │   ├── 25-upstream_keepalive_spec.lua
│   │   │   ├── 26-udp_spec.lua
│   │   │   ├── 27-lua-ssl-trusted-cert_spec.lua
│   │   │   ├── 27-unbuffered_spec.lua
│   │   │   ├── 28-stream_plugins_triggering_spec.lua
│   │   │   ├── 29-collect-plugin-errors_spec.lua
│   │   │   ├── 30-max-args_spec.lua
│   │   │   ├── 31-stream_tls_spec.lua
│   │   │   ├── 32-query-params_spec.lua
│   │   │   ├── 33-request-aware-table_spec.lua
│   │   │   ├── 33-request-id-header_spec.lua
│   │   │   ├── 34-proxy_with_compress_spec.lua
│   │   │   └── 35-via_spec.lua
│   │   ├── 06-invalidations/
│   │   │   ├── 01-cluster_events_spec.lua
│   │   │   ├── 02-core_entities_invalidations_spec.lua
│   │   │   ├── 03-plugins_iterator_invalidation_spec.lua
│   │   │   └── 04-balancer_cache_correctness_spec.lua
│   │   ├── 07-sdk/
│   │   │   ├── 01-ctx_spec.lua
│   │   │   ├── 02-log_spec.lua
│   │   │   ├── 03-cluster_spec.lua
│   │   │   ├── 04-plugin-config_spec.lua
│   │   │   ├── 05-pdk_spec.lua
│   │   │   └── 06-worker_events_spec.lua
│   │   ├── 08-status_api/
│   │   │   ├── 01-core_routes_spec.lua
│   │   │   ├── 02-targets_routes_spec.lua
│   │   │   ├── 03-readiness_endpoint_spec.lua
│   │   │   ├── 04-config_spec.lua
│   │   │   └── 05-dns_client_spec.lua
│   │   ├── 09-hybrid_mode/
│   │   │   ├── 01-sync_spec.lua
│   │   │   ├── 02-start_stop_spec.lua
│   │   │   ├── 03-pki_spec.lua
│   │   │   ├── 04-cp_cluster_sync_spec.lua
│   │   │   ├── 05-ocsp_spec.lua
│   │   │   ├── 08-lazy_export_spec.lua
│   │   │   ├── 09-config-compat_spec.lua
│   │   │   ├── 09-node-id-persistence_spec.lua
│   │   │   ├── 10-forward-proxy_spec.lua
│   │   │   ├── 11-status_spec.lua
│   │   │   ├── 12-errors_spec.lua
│   │   │   ├── 13-deprecations_spec.lua
│   │   │   ├── 14-dp_privileged_agent_spec.lua
│   │   │   └── 15-cp_inert_rpc_sync_spec.lua
│   │   ├── 10-external-plugins/
│   │   │   ├── 01-process-management_spec.lua
│   │   │   ├── 02-execution_spec.lua
│   │   │   ├── 03-wasm_spec.lua
│   │   │   └── 99-reports_spec.lua
│   │   ├── 11-dbless/
│   │   │   ├── 01-respawn_spec.lua
│   │   │   ├── 02-workers_spec.lua
│   │   │   ├── 03-config_persistence_spec.lua
│   │   │   └── 04-pagination_spec.lua
│   │   ├── 12-stream_api/
│   │   │   └── 01-stream_api_endpoint_spec.lua
│   │   ├── 13-vaults/
│   │   │   ├── 01-vault_spec.lua
│   │   │   ├── 02-env_vault_spec.lua
│   │   │   ├── 03-mock_spec.lua
│   │   │   ├── 04-echo_spec.lua
│   │   │   ├── 05-ttl_spec.lua
│   │   │   ├── 06-refresh-secrets_spec.lua
│   │   │   └── 07-resurrect_spec.lua
│   │   ├── 14-observability/
│   │   │   ├── 01-instrumentations_spec.lua
│   │   │   ├── 02-propagation_spec.lua
│   │   │   ├── 03-tracer-pdk_spec.lua
│   │   │   ├── 04-trace-ids-log_spec.lua
│   │   │   ├── 05-logs_spec.lua
│   │   │   └── 06-telemetry-pdk_spec.lua
│   │   ├── 15-plugins-iterator/
│   │   │   ├── 01-precedence_spec.lua
│   │   │   └── 02-correctness_spec.lua
│   │   ├── 16-queues/
│   │   │   └── 01-shutdown_spec.lua
│   │   ├── 17-admin_gui/
│   │   │   ├── 01-admin-gui-path_spec.lua
│   │   │   ├── 02-log_spec.lua
│   │   │   └── 03-reports_spec.lua
│   │   ├── 18-hybrid_rpc/
│   │   │   ├── 01-rpc_spec.lua
│   │   │   ├── 02-error_spec.lua
│   │   │   ├── 03-inert_spec.lua
│   │   │   ├── 04-concentrator_spec.lua
│   │   │   ├── 05-sync-rpc_spec.lua
│   │   │   ├── 06-batch-rpc_spec.lua
│   │   │   ├── 07-notification_spec.lua
│   │   │   ├── 08-sync_v2_get_delta_spec.lua
│   │   │   ├── 09-notify_new_version_spec.lua
│   │   │   └── 10-validate_deltas_spec.lua
│   │   ├── 21-request-debug/
│   │   │   └── 01-request-debug_spec.lua
│   │   └── 22-ai_plugins/
│   │       └── 01-reports_spec.lua
│   ├── 03-plugins/
│   │   ├── 01-legacy_queue_parameter_warning_spec.lua
│   │   ├── 01-tcp-log/
│   │   │   └── 01-tcp-log_spec.lua
│   │   ├── 02-legacy_propagation_parameter_warning_spec.lua
│   │   ├── 02-udp-log/
│   │   │   └── 01-udp-log_spec.lua
│   │   ├── 03-http-log/
│   │   │   ├── 01-log_spec.lua
│   │   │   ├── 02-schema_spec.lua
│   │   │   ├── 03-schem-vault_spec.lua
│   │   │   ├── 04-legacy_queue_sharing_spec.lua
│   │   │   └── 05-old-plugin-compatibility_spec.lua
│   │   ├── 04-file-log/
│   │   │   ├── 01-log_spec.lua
│   │   │   └── 02-schema_spec.lua
│   │   ├── 05-syslog/
│   │   │   └── 01-log_spec.lua
│   │   ├── 06-statsd/
│   │   │   ├── 01-log_spec.lua
│   │   │   ├── 02-schema_spec.lua
│   │   │   └── 03-allow_status_codes_spec.lua
│   │   ├── 07-loggly/
│   │   │   └── 01-log_spec.lua
│   │   ├── 08-datadog/
│   │   │   ├── 01-log_spec.lua
│   │   │   └── 02-schema_spec.lua
│   │   ├── 09-key-auth/
│   │   │   ├── 01-api_spec.lua
│   │   │   ├── 02-access_spec.lua
│   │   │   ├── 03-invalidations_spec.lua
│   │   │   └── 04-hybrid_mode_spec.lua
│   │   ├── 10-basic-auth/
│   │   │   ├── 01-crypto_spec.lua
│   │   │   ├── 02-api_spec.lua
│   │   │   ├── 03-access_spec.lua
│   │   │   ├── 04-invalidations_spec.lua
│   │   │   └── 05-declarative_spec.lua
│   │   ├── 11-correlation-id/
│   │   │   ├── 01-access_spec.lua
│   │   │   └── 02-schema_spec.lua
│   │   ├── 12-request-size-limiting/
│   │   │   └── 01-access_spec.lua
│   │   ├── 13-cors/
│   │   │   ├── 01-access_spec.lua
│   │   │   └── 02-schema_spec.lua
│   │   ├── 14-request-termination/
│   │   │   ├── 01-schema_spec.lua
│   │   │   ├── 02-access_spec.lua
│   │   │   └── 03-integration_spec.lua
│   │   ├── 15-response-transformer/
│   │   │   ├── 01-header_transformer_spec.lua
│   │   │   ├── 02-body_transformer_spec.lua
│   │   │   ├── 03-api_spec.lua
│   │   │   ├── 04-filter_spec.lua
│   │   │   └── 05-big_response_body_spec.lua
│   │   ├── 16-jwt/
│   │   │   ├── 01-jwt_parser_spec.lua
│   │   │   ├── 02-api_spec.lua
│   │   │   ├── 03-access_spec.lua
│   │   │   ├── 04-invalidations_spec.lua
│   │   │   ├── 06-schema_spec.lua
│   │   │   └── fixtures.lua
│   │   ├── 17-ip-restriction/
│   │   │   ├── 01-schema_spec.lua
│   │   │   └── 02-access_spec.lua
│   │   ├── 18-acl/
│   │   │   ├── 01-api_spec.lua
│   │   │   ├── 02-access_spec.lua
│   │   │   └── 03-invalidations_spec.lua
│   │   ├── 19-hmac-auth/
│   │   │   ├── 01-schema_spec.lua
│   │   │   ├── 02-api_spec.lua
│   │   │   ├── 03-access_spec.lua
│   │   │   └── 04-invalidations_spec.lua
│   │   ├── 20-ldap-auth/
│   │   │   ├── 01-access_spec.lua
│   │   │   ├── 02-invalidations_spec.lua
│   │   │   ├── 02-schema_spec.lua
│   │   │   └── 03-decode_spec.lua
│   │   ├── 21-bot-detection/
│   │   │   ├── 01-access_spec.lua
│   │   │   ├── 02-invalidations_spec.lua
│   │   │   └── 03-api_spec.lua
│   │   ├── 23-rate-limiting/
│   │   │   ├── 01-schema_spec.lua
│   │   │   ├── 02-policies_spec.lua
│   │   │   ├── 03-api_spec.lua
│   │   │   ├── 04-access_spec.lua
│   │   │   ├── 05-integration_spec.lua
│   │   │   ├── 06-shorthand_fields_spec.lua
│   │   │   └── 07-hybrid_mode_spec.lua
│   │   ├── 24-response-rate-limiting/
│   │   │   ├── 01-schema_spec.lua
│   │   │   ├── 02-policies_spec.lua
│   │   │   ├── 03-api_spec.lua
│   │   │   ├── 04-access_spec.lua
│   │   │   ├── 05-integration_spec.lua
│   │   │   └── 06-shorthand_fields_spec.lua
│   │   ├── 25-oauth2/
│   │   │   ├── 01-schema_spec.lua
│   │   │   ├── 02-api_spec.lua
│   │   │   ├── 03-access_spec.lua
│   │   │   ├── 04-invalidations_spec.lua
│   │   │   └── 05-kdf_spec.lua
│   │   ├── 26-prometheus/
│   │   │   ├── 01-api_spec.lua
│   │   │   ├── 02-access_spec.lua
│   │   │   ├── 03-custom-serve_spec.lua
│   │   │   ├── 04-status_api_spec.lua
│   │   │   ├── 05-metrics_spec.lua
│   │   │   ├── 06-hybrid-mode_metrics_spec.lua
│   │   │   ├── 07-optional_fields_spec.lua
│   │   │   ├── 08-unit_spec.lua
│   │   │   └── 09-wasmx_spec.lua
│   │   ├── 27-aws-lambda/
│   │   │   ├── 02-schema_spec.lua
│   │   │   ├── 05-aws-serializer_spec.lua
│   │   │   ├── 06-request-util_spec.lua
│   │   │   ├── 08-sam-integration_spec.lua
│   │   │   └── 99-access_spec.lua
│   │   ├── 28-grpc-gateway/
│   │   │   └── 01-proxy_spec.lua
│   │   ├── 29-acme/
│   │   │   ├── 01-client_spec.lua
│   │   │   ├── 02-kong_storage_spec.lua
│   │   │   ├── 03-access_spec.lua
│   │   │   ├── 04-schema_spec.lua
│   │   │   ├── 05-redis_storage_spec.lua
│   │   │   ├── 06-hybrid_mode_spec.lua
│   │   │   └── 07-shorthand_fields_spec.lua
│   │   ├── 30-session/
│   │   │   ├── 01-access_spec.lua
│   │   │   ├── 02-kong_storage_adapter_spec.lua
│   │   │   └── 03-session_spec.lua
│   │   ├── 31-proxy-cache/
│   │   │   ├── 01-schema_spec.lua
│   │   │   ├── 02-access_spec.lua
│   │   │   ├── 03-api_spec.lua
│   │   │   ├── 04-invalidations_spec.lua
│   │   │   └── 05-cache_key_spec.lua
│   │   ├── 32-grpc-web/
│   │   │   └── 01-proxy_spec.lua
│   │   ├── 33-serverless-functions/
│   │   │   ├── 01-schema_spec.lua
│   │   │   ├── 02-access_spec.lua
│   │   │   ├── 03-dbless_spec.lua
│   │   │   └── 04-phases_spec.lua
│   │   ├── 34-zipkin/
│   │   │   ├── request_tags_spec.lua
│   │   │   ├── schema_spec.lua
│   │   │   ├── zipkin_no_endpoint_spec.lua
│   │   │   ├── zipkin_queue_spec.lua
│   │   │   └── zipkin_spec.lua
│   │   ├── 35-azure-functions/
│   │   │   └── 01-access_spec.lua
│   │   ├── 36-request-transformer/
│   │   │   ├── 01-schema_spec.lua
│   │   │   ├── 02-access_spec.lua
│   │   │   └── 03-api_spec.lua
│   │   ├── 37-opentelemetry/
│   │   │   ├── 01-otlp_spec.lua
│   │   │   ├── 02-schema_spec.lua
│   │   │   ├── 03-propagation_spec.lua
│   │   │   ├── 04-exporter_spec.lua
│   │   │   ├── 05-otelcol_spec.lua
│   │   │   ├── 06-regression_spec.lua
│   │   │   └── 07-utils_spec.lua
│   │   ├── 38-ai-proxy/
│   │   │   ├── 00-config_spec.lua
│   │   │   ├── 01-unit_spec.lua
│   │   │   ├── 02-openai_integration_spec.lua
│   │   │   ├── 03-anthropic_integration_spec.lua
│   │   │   ├── 04-cohere_integration_spec.lua
│   │   │   ├── 05-azure_integration_spec.lua
│   │   │   ├── 06-mistral_integration_spec.lua
│   │   │   ├── 07-llama2_integration_spec.lua
│   │   │   ├── 08-encoding_integration_spec.lua
│   │   │   ├── 09-streaming_integration_spec.lua
│   │   │   ├── 10-huggingface_integration_spec.lua
│   │   │   ├── 11-gemini_integration_spec.lua
│   │   │   ├── 12-native_unit_spec.lua
│   │   │   ├── json-schema.json
│   │   │   └── oas.yaml
│   │   ├── 39-ai-request-transformer/
│   │   │   ├── 00-config_spec.lua
│   │   │   ├── 01-transformer_spec.lua
│   │   │   └── 02-integration_spec.lua
│   │   ├── 39-reconfiguration-completion/
│   │   │   ├── 01-access_spec.lua
│   │   │   └── 02-helper_spec.lua
│   │   ├── 40-ai-response-transformer/
│   │   │   ├── 00-config_spec.lua
│   │   │   ├── 01-transformer_spec.lua
│   │   │   └── 02-integration_spec.lua
│   │   ├── 41-ai-prompt-decorator/
│   │   │   ├── 00-config_spec.lua
│   │   │   ├── 01-unit_spec.lua
│   │   │   └── 02-integration_spec.lua
│   │   ├── 42-ai-prompt-guard/
│   │   │   ├── 00-config_spec.lua
│   │   │   ├── 01-unit_spec.lua
│   │   │   └── 02-integration_spec.lua
│   │   ├── 43-ai-prompt-template/
│   │   │   ├── 01-unit_spec.lua
│   │   │   └── 02-integration_spec.lua
│   │   ├── 44-standard-webhooks/
│   │   │   ├── 01-unit_spec.lua
│   │   │   └── 02-integration_spec.lua
│   │   └── 45-redirect/
│   │       ├── 01-schema_spec.lua
│   │       ├── 02-access_spec.lua
│   │       └── 03-integration_spec.lua
│   ├── 04-perf/
│   │   ├── 01-rps/
│   │   │   ├── 01-simple_spec.lua
│   │   │   ├── 02-balancer_spec.lua
│   │   │   ├── 03-plugin_iterator_spec.lua
│   │   │   ├── 04-simple_hybrid_spec.lua
│   │   │   ├── 05-prometheus.lua
│   │   │   ├── 06-core_entities_crud_spec.lua
│   │   │   └── 07-upstream_lock_regression_spec.lua
│   │   ├── 02-flamegraph/
│   │   │   ├── 01-simple_spec.lua
│   │   │   ├── 03-plugin_iterator_spec.lua
│   │   │   ├── 05-prometheus.lua
│   │   │   └── 07-upstream_lock_regression_spec.lua
│   │   └── 99-teardown/
│   │       └── 01-teardown_spec.lua
│   ├── 05-migration/
│   │   ├── db/
│   │   │   └── migrations/
│   │   │       └── core/
│   │   │           ├── 016_280_to_300_spec.lua
│   │   │           ├── 017_300_to_310_spec.lua
│   │   │           ├── 018_310_to_320_spec.lua
│   │   │           ├── 019_320_to_330_spec.lua
│   │   │           ├── 020_330_to_340_spec.lua
│   │   │           ├── 021_340_to_350_spec.lua
│   │   │           ├── 022_350_to_360_spec.lua
│   │   │           ├── 023_360_to_370_spec.lua
│   │   │           ├── 024_380_to_390_spec.lua
│   │   │           └── 025_390_to_3100_spec.lua
│   │   └── plugins/
│   │       ├── acme/
│   │       │   └── migrations/
│   │       │       ├── 001_280_to_300_spec.lua
│   │       │       ├── 002_320_to_330_spec.lua
│   │       │       └── 003_350_to_360_spec.lua
│   │       ├── ai-proxy/
│   │       │   └── migrations/
│   │       │       └── 001_360_to_370_spec.lua
│   │       ├── http-log/
│   │       │   └── migrations/
│   │       │       └── 001_280_to_300_spec.lua
│   │       ├── key-auth/
│   │       │   └── migrations/
│   │       │       └── 004_320_to_330_spec.lua
│   │       ├── oauth2/
│   │       │   └── migrations/
│   │       │       ├── 006_320_to_330_spec.lua
│   │       │       └── 007_320_to_330_spec.lua
│   │       ├── opentelemetry/
│   │       │   └── migrations/
│   │       │       └── 001_331_to_332_spec.lua
│   │       ├── post-function/
│   │       │   └── migrations/
│   │       │       └── 001_280_to_300_spec.lua
│   │       ├── pre-function/
│   │       │   └── migrations/
│   │       │       └── 001_280_to_300_spec.lua
│   │       ├── rate-limiting/
│   │       │   └── migrations/
│   │       │       ├── 005_320_to_330_spec.lua
│   │       │       └── 006_350_to_360_spec.lua
│   │       ├── response-ratelimiting/
│   │       │   └── migrations/
│   │       │       └── 001_350_to_360_spec.lua
│   │       └── session/
│   │           └── migrations/
│   │               ├── 002_320_to_330_spec.lua
│   │               └── 003_330_to_3100_spec.lua
│   ├── 06-third-party/
│   │   └── 01-deck/
│   │       └── 01-deck-integration_spec.lua
│   ├── README.md
│   ├── busted-ci-helper.lua
│   ├── config.ld
│   ├── fixtures/
│   │   ├── 1.2_custom_nginx.template
│   │   ├── admin_api.lua
│   │   ├── ai-proxy/
│   │   │   ├── anthropic/
│   │   │   │   ├── llm-v1-chat/
│   │   │   │   │   ├── requests/
│   │   │   │   │   │   ├── bad_request.json
│   │   │   │   │   │   ├── good-stream.json
│   │   │   │   │   │   ├── good.json
│   │   │   │   │   │   └── good_own_model.json
│   │   │   │   │   └── responses/
│   │   │   │   │       ├── bad_request.json
│   │   │   │   │       ├── bad_upstream_response.json
│   │   │   │   │       ├── good.json
│   │   │   │   │       ├── internal_server_error.html
│   │   │   │   │       ├── malformed_usage_response.json
│   │   │   │   │       ├── no_usage_response.json
│   │   │   │   │       └── unauthorized.json
│   │   │   │   ├── llm-v1-completions/
│   │   │   │   │   ├── requests/
│   │   │   │   │   │   ├── bad_request.json
│   │   │   │   │   │   └── good.json
│   │   │   │   │   └── responses/
│   │   │   │   │       ├── bad_request.json
│   │   │   │   │       ├── good.json
│   │   │   │   │       └── unauthorized.json
│   │   │   │   └── request-transformer/
│   │   │   │       └── response-in-json.json
│   │   │   ├── azure/
│   │   │   │   └── request-transformer/
│   │   │   │       └── response-in-json.json
│   │   │   ├── bedrock/
│   │   │   │   └── chunks/
│   │   │   │       ├── chunk-1.txt
│   │   │   │       ├── chunk-2.txt
│   │   │   │       └── chunk-3.txt
│   │   │   ├── cohere/
│   │   │   │   ├── llm-v1-chat/
│   │   │   │   │   ├── requests/
│   │   │   │   │   │   ├── bad_request.json
│   │   │   │   │   │   ├── good-stream.json
│   │   │   │   │   │   ├── good.json
│   │   │   │   │   │   └── good_own_model.json
│   │   │   │   │   └── responses/
│   │   │   │   │       ├── bad_request.json
│   │   │   │   │       ├── bad_upstream_response.json
│   │   │   │   │       ├── good.json
│   │   │   │   │       ├── internal_server_error.html
│   │   │   │   │       └── unauthorized.json
│   │   │   │   ├── llm-v1-completions/
│   │   │   │   │   ├── requests/
│   │   │   │   │   │   ├── bad_request.json
│   │   │   │   │   │   └── good.json
│   │   │   │   │   └── responses/
│   │   │   │   │       ├── bad_request.json
│   │   │   │   │       ├── good.json
│   │   │   │   │       └── unauthorized.json
│   │   │   │   └── request-transformer/
│   │   │   │       └── response-in-json.json
│   │   │   ├── gemini/
│   │   │   │   ├── llm-v1-chat/
│   │   │   │   │   └── responses/
│   │   │   │   │       ├── fails_safety.json
│   │   │   │   │       └── good.json
│   │   │   │   └── request-transformer/
│   │   │   │       └── response-in-json.json
│   │   │   ├── huggingface/
│   │   │   │   ├── llm-v1-chat/
│   │   │   │   │   ├── requests/
│   │   │   │   │   │   └── good.json
│   │   │   │   │   └── responses/
│   │   │   │   │       ├── bad_request.json
│   │   │   │   │       ├── bad_response_model_load.json
│   │   │   │   │       ├── bad_response_timeout.json
│   │   │   │   │       ├── good.json
│   │   │   │   │       └── unauthorized.json
│   │   │   │   └── llm-v1-completions/
│   │   │   │       ├── requests/
│   │   │   │       │   └── good.json
│   │   │   │       └── responses/
│   │   │   │           ├── bad_request.json
│   │   │   │           ├── good.json
│   │   │   │           └── unauthorized.json
│   │   │   ├── json-schema.json
│   │   │   ├── llama2/
│   │   │   │   ├── ollama/
│   │   │   │   │   └── chat-stream.json
│   │   │   │   ├── raw/
│   │   │   │   │   ├── requests/
│   │   │   │   │   │   ├── good-chat.json
│   │   │   │   │   │   └── good-completions.json
│   │   │   │   │   └── responses/
│   │   │   │   │       ├── bad_request.json
│   │   │   │   │       ├── good.json
│   │   │   │   │       └── unauthorized.json
│   │   │   │   └── request-transformer/
│   │   │   │       └── response-in-json.json
│   │   │   ├── mistral/
│   │   │   │   ├── llm-v1-chat/
│   │   │   │   │   └── responses/
│   │   │   │   │       └── good.json
│   │   │   │   ├── llm-v1-completions/
│   │   │   │   │   └── responses/
│   │   │   │   │       └── good.json
│   │   │   │   └── request-transformer/
│   │   │   │       └── response-in-json.json
│   │   │   ├── native/
│   │   │   │   ├── bedrock/
│   │   │   │   │   └── request/
│   │   │   │   │       └── with-functions-and-chatter.json
│   │   │   │   ├── gemini/
│   │   │   │   │   └── request/
│   │   │   │   │       ├── basic-chat.json
│   │   │   │   │       ├── basic-multimodal.json
│   │   │   │   │       ├── with-functions-and-chatter.json
│   │   │   │   │       └── with-functions.json
│   │   │   │   └── target/
│   │   │   │       ├── target-openai-complete-stream.json
│   │   │   │       └── target-openai-complete.json
│   │   │   ├── oas.yaml
│   │   │   ├── openai/
│   │   │   │   ├── llm-v1-chat/
│   │   │   │   │   ├── requests/
│   │   │   │   │   │   ├── bad_request.json
│   │   │   │   │   │   ├── good-stream-with-functions.json
│   │   │   │   │   │   ├── good-stream.json
│   │   │   │   │   │   ├── good.json
│   │   │   │   │   │   ├── good_multi_modal.json
│   │   │   │   │   │   ├── good_own_model.json
│   │   │   │   │   │   ├── tool_choice_auto.json
│   │   │   │   │   │   ├── tool_choice_none.json
│   │   │   │   │   │   ├── tool_choice_object_function.json
│   │   │   │   │   │   └── tool_choice_required.json
│   │   │   │   │   └── responses/
│   │   │   │   │       ├── bad_request.json
│   │   │   │   │       ├── bad_upstream_response.json
│   │   │   │   │       ├── good.json
│   │   │   │   │       ├── internal_server_error.html
│   │   │   │   │       └── unauthorized.json
│   │   │   │   ├── llm-v1-completions/
│   │   │   │   │   ├── requests/
│   │   │   │   │   │   ├── bad_request.json
│   │   │   │   │   │   └── good.json
│   │   │   │   │   └── responses/
│   │   │   │   │       ├── bad_request.json
│   │   │   │   │       ├── good.json
│   │   │   │   │       └── unauthorized.json
│   │   │   │   ├── llm-v1-embeddings/
│   │   │   │   │   └── responses/
│   │   │   │   │       └── good.json
│   │   │   │   └── request-transformer/
│   │   │   │       ├── response-in-json.json
│   │   │   │       ├── response-not-json.json
│   │   │   │       ├── response-with-bad-instructions.json
│   │   │   │       └── response-with-instructions.json
│   │   │   └── unit/
│   │   │       ├── expected-requests/
│   │   │       │   ├── anthropic/
│   │   │       │   │   ├── llm-v1-chat.json
│   │   │       │   │   └── llm-v1-completions.json
│   │   │       │   ├── azure/
│   │   │       │   │   ├── llm-v1-chat.json
│   │   │       │   │   └── llm-v1-completions.json
│   │   │       │   ├── bedrock/
│   │   │       │   │   └── llm-v1-chat.json
│   │   │       │   ├── cohere/
│   │   │       │   │   ├── llm-v1-chat.json
│   │   │       │   │   └── llm-v1-completions.json
│   │   │       │   ├── gemini/
│   │   │       │   │   └── llm-v1-chat.json
│   │   │       │   ├── llama2/
│   │   │       │   │   ├── ollama/
│   │   │       │   │   │   ├── llm-v1-chat.json
│   │   │       │   │   │   └── llm-v1-completions.json
│   │   │       │   │   └── raw/
│   │   │       │   │       ├── llm-v1-chat.json
│   │   │       │   │       └── llm-v1-completions.json
│   │   │       │   ├── mistral/
│   │   │       │   │   ├── ollama/
│   │   │       │   │   │   └── llm-v1-chat.json
│   │   │       │   │   └── openai/
│   │   │       │   │       └── llm-v1-chat.json
│   │   │       │   └── openai/
│   │   │       │       ├── llm-v1-chat.json
│   │   │       │       └── llm-v1-completions.json
│   │   │       ├── expected-responses/
│   │   │       │   ├── anthropic/
│   │   │       │   │   ├── llm-v1-chat.json
│   │   │       │   │   └── llm-v1-completions.json
│   │   │       │   ├── azure/
│   │   │       │   │   ├── llm-v1-chat.json
│   │   │       │   │   └── llm-v1-completions.json
│   │   │       │   ├── bedrock/
│   │   │       │   │   └── llm-v1-chat.json
│   │   │       │   ├── cohere/
│   │   │       │   │   ├── llm-v1-chat.json
│   │   │       │   │   └── llm-v1-completions.json
│   │   │       │   ├── gemini/
│   │   │       │   │   └── llm-v1-chat.json
│   │   │       │   ├── llama2/
│   │   │       │   │   ├── ollama/
│   │   │       │   │   │   ├── llm-v1-chat.json
│   │   │       │   │   │   └── llm-v1-completions.json
│   │   │       │   │   └── raw/
│   │   │       │   │       ├── llm-v1-chat.json
│   │   │       │   │       └── llm-v1-completions.json
│   │   │       │   ├── mistral/
│   │   │       │   │   ├── ollama/
│   │   │       │   │   │   └── llm-v1-chat.json
│   │   │       │   │   └── openai/
│   │   │       │   │       └── llm-v1-chat.json
│   │   │       │   └── openai/
│   │   │       │       ├── llm-v1-chat.json
│   │   │       │       └── llm-v1-completions.json
│   │   │       ├── real-responses/
│   │   │       │   ├── anthropic/
│   │   │       │   │   ├── llm-v1-chat.json
│   │   │       │   │   └── llm-v1-completions.json
│   │   │       │   ├── azure/
│   │   │       │   │   ├── llm-v1-chat.json
│   │   │       │   │   └── llm-v1-completions.json
│   │   │       │   ├── bedrock/
│   │   │       │   │   └── llm-v1-chat.json
│   │   │       │   ├── cohere/
│   │   │       │   │   ├── llm-v1-chat.json
│   │   │       │   │   └── llm-v1-completions.json
│   │   │       │   ├── gemini/
│   │   │       │   │   └── llm-v1-chat.json
│   │   │       │   ├── llama2/
│   │   │       │   │   ├── ollama/
│   │   │       │   │   │   ├── llm-v1-chat.json
│   │   │       │   │   │   └── llm-v1-completions.json
│   │   │       │   │   └── raw/
│   │   │       │   │       ├── llm-v1-chat.json
│   │   │       │   │       └── llm-v1-completions.json
│   │   │       │   ├── mistral/
│   │   │       │   │   ├── ollama/
│   │   │       │   │   │   └── llm-v1-chat.json
│   │   │       │   │   └── openai/
│   │   │       │   │       └── llm-v1-chat.json
│   │   │       │   └── openai/
│   │   │       │       ├── llm-v1-chat.json
│   │   │       │       └── llm-v1-completions.json
│   │   │       ├── real-stream-frames/
│   │   │       │   ├── cohere/
│   │   │       │   │   ├── llm-v1-chat.txt
│   │   │       │   │   └── llm-v1-completions.txt
│   │   │       │   └── openai/
│   │   │       │       ├── llm-v1-chat.txt
│   │   │       │       └── llm-v1-completions.txt
│   │   │       ├── requests/
│   │   │       │   ├── llm-v1-chat.json
│   │   │       │   ├── llm-v1-completion-template.json
│   │   │       │   └── llm-v1-completions.json
│   │   │       └── streaming-chunk-formats/
│   │   │           ├── aws/
│   │   │           │   └── expected-output.json
│   │   │           ├── complete-json/
│   │   │           │   └── expected-output.json
│   │   │           ├── partial-json-beginning/
│   │   │           │   └── expected-output.json
│   │   │           ├── partial-json-end/
│   │   │           │   └── expected-output.json
│   │   │           └── text-event-stream/
│   │   │               └── expected-output.json
│   │   ├── aws-lambda.lua
│   │   ├── aws-sam.lua
│   │   ├── balancer_utils.lua
│   │   ├── blueprints.lua
│   │   ├── burst.yml
│   │   ├── custom_nginx.template
│   │   ├── custom_plugins/
│   │   │   └── kong/
│   │   │       └── plugins/
│   │   │           ├── admin-api-method/
│   │   │           │   ├── api.lua
│   │   │           │   ├── handler.lua
│   │   │           │   ├── schema.lua
│   │   │           │   └── status_api.lua
│   │   │           ├── api-override/
│   │   │           │   ├── api.lua
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── cache/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── cache-key-vs-endpoint-key/
│   │   │           │   ├── daos.lua
│   │   │           │   ├── handler.lua
│   │   │           │   ├── migrations/
│   │   │           │   │   ├── 000_base_cache_key_vs_endpoint_key.lua
│   │   │           │   │   └── init.lua
│   │   │           │   └── schema.lua
│   │   │           ├── cluster-error-reporting/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── ctx-checker/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── ctx-checker-last/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── ctx-tests/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── ctx-tests-response/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── dns-client-test/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── dummy/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── enable-buffering/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── enable-buffering-response/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── error-generator/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── error-generator-last/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── error-handler-log/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── fail-once-auth/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── foreign-entity/
│   │   │           │   ├── api.lua
│   │   │           │   ├── daos.lua
│   │   │           │   ├── handler.lua
│   │   │           │   ├── migrations/
│   │   │           │   │   ├── 000_base_foreign_entity.lua
│   │   │           │   │   └── init.lua
│   │   │           │   └── schema.lua
│   │   │           ├── get-plugin-id/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── init-worker-lua-error/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── invalid-schema/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── invalidations/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── logger/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── logger-last/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── max-args/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── muti-external-http-calls/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── older-version/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── pdk-logger/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── plugin-config-dump/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── plugin-with-custom-dao/
│   │   │           │   ├── custom_dao.lua
│   │   │           │   ├── daos.lua
│   │   │           │   ├── handler.lua
│   │   │           │   ├── schema.lua
│   │   │           │   └── strategies/
│   │   │           │       └── postgres/
│   │   │           │           └── custom_dao.lua
│   │   │           ├── preserve-nulls/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── reconfiguration-completion/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── redis-dummy/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── reference-ca-cert/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── reports-api/
│   │   │           │   ├── api.lua
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── request-aware-table/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── response-phase/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rewriter/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rpc-batch-test/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rpc-concentrator-test/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rpc-debug/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rpc-error-test/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rpc-get-delta-test/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rpc-hello-test/
│   │   │           │   ├── api.lua
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rpc-notification-test/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rpc-notify-new-version-test/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rpc-validation-test/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── secret-response/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── short-circuit/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── slow-query/
│   │   │           │   ├── api.lua
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── stream-api-echo/
│   │   │           │   ├── api.lua
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── tcp-trace-exporter/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── transformations/
│   │   │           │   ├── daos.lua
│   │   │           │   ├── handler.lua
│   │   │           │   ├── migrations/
│   │   │           │   │   ├── 000_base_transformations.lua
│   │   │           │   │   └── init.lua
│   │   │           │   └── schema.lua
│   │   │           ├── translate-backwards-older-plugin/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── unique-foreign/
│   │   │           │   ├── daos.lua
│   │   │           │   ├── handler.lua
│   │   │           │   ├── migrations/
│   │   │           │   │   ├── 000_base_unique_foreign.lua
│   │   │           │   │   └── init.lua
│   │   │           │   └── schema.lua
│   │   │           ├── with-migrations/
│   │   │           │   ├── daos.lua
│   │   │           │   ├── handler.lua
│   │   │           │   ├── migrations/
│   │   │           │   │   ├── 000_base_with_migrations.lua
│   │   │           │   │   ├── 001_14_to_15.lua
│   │   │           │   │   └── init.lua
│   │   │           │   └── schema.lua
│   │   │           └── worker-events/
│   │   │               ├── handler.lua
│   │   │               └── schema.lua
│   │   ├── custom_vaults/
│   │   │   └── kong/
│   │   │       └── vaults/
│   │   │           ├── echo/
│   │   │           │   ├── init.lua
│   │   │           │   └── schema.lua
│   │   │           ├── mock/
│   │   │           │   ├── init.lua
│   │   │           │   └── schema.lua
│   │   │           ├── mocksocket/
│   │   │           │   ├── init.lua
│   │   │           │   └── schema.lua
│   │   │           ├── random/
│   │   │           │   ├── init.lua
│   │   │           │   └── schema.lua
│   │   │           └── test/
│   │   │               ├── init.lua
│   │   │               └── schema.lua
│   │   ├── dc_blueprints.lua
│   │   ├── default_status_listen.conf
│   │   ├── dump_lmdb_key.lua
│   │   ├── error_templates/
│   │   │   ├── error_template.html
│   │   │   ├── error_template.json
│   │   │   ├── error_template.plain
│   │   │   └── error_template.xml
│   │   ├── external_plugins/
│   │   │   ├── go/
│   │   │   │   ├── go-hello.go
│   │   │   │   ├── go.mod
│   │   │   │   └── go.sum
│   │   │   ├── js/
│   │   │   │   └── js-hello.js
│   │   │   └── py/
│   │   │       ├── py-hello.py
│   │   │       └── requirements.txt
│   │   ├── factories/
│   │   │   └── plugins.lua
│   │   ├── forward-proxy-server.lua
│   │   ├── grpc/
│   │   │   ├── direct_imports.proto
│   │   │   ├── google/
│   │   │   │   ├── api/
│   │   │   │   │   ├── annotations.proto
│   │   │   │   │   ├── http.proto
│   │   │   │   │   └── httpbody.proto
│   │   │   │   └── protobuf/
│   │   │   │       ├── any.proto
│   │   │   │       ├── api.proto
│   │   │   │       ├── descriptor.proto
│   │   │   │       ├── duration.proto
│   │   │   │       ├── empty.proto
│   │   │   │       ├── field_mask.proto
│   │   │   │       ├── source_context.proto
│   │   │   │       ├── struct.proto
│   │   │   │       ├── timestamp.proto
│   │   │   │       ├── type.proto
│   │   │   │       └── wrappers.proto
│   │   │   ├── hello.proto
│   │   │   ├── helloworld.proto
│   │   │   ├── second_level_imports.proto
│   │   │   ├── target/
│   │   │   │   ├── go.mod
│   │   │   │   ├── go.sum
│   │   │   │   ├── grpc-target.go
│   │   │   │   └── targetservice/
│   │   │   │       ├── targetservice.pb.go
│   │   │   │       └── targetservice_grpc.pb.go
│   │   │   └── targetservice.proto
│   │   ├── headers.conf
│   │   ├── hosts
│   │   ├── https_server.lua
│   │   ├── invalid-module.lua
│   │   ├── invalid.conf
│   │   ├── invalid_nginx_directives.conf
│   │   ├── kong_clustering.crt
│   │   ├── kong_clustering.key
│   │   ├── kong_clustering_ca.crt
│   │   ├── kong_clustering_client.crt
│   │   ├── kong_clustering_client.key
│   │   ├── kong_spec.crt
│   │   ├── kong_spec.key
│   │   ├── migrations/
│   │   │   └── kong/
│   │   │       └── db/
│   │   │           └── migrations/
│   │   │               └── core/
│   │   │                   ├── 000_base.lua
│   │   │                   ├── 001_14_to_15.lua
│   │   │                   └── init.lua
│   │   ├── mock_cp.lua
│   │   ├── mock_upstream.lua
│   │   ├── mock_webserver_tpl.lua
│   │   ├── mocker.lua
│   │   ├── mocks/
│   │   │   ├── lua-resty-dns/
│   │   │   │   └── resty/
│   │   │   │       └── dns/
│   │   │   │           └── resolver.lua
│   │   │   └── lua-resty-websocket/
│   │   │       └── resty/
│   │   │           └── websocket/
│   │   │               └── peer.lua
│   │   ├── mtls_certs/
│   │   │   ├── ca.crt
│   │   │   ├── ca.key
│   │   │   ├── example.com.crt
│   │   │   ├── example.com.key
│   │   │   ├── example2.com.crt
│   │   │   └── example2.com.key
│   │   ├── nginx-directives.conf
│   │   ├── ocsp_certs/
│   │   │   ├── ca-chain.crt
│   │   │   ├── ca.crt
│   │   │   ├── index.txt
│   │   │   ├── index.txt.revoked
│   │   │   ├── kong_clustering.crt
│   │   │   ├── kong_clustering.key
│   │   │   ├── kong_data_plane.crt
│   │   │   ├── kong_data_plane.key
│   │   │   ├── ocsp.crt
│   │   │   └── ocsp.key
│   │   ├── opentelemetry/
│   │   │   └── otelcol.yaml
│   │   ├── perf/
│   │   │   ├── 500services-each-4-routes.sql
│   │   │   ├── charts/
│   │   │   │   ├── test_data1.json
│   │   │   │   └── test_data2.json
│   │   │   └── terraform/
│   │   │       ├── aws-ec2/
│   │   │       │   ├── .gitignore
│   │   │       │   ├── ec2.tf
│   │   │       │   ├── main.tf
│   │   │       │   ├── output.tf
│   │   │       │   ├── ssh.tf
│   │   │       │   └── variables.tf
│   │   │       ├── bring-your-own/
│   │   │       │   ├── main.tf
│   │   │       │   ├── output.tf
│   │   │       │   ├── ssh.tf
│   │   │       │   └── variables.tf
│   │   │       ├── digitalocean/
│   │   │       │   ├── .gitignore
│   │   │       │   ├── droplets.tf
│   │   │       │   ├── main.tf
│   │   │       │   ├── output.tf
│   │   │       │   ├── project.tf
│   │   │       │   ├── ssh.tf
│   │   │       │   └── variables.tf
│   │   │       └── equinix-metal/
│   │   │           ├── .gitignore
│   │   │           ├── README.md
│   │   │           ├── main.tf
│   │   │           ├── metal.tf
│   │   │           ├── output.tf
│   │   │           ├── scripts/
│   │   │           │   └── wrk.lua
│   │   │           ├── ssh.tf
│   │   │           ├── tls.tf
│   │   │           └── variables.tf
│   │   ├── prometheus/
│   │   │   └── metrics.conf
│   │   ├── proxy_wasm_filters/
│   │   │   ├── Cargo.toml
│   │   │   ├── response_transformer/
│   │   │   │   ├── Cargo.toml
│   │   │   │   └── src/
│   │   │   │       ├── filter.rs
│   │   │   │       └── types.rs
│   │   │   └── tests/
│   │   │       ├── Cargo.toml
│   │   │       └── src/
│   │   │           ├── filter.rs
│   │   │           ├── metrics.rs
│   │   │           ├── routines.rs
│   │   │           ├── test_cases.rs
│   │   │           ├── test_http.rs
│   │   │           └── types.rs
│   │   ├── redis/
│   │   │   ├── ca.crt
│   │   │   ├── ca.key
│   │   │   ├── docker-entrypoint.sh
│   │   │   ├── server.crt
│   │   │   └── server.key
│   │   ├── reload.conf
│   │   ├── router_path_handling_tests.lua
│   │   ├── sam-app/
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── __init__.py
│   │   │   ├── events/
│   │   │   │   └── event.json
│   │   │   ├── hello_world/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── app.py
│   │   │   │   └── requirements.txt
│   │   │   ├── template.yaml
│   │   │   └── tests/
│   │   │       ├── __init__.py
│   │   │       ├── integration/
│   │   │       │   ├── __init__.py
│   │   │       │   └── test_api_gateway.py
│   │   │       ├── requirements.txt
│   │   │       └── unit/
│   │   │           ├── __init__.py
│   │   │           └── test_handler.py
│   │   ├── shared_dict.lua
│   │   ├── shm-stub.lua
│   │   ├── ssl.lua
│   │   ├── stress_generator.lua
│   │   ├── template_inject/
│   │   │   ├── nginx_kong_test_custom_inject_http.lua
│   │   │   ├── nginx_kong_test_custom_inject_stream.lua
│   │   │   └── nginx_kong_test_tcp_echo_server_custom_inject_stream.lua
│   │   ├── to-strip.conf
│   │   └── valid-module.lua
│   ├── helpers/
│   │   ├── dns.lua
│   │   ├── http_mock/
│   │   │   ├── asserts.lua
│   │   │   ├── clients.lua
│   │   │   ├── debug_port.lua
│   │   │   ├── nginx_instance.lua
│   │   │   ├── tapping.lua
│   │   │   └── template.lua
│   │   ├── http_mock.lua
│   │   ├── perf/
│   │   │   ├── charts/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── charts.py
│   │   │   │   └── requirements.txt
│   │   │   ├── charts.lua
│   │   │   ├── drivers/
│   │   │   │   ├── docker.lua
│   │   │   │   └── terraform.lua
│   │   │   ├── git.lua
│   │   │   ├── logger.lua
│   │   │   └── utils.lua
│   │   ├── perf.lua
│   │   ├── redis_helper.lua
│   │   ├── rpc_mock/
│   │   │   ├── cp.lua
│   │   │   ├── default.lua
│   │   │   ├── dp.lua
│   │   │   ├── readme.md
│   │   │   └── setup.lua
│   │   └── wait.lua
│   ├── helpers.lua
│   ├── hybrid.lua
│   ├── internal/
│   │   ├── asserts.lua
│   │   ├── client.lua
│   │   ├── cmd.lua
│   │   ├── conf.lua
│   │   ├── constants.lua
│   │   ├── db.lua
│   │   ├── dns.lua
│   │   ├── grpc.lua
│   │   ├── misc.lua
│   │   ├── module.lua
│   │   ├── pid.lua
│   │   ├── server.lua
│   │   ├── shell.lua
│   │   ├── ssl.lua
│   │   ├── sys.lua
│   │   └── wait.lua
│   ├── kong_tests.conf
│   ├── ldoc.css
│   ├── on_demand_specs
│   ├── renderdocs.sh
│   ├── require.lua
│   └── upgrade_helpers.lua
└── t/
    ├── 01-pdk/
    │   ├── 01-table.t
    │   ├── 02-log/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-sanity.t
    │   │   ├── 02-new.t
    │   │   ├── 03-set_format.t
    │   │   ├── 04-inspect.t
    │   │   ├── 05-set_serialize_value.t
    │   │   └── 06-deprecation.t
    │   ├── 03-ip/
    │   │   └── 01-is_trusted.t
    │   ├── 04-request/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-get_scheme.t
    │   │   ├── 02-get_host.t
    │   │   ├── 03-get_port.t
    │   │   ├── 04-get_forwarded_scheme.t
    │   │   ├── 05-get_forwarded_host.t
    │   │   ├── 06-get_forwarded_port.t
    │   │   ├── 07-get_http_version.t
    │   │   ├── 08-get_method.t
    │   │   ├── 09-get_path.t
    │   │   ├── 10-get_raw_query.t
    │   │   ├── 11-get_query_arg.t
    │   │   ├── 12-get_query.t
    │   │   ├── 13-get_header.t
    │   │   ├── 14-get_headers.t
    │   │   ├── 15-get_raw_body.t
    │   │   ├── 16-get_body.t
    │   │   ├── 17-get_path_with_query.t
    │   │   ├── 18-get_forwarded_path.t
    │   │   ├── 19-get_forwarded_prefix.t
    │   │   ├── 20-get_raw_path.t
    │   │   ├── 20-get_start_time.t
    │   │   └── 21-get_uri_captures.t
    │   ├── 05-client/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-get_ip.t
    │   │   ├── 02-get_forwarded_ip.t
    │   │   ├── 03-get_port.t
    │   │   ├── 04-get_forwarded_port.t
    │   │   ├── 05-get_credential.t
    │   │   ├── 06-get_consumer.t
    │   │   ├── 07-authenticate.t
    │   │   ├── 08-get_protocol.t
    │   │   └── 09-load-consumer.t
    │   ├── 06-service-request/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-set_scheme.t
    │   │   ├── 04-set_path.t
    │   │   ├── 05-set_raw_query.t
    │   │   ├── 06-set_method.t
    │   │   ├── 07-set_body.t
    │   │   ├── 08-set_query.t
    │   │   ├── 09-set_header.t
    │   │   ├── 10-add_header.t
    │   │   ├── 11-clear_header.t
    │   │   ├── 12-set_headers.t
    │   │   ├── 13-set_raw_body.t
    │   │   └── 14-clear_query_arg.t
    │   ├── 07-service-response/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-get_status.t
    │   │   ├── 02-get_headers.t
    │   │   ├── 03-get_header.t
    │   │   ├── 04-get_raw_body.t
    │   │   └── 05-get_body.t
    │   ├── 08-response/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-get_status.t
    │   │   ├── 02-get_header.t
    │   │   ├── 03-get_headers.t
    │   │   ├── 04-set_status.t
    │   │   ├── 05-set_header.t
    │   │   ├── 06-add_header.t
    │   │   ├── 07-clear_header.t
    │   │   ├── 08-set_headers.t
    │   │   ├── 09-set_raw_body.t
    │   │   ├── 10-set_body.t
    │   │   ├── 11-exit.t
    │   │   ├── 12-get_source.t
    │   │   ├── 13-error.t
    │   │   └── 14-get_raw_body.t
    │   ├── 09-service/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-set-upstream.t
    │   │   ├── 02-set-target.t
    │   │   ├── 03-set-tls-cert-key.t
    │   │   ├── 04-set-retries.t
    │   │   └── 05-set-timeouts.t
    │   ├── 10-nginx/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-get_subsystem.t
    │   │   └── 02-get_statistics.t
    │   ├── 11-ctx.t
    │   ├── 12-node/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-get_id.t
    │   │   ├── 02-get_memory_stats.t
    │   │   └── 03-get_hostname.t
    │   ├── 13-router/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-get_route.t
    │   │   └── 02-get_service.t
    │   ├── 14-client-tls/
    │   │   ├── 00-phase_checks.t
    │   │   └── 01-request_client_certificate.t
    │   ├── 15-tracing/
    │   │   └── 01-context.t
    │   └── 16-rl-ctx.t
    ├── 02-global/
    │   ├── 01-init-pdk.t
    │   ├── 02-set-named-ctx.t
    │   └── 03-namespaced_log.t
    ├── 03-dns-client/
    │   ├── 00-sanity.t
    │   ├── 01-phases.t
    │   └── 02-timer-usage.t
    ├── 04-patch/
    │   ├── 01-ngx-buf-double-free.t
    │   ├── 02-ngx-read-body-block.t
    │   ├── 03-fix-ngx-send-header-filter-finalize-ctx.t
    │   ├── 04-fix-ngx-recreate-request-work-for-body.t
    │   └── 05-ngx-refresh-upstream-uri-when-balancer-retry.t
    ├── 05-mlcache/
    │   ├── 00-ipc.t
    │   ├── 01-new.t
    │   ├── 02-get.t
    │   ├── 03-peek.t
    │   ├── 04-update.t
    │   ├── 05-set.t
    │   ├── 06-delete.t
    │   ├── 07-l1_serializer.t
    │   ├── 08-purge.t
    │   ├── 09-isolation.t
    │   ├── 10-ipc_shm.t
    │   ├── 11-locks_shm.t
    │   ├── 12-resurrect-stale.t
    │   ├── 13-get_bulk.t
    │   ├── 14-bulk-and-res.t
    │   └── 15-renew.t
    ├── Util.pm
    ├── certs/
    │   ├── ca.crt
    │   ├── ca.key
    │   ├── client_example.com.crt
    │   ├── client_example.com.key
    │   ├── intermediate.crt
    │   ├── intermediate.key
    │   ├── test.crt
    │   └── test.key
    ├── pdk.luacov
    └── phase_checks.luacov

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

================================================
FILE: .bazelignore
================================================
# NB: sematics here are not the same as .gitignore
# see https://github.com/bazelbuild/bazel/issues/8106
# Ignore backup files.
*~
# Ignore Vim swap files.
.*.swp
# Ignore files generated by IDEs.
/.aswb/
/.cache/
/.classpath
/.clwb/
/.factorypath
/.idea/
/.ijwb/
/.project
/.settings
/.vscode/
/bazel.iml
# Ignore all bazel-* symlinks. There is no full list since this can change
# based on the name of the directory bazel is cloned into.
/bazel-*
# Ignore outputs generated during Bazel bootstrapping.
/output/
# Ignore jekyll build output.
/production
/.sass-cache
# Bazelisk version file
.bazelversion
# User-specific .bazelrc
user.bazelrc

/t/
/spec/
/spec-ee/
/servroot/
/autodoc/
/.github/

.DS_Store


================================================
FILE: .bazelrc
================================================
# Bazel doesn't need more than 200MB of memory for local build based on memory profiling:
# https://docs.bazel.build/versions/master/skylark/performance.html#memory-profiling
# The default JVM max heapsize is 1/4 of physical memory up to 32GB which could be large
# enough to consume all memory constrained by cgroup in large host.
# Limiting JVM heapsize here to let it do GC more when approaching the limit to
# leave room for compiler/linker.
# The number 3G is chosen heuristically to both support large VM and small VM with RBE.
# Startup options cannot be selected via config.
startup --host_jvm_args=-Xmx512m

run --color=yes

common --color=yes
common --curses=auto

# TODO: remove after bump to bazel >= 8
common --enable_workspace

build --experimental_ui_max_stdouterr_bytes=10485760

build --show_progress_rate_limit=0
build --show_timestamps
build --worker_verbose

build --incompatible_strict_action_env

# make output files and directories 0755 instead of 0555
build --experimental_writable_outputs


# Pass PATH, CC, CXX variables from the environment.
build --action_env=CC --host_action_env=CC
build --action_env=CXX --host_action_env=CXX
build --action_env=PATH --host_action_env=PATH

# temporary fix for https://github.com/bazelbuild/bazel/issues/12905 on macOS
build --features=-debug_prefix_map_pwd_is_dot

# Build flags.
build --action_env=BUILD_NAME=kong-dev
build --action_env=INSTALL_DESTDIR=MANAGED
build --strip=never

# Release flags
build:release --//:debug=false
build:release --//:licensing=true
build:release --action_env=BUILD_NAME=kong-dev
build:release --action_env=INSTALL_DESTDIR=/usr/local
build:release --compilation_mode=opt
build:release --copt="-g"
build:release --strip=never

build --spawn_strategy=local



================================================
FILE: .bazelversion
================================================
7.3.1


================================================
FILE: .busted
================================================
return {
  default = {
    lpath = "./?.lua;./?/init.lua;",
    -- make setup() and teardown() behave like their lazy_ variants
    lazy = true,
    helper = "./spec/busted-ci-helper.lua",
  }
}


================================================
FILE: .ci/ast-grep/README.md
================================================
# ast-grep

`ast-grep` is a tool for querying source code in a (relatively)
language-agnostic manner. It allows us to write lint rules that target patterns
that are specific to our codebase and therefore not covered by tools like
`luacheck`.

## Installing ast-grep

See the [installation docs](https://ast-grep.github.io/guide/quick-start.html#installation)
for guidance.


## Crafting a New Lint Rule

The workflow for writing a new lint rule looks like this:

1. Draft your rule at `.ci/ast-grep/rules/${name}.yml`
    * Use `ast-grep scan --filter ${name} [paths...]` to evaluate your rule's behavior
2. Write tests for the rule in `.ci/ast-grep/tests/${name}-test.yml`
    * Make sure to fill out several `valid` and `invalid` code snippets
    * Use `ast-grep test --interactive`* to test the rule
3. `git add .gi/ast-grep && git commit ...`

\* `ast-grep test` uses a file snapshot testing pattern. Almost any time a rule
or test is created/modified, the snapshots must be updated. The `--interactive`
flag for `ast-grep test` will prompt you to accept these updates. The snapshots
provide very granular testing for rule behavior, but for many cases where we
just care about whether or not a rule matches a certain snippet of code, they
can be overkill. Use `ast-grep --update-all` to automatically accept and save
new snapshots.

## CI

`ast-grep` is executed in the ([ast-grep lint
workflow](/.github/workflows/ast-grep.yml)). In addition to running the linter,
this workflow also performs self-tests and ensures that all existing rules are
well-formed and have tests associated with them.

### Links

* [ast-grep website and documentation](https://ast-grep.github.io)
* [ast-grep source code](https://github.com/ast-grep/ast-grep)


================================================
FILE: .ci/ast-grep/common/.gitkeep
================================================


================================================
FILE: .ci/ast-grep/rules/.gitkeep
================================================


================================================
FILE: .ci/ast-grep/rules/assert-eventually-terminated.yml
================================================
id: assert-eventually-terminated
language: lua
message: Unterminated eventual assertion
severity: error
note: |
  `assert.eventually()` does not perform any assertion unless followed
  by one of its terminator methods:
    * `is_truthy(message)`
    * `is_falsy(message)`
    * `has_error(message)`
    * `has_no_error(message)`

files:
  - '**/*_spec.lua'

rule:
  all:
    - kind: function_call
      pattern: $$$.eventually($$$)

    - has:
        kind: dot_index_expression
        any:
          - pattern: assert.$$$
          - pattern: luassert.$$$
        stopBy: end

    - not:
        inside:
          kind: function_call
          any:
            - pattern: $$$.is_truthy($$$)
            - pattern: $$$.is_falsy($$$)
            - pattern: $$$.has_error($$$)
            - pattern: $$$.has_no_error($$$)
          stopBy: end


================================================
FILE: .ci/ast-grep/rules/helpers-outside-of-setup.yml
================================================
id: helpers-outside-of-setup
language: lua
message: Calling test setup helper function in the wrong scope
severity: warning
note: |
  Avoid calling test setup functions outside of `setup()`/`lazy_setup()`.

  ## good
  ```lua
  describe("my test", function()
    local port_a
    local port_b

    lazy_setup(function()
      port_a = helpers.get_available_port()
    end)

    it("my test case", function()
      port_b = helpers.get_available_port()
    end)
  end)

  ## bad
  ```lua
  local port_a = helpers.get_available_port()
  describe("my test", function()
    local port_b = helpers.get_available_port()

    it("my test case", function()
    end)
  end)


files:
  - '**/*_spec.lua'

utils:
  function-scope:
    any:
      - kind: function_call
      - kind: function_declaration
      - kind: function_definition

  module-scope:
    not:
      inside:
        matches: function-scope
        stopBy: end

  busted-test-case:
    inside:
      kind: function_call
      any:
        - pattern: it($$$)
        - pattern: pending($$$)

        # aliases for it/pending seen in test files
        - pattern: do_it($$$)
        - pattern: postgres_only($$$)

  busted-lifecycle:
    inside:
      kind: function_call
      any:
        - pattern: setup($$$)
        - pattern: lazy_setup($$$)
        - pattern: teardown($$$)
        - pattern: lazy_teardown($$$)
        - pattern: before_each($$$)
        - pattern: after_each($$$)

  in-upgrade-helper-setup:
    pattern: $IDENT.setup($$$)
    inside:
      kind: chunk
      stopBy: end
      has:
        any:
          - pattern: $IDENT = require "spec.upgrade_helpers"
          - pattern: $IDENT = require("spec.upgrade_helpers")
        stopBy: end

  in-function-scope:
    any:
      # local function my_setup()
      #   helpers.get_available_port()
      # end
      - kind: function_declaration

      # local my_setup = function()
      #   helpers.get_available_port()
      # end
      - pattern: $IDENT = function($$$) $$$ end

  busted-describe:
    inside:
      kind: function_call
      pattern: describe($$$)
      stopBy:
        any:
          - matches: busted-test-case
          - matches: busted-lifecycle
          - matches: in-function-scope
          - matches: in-upgrade-helper-setup

  non-setup-scope:
    any:
      - matches: module-scope
      - matches: busted-describe

rule:
  kind: function_call
  pattern: helpers.$FUNC($$$)
  matches: non-setup-scope

constraints:
  FUNC:
    kind: identifier
    any:
      - pattern: admin_client
      - pattern: generate_keys
      - pattern: get_available_port
      - pattern: get_db_utils
      - pattern: setenv
      - pattern: start_kong
      - pattern: tcp_server


================================================
FILE: .ci/ast-grep/rules/ngx-log-string-concat.yml
================================================
id: ngx-log-string-concat
language: lua
message: Using string concatenation to build arguments for ngx.log()
severity: error
note: |
  When invoking `ngx.log()` with some variable as input, prefer vararg-style
  calls rather than using the string concatenation operator (`..`):

  ## bad
  ```lua
  ngx.log(ngx.DEBUG, "if `my_var` is nil, this code throws an exception: " .. my_var)
  ```

  ## good
  ```lua
  ngx.log(ngx.DEBUG, "if `my_var` is nil, this code is fine: ", my_var)
  ```

files:
  - kong/**
  - test*.lua

rule:
  all:
    - matches: string-concat
      inside:
        kind: arguments
        inside:
          matches: ngx-log-call
    - not:
        matches: string-literal-concat

utils:
  ngx-log-call:
    any:
      # direct invocation of `_G.ngx.log()`
      - pattern: ngx.log($_LEVEL, $$$)

      # track local var assignments of `_G.ngx.log`
      - pattern: $IDENT($_LEVEL, $$$)
        inside:
          kind: chunk
          stopBy: end
          has:
            pattern: $IDENT = ngx.log
            stopBy: end

  string-concat:
    kind: binary_expression
    pattern: $LHS .. $RHS

  string-literal-concat:
    kind: binary_expression
    all:
      - has:
          nthChild: 1
          any:
            - kind: string
            - matches: string-literal-concat

      - has:
          nthChild: 2
          any:
            - kind: string
            - matches: string-literal-concat


================================================
FILE: .ci/ast-grep/tests/.gitkeep
================================================


================================================
FILE: .ci/ast-grep/tests/__snapshots__/assert-eventually-terminated-snapshot.yml
================================================
id: assert-eventually-terminated
snapshots:
  assert.eventually(function() end):
    labels:
    - source: assert.eventually(function() end)
      style: primary
      start: 0
      end: 33
    - source: assert.eventually
      style: secondary
      start: 0
      end: 17
  ? |
    assert.eventually(function() end)
  : labels:
    - source: assert.eventually(function() end)
      style: primary
      start: 0
      end: 33
    - source: assert.eventually
      style: secondary
      start: 0
      end: 17
  assert.eventually(function() end).with_timeout(1):
    labels:
    - source: assert.eventually(function() end)
      style: primary
      start: 0
      end: 33
    - source: assert.eventually
      style: secondary
      start: 0
      end: 17
  assert.with_timeout(1).eventually(function() end):
    labels:
    - source: assert.with_timeout(1).eventually(function() end)
      style: primary
      start: 0
      end: 49
    - source: assert.with_timeout
      style: secondary
      start: 0
      end: 19
  assert.with_timeout(1).eventually(function() end).with_timeout(1):
    labels:
    - source: assert.with_timeout(1).eventually(function() end)
      style: primary
      start: 0
      end: 49
    - source: assert.with_timeout
      style: secondary
      start: 0
      end: 19
  luassert.eventually(function() end):
    labels:
    - source: luassert.eventually(function() end)
      style: primary
      start: 0
      end: 35
    - source: luassert.eventually
      style: secondary
      start: 0
      end: 19
  ? |
    luassert.eventually(function() end)
  : labels:
    - source: luassert.eventually(function() end)
      style: primary
      start: 0
      end: 35
    - source: luassert.eventually
      style: secondary
      start: 0
      end: 19
  luassert.eventually(function() end).with_timeout(1):
    labels:
    - source: luassert.eventually(function() end)
      style: primary
      start: 0
      end: 35
    - source: luassert.eventually
      style: secondary
      start: 0
      end: 19
  luassert.with_timeout(1).eventually(function() end):
    labels:
    - source: luassert.with_timeout(1).eventually(function() end)
      style: primary
      start: 0
      end: 51
    - source: luassert.with_timeout
      style: secondary
      start: 0
      end: 21
  luassert.with_timeout(1).eventually(function() end).with_timeout(1):
    labels:
    - source: luassert.with_timeout(1).eventually(function() end)
      style: primary
      start: 0
      end: 51
    - source: luassert.with_timeout
      style: secondary
      start: 0
      end: 21


================================================
FILE: .ci/ast-grep/tests/__snapshots__/helpers-outside-of-setup-snapshot.yml
================================================
id: helpers-outside-of-setup
snapshots:
  ? |
    describe("my test", function()
      for , strategy in helpers.each_strategy() do
        local a = 123
        local port = helpers.get_available_port()
      end
    end)
  : labels:
    - source: helpers.get_available_port()
      style: primary
      start: 113
      end: 141
    - source: |-
        describe("my test", function()
          for , strategy in helpers.each_strategy() do
            local a = 123
            local port = helpers.get_available_port()
          end
        end)
      style: secondary
      start: 0
      end: 152
  ? |
    describe("my test", function()
      local a = 123
      local port = helpers.get_available_port()
    end)
  : labels:
    - source: helpers.get_available_port()
      style: primary
      start: 62
      end: 90
    - source: |-
        describe("my test", function()
          local a = 123
          local port = helpers.get_available_port()
        end)
      style: secondary
      start: 0
      end: 95
  ? |
    describe(function()
      local a = 123
      local port = helpers.get_available_port()
    end)
  : labels:
    - source: helpers.get_available_port()
      style: primary
      start: 51
      end: 79
    - source: |-
        describe(function()
          local a = 123
          local port = helpers.get_available_port()
        end)
      style: secondary
      start: 0
      end: 84
  ? |
    for , strategy in helpers.each_strategy() do
      local a = 123
      local port = helpers.get_available_port()

      describe("my test", function()
        -- ...
      end)
    end
  : labels:
    - source: helpers.get_available_port()
      style: primary
      start: 76
      end: 104
  ? |
    for , strategy in helpers.each_strategy() do
      local a = 123
      local port = helpers.get_available_port()
    end
  : labels:
    - source: helpers.get_available_port()
      style: primary
      start: 76
      end: 104
  ? |
    local a = 123
    local port = helpers.get_available_port()
  : labels:
    - source: helpers.get_available_port()
      style: primary
      start: 27
      end: 55
  local port = helpers.get_available_port():
    labels:
    - source: helpers.get_available_port()
      style: primary
      start: 13
      end: 41


================================================
FILE: .ci/ast-grep/tests/__snapshots__/ngx-log-string-concat-snapshot.yml
================================================
id: ngx-log-string-concat
snapshots:
  ? |
    local foo = ngx.log

    foo(ngx.NOTICE, b .. c .. ": STRING")
  : labels:
    - source: 'b .. c .. ": STRING"'
      style: primary
      start: 37
      end: 57
    - source: foo = ngx.log
      style: secondary
      start: 6
      end: 19
    - source: |
        local foo = ngx.log

        foo(ngx.NOTICE, b .. c .. ": STRING")
      style: secondary
      start: 0
      end: 59
    - source: 'foo(ngx.NOTICE, b .. c .. ": STRING")'
      style: secondary
      start: 21
      end: 58
    - source: '(ngx.NOTICE, b .. c .. ": STRING")'
      style: secondary
      start: 24
      end: 58
  ? |
    local foo = ngx.log

    if true then
      local function my_log(a, b, c)
        foo(ngx.NOTICE, b .. c .. ": STRING")
      end
    end
  : labels:
    - source: 'b .. c .. ": STRING"'
      style: primary
      start: 87
      end: 107
    - source: foo = ngx.log
      style: secondary
      start: 6
      end: 19
    - source: |
        local foo = ngx.log

        if true then
          local function my_log(a, b, c)
            foo(ngx.NOTICE, b .. c .. ": STRING")
          end
        end
      style: secondary
      start: 0
      end: 119
    - source: 'foo(ngx.NOTICE, b .. c .. ": STRING")'
      style: secondary
      start: 71
      end: 108
    - source: '(ngx.NOTICE, b .. c .. ": STRING")'
      style: secondary
      start: 74
      end: 108
  ? |
    local ngx_log = ngx.log
    local foo = ngx.log

    if true then
      local function my_log(a, b, c)
        ngx_log(ngx.ERR, "STRING: " .. a)
        foo(ngx.NOTICE, b .. c .. ": STRING")
      end
    end
  : labels:
    - source: '"STRING: " .. a'
      style: primary
      start: 112
      end: 127
    - source: ngx_log = ngx.log
      style: secondary
      start: 6
      end: 23
    - source: |
        local ngx_log = ngx.log
        local foo = ngx.log

        if true then
          local function my_log(a, b, c)
            ngx_log(ngx.ERR, "STRING: " .. a)
            foo(ngx.NOTICE, b .. c .. ": STRING")
          end
        end
      style: secondary
      start: 0
      end: 181
    - source: 'ngx_log(ngx.ERR, "STRING: " .. a)'
      style: secondary
      start: 95
      end: 128
    - source: '(ngx.ERR, "STRING: " .. a)'
      style: secondary
      start: 102
      end: 128
  ? |
    local ngx_log = ngx.log
    local foo = ngx.log

    local function my_log(a, b, c)
      ngx_log(ngx.ERR, "STRING: " .. a)
      foo(ngx.NOTICE, b .. c .. ": STRING")
    end
    my_log(1, 2, 3)
  : labels:
    - source: '"STRING: " .. a'
      style: primary
      start: 95
      end: 110
    - source: ngx_log = ngx.log
      style: secondary
      start: 6
      end: 23
    - source: |
        local ngx_log = ngx.log
        local foo = ngx.log

        local function my_log(a, b, c)
          ngx_log(ngx.ERR, "STRING: " .. a)
          foo(ngx.NOTICE, b .. c .. ": STRING")
        end
        my_log(1, 2, 3)
      style: secondary
      start: 0
      end: 172
    - source: 'ngx_log(ngx.ERR, "STRING: " .. a)'
      style: secondary
      start: 78
      end: 111
    - source: '(ngx.ERR, "STRING: " .. a)'
      style: secondary
      start: 85
      end: 111
  ? |
    local ngx_log = ngx.log
    local foo = ngx.log

    ngx_log(ngx.ERR, "STRING: " .. a)
    foo(ngx.NOTICE, b .. c .. ": STRING")
  : labels:
    - source: '"STRING: " .. a'
      style: primary
      start: 62
      end: 77
    - source: ngx_log = ngx.log
      style: secondary
      start: 6
      end: 23
    - source: |
        local ngx_log = ngx.log
        local foo = ngx.log

        ngx_log(ngx.ERR, "STRING: " .. a)
        foo(ngx.NOTICE, b .. c .. ": STRING")
      style: secondary
      start: 0
      end: 117
    - source: 'ngx_log(ngx.ERR, "STRING: " .. a)'
      style: secondary
      start: 45
      end: 78
    - source: '(ngx.ERR, "STRING: " .. a)'
      style: secondary
      start: 52
      end: 78
  ? |
    ngx.log(ngx.INFO, "STRING: " .. my_var .. ": STRING")
  : labels:
    - source: '"STRING: " .. my_var .. ": STRING"'
      style: primary
      start: 18
      end: 52
    - source: 'ngx.log(ngx.INFO, "STRING: " .. my_var .. ": STRING")'
      style: secondary
      start: 0
      end: 53
    - source: '(ngx.INFO, "STRING: " .. my_var .. ": STRING")'
      style: secondary
      start: 7
      end: 53
  'ngx.log(ngx.INFO, "STRING: " .. my_var)':
    labels:
    - source: '"STRING: " .. my_var'
      style: primary
      start: 18
      end: 38
    - source: 'ngx.log(ngx.INFO, "STRING: " .. my_var)'
      style: secondary
      start: 0
      end: 39
    - source: '(ngx.INFO, "STRING: " .. my_var)'
      style: secondary
      start: 7
      end: 39
  ? |
    ngx.log(ngx.INFO, "STRING: " .. my_var)
  : labels:
    - source: '"STRING: " .. my_var'
      style: primary
      start: 18
      end: 38
    - source: 'ngx.log(ngx.INFO, "STRING: " .. my_var)'
      style: secondary
      start: 0
      end: 39
    - source: '(ngx.INFO, "STRING: " .. my_var)'
      style: secondary
      start: 7
      end: 39
  ? |
    ngx.log(ngx.INFO, my_var .. ": STRING :" .. my_other_var)
  : labels:
    - source: 'my_var .. ": STRING :" .. my_other_var'
      style: primary
      start: 18
      end: 56
    - source: 'ngx.log(ngx.INFO, my_var .. ": STRING :" .. my_other_var)'
      style: secondary
      start: 0
      end: 57
    - source: '(ngx.INFO, my_var .. ": STRING :" .. my_other_var)'
      style: secondary
      start: 7
      end: 57
  'ngx.log(ngx.INFO, my_var .. ": STRING")':
    labels:
    - source: 'my_var .. ": STRING"'
      style: primary
      start: 18
      end: 38
    - source: 'ngx.log(ngx.INFO, my_var .. ": STRING")'
      style: secondary
      start: 0
      end: 39
    - source: '(ngx.INFO, my_var .. ": STRING")'
      style: secondary
      start: 7
      end: 39
  ? |
    ngx.log(ngx.INFO, my_var .. ": STRING")
  : labels:
    - source: 'my_var .. ": STRING"'
      style: primary
      start: 18
      end: 38
    - source: 'ngx.log(ngx.INFO, my_var .. ": STRING")'
      style: secondary
      start: 0
      end: 39
    - source: '(ngx.INFO, my_var .. ": STRING")'
      style: secondary
      start: 7
      end: 39


================================================
FILE: .ci/ast-grep/tests/assert-eventually-terminated-test.yml
================================================
id: assert-eventually-terminated

valid:
  # simple, all terminators
  - |
    assert.eventually(function() end).is_truthy()
    assert.eventually(function() end).is_falsy()
    assert.eventually(function() end).has_error()
    assert.eventually(function() end).has_no_error()

  # luassert counts too
  - |
    luassert.eventually(function() end).is_truthy()
    luassert.eventually(function() end).is_falsy()
    luassert.eventually(function() end).has_error()
    luassert.eventually(function() end).has_no_error()

  # with modifiers before .eventually()
  - |
    assert
      .with_timeout(1)
      .eventually(function() end)
      .is_truthy()

  # with modifiers after .eventually()
  - |
    assert
      .eventually(function() end)
      .with_timeout(1)
      .is_truthy()

  # eventually() but unrelated to assert
  - |
    local t = {}
    t.eventually(function() end)


invalid:
  # unterminated assert
  - assert.eventually(function() end)
  - assert.with_timeout(1).eventually(function() end)
  - assert.with_timeout(1).eventually(function() end).with_timeout(1)
  - assert.eventually(function() end).with_timeout(1)

  # same, but luassert
  - luassert.eventually(function() end)
  - luassert.with_timeout(1).eventually(function() end)
  - luassert.with_timeout(1).eventually(function() end).with_timeout(1)
  - luassert.eventually(function() end).with_timeout(1)


================================================
FILE: .ci/ast-grep/tests/helpers-outside-of-setup-test.yml
================================================
id: helpers-outside-of-setup

valid:
  # inside `lazy_setup()`
  - |
    lazy_setup(function()
      local a = 123
      local port = helpers.get_available_port()
    end)

  # inside `setup()`
  - |
    setup(function()
      local a = 123
      local port = helpers.get_available_port()
    end)

  # inside `it()`
  - |
    it(function()
      local a = 123
      local port = helpers.get_available_port()
    end)

  # inside a local function (declaration)
  - |
    describe("foo", function()
      local port

      local function my_setup()
        port = helpers.get_available_port()
      end

      local function my_setup_with_opts(opts)
        port = helpers.get_available_port()
      end

      lazy_setup(function()
        my_setup()
        my_setup_with_opts({})
      end)
    end)

  # inside a local function (declaration + assignment)
  - |
    describe("foo", function()
      local port

      local my_setup = function()
        port = helpers.get_available_port()
      end

      local my_setup_with_opts = function(opts)
        port = helpers.get_available_port()
      end

      lazy_setup(function()
        my_setup()
        my_setup_with_opts({})
      end)
    end)

  # inside a non-local function (declaration + assignment)
  - |
    local my_setup, my_setup_with_opts

    describe("foo", function()
      local port

      my_setup = function()
        port = helpers.get_available_port()
      end

      my_setup_with_opts = function(opts)
        port = helpers.get_available_port()
      end

      lazy_setup(function()
        my_setup()
        my_setup_with_opts({})
      end)
    end)

  # inside require"spec.upgrade_helpers".setup
  - |
    local uh = require "spec.upgrade_helpers"

    describe("my test", function()
      local port

      uh.setup(function()
        port = helpers.get_available_port()
      end)
    end)

  # inside require("spec.upgrade_helpers").setup
  - |
    local uh = require("spec.upgrade_helpers")

    describe("my test", function()
      local port

      uh.setup(function()
        port = helpers.get_available_port()
      end)
    end)

invalid:
  # at the outermost scope
  - |
    local a = 123
    local port = helpers.get_available_port()

  # inside some strategy iterator thing
  - |
    for , strategy in helpers.each_strategy() do
      local a = 123
      local port = helpers.get_available_port()

      describe("my test", function()
        -- ...
      end)
    end

  # inside describe() inside some iterator
  - |
    describe("my test", function()
      for , strategy in helpers.each_strategy() do
        local a = 123
        local port = helpers.get_available_port()
      end
    end)

  # directly inside `describe()` (no label)
  - |
    describe(function()
      local a = 123
      local port = helpers.get_available_port()
    end)

  # directly inside `describe()` (with label)
  - |
    describe("my test", function()
      local a = 123
      local port = helpers.get_available_port()
    end)


================================================
FILE: .ci/ast-grep/tests/ngx-log-string-concat-test.yml
================================================
id: ngx-log-string-concat

valid:
  # normal, expected usage
  - |
    ngx.log(ngx.ERR, "STRING: ", my_var)

  # string literals can be concatenated to keep line lengths in check
  - |
    ngx.log(ngx.ERR, "my very super long line"
                  .. " my continuation of that line")

  # chained/nested concatenation of string literals is allowed
  - |
    ngx.log(ngx.ERR, "my very super long line"
                  .. " my continuation of that line"
                  .. " my extra continuation of that line")

  # only ngx.log() calls are checked
  - |
    my_other_function(ngx.ERR, "STRING: " .. my_var)

  # saving a local reference ngx.log doesn't affect other function calls
  - |
    local ngx_log = ngx.log
    my_other_function(ngx.ERR, "STRING: " .. my_var)

invalid:
  # string .. variable
  - |
    ngx.log(ngx.INFO, "STRING: " .. my_var)

  # variable .. string
  - |
    ngx.log(ngx.INFO, my_var .. ": STRING")

  # variable .. string .. variable
  - |
    ngx.log(ngx.INFO, my_var .. ": STRING :" .. my_other_var)

  # string .. variable .. string
  - |
    ngx.log(ngx.INFO, "STRING: " .. my_var .. ": STRING")

  # calling ngx.log via local var reference
  - |
    local foo = ngx.log

    foo(ngx.NOTICE, b .. c .. ": STRING")

  # calling ngx.log via local var reference (nested)
  - |
    local foo = ngx.log

    if true then
      local function my_log(a, b, c)
        foo(ngx.NOTICE, b .. c .. ": STRING")
      end
    end


================================================
FILE: .ci/luacov-stats-aggregator.lua
================================================
-- Aggregates stats from multiple luacov stat files.
-- Example stats for a 12 lines file `my/file.lua`
-- that received hits on lines 3, 4, 9:
-- 
-- ["my/file.lua"] = {
--   [3] = 1,
--   [4] = 3,
--   [9] = 2,
--   max = 12,
--   max_hits = 3
-- }
--

local luacov_stats = require "luacov.stats"
local luacov_reporter = require "luacov.reporter"
local luacov_runner = require "luacov.runner"
local lfs = require "lfs"


-- load parameters
local params = {...}
local stats_folders_prefix = params[1] or "luacov-stats-out-"
local file_name            = params[2] or "luacov.stats.out"
local strip_prefix         = params[3] or ""
local base_path            = "."


-- load stats from different folders named using the format:
-- luacov-stats-out-${timestamp}
local loaded_stats = {}
for folder in lfs.dir(base_path) do
  if folder:find(stats_folders_prefix, 1, true) then
    local stats_file = folder .. "/" .. file_name
    local loaded = luacov_stats.load(stats_file)
    if loaded then
      loaded_stats[#loaded_stats + 1] = loaded
      print("loading file: " .. stats_file)
    end
  end
end


-- aggregate
luacov_runner.load_config()
for _, stat_data in ipairs(loaded_stats) do
  -- make all paths relative to ensure file keys have the same format
  -- and avoid having separate counters for the same file
  local rel_stat_data = {}
  for f_name, data in pairs(stat_data) do
    if f_name:sub(0, #strip_prefix) == strip_prefix then
      f_name = f_name:sub(#strip_prefix + 1)
    end
    rel_stat_data[f_name] = data
  end

  luacov_runner.data = rel_stat_data
  luacov_runner.save_stats()
end


-- generate report
luacov_reporter.report()


================================================
FILE: .ci/test_suites.json
================================================
[
  {
    "name": "unit",
    "exclude_tags": "flaky,ipv6",
    "venv_script": "kong-dev-venv.sh",
    "specs": ["spec/01-unit/"]
  },
  {
    "name": "integration",
    "exclude_tags": "flaky,ipv6,off",
    "environment": {
      "KONG_TEST_DATABASE": "postgres"
    },
    "venv_script": "kong-dev-venv.sh",
    "specs": ["spec/02-integration/"]
  },
  {
    "name": "dbless",
    "exclude_tags": "flaky,ipv6,postgres,db",
    "environment": {
      "KONG_TEST_DATABASE": "off"
    },
    "venv_script": "kong-dev-venv.sh",
    "specs": [
      "spec/02-integration/02-cmd/",
      "spec/02-integration/05-proxy/",
      "spec/02-integration/04-admin_api/02-kong_routes_spec.lua",
      "spec/02-integration/04-admin_api/15-off_spec.lua",
      "spec/02-integration/08-status_api/01-core_routes_spec.lua",
      "spec/02-integration/08-status_api/03-readiness_endpoint_spec.lua",
      "spec/02-integration/11-dbless/"
    ]
  },
  {
    "name": "plugins",
    "exclude_tags": "flaky,ipv6",
    "venv_script": "kong-dev-venv.sh",
    "specs": ["spec/03-plugins/"]
  }
]


================================================
FILE: .devcontainer/Dockerfile
================================================
FROM kong/kong:3.0.0-ubuntu

USER root

RUN apt-get update

RUN apt-get install -y \
        build-essential \
        unzip \
        git \
        m4 \
        libyaml-dev \
        curl


================================================
FILE: .devcontainer/devcontainer.json
================================================
// For format details, see https://code.visualstudio.com/docs/remote/devcontainerjson-reference
{
    "name": "Kong Gateway Dev",

    // Update the 'dockerComposeFile' list if you have more compose files or use different names.
    "dockerComposeFile": "docker-compose.yml",

    // The 'service' property is the name of the service for the container that VS Code should
    // use. Update this value and .devcontainer/docker-compose.yml to the real service name.
    "service": "kong",

    // The optional 'workspaceFolder' property is the path VS Code should open by default when
    // connected. This is typically a volume mount in .devcontainer/docker-compose.yml
    "workspaceFolder": "/workspace",

    // Use 'forwardPorts' to make a list of ports inside the container available locally.
    "forwardPorts": [8000, 8001, "db:5432"],

    "postCreateCommand": "make dev-legacy",

    // Set *default* container specific settings.json values on container create.
    // "settings": {},

    // Add the IDs of extensions you want installed when the container is created.
    // "extensions": [],

    // Uncomment the next line if you want to keep your containers running after VS Code shuts down.
    // "shutdownAction": "none",

    // Uncomment the next line to use 'postCreateCommand' to run commands after the container is created.
    // "postCreateCommand": "uname -a",

    // Comment out to connect as root instead. To add a non-root user, see: https://aka.ms/vscode-remote/containers/non-root.
    // "remoteUser": "vscode"
}


================================================
FILE: .devcontainer/docker-compose.yml
================================================
version: "3.8"

services:

  db:
    image: postgres:9.6
    environment:
      POSTGRES_PASSWORD: kong
      POSTGRES_USER: kong

  kong:
    build:
      # Using a Dockerfile is optional, but included for completeness.
      context: .
      dockerfile: Dockerfile

    volumes:
      # This is where VS Code should expect to find your project's source code and the value of "workspaceFolder" in .devcontainer/devcontainer.json
      - ..:/workspace:cached

      # Uncomment the next line to use Docker from inside the container. See https://aka.ms/vscode-remote/samples/docker-from-docker-compose for details.
      - /var/run/docker.sock:/var/run/docker.sock

    # Uncomment the next four lines if you will use a ptrace-based debugger like C++, Go, and Rust.
    cap_add:
      - SYS_PTRACE
    security_opt:
      - seccomp:unconfined

    environment:
      KONG_PROXY_ERROR_LOG: /dev/stderr
      KONG_PG_USER: kong
      KONG_PG_DATABASE: kong
      KONG_PG_PASSWORD: kong
      KONG_PG_HOST: db
      OPENSSL_DIR: /usr/local/kong
      CRYPTO_DIR: /usr/local/kong

    # Overrides default command so things don't shut down after the process ends.
    command: /bin/sh -c "while sleep 1000; do :; done"

    # Runs app on the same network as the service container, allows "forwardPorts" in devcontainer.json function.
    network_mode: service:db

    # Use "forwardPorts" in **devcontainer.json** to forward an app port locally.
    # (Adding the "ports" property to this file will not forward from a Codespace.)

    # Uncomment the next line to use a non-root user for all processes - See https://aka.ms/vscode-remote/containers/non-root for details.
    # user: vscode


================================================
FILE: .editorconfig
================================================
root                     = true

[*]
end_of_line              = lf
insert_final_newline     = true
trim_trailing_whitespace = true
charset                  = utf-8

[*.lua]
indent_style             = space
indent_size              = 2

[kong/templates/nginx*]
indent_style             = space
indent_size              = 4

[*.template]
indent_style             = space
indent_size              = 4

[Makefile]
indent_style             = tab

[bin/kong]
indent_style             = space
indent_size              = 2

[bin/busted]
indent_style             = space
indent_size              = 2

[bin/kong-health]
indent_style             = space
indent_size              = 2


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yaml
================================================
name: 🐞 Bug
description: Something is not working as indended.
body:
- type: checkboxes
  attributes:
    label: Is there an existing issue for this?
    description: Please search to see if an issue already exists for the bug you encountered. Make sure you are also using the latest version of Kong.
    options:
    - label: I have searched the existing issues
      required: true
- type: input 
  attributes:
    label: Kong version (`$ kong version`)
    description: 'example: Kong 2.5'
    placeholder: 'Please provide the current Kong Gateway version you are using here.'
  validations:
    required: true
- type: textarea
  attributes:
    label: Current Behavior
    description: A concise description of what you're experiencing.
    placeholder: |
      When I do <X>, <Y> happens and I see the error message attached below:
      ```...```
  validations:
    required: false
- type: textarea
  attributes:
    label: Expected Behavior
    description: A concise description of what you expected to happen.
    placeholder: When I do <X>, <Z> should happen instead.
  validations:
    required: false
- type: textarea
  attributes:
    label: Steps To Reproduce
    description: Steps to reproduce the behavior.
    placeholder: |
      1. In this environment...
      2. With this config...
      3. Run '...'
      4. See error...
  validations:
    required: false
- type: textarea
  attributes:
    label: Anything else?
    description: |
      - Kong debug-level startup logs (`$ kong start --vv`)
      - Kong error logs (`<KONG_PREFIX>/logs/error.log`)
      - Kong configuration (the output of a GET request to Kong's Admin port - see
        https://docs.konghq.com/latest/admin-api/#retrieve-node-information)
      - Running operating system
  validations:
    required: false


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
  - name: Kong Gateway Open Source Community Pledge
    url: https://github.com/Kong/kong/blob/master/COMMUNITY_PLEDGE.md
  - name: Feature Request
    url: https://github.com/Kong/kong/discussions/categories/ideas-and-feature-requests
    about: Propose your cool ideas and feature requests at the Kong discussion forum
  - name: Question
    url: https://github.com/Kong/kong/discussions/categories/help
    about: Ask (and answer) questions at the Kong discussion forum


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!--
NOTE: Please read the CONTRIBUTING.md guidelines before submitting your patch,
and ensure you followed them all:
https://github.com/Kong/kong/blob/master/CONTRIBUTING.md#contributing

Refer to the Kong Gateway Community Pledge to understand how we work
with the open source community:
https://github.com/Kong/kong/blob/master/COMMUNITY_PLEDGE.md
-->

### Summary

<!--- Why is this change required? What problem does it solve? -->

### Checklist

- [ ] The Pull Request has tests
- [ ] A changelog file has been created under `changelog/unreleased/kong` or `skip-changelog` label added on PR if changelog is unnecessary. [README.md](https://github.com/Kong/gateway-changelog/blob/main/README.md)
- [ ] There is a user-facing docs PR against https://github.com/Kong/developer.konghq.com - PUT DOCS PR HERE

### Issue reference

<!--- If it fixes an open issue, please link to the issue here. -->
Fix #_[issue number]_


================================================
FILE: .github/actions/build-cache-key/action.yml
================================================
name: Build Cache Key

description: >
  Generates a cache key suitable for save/restore of Kong builds.

inputs:
  prefix:
    description: 'String prefix applied to the build cache key'
    required: false
    default: 'build'
  extra:
    description: 'Additional values/file hashes to use in the cache key'
    required: false

outputs:
  cache-key:
    description: 'The generated cache key'
    value: ${{ steps.cache-key.outputs.CACHE_KEY }}

runs:
  using: composite
  steps:
    - name: Generate cache key
      id: cache-key
      shell: bash
      env:
        PREFIX: ${{ inputs.prefix }}
        EXTRA: ${{ inputs.extra }}
      run: |
        # please keep these sorted
        FILE_HASHES=(
          ${{ hashFiles('.bazelignore') }}
          ${{ hashFiles('.bazelrc') }}
          ${{ hashFiles('.bazelversion') }}
          ${{ hashFiles('.github/actions/build-cache-key/**') }}
          ${{ hashFiles('.github/workflows/build.yml') }}
          ${{ hashFiles('.requirements') }}
          ${{ hashFiles('BUILD.bazel') }}
          ${{ hashFiles('WORKSPACE') }}
          ${{ hashFiles('bin/kong') }}
          ${{ hashFiles('bin/kong-health') }}
          ${{ hashFiles('build/**') }}
          ${{ hashFiles('kong-*.rockspec') }}
          ${{ hashFiles('kong.conf.default') }}
        )

        if [[ -n ${EXTRA:-} ]]; then
          readarray \
            -O "${#FILE_HASHES[@]}" \
            -t \
            FILE_HASHES \
          <<< "$EXTRA"
        fi

        HASH=$(printf '%s\n' "${FILE_HASHES[@]}" \
          | grep -vE '^$' \
          | sort --stable --unique \
          | sha256sum - \
          | awk '{print $1}'
        )

        echo "CACHE_KEY=${PREFIX}::${HASH}" | tee -a $GITHUB_OUTPUT


================================================
FILE: .github/actions/build-wasm-test-filters/action.yml
================================================
name: Build WASM Test Filters

description: >
  Installs the rust toolchain and builds the WASM filters that are used
  in our integration tests

runs:
  using: composite
  steps:
    - name: Setup env vars
      shell: bash
      run: |
        FILTER_PATH=$PWD/spec/fixtures/proxy_wasm_filters
        {
          echo "WASM_FILTER_PATH=$FILTER_PATH"
          echo "WASM_FIXTURE_PATH=$FILTER_PATH/build"
          echo "WASM_FILTER_CARGO_LOCK=$FILTER_PATH/Cargo.lock"
          echo "WASM_FILTER_TARGET=wasm32-wasip1"
        } >> $GITHUB_ENV

    - name: Setup cache key
      shell: bash
      env:
        FILE_HASH: ${{ hashFiles(env.WASM_FILTER_CARGO_LOCK, format('{0}/**/*.rs', env.WASM_FILTER_PATH)) }}
        CACHE_VERSION: "6"
        RUNNER_OS: ${{ runner.os }}
      run: |
        CACHE_PREFIX="wasm-test-filters::v${CACHE_VERSION}::${RUNNER_OS}::${WASM_FILTER_TARGET}::"
        {
          echo "WASM_CACHE_PREFIX=${CACHE_PREFIX}"
          echo "WASM_CACHE_KEY=${CACHE_PREFIX}${FILE_HASH}"
        } >> $GITHUB_ENV

    - name: Restore Cache
      uses: actions/cache/restore@v4
      id: restore-cache
      with:
        path: ${{ env.WASM_FILTER_PATH }}/target/**/*.wasm
        key: ${{ env.WASM_CACHE_KEY }}

    - name: Install Rust Toolchain
      if: steps.restore-cache.outputs.cache-hit != 'true'
      uses: dtolnay/rust-toolchain@a54c7afa936fefeb4456b2dd8068152669aa8203
      with:
        toolchain: stable
        components: cargo
        targets: ${{ env.WASM_FILTER_TARGET }}

    - name: Build Test Filters
      if: steps.restore-cache.outputs.cache-hit != 'true'
      shell: bash
      run: |
        # building in release mode yields smaller library sizes, so it's
        # better for our cacheability
        cargo build \
          --manifest-path "${WASM_FILTER_PATH:?}/Cargo.toml" \
          --workspace \
          --lib \
          --target "${WASM_FILTER_TARGET:?}" \
          --release

    - name: Save cache
      if: steps.restore-cache.outputs.cache-hit != 'true'
      id: save-cache
      uses: actions/cache/save@v4
      with:
        path: ${{ env.WASM_FILTER_PATH }}/target/**/*.wasm
        key: ${{ env.WASM_CACHE_KEY }}

    - name: Create a symlink to the target directory
      shell: bash
      run: |
        ln -sfv \
          --no-target-directory \
          "${WASM_FILTER_PATH:?}"/target/"${WASM_FILTER_TARGET:?}"/release \
          "${WASM_FIXTURE_PATH:?}"

    - name: debug
      shell: bash
      run: ls -la "${{ env.WASM_FIXTURE_PATH }}"/*.wasm


================================================
FILE: .github/dependabot.yml
================================================
# Set update schedule for GitHub Actions

version: 2
updates:

  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      # Check for updates to GitHub Actions every week
      interval: "weekly"


================================================
FILE: .github/labeler.yml
================================================
'cherry-pick kong-ee':
- changed-files:
  - any-glob-to-any-file: ['kong/**/*', 'spec/**/*', 'build/**/*', 'bin/**/*', 'scripts/**/*', 'changelog/**/*']

core/admin-api:
- changed-files:
  - any-glob-to-any-file: kong/api/**/*

core/balancer:
- changed-files:
  - any-glob-to-any-file: kong/runloop/balancer/*

core/cli:
- changed-files:
  - any-glob-to-any-file: kong/cmd/**/*

core/clustering:
- changed-files:
  - any-glob-to-any-file: ['kong/clustering/**/*', 'kong/cluster_events/**/*']

core/configuration:
- changed-files:
  - any-glob-to-any-file: kong/conf_loader/*

core/db/migrations:
- changed-files:
  - any-glob-to-any-file: kong/db/migrations/**/*

core/db:
- changed-files:
  - all-globs-to-any-file: ['kong/db/**/*', '!kong/db/migrations/**/*']

changelog:
- changed-files:
  - any-glob-to-any-file: CHANGELOG.md

core/docs:
- changed-files:
  - all-globs-to-any-file: ['**/*.md', '!CHANGELOG.md']

autodoc:
- changed-files:
  - any-glob-to-any-file: 'autodoc/**/*'

core/language/go:
- changed-files:
  - any-glob-to-any-file: kong/runloop/plugin_servers/*

core/language/js:
- changed-files:
  - any-glob-to-any-file: kong/runloop/plugin_servers/*

core/language/python:
- changed-files:
  - any-glob-to-any-file: kong/runloop/plugin_servers/*

core/logs:
- changed-files:
  - any-glob-to-any-file: kong/pdk/log.lua

core/pdk:
- changed-files:
  - all-globs-to-any-file: ['kong/pdk/**/*', '!kong/pdk/log.lua']

core/proxy:
- changed-files:
  - all-globs-to-any-file: ['kong/runloop/**/*', '!kong/runloop/balancer/*', '!kong/runloop/plugin_servers/*']

core/router:
- changed-files:
  - any-glob-to-any-file: kong/router/*

core/templates:
- changed-files:
  - any-glob-to-any-file: kong/templates/*

core/tracing:
- changed-files:
  - any-glob-to-any-file: ['kong/observability/tracing/**/*', 'kong/pdk/tracing.lua']

core/wasm:
- changed-files:
  - any-glob-to-any-file: ['kong/runloop/wasm.lua', 'kong/runloop/wasm/**/*']

chore:
- changed-files:
  - any-glob-to-any-file: ['.github/**/*', '.devcontainer/**/*']

plugins/acl:
- changed-files:
  - any-glob-to-any-file: kong/plugins/acl/**/*

plugins/acme:
- changed-files:
  - any-glob-to-any-file: kong/plugins/acme/**/*

plugins/ai-proxy:
- changed-files:
  - any-glob-to-any-file: ['kong/plugins/ai-proxy/**/*', 'kong/llm/**/*']

plugins/ai-prompt-decorator:
- changed-files:
  - any-glob-to-any-file: kong/plugins/ai-prompt-decorator/**/*

plugins/ai-prompt-template:
- changed-files:
  - any-glob-to-any-file: kong/plugins/ai-prompt-template/**/*

plugins/ai-request-transformer:
- changed-files:
  - any-glob-to-any-file: ['kong/plugins/ai-request-transformer/**/*', 'kong/llm/**/*']

plugins/ai-response-transformer:
- changed-files:
  - any-glob-to-any-file: ['kong/plugins/ai-response-transformer/**/*', 'kong/llm/**/*']

plugins/ai-prompt-guard:
- changed-files:
  - any-glob-to-any-file: kong/plugins/ai-prompt-guard/**/*

plugins/aws-lambda:
- changed-files:
  - any-glob-to-any-file: kong/plugins/aws-lambda/**/*

plugins/azure-functions:
- changed-files:
  - any-glob-to-any-file: kong/plugins/azure-functions/**/*

plugins/basic-auth:
- changed-files:
  - any-glob-to-any-file: kong/plugins/basic-auth/**/*

plugins/bot-detection:
- changed-files:
  - any-glob-to-any-file: kong/plugins/bot-detection/**/*

plugins/correlation-id:
- changed-files:
  - any-glob-to-any-file: kong/plugins/correlation-id/**/*

plugins/cors:
- changed-files:
  - any-glob-to-any-file: kong/plugins/cors/**/*

plugins/datadog:
- changed-files:
  - any-glob-to-any-file: kong/plugins/datadog/**/*

plugins/file-log:
- changed-files:
  - any-glob-to-any-file: kong/plugins/file-log/**/*

plugins/grpc-gateway:
- changed-files:
  - any-glob-to-any-file: kong/plugins/grpc-gateway/**/*

plugins/grpc-web:
- changed-files:
  - any-glob-to-any-file: kong/plugins/grpc-web/**/*

plugins/hmac-auth:
- changed-files:
  - any-glob-to-any-file: kong/plugins/hmac-auth/**/*

plugins/http-log:
- changed-files:
  - any-glob-to-any-file: kong/plugins/http-log/**/*

plugins/ip-restriction:
- changed-files:
  - any-glob-to-any-file: kong/plugins/ip-restriction/**/*

plugins/jwt:
- changed-files:
  - any-glob-to-any-file: kong/plugins/jwt/**/*

plugins/key-auth:
- changed-files:
  - any-glob-to-any-file: kong/plugins/key-auth/**/*

plugins/ldap-auth:
- changed-files:
  - any-glob-to-any-file: kong/plugins/ldap-auth/**/*

plugins/loggly:
- changed-files:
  - any-glob-to-any-file: kong/plugins/loggly/**/*

plugins/oauth2:
- changed-files:
  - any-glob-to-any-file: kong/plugins/oauth2/**/*

plugins/prometheus:
- changed-files:
  - any-glob-to-any-file: kong/plugins/prometheus/**/*

plugins/proxy-cache:
- changed-files:
  - any-glob-to-any-file: kong/plugins/proxy-cache/**/*

plugins/rate-limiting:
- changed-files:
  - any-glob-to-any-file: kong/plugins/rate-limiting/**/*

plugins/request-size-limiting:
- changed-files:
  - any-glob-to-any-file: kong/plugins/request-size-limiting/**/*

plugins/request-termination:
- changed-files:
  - any-glob-to-any-file: kong/plugins/request-termination/**/*

plugins/request-transformer:
- changed-files:
  - any-glob-to-any-file: kong/plugins/request-transformer/**/*

plugins/response-ratelimiting:
- changed-files:
  - any-glob-to-any-file: kong/plugins/response-ratelimiting/**/*

plugins/response-transformer:
- changed-files:
  - any-glob-to-any-file: kong/plugins/response-transformer/**/*

plugins/session:
- changed-files:
  - any-glob-to-any-file: kong/plugins/session/**/*

plugins/serverless-functions:
- changed-files:
  - any-glob-to-any-file: ['kong/plugins/post-function/**/*', 'kong/plugins/pre-function/**/*']

plugins/statsd:
- changed-files:
  - any-glob-to-any-file: kong/plugins/statsd/**/*

plugins/syslog:
- changed-files:
  - any-glob-to-any-file: kong/plugins/syslog/**/*

plugins/tcp-log:
- changed-files:
  - any-glob-to-any-file: kong/plugins/tcp-log/**/*

plugins/udp-log:
- changed-files:
  - any-glob-to-any-file: kong/plugins/udp-log/**/*

plugins/zipkin:
- changed-files:
  - any-glob-to-any-file: kong/plugins/zipkin/**/*

plugins/opentelemetry:
- changed-files:
  - any-glob-to-any-file: kong/plugins/opentelemetry/**/*

plugins/standard-webhooks:
- changed-files:
  - any-glob-to-any-file: kong/plugins/standard-webhooks/**/*

plugins/redirect:
- changed-files:
  - any-glob-to-any-file: kong/plugins/redirect/**/*

schema-change-noteworthy:
- changed-files:
  - any-glob-to-any-file: [
      'kong/db/schema/**/*.lua', 'kong/**/schema.lua', 'kong/plugins/**/daos.lua', 'plugins-ee/**/daos.lua', 'plugins-ee/**/schema.lua', 'kong/db/dao/*.lua', 'kong/enterprise_edition/redis/init.lua',
      'kong/llm/init.lua', 'kong/llm/schemas/*.lua', 'kong/llm/vectordb/strategies/pgvector/init.lua',
    ]

build/bazel:
- changed-files:
  - any-glob-to-any-file: ['**/*.bazel', '**/*.bzl', 'build/**/*', 'WORKSPACE', '.bazelignore', '.bazelrc', '.bazelversion', 'scripts/build-*.sh']


================================================
FILE: .github/matrix-commitly.yml
================================================
# please see matrix-full.yml for meaning of each field
build-packages:
- label: ubuntu-24.04
  image: ubuntu:24.04
  package: deb
  check-manifest-suite: ubuntu-24.04-amd64

build-images:
- label: ubuntu
  base-image: ubuntu:24.04
  package: deb
  artifact-from: ubuntu-24.04

smoke-tests:
- label: ubuntu

scan-vulnerabilities:
- label: ubuntu

release-packages:

release-images:
- label: ubuntu
  package: deb


================================================
FILE: .github/matrix-full.yml
================================================
build-packages:
# label: used to distinguish artifacts for later use
# image: docker image name if the build is running in side a container
# package: package type
# package-type: the nfpm packaging target, //:kong_{package} target; only used when package is rpm
# bazel-args: additional bazel build flags
# check-manifest-suite: the check manifest suite as defined in scripts/explain_manifest/config.py

# Ubuntu
- label: ubuntu-20.04
  image: ubuntu:20.04
  package: deb
  check-manifest-suite: ubuntu-20.04-amd64
- label: ubuntu-22.04
  image: ubuntu:22.04
  package: deb
  check-manifest-suite: ubuntu-22.04-amd64
- label: ubuntu-22.04-arm64
  image: ubuntu:22.04
  package: deb
  bazel-args: --platforms=//:generic-crossbuild-aarch64
  check-manifest-suite: ubuntu-22.04-arm64
- label: ubuntu-24.04
  image: ubuntu:24.04
  package: deb
  check-manifest-suite: ubuntu-24.04-amd64
- label: ubuntu-24.04-arm64
  image: ubuntu:24.04
  package: deb
  bazel-args: --platforms=//:generic-crossbuild-aarch64
  check-manifest-suite: ubuntu-24.04-arm64

# Debian
- label: debian-11
  image: debian:11
  package: deb
  check-manifest-suite: debian-11-amd64
- label: debian-12
  image: debian:12
  package: deb
  check-manifest-suite: debian-12-amd64

# RHEL
- label: rhel-8
  image: rockylinux:8
  package: rpm
  package-type: el8
  check-manifest-suite: el8-amd64
- label: rhel-9
  image: rockylinux:9
  package: rpm
  package-type: el9
  check-manifest-suite: el9-amd64
- label: rhel-9-arm64
  package: rpm
  package-type: el9
  bazel-args: --platforms=//:rhel9-crossbuild-aarch64 --//:brotli=False
  check-manifest-suite: el9-arm64

  # Amazon Linux
- label: amazonlinux-2
  package: rpm
  package-type: aws2
  check-manifest-suite: amazonlinux-2-amd64
  # simdjson doesn't compile on gcc7.3.1 (needs 7.4)
  bazel-args: --platforms=//:aws2-crossbuild-x86_64 --//:simdjson=False
- label: amazonlinux-2023
  image: amazonlinux:2023
  package: rpm
  package-type: aws2023
  check-manifest-suite: amazonlinux-2023-amd64
- label: amazonlinux-2023-arm64
  package: rpm
  package-type: aws2023
  bazel-args: --platforms=//:aws2023-crossbuild-aarch64 --//:brotli=False
  check-manifest-suite: amazonlinux-2023-arm64

build-images:
# Only build images for the latest version of each major release.

# label: used as compose docker image label ${github.sha}-${label}
# base-image: docker image to use as base
# package: package type
# artifact-from: label of build-packages to use
# artifact-from-alt: another label of build-packages to use for downloading package (to build multi-arch image)
# docker-platforms: comma separated list of docker buildx platforms to build for

# Ubuntu
- label: ubuntu
  base-image: ubuntu:24.04
  package: deb
  artifact-from: ubuntu-24.04
  artifact-from-alt: ubuntu-24.04-arm64
  docker-platforms: linux/amd64, linux/arm64

# Debian
- label: debian
  base-image: debian:12-slim
  package: deb
  artifact-from: debian-12

# RHEL
- label: rhel
  base-image: registry.access.redhat.com/ubi9
  package: rpm
  rpm_platform: el9
  artifact-from: rhel-9
  artifact-from-alt: rhel-9-arm64
  docker-platforms: linux/amd64, linux/arm64

smoke-tests:
- label: ubuntu
- label: debian
- label: rhel

scan-vulnerabilities:
- label: ubuntu
- label: debian
- label: rhel

release-packages:
# Ubuntu
- label: ubuntu-20.04
  package: deb
  artifact-from: ubuntu-20.04
  artifact-version: 20.04
  artifact-type: ubuntu
  artifact: kong.amd64.deb
- label: ubuntu-22.04
  package: deb
  artifact-from: ubuntu-22.04
  artifact-version: 22.04
  artifact-type: ubuntu
  artifact: kong.amd64.deb
- label: ubuntu-22.04-arm64
  package: deb
  artifact-from: ubuntu-22.04-arm64
  artifact-version: 22.04
  artifact-type: ubuntu
  artifact: kong.arm64.deb
- label: ubuntu-24.04
  package: deb
  artifact-from: ubuntu-24.04
  artifact-version: 24.04
  artifact-type: ubuntu
  artifact: kong.amd64.deb
- label: ubuntu-24.04-arm64
  package: deb
  artifact-from: ubuntu-24.04-arm64
  artifact-version: 24.04
  artifact-type: ubuntu
  artifact: kong.arm64.deb

# Debian
- label: debian-11
  package: deb
  artifact-from: debian-11
  artifact-version: 11
  artifact-type: debian
  artifact: kong.amd64.deb
- label: debian-12
  package: deb
  artifact-from: debian-12
  artifact-version: 12
  artifact-type: debian
  artifact: kong.amd64.deb

# RHEL
- label: rhel-8
  package: rpm
  artifact-from: rhel-8
  artifact-version: 8
  artifact-type: rhel
  artifact: kong.el8.amd64.rpm
- label: rhel-9
  package: rpm
  artifact-from: rhel-9
  artifact-version: 9
  artifact-type: rhel
  artifact: kong.el9.amd64.rpm
- label: rhel-9-arm64
  package: rpm
  artifact-from: rhel-9-arm64
  artifact-version: 9
  artifact-type: rhel
  artifact: kong.el9.arm64.rpm

# Amazon Linux
- label: amazonlinux-2
  package: rpm
  artifact-from: amazonlinux-2
  artifact-version: 2
  artifact-type: amazonlinux
  artifact: kong.aws2.amd64.rpm
- label: amazonlinux-2023
  package: rpm
  artifact-from: amazonlinux-2023
  artifact-version: 2023
  artifact-type: amazonlinux
  artifact: kong.aws2023.amd64.rpm
- label: amazonlinux-2023-arm64
  package: rpm
  artifact-from: amazonlinux-2023-arm64
  artifact-version: 2023
  artifact-type: amazonlinux
  artifact: kong.aws2023.arm64.rpm

release-images:
- label: ubuntu
- label: debian
- label: rhel


================================================
FILE: .github/workflows/add-release-pongo.yml
================================================
name: Add New Release to Pongo

on:
  push:
    tags:
    - '[1-9]+.[0-9]+.[0-9]+'

jobs:
  set_vars:
    name: Set Vars
    runs-on: ubuntu-latest-kong
    env:
      REF_NAME: ${{ github.ref_name }}
      RELEASE_TAG_NAME: ${{ github.event.release.tag_name }}
    outputs:
      code_base: ${{ steps.define_vars.outputs.CODE_BASE }}
      tag_version: ${{ steps.define_vars.outputs.TAG_VERSION }}
    steps:
    - name: Define Vars
      id: define_vars
      shell: bash
      run: |
        if [[ "${GITHUB_REPOSITORY,,}" = "kong/kong" ]] ; then
          CODE_BASE=CE
        elif [[ "${GITHUB_REPOSITORY,,}" = "kong/kong-ee" ]] ; then
          CODE_BASE=EE
        fi
        echo "CODE_BASE=$CODE_BASE" >> "$GITHUB_OUTPUT"

        if [[ "${{ github.event_name }}" == "push" ]] ; then
          TAG_VERSION="$REF_NAME"
        elif [[ "${{ github.event_name }}" == "release" ]] ; then
          TAG_VERSION="$RELEASE_TAG_NAME"
        fi
        echo "TAG_VERSION=$TAG_VERSION" >> "$GITHUB_OUTPUT"
  add_release_to_pongo:
    name: Add Release to Pongo
    runs-on: ubuntu-latest-kong
    needs:
    - set_vars
    env:
      GITHUB_TOKEN: ${{ secrets.PAT }}
    steps:
    - name: Checkout Pongo
      id: checkout_pongo
      uses: actions/checkout@v4
      with:
        token: ${{ env.GITHUB_TOKEN }}
        repository: kong/kong-pongo
        ref: master
    - name: Set git Env
      id: set_git_env
      shell: bash
      run: |
        git config --global user.email "ci-bot@konghq.com"
        git config --global user.name "CI Bot"
    - name: Create PR
      id: create_pr
      shell: bash
      run: |
        ./assets/add_version.sh "${{ needs.set_vars.outputs.code_base }}" "${{ needs.set_vars.outputs.tag_version }}"


================================================
FILE: .github/workflows/ast-grep.yml
================================================
name: ast-grep lint

on:
  pull_request:
    paths:
      - .github/workflows/ast-grep.yml # this workflow
      - sgconfig.yml
      - .ci/ast-grep/**

      # globs for files that we want to check with ast-grep here
      - '**/*.lua'

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

jobs:
  lint:
    name: lint

    runs-on: ubuntu-22.04

    defaults:
      run:
        shell: bash

    steps:
      - name: git checkout
        uses: actions/checkout@v4

      - name: ensure all rules are properly formed and have tests
        run: |
          shopt -s failglob

          declare -i failed=0
          fail() {
            failed=1

            local -r fname=${1:?}
            shift

            local entry
            printf -v entry '::error file=%s' "$fname"

            while (( $# > 0 )); do
              case $1 in
                -t|--title)
                  local title=${2:?}
                  shift 2
                  printf -v entry '%s,title=%s' "$entry" "$title"
                  ;;
                *)
                  break
                  ;;
              esac
            done

            local msg
            printf -v msg "$@"
            printf '%s::%s\n' "$entry" "$msg"
          }

          declare -i count=0

          for rule in .ci/ast-grep/rules/*.yml; do
            count+=1

            name=${rule##*/}
            name=${name%*.yml}

            printf 'Rule(%s): %s\n' "$name" "$rule"

            id=$(yq -r .id < "$rule")

            if [[ $id != "$name" ]]; then
              fail "$rule" \
                --title 'Rule .id/filename mismatch' \
                'Rule(%s) ${filename}.yml must match its .id (%s)' \
                "$name" "$id"
            fi

            test=.ci/ast-grep/tests/${name}-test.yml

            if [[ ! -e $test ]]; then
              failed=1
              fail "$rule" \
                --title 'Rule test required' \
                'Rule test file (%s) not found' "$test"

              continue
            fi

            printf 'Rule(%s): test file: %s\n' "$name" "$test"

            test_id=$(yq -r .id < "$test")
            if [[ $test_id != $id ]]; then
              fail "$test" \
                --title 'Rule test file/.id mismatch' \
                'Rule test file .id (%s) does not match rule .id (%s)' \
                "$test_id" "$id"
            fi

            declare -i valid invalid
            valid=$(yq -r '.valid | length' < "$test")
            invalid=$(yq -r '.invalid | length' < "$test")

            if (( valid < 1 || invalid < 1 )); then
              fail "$test" \
                --title 'Rule tests insufficient' \
                'Rule test file must contain at least one valid and one invalid test case'
            fi

            printf 'Rule(%s) test has %s valid and %s invalid test cases\n' \
              "$name" "$valid" "$invalid"
          done

          printf 'Checked %s rules\n' "$count"

          if (( failed > 0 )); then
            printf '::error::Found one or more problems while checking ast-grep rules and tests\n'
            exit 1
          fi

      # NOTE: this is basically an inline of the official, public gh action
      # (https://github.com/ast-grep/action).
      - name: install ast-grep
        run: |
          set -euo pipefail

          readonly VERSION=0.36.2
          readonly CHECKSUM=7fd693b013447582d8befa1695f00d17301c2cff1763cfb0b52191096309dbef
          readonly FILENAME=app-x86_64-unknown-linux-gnu.zip
          readonly BINDIR=$HOME/.local/bin

          readonly URL=https://github.com/ast-grep/ast-grep/releases/download/${VERSION}/${FILENAME}

          curl --fail \
            --silent \
            --location \
            --output "$FILENAME" \
            "$URL"

          sha256sum --check --strict <<< "${CHECKSUM} ${FILENAME}"

          unzip "$FILENAME" ast-grep
          ./ast-grep --version

          mkdir -p "$BINDIR"
          mv ast-grep "$BINDIR"
          echo "$BINDIR" >> $GITHUB_PATH

      - name: ast-grep test
        run: ast-grep test

      - name: ast-grep scan
        run: ast-grep scan --format github


================================================
FILE: .github/workflows/auto-assignee.yml
================================================
name: Add assignee to PRs
on:
  pull_request:
    types: [ opened, reopened ]
permissions:
  pull-requests: write
jobs:
  assign-author:
    runs-on: ubuntu-latest
    steps:
      - name: assign-author
        # ignore the pull requests opened from PR because token is not correct
        if: github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]'
        uses: toshimaru/auto-author-assign@ebd30f10fb56e46eb0759a14951f36991426fed0



================================================
FILE: .github/workflows/autodocs.yml
================================================
name: Autodocs

on:
  workflow_dispatch:
    inputs:
      version:
        description: "Version (e.g. 2.4.x)"
        required: true
      source_branch:
        description: "Source Branch in kong/kong (e.g. release/2.4.x)"
        required: true
      target_branch:
        description: "Target Branch in kong/docs.konghq.com (e.g. release/2.4)"
        required: true
      force_build:
        description: "Ignore the build cache and build dependencies from scratch"
        type: boolean
        default: false
jobs:
  build:
    name: Build dependencies
    runs-on: ubuntu-22.04

    env:
      DOWNLOAD_ROOT: $HOME/download-root

    steps:
      - name: Set environment variables
        run: |
          echo "INSTALL_ROOT=$HOME/install-root" >> $GITHUB_ENV
          echo "DOWNLOAD_ROOT=$HOME/download-root" >> $GITHUB_ENV
          echo "LD_LIBRARY_PATH=$INSTALL_ROOT/openssl/lib:$LD_LIBRARY_PATH" >> $GITHUB_ENV

      - name: Checkout Kong source code
        uses: actions/checkout@v4

      - name: Lookup build cache
        uses: actions/cache@v4
        id: cache-deps
        with:
          path: ${{ env.INSTALL_ROOT }}
          key: ${{ hashFiles('.ci/setup_env_github.sh') }}-${{ hashFiles('.requirements') }}-${{ hashFiles('kong-*.rockspec') }}

      - name: Checkout kong-build-tools
        if: steps.cache-deps.outputs.cache-hit != 'true' || github.event.inputs.force_build == 'true'
        uses: actions/checkout@v4
        with:
          repository: Kong/kong-build-tools
          path: kong-build-tools
          ref: master

      - name: Checkout go-pluginserver
        if: steps.cache-deps.outputs.cache-hit != 'true' || github.event.inputs.force_build == 'true'
        uses: actions/checkout@v4
        with:
          repository: Kong/go-pluginserver
          path: go-pluginserver

      - name: Add to Path
        if: steps.cache-deps.outputs.cache-hit != 'true' || github.event.inputs.force_build == 'true'
        run: echo "$INSTALL_ROOT/openssl/bin:$INSTALL_ROOT/openresty/nginx/sbin:$INSTALL_ROOT/openresty/bin:$INSTALL_ROOT/luarocks/bin:$GITHUB_WORKSPACE/kong-build-tools/openresty-build-tools" >> $GITHUB_PATH

      - name: Install packages
        if: steps.cache-deps.outputs.cache-hit != 'true' || github.event.inputs.force_build == 'true'
        run: sudo apt update && sudo apt install libyaml-dev valgrind

      - name: Build Kong dependencies
        if: steps.cache-deps.outputs.cache-hit != 'true' || github.event.inputs.force_build == 'true'
        run: |
          source .ci/setup_env_github.sh
          make dev
  autodoc:
    runs-on: ubuntu-22.04
    needs: [build]
    steps:
      - name: Set environment variables
        run: |
          echo "INSTALL_ROOT=$HOME/install-root" >> $GITHUB_ENV
          echo "DOWNLOAD_ROOT=$HOME/download-root" >> $GITHUB_ENV
          echo "LD_LIBRARY_PATH=$INSTALL_ROOT/openssl/lib:$LD_LIBRARY_PATH" >> $GITHUB_ENV

      - name: Checkout Kong source code
        uses: actions/checkout@v4
        with:
          path: kong
          ref: ${{ github.event.inputs.source_branch }}

      - name: Checkout Kong Docs
        uses: actions/checkout@v4
        with:
          repository: kong/docs.konghq.com
          path: docs.konghq.com
          token: ${{ secrets.PAT }}
          ref: ${{ github.event.inputs.target_branch }}

      - name: Lookup build cache
        uses: actions/cache@v4
        id: cache-deps
        with:
          path: ${{ env.INSTALL_ROOT }}
          key: ${{ hashFiles('kong/.ci/setup_env_github.sh') }}-${{ hashFiles('kong/.requirements') }}-${{ hashFiles('kong/kong-*.rockspec') }}

      - name: Add to Path
        run: echo "$INSTALL_ROOT/openssl/bin:$INSTALL_ROOT/openresty/nginx/sbin:$INSTALL_ROOT/openresty/bin:$INSTALL_ROOT/luarocks/bin:$GITHUB_WORKSPACE/kong-build-tools/openresty-build-tools:$INSTALL_ROOT/go-pluginserver" >> $GITHUB_PATH

      - name: Run Autodocs
        run: |
          cd kong
          eval `luarocks path`
          scripts/autodoc ../docs.konghq.com ${{ github.event.inputs.version }}

      - name: Generate branch name
        id: kong-branch
        run: |
          cd kong
          output="$(git branch --show-current)"
          echo "name=$output" >> $GITHUB_OUTPUT

      - name: Show Docs status
        run: |
          cd docs.konghq.com
          git status
          git checkout -b "autodocs-${{ steps.kong-branch.outputs.name }}"

      - name: Commit autodoc changes
        uses: stefanzweifel/git-auto-commit-action@8621497c8c39c72f3e2a999a26b4ca1b5058a842 # v5
        with:
          repository: "./docs.konghq.com"
          commit_message: "Autodocs update"
          branch: "autodocs-${{ steps.kong-branch.outputs.name }}"
          skip_fetch: true
          push_options: "--force"

      - name: Raise PR
        run: |
          cd docs.konghq.com
          echo "${{ secrets.PAT }}" | gh auth login --with-token
          gh pr create --base "${{ github.event.inputs.target_branch }}" --fill --label "review:autodoc"


================================================
FILE: .github/workflows/backport-fail-bot.yml
================================================
name: Forward failed backport alert to Slack

on:
  issue_comment:
    types: [created]

jobs:
  check_comment:
    runs-on: ubuntu-latest
    if: github.event.issue.pull_request != null && contains(github.event.comment.body, 'cherry-pick the changes locally and resolve any conflicts')

    steps:
    - name: Fetch mapping file
      id: fetch_mapping
      uses: actions/github-script@v7
      env:
        ACCESS_TOKEN: ${{ secrets.PAT }}
      with:
        script: |
          const url = 'https://raw.githubusercontent.com/Kong/github-slack-mapping/main/mapping.json';
          const headers = {Authorization: `token ${process.env.ACCESS_TOKEN}`};
          const response = await fetch(url, {headers});
          const mapping = await response.json();
          return mapping;

    - name: Generate Slack Payload
      id: generate-payload
      uses: actions/github-script@v7
      env:
        SLACK_CHANNEL: gateway-notifications
        SLACK_MAPPING: "${{ steps.fetch_mapping.outputs.result }}"
      with:
        script: |
          const pr_url = ${{ github.event.issue.pull_request.html_url }};
          const slack_mapping = JSON.parse(process.env.SLACK_MAPPING);
          const pr_author_github_id = ${{ github.event.issue.user.login }};
          const pr_author_slack_id = slack_mapping[pr_author_github_id];
          const author = pr_author_slack_id ? `<@${pr_author_slack_id}>` : pr_author_github_id;
          const payload = {
            text: `${pr_url} from ${author} failed to backport.`,
            channel: process.env.SLACK_CHANNEL,
          };
          return JSON.stringify(payload);
        result-encoding: string

    - name: Send Slack Message
      uses: slackapi/slack-github-action@70cd7be8e40a46e8b0eced40b0de447bdb42f68e # v1.26.0
      with:
        payload: ${{ steps.generate-payload.outputs.result }}
      env:
        SLACK_WEBHOOK_URL: ${{ secrets.SLACK_GATEWAY_NOTIFICATIONS_WEBHOOK }}


================================================
FILE: .github/workflows/backport-v2.yml
================================================
name: Backport v2
on:
  pull_request:
    types: [closed, labeled] # runs when the pull request is closed/merged or labeled (to trigger a backport in hindsight)
permissions:
  contents: write # so it can comment
  pull-requests: write # so it can create pull requests
  actions: write
jobs:
  backport:
    name: Backport
    runs-on: ubuntu-latest
    if: github.event.pull_request.merged
    steps:
      - uses: actions/checkout@v4
      - name: Create backport pull requests
        uses: korthout/backport-action@924c8170740fa1e3685f69014971f7f251633f53 # v2.4.1
        id: backport
        with:
          github_token: ${{ secrets.PAT }}
          pull_title: '[backport -> ${target_branch}] ${pull_title}'
          merge_commits: 'skip'
          copy_labels_pattern: ^(?!backport ).* # copies all labels except those starting with "backport "
          label_pattern: ^backport (release\/[^ ]+)$ # filters for labels starting with "backport " and extracts the branch name
          pull_description: |-
            Automated backport to `${target_branch}`, triggered by a label in #${pull_number}.

            ## Original description

            ${pull_description}
          copy_assignees: true
          copy_milestone: true
          copy_requested_reviewers: true
          experimental: >
            {
              "detect_merge_method": true
            }
      - name: add label
        if: steps.backport.outputs.was_successful == 'false'
        uses: Kong/action-add-labels@81b0a07d6b2ec64d770be1ca94c31ec827418054
        with:
          labels: incomplete-backport


================================================
FILE: .github/workflows/build.yml
================================================
name: Build
on:
  workflow_call:
    inputs:
      relative-build-root:
        required: true
        type: string
    outputs:
      cache-key:
        description: 'Computed cache key, used for restoring cache in other workflows'
        value: ${{ jobs.build.outputs.cache-key }}

env:
  BUILD_ROOT: ${{ github.workspace }}/${{ inputs.relative-build-root }}

jobs:
  build:
    name: Build dependencies
    runs-on: ubuntu-22.04

    outputs:
      cache-key: ${{ steps.cache-key.outputs.cache-key }}

    steps:
    - name: Checkout Kong source code
      uses: actions/checkout@v4

    - name: Generate cache key
      id: cache-key
      uses: ./.github/actions/build-cache-key

    - name: Lookup build cache
      id: cache-deps
      uses: actions/cache@v4
      with:
        path: ${{ env.BUILD_ROOT }}
        key: ${{ steps.cache-key.outputs.cache-key }}

    - name: Install packages
      if: steps.cache-deps.outputs.cache-hit != 'true'
      run: sudo apt update && sudo apt install libyaml-dev valgrind libprotobuf-dev

    - name: Build Kong
      if: steps.cache-deps.outputs.cache-hit != 'true'
      env:
        GH_TOKEN: ${{ github.token }}
      run: |
        make build-kong
        chmod +rw -R "$BUILD_ROOT/kong-dev"

    - name: Update PATH
      run: |
        echo "$BUILD_ROOT/kong-dev/bin" >> $GITHUB_PATH
        echo "$BUILD_ROOT/kong-dev/openresty/nginx/sbin" >> $GITHUB_PATH
        echo "$BUILD_ROOT/kong-dev/openresty/bin" >> $GITHUB_PATH

    - name: Debug (nginx)
      run: |
        echo nginx: $(which nginx)
        nginx -V 2>&1 | sed -re 's/ --/\n--/g'
        ldd $(which nginx)

    - name: Debug (luarocks)
      run: |
        echo luarocks: $(which luarocks)
        luarocks --version
        luarocks config

    - name: Bazel Outputs
      uses: actions/upload-artifact@v4
      if: failure()
      with:
        name: bazel-outputs
        path: |
          bazel-out/_tmp/actions
        retention-days: 3

    - name: Build Dev Kong dependencies
      if: steps.cache-deps.outputs.cache-hit != 'true'
      run: |
        make install-dev-rocks


================================================
FILE: .github/workflows/build_and_test.yml
================================================
name: Build & Test
on:
  pull_request:
    paths-ignore:
    # ignore markdown files (CHANGELOG.md, README.md, etc.)
    - '**/*.md'
    - 'COPYRIGHT'
    - 'LICENSE'
    - '.github/workflows/release.yml'
    - 'changelog/**'
    - 'kong.conf.default'
  push:
    paths-ignore:
    # ignore markdown files (CHANGELOG.md, README.md, etc.)
    - '**/*.md'
    # ignore PRs for the generated COPYRIGHT file
    - 'COPYRIGHT'
    - 'LICENSE'
    branches:
    - master
    - release/*
    - test-please/*
  workflow_dispatch:
    inputs:
      coverage:
        description: 'Coverage enabled'
        required: false
        type: boolean
        default: false

# cancel previous runs if new commits are pushed to the PR, but run for each commit on master
concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

env:
  BUILD_ROOT: ${{ github.workspace }}/bazel-bin/build
  KONG_TEST_COVERAGE: ${{ inputs.coverage == true || github.event_name == 'schedule' }}
  RUNNER_COUNT: 7

jobs:
  metadata:
    name: Metadata
    runs-on: ubuntu-22.04
    outputs:
      old-kong-version: ${{ steps.old-kong-version.outputs.ref }}

    steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 0  # `git merge-base` requires the history

    - name: Get Old Kong Version
      id: old-kong-version
      run: |
        KONG_VERSION=$(bash scripts/grep-kong-version.sh)
        major=$(echo "$KONG_VERSION" | cut -d. -f1)
        minor=$(echo "$KONG_VERSION" | cut -d. -f2)
        # if the minor version isn't 0, use the first release or starting point of the previous minor branch;
        # otherwise just leave it empty, so later the default branch or commit will be used.
        if [ "$minor" -ne 0 ]; then
          minor=$((minor - 1))
          git fetch origin master -t
          if [ $(git tag -l "$major.$minor.0") ]; then
              echo "ref=$major.$minor.0" >> $GITHUB_OUTPUT
          else
              git fetch origin release/$major.$minor.x
              COMMIT_HASH=$(git merge-base origin/master origin/release/$major.$minor.x)
              echo "ref=$COMMIT_HASH" >> $GITHUB_OUTPUT
          fi
        else
          echo "ref=" >> $GITHUB_OUTPUT
        fi

  build:
    uses: ./.github/workflows/build.yml
    with:
      relative-build-root: bazel-bin/build

  lint-and-doc-tests:
    name: Lint and Doc tests
    runs-on: ubuntu-22.04
    needs: build

    steps:
    - name: Bump max open files
      run: |
          sudo echo 'kong soft nofile 65536' | sudo tee -a /etc/security/limits.d/kong-ci.conf
          sudo echo 'kong hard nofile 65536' | sudo tee -a /etc/security/limits.d/kong-ci.conf
          sudo echo "$(whoami) soft nofile 65536" | sudo tee -a /etc/security/limits.d/kong-ci.conf
          sudo echo "$(whoami) hard nofile 65536" | sudo tee -a /etc/security/limits.d/kong-ci.conf

    - name: Checkout Kong source code
      uses: actions/checkout@v4

    - name: Lookup build cache
      id: cache-deps
      uses: actions/cache@v4
      with:
        path: ${{ env.BUILD_ROOT }}
        key: ${{ needs.build.outputs.cache-key }}

    - name: Check test-helpers doc generation
      run: |
          source ${{ env.BUILD_ROOT }}/kong-dev-venv.sh
          pushd ./spec && ldoc .

    - name: Check autodoc generation
      run: |
          source ${{ env.BUILD_ROOT }}/kong-dev-venv.sh
          scripts/autodoc

    - name: Lint Lua code
      run: |
          make lint

    - name: Validate rockspec file
      run: |
          source ${{ env.BUILD_ROOT }}/kong-dev-venv.sh
          scripts/validate-rockspec

    - name: Check spec file misspelling
      run: |
          scripts/check_spec_files_spelling.sh

    - name: Check labeler configuration
      run: scripts/check-labeler.pl .github/labeler.yml

  schedule:
    name: Schedule busted tests to run
    runs-on: ubuntu-22.04
    needs: build

    env:
      WORKFLOW_ID: ${{ github.run_id }}

    outputs:
      runners: ${{ steps.generate-runner-array.outputs.RUNNERS }}

    steps:
    - name: Checkout source code
      uses: actions/checkout@v4

    - name: Download runtimes file
      uses: Kong/gh-storage/download@b196a6b94032e56e414227c749e9f96a6afc2b91 # v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        repo-path: Kong/gateway-action-storage/main/.ci/runtimes.json

    - name: Schedule tests
      uses: Kong/gateway-test-scheduler/schedule@69f0c2a562ac44fc3650b8bfa62106b34094b5ce # v3
      with:
        test-suites-file: .ci/test_suites.json
        test-file-runtime-file: .ci/runtimes.json
        output-prefix: test-chunk.
        runner-count: ${{ env.RUNNER_COUNT }}
        static-mode: ${{ github.run_attempt > 1 }}

    - name: Upload schedule files
      uses: actions/upload-artifact@v4
      continue-on-error: true
      with:
        name: schedule-test-files
        path: test-chunk.*
        retention-days: 7

    - name: Generate runner array
      id: generate-runner-array
      run: |
        echo "RUNNERS=[$(seq -s "," 1 $(( "$RUNNER_COUNT" )))]" >> "$GITHUB_OUTPUT"

  busted-tests:
    name: Busted test runner ${{ matrix.runner }}
    runs-on: ubuntu-22.04
    needs: [metadata,build,schedule]

    strategy:
      fail-fast: false
      matrix:
        runner: ${{ fromJSON(needs.schedule.outputs.runners) }}

    services:
      postgres:
        image: postgres:13
        env:
          POSTGRES_USER: kong
          POSTGRES_DB: kong
          POSTGRES_HOST_AUTH_METHOD: trust
        ports:
          - 5432:5432
        options: --health-cmd pg_isready --health-interval 5s --health-timeout 5s --health-retries 8

      grpcbin:
        image: kong/grpcbin
        ports:
          - 15002:9000
          - 15003:9001

      redis:
        image: redis
        ports:
          - 6379:6379
          - 6380:6380
        options: >-
          --name kong_redis

      zipkin:
        image: openzipkin/zipkin:2
        ports:
          - 9411:9411

      redis-auth:
        image: redis/redis-stack-server
        # Set health checks to wait until redis has started
        options: >-
          --health-cmd "redis-cli ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          - 6385:6379
        env:
          REDIS_ARGS: "--requirepass passdefault"

    steps:
    - name: Bump max open files
      run: |
          sudo echo 'kong soft nofile 65536' | sudo tee -a /etc/security/limits.d/kong-ci.conf
          sudo echo 'kong hard nofile 65536' | sudo tee -a /etc/security/limits.d/kong-ci.conf
          sudo echo "$(whoami) soft nofile 65536" | sudo tee -a /etc/security/limits.d/kong-ci.conf
          sudo echo "$(whoami) hard nofile 65536" | sudo tee -a /etc/security/limits.d/kong-ci.conf

    - name: Checkout Kong source code
      uses: actions/checkout@v4

    # used for plugin compatibility test
    - name: Checkout old version Kong source code
      uses: actions/checkout@v4
      with:
        path: kong-old
        # if the minor version is 0, `ref` will default to ''
        # which is same as in the previous step
        ref: ${{ needs.metadata.outputs.old-kong-version }}

    - name: Lookup build cache
      id: cache-deps
      uses: actions/cache@v4
      with:
        path: ${{ env.BUILD_ROOT }}
        key: ${{ needs.build.outputs.cache-key }}

    - name: Add gRPC test host names
      run: |
          echo "127.0.0.1 grpcs_1.test" | sudo tee -a /etc/hosts
          echo "127.0.0.1 grpcs_2.test" | sudo tee -a /etc/hosts

    - name: Enable SSL for Redis
      run: |
          docker cp ${{ github.workspace }} kong_redis:/workspace
          docker cp ${{ github.workspace }}/spec/fixtures/redis/docker-entrypoint.sh kong_redis:/usr/local/bin/docker-entrypoint.sh
          docker restart kong_redis
          docker logs kong_redis

    - name: Run OpenTelemetry Collector
      run: |
          mkdir -p ${{ github.workspace }}/tmp/otel
          touch ${{ github.workspace }}/tmp/otel/file_exporter.json
          sudo chmod 777 -R ${{ github.workspace }}/tmp/otel
          docker run -p 4317:4317 -p 4318:4318 -p 55679:55679 \
              -v ${{ github.workspace }}/spec/fixtures/opentelemetry/otelcol.yaml:/etc/otel-collector-config.yaml \
              -v ${{ github.workspace }}/tmp/otel:/etc/otel \
              --name opentelemetry-collector -d \
              otel/opentelemetry-collector-contrib:0.52.0 \
              --config=/etc/otel-collector-config.yaml
          sleep 2
          docker logs opentelemetry-collector

    - name: Install AWS SAM cli tool
      run: |
          curl -L -s -o /tmp/aws-sam-cli.zip https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip
          unzip -o /tmp/aws-sam-cli.zip -d /tmp/aws-sam-cli
          sudo /tmp/aws-sam-cli/install --update

    - name: Update PATH
      run: |
        echo "$BUILD_ROOT/kong-dev/bin" >> $GITHUB_PATH
        echo "$BUILD_ROOT/kong-dev/openresty/nginx/sbin" >> $GITHUB_PATH
        echo "$BUILD_ROOT/kong-dev/openresty/bin" >> $GITHUB_PATH

    - name: Debug (nginx)
      run: |
        echo nginx: $(which nginx)
        nginx -V 2>&1 | sed -re 's/ --/\n--/g'
        ldd $(which nginx)

    - name: Debug (luarocks)
      run: |
        echo luarocks: $(which luarocks)
        luarocks --version
        luarocks config

    - name: Tune up postgres max_connections
      run: |
        # arm64 runners may use more connections due to more worker cores
        psql -hlocalhost -Ukong kong -tAc 'alter system set max_connections = 5000;'

    - name: Download test schedule file
      uses: actions/download-artifact@v4
      with:
        name: schedule-test-files

    - name: Generate helper environment variables
      run: |
           echo FAILED_TEST_FILES_FILE=failed-tests.json >> $GITHUB_ENV
           echo TEST_FILE_RUNTIME_FILE=test-runtime.json >> $GITHUB_ENV
           echo SPEC_ERRLOG_CACHE_DIR=/tmp/${{ github.run_id }}/build_test/${{ matrix.runner }} >> $GITHUB_ENV

    - name: Build & install dependencies
      run: |
        make dev
        # python pluginserver tests dependency
        pip install kong-pdk

    - name: Download test rerun information
      uses: actions/download-artifact@v4
      continue-on-error: true
      with:
        name: test-rerun-info-${{ matrix.runner }}

    - name: Download test runtime statistics from previous runs
      uses: actions/download-artifact@v4
      continue-on-error: true
      with:
        name: test-runtime-statistics-${{ matrix.runner }}

    - name: Run Tests
      env:
        KONG_TEST_PG_DATABASE: kong
        KONG_TEST_PG_USER: kong
        KONG_TEST_DATABASE: postgres
        KONG_SPEC_TEST_GRPCBIN_PORT: "15002"
        KONG_SPEC_TEST_GRPCBIN_SSL_PORT: "15003"
        KONG_SPEC_TEST_OTELCOL_FILE_EXPORTER_PATH: ${{ github.workspace }}/tmp/otel/file_exporter.json
        KONG_SPEC_TEST_OLD_VERSION_KONG_PATH: ${{ github.workspace }}/kong-old
        DD_ENV: ci
        DD_SERVICE: kong-ce-ci
        DD_CIVISIBILITY_MANUAL_API_ENABLED: 1
        DD_CIVISIBILITY_AGENTLESS_ENABLED: true
        DD_TRACE_GIT_METADATA_ENABLED: true
        DD_API_KEY: ${{ secrets.DATADOG_API_KEY }}
        SPEC_ERRLOG_CACHE_DIR: ${{ env.SPEC_ERRLOG_CACHE_DIR }}
      uses: Kong/gateway-test-scheduler/runner@69f0c2a562ac44fc3650b8bfa62106b34094b5ce # v3
      with:
        tests-to-run-file: test-chunk.${{ matrix.runner }}.json
        failed-test-files-file: ${{ env.FAILED_TEST_FILES_FILE }}
        test-file-runtime-file: ${{ env.TEST_FILE_RUNTIME_FILE }}
        setup-venv-path: ${{ env.BUILD_ROOT }}

    - name: Upload error logs
      if: failure()
      uses: actions/upload-artifact@v4
      with:
        name: busted-test-errlogs-${{ matrix.runner }}
        path: ${{ env.SPEC_ERRLOG_CACHE_DIR }}
        retention-days: 1

    - name: Upload test rerun information
      if: always()
      uses: actions/upload-artifact@v4
      with:
        name: test-rerun-info-${{ matrix.runner }}
        path: ${{ env.FAILED_TEST_FILES_FILE }}
        retention-days: 2

    - name: Upload test runtime statistics for offline scheduling
      if: always()
      uses: actions/upload-artifact@v4
      with:
        name: test-runtime-statistics-${{ matrix.runner }}
        path: ${{ env.TEST_FILE_RUNTIME_FILE }}
        retention-days: 7

    - name: Archive coverage stats file
      uses: actions/upload-artifact@v4
      if: ${{ always() && (inputs.coverage == true || github.event_name == 'schedule') }}
      with:
        name: luacov-stats-out-${{ github.job }}-${{ github.run_id }}-${{ matrix.runner }}
        retention-days: 1
        path: |
          luacov.stats.out

    - name: Get kernel message
      if: failure()
      run: |
        sudo dmesg -T

  pdk-tests:
    name: PDK tests
    runs-on: ubuntu-22.04
    needs: build

    steps:
    - name: Bump max open files
      run: |
          sudo echo 'kong soft nofile 65536' | sudo tee -a /etc/security/limits.d/kong-ci.conf
          sudo echo 'kong hard nofile 65536' | sudo tee -a /etc/security/limits.d/kong-ci.conf
          sudo echo "$(whoami) soft nofile 65536" | sudo tee -a /etc/security/limits.d/kong-ci.conf
          sudo echo "$(whoami) hard nofile 65536" | sudo tee -a /etc/security/limits.d/kong-ci.conf

    - name: Checkout Kong source code
      uses: actions/checkout@v4

    - name: Lookup build cache
      id: cache-deps
      uses: actions/cache@v4
      with:
        path: ${{ env.BUILD_ROOT }}
        key: ${{ needs.build.outputs.cache-key }}

    - name: Install Test::Nginx
      run: |
          CPAN_DOWNLOAD=./cpanm
          mkdir -p $CPAN_DOWNLOAD
          curl -o $CPAN_DOWNLOAD/cpanm https://cpanmin.us
          chmod +x $CPAN_DOWNLOAD/cpanm

          echo "Installing CPAN dependencies..."
          $CPAN_DOWNLOAD/cpanm --notest --local-lib=$HOME/perl5 local::lib && eval $(perl -I $HOME/perl5/lib/perl5/ -Mlocal::lib)
          $CPAN_DOWNLOAD/cpanm --notest Test::Nginx

    - name: Generate environment variables
      run: |
           echo SPEC_ERRLOG_CACHE_DIR=/tmp/${{ github.run_id }}/PDK_test >> $GITHUB_ENV

    - name: Tests
      env:
        TEST_SUITE: pdk
      run: |
          source ${{ env.BUILD_ROOT }}/kong-dev-venv.sh
          if [[ $KONG_TEST_COVERAGE = true ]]; then
            export PDK_LUACOV=1
          fi
          eval $(perl -I $HOME/perl5/lib/perl5/ -Mlocal::lib)
          prove -I. -r t

    - name: Upload error logs
      if: failure()
      uses: actions/upload-artifact@v4
      with:
        name: PDK-test-errlogs
        path: ${{ env.SPEC_ERRLOG_CACHE_DIR }}
        retention-days: 1

    - name: Archive coverage stats file
      uses: actions/upload-artifact@v4
      if: ${{ always() && (inputs.coverage == true || github.event_name == 'schedule') }}
      with:
        name: luacov-stats-out-${{ github.job }}-${{ github.run_id }}
        retention-days: 1
        path: |
          luacov.stats.out

    - name: Get kernel message
      if: failure()
      run: |
        sudo dmesg -T

  cleanup-and-aggregate-stats:
    needs: [lint-and-doc-tests,pdk-tests,busted-tests]
    name: Cleanup and Luacov stats aggregator
    if: ${{ always() && (inputs.coverage == true || github.event_name == 'schedule') }}
    runs-on: ubuntu-22.04

    steps:
    - name: Checkout source code
      uses: actions/checkout@v4

    - name: Install requirements
      run: |
        sudo apt-get update && sudo apt-get install -y luarocks
        sudo luarocks install luacov
        sudo luarocks install luafilesystem

    # Download all archived coverage stats files
    - uses: actions/download-artifact@v4

    - name: Stats aggregation
      shell: bash
      run: |
        lua .ci/luacov-stats-aggregator.lua "luacov-stats-out-" "luacov.stats.out" ${{ github.workspace }}/
        # The following prints a report with each file sorted by coverage percentage, and the total coverage
        printf "\n\nCoverage   File\n\n"
        awk -v RS='Coverage\n-+\n' 'NR>1{print $0}' luacov.report.out | grep -vE "^-|^$" > summary.out
        cat summary.out | grep -v "^Total" | awk '{printf "%7d%%   %s\n", $4, $1}' | sort -n
        cat summary.out | grep "^Total" | awk '{printf "%7d%%   %s\n", $4, $1}'


================================================
FILE: .github/workflows/buildifier.yml
================================================
name: Buildifier

on:
  pull_request:
    paths:
    - '**/*.bzl'
    - '**/*.bazel'
    - 'BUILD*'
    - 'WORKSPACE*'
  push:
    paths:
    - '**/*.bzl'
    - '**/*.bazel'
    - 'BUILD*'
    - 'WORKSPACE*'
    branches:
    - master
    - release/*

jobs:

  autoformat:
    name: Auto-format and Check
    runs-on: ubuntu-22.04

    steps:
      - name: Check out code
        uses: actions/checkout@v4

      - name: Install Dependencies
        run: |
          sudo wget -O /bin/buildifier https://github.com/bazelbuild/buildtools/releases/download/5.1.0/buildifier-linux-amd64
          sudo chmod +x /bin/buildifier

      - name: Run buildifier
        run: |
          buildifier -mode=fix $(find . -name 'BUILD*' -o -name 'WORKSPACE*' -o -name '*.bzl' -o -name '*.bazel' -type f)

      - name: Verify buildifier
        shell: bash
        run: |
          # From: https://backreference.org/2009/12/23/how-to-match-newlines-in-sed/
          # This is to leverage this workaround:
          # https://github.com/actions/toolkit/issues/193#issuecomment-605394935
          function urlencode() {
            sed ':begin;$!N;s/\n/%0A/;tbegin'
          }
          if [[ $(git diff-index --name-only HEAD --) ]]; then
              for x in $(git diff-index --name-only HEAD --); do
                echo "::error file=$x::Please run buildifier.%0A$(git diff $x | urlencode)"
              done
              echo "${{ github.repository }} is out of style. Please run buildifier."
              exit 1
          fi
          echo "${{ github.repository }} is formatted correctly."


================================================
FILE: .github/workflows/changelog-requirement.yml
================================================
name: Changelog Requirement

on:
  pull_request:
    types: [ opened, synchronize, labeled, unlabeled ]
    paths:
      - 'kong/**'
      - '**.rockspec'
      - '.requirements'
      - 'changelog/**'

jobs:
  require-changelog:
    if: ${{ !contains(github.event.*.labels.*.name, 'skip-changelog') }}
    name: Requires changelog
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 2

      - name: Find changelog files
        id: changelog-list
        uses: kong/changed-files@4edd678ac3f81e2dc578756871e4d00c19191daf
        with:
          files_yaml: |
            changelogs:
              - 'changelog/unreleased/**/*.yml'
            upper_case:
              - 'CHANGELOG/**'
            numbered:
              - 'changelog/unreleased/**/[0-9]+.yml'

      - name: Check changelog existence
        if: steps.changelog-list.outputs.changelogs_any_changed == 'false'
        run: |
          echo "Changelog file expected but found none. If you believe this PR requires no changelog entry, label it with \"skip-changelog\"."
          echo "Refer to https://github.com/Kong/gateway-changelog for format guidelines."
          exit 1

      - name: Check correct case for changelog directory
        if: steps.changelog-list.outputs.upper_case_any_changed == 'true'
        run: |
          echo "Please use \"changelog\" (all lowercase) for changelog modifications."
          echo "Refer to https://github.com/Kong/gateway-changelog for format guidelines."
          echo "Bad file(s): ${{ steps.changelog-list.outputs.upper_case_all_changed_files }}"
          exit 1

      - name: Check descriptive filename for changelog entry
        if: steps.changelog-list.outputs.numbered_any_changed == 'true'
        run: |
          echo "Please use short descriptive name for changelog files instead of numbers."
          echo "E.g. bump_openresty.yml instead of 12345.yml."
          echo "Refer to https://github.com/Kong/gateway-changelog for format guidelines."
          echo "Bad file(s): ${{ steps.changelog-list.outputs.numbered_all_changed_files }}"
          exit 1

      - name: Fail when deprecated YAML keys are used
        run: |
          for file in ${{ steps.changelog-list.outputs.changelogs_all_changed_files }}; do
            if grep -q "prs:" $file || grep -q "jiras:" $file; then
              echo "Please do not include \"prs\" or \"jiras\" keys in new changelogs, put the JIRA number inside commit message and PR description instead."
              echo "Refer to https://github.com/Kong/gateway-changelog for format guidelines."
              echo "Bad file: $file"
              exit 1
            fi
          done


================================================
FILE: .github/workflows/changelog-validation.yml
================================================
name: Changelog Validation

on:
  pull_request:
    types: [ opened, synchronize ]

jobs:
  validate-changelog:
    name: Validate changelog
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Validate changelogs
        uses: Kong/gateway-changelog@bc389e6bcc015b3560c4d1024a3782331602a0f6
        with:
          files: changelog/unreleased/*/*.yml


================================================
FILE: .github/workflows/cherry-picks-v2.yml
================================================
name: Cherry Pick to remote repository v2
on:
  pull_request:
    types: [closed, labeled]
  issue_comment:
    types: [created]
permissions:
  contents: write # so it can comment
  pull-requests: write # so it can create pull requests and labels
jobs:
  cross-repo-cherrypick:
    name: Cherry pick to remote repository
    runs-on: ubuntu-latest
    # Only run when pull request is merged, or labeled
    # or when a comment containing `/cherry-pick` is created
    # and the author is a member, collaborator or owner
    if: >
      github.ref == 'refs/heads/master' &&
      (
        github.event_name == 'pull_request' &&
        github.event.pull_request.merged
      ) || (
        github.event_name == 'issue_comment' &&
        github.event.issue.pull_request &&
        contains(fromJSON('["MEMBER", "COLLABORATOR", "OWNER"]'), github.event.comment.author_association) &&
        startsWith(github.event.comment.body, '/cherry-pick')
      )
    steps:
      - uses: actions/checkout@v4
        with:
          token: ${{ secrets.CHERRY_PICK_TOKEN }}
      - name: Create backport pull requests
        uses: jschmid1/cross-repo-cherrypick-action@9d2ead0043acba474373992c8175f2b8ffcdb31c #v1.2.0
        id: cherry_pick
        with:
          token: ${{ secrets.CHERRY_PICK_TOKEN }}
          pull_title: '[cherry-pick -> ${target_branch}] ${pull_title}'
          merge_commits: 'skip'
          trigger_label: 'cherry-pick kong-ee' # trigger based on this label
          pull_description: |-
            Automated cherry-pick to `${target_branch}`, triggered by a label in https://github.com/${owner}/${repo}/pull/${pull_number} :robot:.

            ## Original description

            ${pull_description}
          upstream_repo: 'kong/kong-ee'
          branch_map: |-
            {
              "master": "master"
            }
      - name: add label
        if: steps.cherry_pick.outputs.was_successful == 'false'
        uses: Kong/action-add-labels@81b0a07d6b2ec64d770be1ca94c31ec827418054
        with:
          labels: incomplete-cherry-pick


================================================
FILE: .github/workflows/community-stale.yml
================================================
name: Close inactive issues
on:
  schedule:
    - cron: "30 1 * * *"

jobs:
  close-issues:
    runs-on: ubuntu-latest
    permissions:
      issues: write
      pull-requests: write
    steps:
      - uses: actions/stale@v9
        with:
          days-before-stale: 14
          days-before-close: 7
          only-labels: "pending author feedback"
          exempt-pr-labels: "pinned,security"
          exempt-issue-labels: "pinned,security"
          stale-issue-label: "stale"
          stale-issue-message: "This issue is marked as stale because it has been open for 14 days with no activity."
          close-issue-message: |
            Dear contributor,
            
            We are automatically closing this issue because it has not seen any activity for three weeks.
            We're sorry that your issue could not be resolved.  If any new information comes up that could
            help resolving it, please feel free to reopen it.
            
            Your contribution is greatly appreciated!
            
            Please have a look
            [our pledge to the community](https://github.com/Kong/kong/blob/master/COMMUNITY_PLEDGE.md)
            for more information.
            
            Sincerely,
            Your Kong Gateway team
          stale-pr-message: "This PR is marked as stale because it has been open for 14 days with no activity."
          close-pr-message: |
            Dear contributor,
            
            We are automatically closing this pull request because it has not seen any activity for three weeks.
            We're sorry that we could not merge it.  If you still want to pursure your patch, please feel free to 
            reopen it and address any remaining issues.
            
            Your contribution is greatly appreciated!
            
            Please have a look
            [our pledge to the community](https://github.com/Kong/kong/blob/master/COMMUNITY_PLEDGE.md)
            for more information.
            
            Sincerely,
            Your Kong Gateway team
          repo-token: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/copyright-check.yml
================================================
name: Detect Unexpected EE Changes

on:
  pull_request:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
  check-copyright-and-ee-files:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Find Enterprise Copyright
        shell: bash
        run: |
          set -e

          workflow_file=$(grep -rnl "^name:[[:space:]]*Detect Unexpected EE Changes" .github/workflows/*.yml | head -n1)
          echo "Detected workflow file: $workflow_file"

          all_files=$(grep -r -F -l "This software is copyright Kong Inc. and its licensors." .)

          # ignore this file
          files=$(echo "$all_files" | grep -v "$workflow_file$" || true)


          if [ -n "$files" ]; then
            echo "Error: Enterprise copyright detected in the following files:"
            echo "$files"
            exit 1
          else
            echo "No enterprise copyright found."
          fi

      - name: Get changed EE files
        id: changed-ee-files
        uses: kong/changed-files@4edd678ac3f81e2dc578756871e4d00c19191daf
        with:
          files: |
            spec-ee/**
            plugins-ee/**
            kong/enterprise_edition/**
            kong/plugins/*-advanced/**
            changelog/**/*-ee/**
    
      - name: Detect EE files
        if: steps.changed-ee-files.outputs.any_changed == 'true'
        run: |
          echo "The following unexpected EE files were detected:"
          echo "${{ steps.changed-ee-files.outputs.all_changed_files }}"
          exit 1


================================================
FILE: .github/workflows/deck-integration.yml
================================================
name: Gateway decK Integration Tests

on:
  pull_request:
    paths:
    - 'kong/db/schema/**/*.lua'
    - 'kong/**/schema.lua'
    - 'kong/plugins/**/daos.lua'
    - 'kong/db/dao/*.lua'
    - 'kong/api/**/*.lua'
    - '.github/workflows/deck-integration.yml'

permissions:
  pull-requests: write

env:
  LIBRARY_PREFIX: /usr/local/kong
  TEST_RESULTS_XML_OUTPUT: test-results
  BUILD_ROOT: ${{ github.workspace }}/bazel-bin/build

# cancel previous runs if new commits are pushed to the PR
concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

jobs:
  build:
    uses: ./.github/workflows/build.yml
    with:
      relative-build-root: bazel-bin/build

  deck-integration:
    name: Gateway decK integration tests
    runs-on: ubuntu-22.04
    needs: build
    timeout-minutes: 5

    services:
      postgres:
        image: postgres:13
        env:
          POSTGRES_USER: kong
          POSTGRES_DB: kong
          POSTGRES_HOST_AUTH_METHOD: trust
        ports:
          - 5432:5432
        options: --health-cmd pg_isready --health-interval 5s --health-timeout 5s --health-retries 8

    steps:
      - name: Install packages
        run: sudo apt update && sudo apt install -y libyaml-dev valgrind libprotobuf-dev libpam-dev postgresql-client jq

      - name: Checkout Kong source code
        uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: Lookup build cache
        id: cache-deps
        uses: actions/cache@v4
        with:
          path: ${{ env.BUILD_ROOT }}
          key: ${{ needs.build.outputs.cache-key }}

      - name: Install Kong dev
        run: make dev

      - name: Tests
        id: deck_tests
        env:
          KONG_TEST_PG_DATABASE: kong
          KONG_TEST_PG_USER: kong
          KONG_TEST_DATABASE: postgres
        run: |
          mkdir $TEST_RESULTS_XML_OUTPUT
          source ${{ env.BUILD_ROOT }}/kong-dev-venv.sh
          bin/busted spec/06-third-party/01-deck -o hjtest -Xoutput $(realpath $TEST_RESULTS_XML_OUTPUT)/report.xml -v


================================================
FILE: .github/workflows/label-check.yml
================================================
name: Pull Request Label Checker
on:
  pull_request:
    types: [opened, edited, synchronize, labeled, unlabeled]
jobs:
  check-labels:
    name: prevent merge labels
    runs-on: ubuntu-latest

    steps:
    - name: backport master label found
      run: echo "Please do not backport into master, instead, create a PR targeting master and backport from it instead."; exit 1
      if: ${{ contains(github.event.*.labels.*.name, 'backport master') }}


================================================
FILE: .github/workflows/label-community-pr.yml
================================================
name: Label community PRs

on:
  schedule:
    - cron: '*/30 * * * *'

permissions:
  pull-requests: write

jobs:
  check_author:
    runs-on: ubuntu-latest
    defaults:
      run:
        shell: bash
    steps:
      - uses: actions/checkout@v4
      - name: Label Community PR
        env:
          GH_TOKEN: ${{ secrets.COMMUNITY_PRS_TOKEN }}
          LABEL: "author/community"
          BOTS: "team-gateway-bot app/dependabot"
        run: |
          set +e
          for id in `gh pr list -S 'draft:false' -s 'open'|awk '{print $1}'`
          do
            name=`gh pr view $id --json author -q '.author.login'`
            ret=`gh api orgs/Kong/members --paginate -q '.[].login'|grep "^${name}$"`
            if [[ -z $ret && ! "${BOTS[@]}" =~ $name ]]; then
              gh pr edit $id --add-label "${{ env.LABEL }}"
            else
              gh pr edit $id --remove-label "${{ env.LABEL }}"
            fi
          done


================================================
FILE: .github/workflows/label-schema.yml
================================================
name: Pull Request Schema Labeler
on:
  pull_request:
    types: [opened, edited, labeled, unlabeled]
jobs:
  schema-change-labels:
    if: "${{ contains(github.event.*.labels.*.name, 'schema-change-noteworthy') }}"
    runs-on: ubuntu-latest
    steps:
    - name: Schema change label found
      uses: Kong/action-slack-notify@bd750854aaf93c5c6f69799bf813c40e7786368a # v2_node20
      continue-on-error: true
      env:
        SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_SCHEMA_CHANGE }}
        SLACK_MESSAGE: ${{ github.event.pull_request.title }}
        SLACK_FOOTER: "<${{ github.server_url }}/${{ github.repository }}/pull/${{ github.event.pull_request.number }}>"


================================================
FILE: .github/workflows/labeler-v2.yml
================================================
name: "Pull Request Labeler v2"
on:
- pull_request

jobs:
  labeler:
    if: ${{ !github.event.pull_request.head.repo.fork }}
    permissions:
      contents: read
      pull-requests: write
    runs-on: ubuntu-latest
    steps:
    - uses: actions/labeler@v5


================================================
FILE: .github/workflows/openresty-patches-companion.yml
================================================
name: Openresty patches review companion
on:
  pull_request:
    paths:
    - 'build/openresty/patches/**'

jobs:
  create-pr:
    runs-on: ubuntu-latest
    steps:
      - name: Dispatch the workflow
        if: ${{ github.repository_owner == 'Kong' }}
        uses: benc-uk/workflow-dispatch@25b02cc069be46d637e8fe2f1e8484008e9e9609 # v1
        with:
          workflow: create-pr.yml
          repo: kong/openresty-patches-review
          ref: master
          token: ${{ secrets.PAT }}
          inputs: |
            {"pr-branch":"${{ github.event.pull_request.head.repo.owner.login }}:${{ github.head_ref }}", "pr-base":"${{ github.base_ref }}", "ee":${{ contains(github.repository, 'kong-ee') && 'true' || 'false' }}, "pr-id":"${{ github.event.pull_request.number }}"}



================================================
FILE: .github/workflows/perf.yml
================================================
name: Performance Test

on:
  pull_request:
  schedule:
  # don't know the timezone but it's daily at least
  - cron:  '0 7 * * *'

env:
  terraform_version: '1.2.4'
  HAS_ACCESS_TO_GITHUB_TOKEN: ${{ github.event_name != 'pull_request' || (github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]') }}
  BUILD_ROOT: ${{ github.workspace }}/bazel-bin/build

  # only for pr
  GHA_CACHE: ${{ github.event_name == 'pull_request' }}

jobs:
  build-packages:
    name: Build dependencies
    runs-on: ubuntu-22.04
    if: |
      github.event_name == 'schedule' ||
      (github.event_name == 'pull_request' && startsWith(github.event.pull_request.title, 'perf(')) ||
      (github.event_name == 'issue_comment' && github.event.action == 'created' &&
        github.event.issue.pull_request &&
        contains('["OWNER", "COLLABORATOR", "MEMBER"]', github.event.comment.author_association) &&
        (startsWith(github.event.comment.body, '/perf') || startsWith(github.event.comment.body, '/flamegraph'))
      )

    outputs:
      cache-key: ${{ steps.cache-key.outputs.cache-key }}

    steps:
    - name: Checkout Kong source code
      uses: actions/checkout@v4

    - name: Generate cache key
      id: cache-key
      uses: ./.github/actions/build-cache-key
      with:
        prefix: perf

    - name: Lookup build cache
      id: cache-deps
      uses: actions/cache@v4
      with:
        path: ${{ env.BUILD_ROOT }}
        key: ${{ steps.cache-key.outputs.cache-key }}

    - name: Install packages
      if: steps.cache-deps.outputs.cache-hit != 'true'
      run: sudo apt update && sudo apt install libyaml-dev valgrind libprotobuf-dev

    - name: Build Kong
      if: steps.cache-deps.outputs.cache-hit != 'true'
      env:
        GH_TOKEN: ${{ github.token }}
      run: |
        make build-kong
        BUILD_PREFIX=$BUILD_ROOT/kong-dev
        export PATH="$BUILD_PREFIX/bin:$BUILD_PREFIX/openresty/nginx/sbin:$BUILD_PREFIX/openresty/bin:$PATH"
        chmod +rw -R $BUILD_PREFIX
        nginx -V
        ldd $(which nginx)
        luarocks

    - name: Bazel Outputs
      uses: actions/upload-artifact@v4
      if: failure()
      with:
        name: bazel-outputs
        path: |
          bazel-out/_tmp/actions
        retention-days: 3

    - name: Build Dev Kong dependencies
      if: steps.cache-deps.outputs.cache-hit != 'true'
      run: |
        make install-dev-rocks

  perf:
    name: RPS, latency and flamegraphs
    runs-on: ubuntu-22.04
    needs: build-packages

    permissions:
      # required to send comment of graphs and results in the PR
      pull-requests: write

    if: |
      github.event_name == 'schedule' ||
      (github.event_name == 'pull_request' && startsWith(github.event.pull_request.title, 'perf(')) ||
      (github.event_name == 'issue_comment' && github.event.action == 'created' &&
        github.event.issue.pull_request &&
        contains('["OWNER", "COLLABORATOR", "MEMBER"]', github.event.comment.author_association) &&
        (startsWith(github.event.comment.body, '/perf') || startsWith(github.event.comment.body, '/flamegraph'))
      )

    # perf test can only run one at a time per repo for now
    concurrency:
      group: perf-ce

    steps:
    # set up mutex across CE and EE to avoid resource race
    - name: Set up mutex
      uses: ben-z/gh-action-mutex@9709ba4d8596ad4f9f8bbe8e0f626ae249b1b3ac # v1.0-alpha-6
      with:
        repository: "Kong/kong-perf-mutex-lock"
        branch: "gh-mutex"
        repo-token: ${{ secrets.PAT }}

    - name: Checkout Kong source code
      uses: actions/checkout@v4
      with:
        # Fetch all history for all tags and branches
        fetch-depth: 0

    - name: Load Cached Packages
      id: cache-deps
      if: env.GHA_CACHE == 'true'
      uses: actions/cache@v4
      with:
        path: ${{ env.BUILD_ROOT }}
        key: ${{ needs.build-packages.outputs.cache-key }}

    - name: Install performance test Dependencies
      run: |
        # in Kong repository
        sudo apt update && sudo apt install inkscape -y

        # terraform!
        wget https://releases.hashicorp.com/terraform/${{ env.terraform_version }}/terraform_${{ env.terraform_version }}_linux_amd64.zip
        unzip terraform_${{ env.terraform_version }}_linux_amd64.zip
        sudo mv terraform /usr/bin/

    - name: Choose perf suites
      id: choose_perf
      env:
        COMMENT_BODY: ${{ github.event.comment.body }}
      run: |
        suites="$(printf '%s' "$COMMENT_BODY" | awk '{print $1}')"
        tags="$(printf '%s' "$COMMENT_BODY" | awk '{print $2}')"

        if [[ $suite == "/flamegraph" ]]; then
          suites="02-flamegraph"
          if [[ -z $tags ]]; then
            tags="simple"
          fi
        elif [[ $suite == "/perf" ]]; then
          suites="01-rps"
          if [[ -z $tags ]]; then
            tags="baseline,single_route"
          fi
        else
          # if not specified by comment, run both
          suites="01-rps 02-flamegraph"
          if [[ -z $tags ]]; then
            tags="baseline,single_route,simple"
          fi
        fi

        echo "suites=$suites" >> $GITHUB_OUTPUT
        echo "tags=$tags" >> $GITHUB_OUTPUT

    - uses: xt0rted/pull-request-comment-branch@d97294d304604fa98a2600a6e2f916a84b596dc7 # v1.4.1
      id: comment-branch
      if: github.event_name == 'issue_comment' && github.event.action == 'created'

    - name: Find compared versions
      id: compare_versions
      env:
        PR_BASE_REF: ${{ github.event.pull_request.base.ref }}
        COMMENT_BODY: ${{ github.event.comment.body }}
      run: |
        pr_ref=$(echo "$PR_BASE_REF")
        custom_vers="$(printf '%s' "$COMMENT_BODY" | awk '{print $3}')"

        if [[ ! -z "${pr_ref}" ]]; then
          vers="git:${{ github.head_ref }},git:${pr_ref}"
        elif [[ ! -z "${custom_vers}" ]]; then
          vers="${custom_vers}"
        elif [[ ! -z "$COMMENT_BODY" ]]; then
          vers="git:${{ steps.comment-branch.outputs.head_ref}},git:${{ steps.comment-branch.outputs.base_ref}}"
        else # is cron job/on master
          vers="git:master,git:origin/master~10,git:origin/master~50"
        fi

        echo $vers

        echo "vers=$vers" >> $GITHUB_OUTPUT


    - name: Run Tests
      env:
        PERF_TEST_VERSIONS: ${{ steps.compare_versions.outputs.vers }}
        PERF_TEST_DRIVER: terraform
        PERF_TEST_TERRAFORM_PROVIDER: bring-your-own
        PERF_TEST_BYO_KONG_IP: ${{ secrets.PERF_TEST_BYO_KONG_IP }}
        PERF_TEST_BYO_WORKER_IP: ${{ secrets.PERF_TEST_BYO_WORKER_IP }}
        PERF_TEST_BYO_SSH_USER: gha
        PERF_TEST_USE_DAILY_IMAGE: true
        PERF_TEST_DISABLE_EXEC_OUTPUT: true
      timeout-minutes: 180
      run: |
        export PERF_TEST_BYO_SSH_KEY_PATH=$(pwd)/ssh_key
        echo "${{ secrets.PERF_TEST_BYO_SSH_KEY }}" > ${PERF_TEST_BYO_SSH_KEY_PATH}

        chmod 600 ${PERF_TEST_BYO_SSH_KEY_PATH}
        # setup tunnel for psql and admin port
        ssh -o StrictHostKeyChecking=no -o TCPKeepAlive=yes -o ServerAliveInterval=10 \
            -o ExitOnForwardFailure=yes -o ConnectTimeout=5 \
            -L 15432:localhost:5432 -L 39001:localhost:39001 \
            -i ${PERF_TEST_BYO_SSH_KEY_PATH} \
            ${PERF_TEST_BYO_SSH_USER}@${PERF_TEST_BYO_KONG_IP} tail -f /dev/null &
        sleep 5

        sudo iptables -t nat -I OUTPUT -p tcp --dport 5432  -d ${PERF_TEST_BYO_KONG_IP} -j DNAT --to 127.0.0.1:15432
        sudo iptables -t nat -I OUTPUT -p tcp --dport 39001 -d ${PERF_TEST_BYO_KONG_IP} -j DNAT --to 127.0.0.1:39001

        make dev # required to install other dependencies like bin/grpcurl
        source ${{ env.BUILD_ROOT }}/kong-dev-venv.sh
        for suite in ${{ steps.choose_perf.outputs.suites }}; do
          # Run each test individually, ngx.pipe doesn't like to be imported twice
          # maybe bin/busted --no-auto-insulate
          for f in $(find "spec/04-perf/$suite/" -type f); do
            bin/busted "$f" \
              -t "${{ steps.choose_perf.outputs.tags }}"
          done
        done

    - name: Teardown
      # Note: by default each job has if: ${{ success() }}
      if: always()
      env:
        PERF_TEST_VERSIONS: git:${{ github.sha }}
        PERF_TEST_DRIVER: terraform
        PERF_TEST_TERRAFORM_PROVIDER: bring-your-own
        PERF_TEST_BYO_KONG_IP: ${{ secrets.PERF_TEST_BYO_KONG_IP }}
        PERF_TEST_BYO_WORKER_IP: ${{ secrets.PERF_TEST_BYO_WORKER_IP }}
        PERF_TEST_BYO_SSH_USER: gha
        PERF_TEST_TEARDOWN_ALL: true
      run: |
        export PERF_TEST_BYO_SSH_KEY_PATH=$(pwd)/ssh_key
        echo "${{ secrets.PERF_TEST_BYO_SSH_KEY }}" > ${PERF_TEST_BYO_SSH_KEY_PATH}

        make dev # required to install other dependencies like bin/grpcurl
        source ${{ env.BUILD_ROOT }}/kong-dev-venv.sh
        bin/busted spec/04-perf/99-teardown/

        rm -f ${PERF_TEST_BYO_SSH_KEY_PATH}

    - name: Generate high DPI graphs
      if: always()
      run: |
        for i in $(ls output/*.svg); do
          inkscape --export-area-drawing --export-png="${i%.*}.png" --export-dpi=300 -b FFFFFF $i
        done

    - uses: actions/setup-python@v5
      with:
        python-version: '3.10'
        cache: 'pip'

    - name: Generate plots
      if: always()
      run: |
        cwd=$(pwd)
        cd spec/helpers/perf/charts/
        pip install -r requirements.txt
        for i in $(ls ${cwd}/output/*.data.json); do
          python ./charts.py $i -o "${cwd}/output/"
        done

    - name: Save results
      uses: actions/upload-artifact@v3
      if: always()
      with:
        name: perf-results
        path: |
          output/
          !output/**/*.log

        retention-days: 31

    - name: Save error logs
      uses: actions/upload-artifact@v3
      if: always()
      with:
        name: error_logs
        path: |
          output/**/*.log
        retention-days: 31

    - name: Output
      if: always()
      id: output
      run: |
        if [[ "${{ steps.choose_perf.outputs.suites }}" =~ "02-flamegraph" ]]; then
          result="Please see Github Actions artifacts for flamegraphs.

          "
        fi

        result="${result}$(cat output/result.txt)" || true

        # https://github.community/t/set-output-truncates-multiline-strings/16852/2
        result="${result//'%'/'%25'}"
        result="${result//$'\n'/'%0A'}"
        result="${result//$'\r'/'%0D'}"

        echo "result=$results" >> $GITHUB_OUTPUT

    - name: Upload charts
      if: always()
      id: charts
      uses: devicons/public-upload-to-imgur@352cf5f2805c692539a96cfe49a09669e6fca88e # v2.2.2
      continue-on-error: true
      with:
        path: output/*.png
        client_id: ${{ secrets.PERF_TEST_IMGUR_CLIENT_ID }}

    - name: Comment
      if: |
        github.event_name == 'pull_request' ||
        (github.event_name == 'issue_comment' && github.event.issue.pull_request)
      uses: actions-ecosystem/action-create-comment@e23bc59fbff7aac7f9044bd66c2dc0fe1286f80b # v1.0.0
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}
        body: |
          ## :rocket: Performance test result

          **Test Suite**: ${{ steps.choose_perf.outputs.suites }} (${{ steps.choose_perf.outputs.tags }})

          ${{ join(fromJSON(steps.charts.outputs.markdown_urls), '     ') }}

          <details><summary>Click to expand</summary>

          ```
          ${{ steps.output.outputs.result }}

          Kong error logs are also available in Github Actions artifacts.
          ```

          </details>

          [Download Artifacts](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}#artifacts) for detailed results and interactive SVG flamegraphs.


================================================
FILE: .github/workflows/release.yml
================================================
name: Package & Release

# The workflow to build and release official Kong packages and images.

on:  # yamllint disable-line rule:truthy
  pull_request:
    paths-ignore:
    - '**/*.md'
    - 'COPYRIGHT'
    - 'LICENSE'
    - '.github/workflows/build_and_test.yml'
    - 'changelog/**'
    - 'kong.conf.default'
  schedule:
  - cron:  '0 0 * * *'
  push:
    branches:
    - master
  workflow_dispatch:
    inputs:
      official:
        description: 'Official release?'
        required: true
        type: boolean
        default: false
      version:
        description: 'Release version, e.g. `3.0.0.0-beta.2`'
        required: true
        type: string

# `commit-ly` is a flag that indicates whether the build should be run per commit.

env:
  # official release repo
  DOCKER_ORGANIZATION: kong
  DOCKER_REPOSITORY: kong/kong
  PRERELEASE_DOCKER_REPOSITORY: kong/kong-dev
  FULL_RELEASE: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || github.actor == 'dependabot[bot]'}}

  # only for PR
  GHA_CACHE: ${{ github.event_name == 'pull_request' }}
  # PRs opened from fork and from dependabot don't have access to repo secrets
  HAS_ACCESS_TO_GITHUB_TOKEN: ${{ github.event_name != 'pull_request' || (github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]') }}


jobs:
  metadata:
    name: Metadata
    runs-on: ubuntu-24.04
    outputs:
      kong-version: ${{ steps.build-info.outputs.kong-version }}
      prerelease-docker-repository: ${{ env.PRERELEASE_DOCKER_REPOSITORY }}
      docker-repository: ${{ steps.build-info.outputs.docker-repository }}
      release-desc: ${{ steps.build-info.outputs.release-desc }}
      release-label: ${{ steps.build-info.outputs.release-label || '' }}
      deploy-environment: ${{ steps.build-info.outputs.deploy-environment }}
      matrix: ${{ steps.build-info.outputs.matrix }}
      arch: ${{ steps.build-info.outputs.arch }}
      # use github.event.pull_request.head.sha instead of github.sha on a PR, as github.sha on PR is the merged commit (temporary commit)
      commit-sha: ${{ github.event.pull_request.head.sha || github.sha }}

    steps:
    - uses: actions/checkout@v4
    - name: Build Info
      id: build-info
      run: |
        KONG_VERSION=$(bash scripts/grep-kong-version.sh)
        echo "kong-version=$KONG_VERSION" >> $GITHUB_OUTPUT

        if [ "${{ github.event_name == 'schedule' }}" == "true" ]; then
          echo "release-label=$(date -u +'%Y%m%d')" >> $GITHUB_OUTPUT
        fi

        matrix_file=".github/matrix-commitly.yml"
        if [ "$FULL_RELEASE" == "true" ]; then
          matrix_file=".github/matrix-full.yml"
        fi

        if [ "${{ github.event.inputs.official }}" == "true" ]; then
          release_desc="$KONG_VERSION (official)"
          echo "docker-repository=$DOCKER_REPOSITORY" >> $GITHUB_OUTPUT
          echo "deploy-environment=release" >> $GITHUB_OUTPUT
        else
          release_desc="$KONG_VERSION (pre-release)"
          echo "docker-repository=$PRERELEASE_DOCKER_REPOSITORY" >> $GITHUB_OUTPUT
        fi

        echo "release-desc=$release_desc" >> $GITHUB_OUTPUT

        echo "matrix=$(yq -I=0 -o=json $matrix_file)" >> $GITHUB_OUTPUT

        echo "docker-test-image=${{ env.PRERELEASE_DOCKER_REPOSITORY }}:${{ github.event.pull_request.head.sha || github.sha }}" >> $GITHUB_OUTPUT

        cat $GITHUB_OUTPUT

        echo "### :package: Building and packaging for $release_desc" >> $GITHUB_STEP_SUMMARY
        echo >> $GITHUB_STEP_SUMMARY
        echo '- event_name: ${{ github.event_name }}' >> $GITHUB_STEP_SUMMARY
        echo '- ref_name: ${{ github.ref_name }}' >> $GITHUB_STEP_SUMMARY
        echo '- inputs.version: ${{ github.event.inputs.version }}' >> $GITHUB_STEP_SUMMARY
        echo >> $GITHUB_STEP_SUMMARY
        echo '```' >> $GITHUB_STEP_SUMMARY
        cat $GITHUB_OUTPUT >> $GITHUB_STEP_SUMMARY
        echo '```' >> $GITHUB_STEP_SUMMARY

  build-packages:
    needs: metadata
    name: Build & Package - ${{ matrix.label }}
    environment: ${{ needs.metadata.outputs.deploy-environment }}

    strategy:
      fail-fast: false
      matrix:
        include: "${{ fromJSON(needs.metadata.outputs.matrix)['build-packages'] }}"

    runs-on: ubuntu-24.04
    container:
      image: ${{ matrix.image }}
      options: --privileged

    steps:
    - name: Early Rpm Setup
      if: matrix.package == 'rpm' && matrix.image != ''
      run: |
        # tar/gzip is needed to restore git cache (if available)
        yum install -y tar gzip which file zlib-devel

    - name: Early Deb in Container Setup
      if: matrix.package == 'deb' && matrix.image != ''
      run: |
        # tar/gzip is needed to restore git cache (if available)
        apt-get update
        apt-get install -y git tar gzip file sudo

    - name: Cache Git
      id: cache-git
      if: (matrix.package == 'rpm') && matrix.image != ''
      uses: actions/cache@v4
      with:
        path: /usr/local/git
        key: ${{ matrix.label }}-git-2.41.0

    # el-7,8, amazonlinux-2,2023 doesn't have git 2.18+, so we need to install it manually
    - name: Install newer Git
      if: (matrix.package == 'rpm') && matrix.image != '' && steps.cache-git.outputs.cache-hit != 'true'
      run: |
        if which apt 2>/dev/null; then
          apt update
          apt install -y wget libz-dev libssl-dev libcurl4-gnutls-dev libexpat1-dev gettext make gcc autoconf sudo
        else
          yum update -y
          yum groupinstall -y 'Development Tools'
          yum install -y wget zlib-devel openssl-devel curl-devel expat-devel gettext-devel perl-CPAN perl-devel
        fi
        wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.41.0.tar.gz
        tar xf git-2.41.0.tar.gz
        cd git-2.41.0

        make configure
        ./configure --prefix=/usr/local/git
        make -j$(nproc)
        make install

    - name: Add Git to PATH
      if: (matrix.package == 'rpm') && matrix.image != ''
      run: |
        echo "/usr/local/git/bin" >> $GITHUB_PATH

    - name: Checkout Kong source code
      uses: actions/checkout@v4

    - name: Swap git with https
      run: git config --global url."https://github".insteadOf git://github

    - name: Generate build cache key
      id: cache-key
      if: env.GHA_CACHE == 'true'
      uses: ./.github/actions/build-cache-key
      with:
        prefix: ${{ matrix.label }}-build
        extra: |
          ${{ hashFiles('kong/**') }}

    - name: Cache Packages
      id: cache-deps
      if: env.GHA_CACHE == 'true'
      uses: actions/cache@v4
      with:
        path: bazel-bin/pkg
        key: ${{ steps.cache-key.outputs.cache-key }}

    - name: Set .requirements into environment variables
      run: |
        grep -v '^#' .requirements >> $GITHUB_ENV

    - name: Setup Bazel
      uses: bazel-contrib/setup-bazel@e403ad507104847c3539436f64a9e9eecc73eeec #0.8.5
      with:
        bazelisk-version: "1.20.0"
        # Avoid downloading Bazel every time.
        bazelisk-cache: true
       
    - name: Install Deb Dependencies
      if: matrix.package == 'deb' && steps.cache-deps.outputs.cache-hit != 'true'
      run: |
        sudo apt-get update && sudo DEBIAN_FRONTEND=noninteractive apt-get install -y \
                automake \
                build-essential \
                curl \
                file \
                libyaml-dev \
                m4 \
                perl \
                pkg-config \
                unzip \
                zlib1g-dev

    - name: Install Ubuntu Cross Build Dependencies (arm64)
      if: matrix.package == 'deb' && steps.cache-deps.outputs.cache-hit != 'true' && endsWith(matrix.label, 'arm64')
      run: |
        sudo apt-get install crossbuild-essential-arm64 -y

    - name: Install Rpm Dependencies
      if: matrix.package == 'rpm' && matrix.image != ''
      run: |
        yum groupinstall -y 'Development Tools'
        dnf install -y 'dnf-command(config-manager)'
        dnf config-manager --set-enabled powertools || true # enable devel packages on rockylinux:8
        dnf config-manager --set-enabled crb || true # enable devel packages on rockylinux:9
        yum install -y libyaml-devel
        yum install -y cpanminus || (yum install -y perl && curl -L https://raw.githubusercontent.com/miyagawa/cpanminus/master/cpanm | perl - App::cpanminus) # amazonlinux2023 removed cpanminus
        # required for openssl 3.x config
        cpanm IPC/Cmd.pm

    - name: Build Kong dependencies
      if: steps.cache-deps.outputs.cache-hit != 'true'
      env:
        GH_TOKEN: ${{ github.token }}
      run: |
        bazel build --config release //build:kong --verbose_failures ${{ matrix.bazel-args }}

    - name: Package Kong - ${{ matrix.package }}
      if: matrix.package != 'rpm' && steps.cache-deps.outputs.cache-hit != 'true'
      run: |
        bazel build --config release :kong_${{ matrix.package }} --verbose_failures ${{ matrix.bazel-args }}

    - name: Package Kong - rpm
      if: matrix.package == 'rpm' && steps.cache-deps.outputs.cache-hit != 'true'
      env:
        RELEASE_SIGNING_GPG_KEY: ${{ secrets.RELEASE_SIGNING_GPG_KEY }}
        NFPM_RPM_PASSPHRASE: ${{ secrets.RELEASE_SIGNING_GPG_KEY_PASSPHRASE }}
      run: |
        if [ -n "${RELEASE_SIGNING_GPG_KEY:-}" ]; then
          RPM_SIGNING_KEY_FILE=$(mktemp)
          echo "$RELEASE_SIGNING_GPG_KEY" > $RPM_SIGNING_KEY_FILE
          export RPM_SIGNING_KEY_FILE=$RPM_SIGNING_KEY_FILE
        fi

        bazel build --config release :kong_${{ matrix.package-type }} --action_env=RPM_SIGNING_KEY_FILE --action_env=NFPM_RPM_PASSPHRASE ${{ matrix.bazel-args }}

    - name: Bazel Debug Outputs
      if: failure()
      run: |
        cat bazel-out/_tmp/actions/stderr-*
        sudo dmesg || true
        tail -n500 bazel-out/**/*/CMake.log || true

    - name: Upload artifacts
      uses: actions/upload-artifact@v4
      with:
        name: ${{ matrix.label }}-packages
        path: bazel-bin/pkg
        retention-days: 3

  verify-manifest-packages:
    needs: [metadata, build-packages]
    name: Verify Manifest - Package ${{ matrix.label }}
    runs-on: ubuntu-24.04

    strategy:
      fail-fast: false
      matrix:
        include: "${{ fromJSON(needs.metadata.outputs.matrix)['build-packages'] }}"

    steps:
    - uses: actions/checkout@v4

    - name: Download artifact
      uses: actions/download-artifact@v4
      with:
        name: ${{ matrix.label }}-packages
        path: bazel-bin/pkg

    - name: Install Python
      uses: actions/setup-python@v5
      with:
        python-version: '3.11'
        cache: 'pip' # caching pip dependencies

    - name: Verify
      run: |
        cd scripts/explain_manifest
        pip install -r requirements.txt
        pkg=$(ls ../../bazel-bin/pkg/kong* |head -n1)
        python ./main.py -f filelist.txt -p $pkg -o test.txt -s ${{ matrix.check-manifest-suite }}

  build-images:
    name: Build Images - ${{ matrix.label }}
    needs: [metadata, build-packages]
    runs-on: ubuntu-24.04

    permissions:
      # create comments on commits for docker images needs the `write` permission
      contents: write

    strategy:
      fail-fast: false
      matrix:
        include: "${{ fromJSON(needs.metadata.outputs.matrix)['build-images'] }}"

    steps:
    - uses: actions/checkout@v4

    - name: Download artifact
      uses: actions/download-artifact@v4
      with:
        name: ${{ matrix.artifact-from }}-packages
        path: bazel-bin/pkg

    - name: Download artifact (alt)
      if: matrix.artifact-from-alt != ''
      uses: actions/download-artifact@v4
      with:
        name: ${{ matrix.artifact-from-alt }}-packages
        path: bazel-bin/pkg

    - name: Login to Docker Hub
      if: ${{ env.HAS_ACCESS_TO_GITHUB_TOKEN == 'true' }}
      uses: docker/login-action@e92390c5fb421da1463c202d546fed0ec5c39f20 # v2.1.0
      with:
        username: ${{ env.DOCKER_ORGANIZATION }}
        password: ${{ secrets.DOCKER_OAT_PUSH }}

    - name: Docker meta
      id: meta
      uses: docker/metadata-action@369eb591f429131d6889c46b94e711f089e6ca96 # v5
      env:
        DOCKER_METADATA_PR_HEAD_SHA: true
      with:
        images: ${{ needs.metadata.outputs.prerelease-docker-repository }}
        tags: |
          type=raw,${{ needs.metadata.outputs.commit-sha }}-${{ matrix.label }}
          type=raw,enable=${{ matrix.label == 'ubuntu' }},${{ needs.metadata.outputs.commit-sha }}

    - name: Set up QEMU
      if: matrix.docker-platforms != ''
      uses: docker/setup-qemu-action@53851d14592bedcffcf25ea515637cff71ef929a # v3

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3

    - name: Set platforms
      id: docker_platforms_arg
      run: |
        platforms="${{ matrix.docker-platforms }}"
        if [[ -z "$platforms" ]]; then
          platforms="linux/amd64"
        fi

        echo "platforms=$platforms"
        echo "platforms=$platforms" >> $GITHUB_OUTPUT

    - name: Set rpm platform
      id: docker_rpm_platform_arg
      if: matrix.package == 'rpm'
      run: |
        rpm_platform="${{ matrix.rpm_platform }}"
        if [[ -z "$rpm_platform" ]]; then
          rpm_platform="el9"
        fi

        echo "rpm_platform=$rpm_platform"
        echo "rpm_platform=$rpm_platform" >> $GITHUB_OUTPUT

    - name: Build Docker Image
      uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5
      with:
        file: build/dockerfiles/${{ matrix.package }}.Dockerfile
        context: .
        push: ${{ env.HAS_ACCESS_TO_GITHUB_TOKEN == 'true' }}
        tags: ${{ steps.meta.outputs.tags }}
        labels: ${{ steps.meta.outputs.labels }}
        platforms: ${{ steps.docker_platforms_arg.outputs.platforms }}
        build-args: |
          KONG_BASE_IMAGE=${{ matrix.base-image }}
          KONG_ARTIFACT_PATH=bazel-bin/pkg
          KONG_VERSION=${{ needs.metadata.outputs.kong-version }}
          RPM_PLATFORM=${{ steps.docker_rpm_platform_arg.outputs.rpm_platform }}
          EE_PORTS=8002 8445 8003 8446 8004 8447

    - name: Comment on commit
      if: github.event_name == 'push' && matrix.label == 'ubuntu'
      uses: peter-evans/commit-comment@5a6f8285b8f2e8376e41fe1b563db48e6cf78c09 # v3.0.0
      with:
        token: ${{ secrets.GITHUB_TOKEN }}
        body: |
          ### Bazel Build
          Docker image available `${{ needs.metadata.outputs.prerelease-docker-repository }}:${{ needs.metadata.outputs.commit-sha }}`
          Artifacts available https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}

  verify-manifest-images:
    needs: [metadata, build-images]
    name: Verify Manifest - Image ${{ matrix.label }}
    runs-on: ubuntu-24.04
    if: github.event_name != 'pull_request' || (github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]')

    strategy:
      fail-fast: false
      matrix:
        include: "${{ fromJSON(needs.metadata.outputs.matrix)['build-images'] }}"

    steps:
    - uses: actions/checkout@v4

    - name: Install Python
      uses: actions/setup-python@v5
      with:
        python-version: '3.11'
        cache: 'pip' # caching pip dependencies

    - name: Verify
      run: |
        cd scripts/explain_manifest
        # docker image verify requires sudo to set correct permissions, so we
        # also install deps for root
        sudo -E pip install -r requirements.txt
        IMAGE=${{ env.PRERELEASE_DOCKER_REPOSITORY }}:${{ needs.metadata.outputs.commit-sha }}-${{ matrix.label }}

        sudo -E python ./main.py --image $IMAGE -f docker_image_filelist.txt -s docker-image

        if [[ ! -z "${{ matrix.docker-platforms }}" ]]; then
          DOCKER_DEFAULT_PLATFORM=linux/arm64 sudo -E python ./main.py --image $IMAGE -f docker_image_filelist.txt -s docker-image
        fi

  scan-images:
    name: Scan Images - ${{ matrix.label }}
    needs: [metadata, build-images]
    runs-on: ubuntu-24.04
    timeout-minutes: ${{ fromJSON(vars.GHA_DEFAULT_TIMEOUT) }}
    if: |-
      always()
      && vars.DISABLE_SCA_SCAN == 'false'
      && fromJSON(needs.metadata.outputs.matrix)['scan-vulnerabilities'] != ''
      && needs.build-images.result == 'success'
      && (github.event_name != 'pull_request' || (github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]'))
    strategy:
      fail-fast: false
      matrix:
        include: "${{ fromJSON(needs.metadata.outputs.matrix)['scan-vulnerabilities'] }}"
    env:
      IMAGE: ${{ needs.metadata.outputs.prerelease-docker-repository }}:${{ needs.metadata.outputs.commit-sha }}-${{ matrix.label }}
    steps:
    - name: Install regctl
      uses: regclient/actions/regctl-installer@ce5fd131e371ffcdd7508b478cb223b3511a9183

    - name: Login to Docker Hub
      if: ${{ env.HAS_ACCESS_TO_GITHUB_TOKEN }}
      uses: docker/login-action@e92390c5fb421da1463c202d546fed0ec5c39f20 # v2.1.0
      with:
        username: ${{ env.DOCKER_ORGANIZATION }}
        password: ${{ secrets.DOCKER_OAT_PUSH }}

    # TODO: Refactor matrix file to support and parse platforms specific to distro
    # Workaround: Look for specific amd64 and arm64  hardcooded architectures
    - name: Parse Architecture Specific Image Manifest Digests
      id: image_manifest_metadata
      run: |
        manifest_list_exists="$(
          if regctl manifest get "${IMAGE}" --format raw-body --require-list -v panic &> /dev/null; then
            echo true
          else
            echo false
          fi
        )"
        echo "manifest_list_exists=$manifest_list_exists"
        echo "manifest_list_exists=$manifest_list_exists" >> $GITHUB_OUTPUT

        amd64_sha="$(regctl image digest "${IMAGE}" --platform linux/amd64 || echo '')"
        arm64_sha="$(regctl image digest "${IMAGE}" --platform linux/arm64 || echo '')"
        echo "amd64_sha=$amd64_sha"
        echo "amd64_sha=$amd64_sha" >> $GITHUB_OUTPUT
        echo "arm64_sha=$arm64_sha"
        echo "arm64_sha=$arm64_sha" >> $GITHUB_OUTPUT

    - name: Scan AMD64 Image digest
      id: sbom_action_amd64
      if: steps.image_manifest_metadata.outputs.amd64_sha != ''
      uses: Kong/public-shared-actions/security-actions/scan-docker-image@a5b1cfac7d55d8cf9390456a1e6799425e28840d # v4.0.1
      with:
        asset_prefix: kong-${{ needs.metadata.outputs.commit-sha }}-${{ matrix.label }}-linux-amd64
        image: ${{ needs.metadata.outputs.prerelease-docker-repository }}:${{ needs.metadata.outputs.commit-sha }}-${{ matrix.label }}
        skip_cis_scan: true # FIXME

    - name: Scan ARM64 Image digest
      if: steps.image_manifest_metadata.outputs.manifest_list_exists == 'true' && steps.image_manifest_metadata.outputs.arm64_sha != ''
      id: sbom_action_arm64
      uses: Kong/public-shared-actions/security-actions/scan-docker-image@a5b1cfac7d55d8cf9390456a1e6799425e28840d # v4.0.1
      with:
        asset_prefix: kong-${{ needs.metadata.outputs.commit-sha }}-${{ matrix.label }}-linux-arm64
        image: ${{ needs.metadata.outputs.prerelease-docker-repository }}:${{ needs.metadata.outputs.commit-sha }}-${{ matrix.label }}
        skip_cis_scan: true # FIXME

  release-packages:
    name: Release Packages - ${{ matrix.label }} - ${{ needs.metadata.outputs.release-desc }}
    needs: [metadata, build-packages, build-images]
    runs-on: ubuntu-24.04
    if: fromJSON(needs.metadata.outputs.matrix)['release-packages'] != ''
    timeout-minutes: 5 # PULP takes a while to publish
    environment: release

    strategy:
      # limit to 3 jobs at a time
      max-parallel: 3
      fail-fast: false
      matrix:
        include: "${{ fromJSON(needs.metadata.outputs.matrix)['release-packages'] }}"

    steps:
    - uses: actions/checkout@v4

    - name: Download artifact
      uses: actions/download-artifact@v4
      with:
        name: ${{ matrix.artifact-from }}-packages
        path: bazel-bin/pkg

    - name: Set package architecture
      id: pkg-arch
      run: |
        arch='amd64'
        if [[ '${{ matrix.label }}' == *'arm64' ]]; then
          arch='arm64'
        fi
        echo "arch=$arch"
        echo "arch=$arch" >> $GITHUB_OUTPUT

    - name: Upload Packages
      env:
        ARCHITECTURE: ${{ steps.pkg-arch.outputs.arch }}
        OFFICIAL_RELEASE: ${{ github.event.inputs.official }}
        ARTIFACT_VERSION: ${{ matrix.artifact-version }}
        ARTIFACT_TYPE: ${{ matrix.artifact-type }}
        ARTIFACT: ${{ matrix.artifact }}
        INPUT_VERSION: ${{ github.event.inputs.version }}
        PACKAGE_TYPE: ${{ matrix.package }}
        KONG_RELEASE_LABEL: ${{ needs.metadata.outputs.release-label }}
        VERBOSE: ${{ runner.debug == '1' && '1' || '' }}
        CLOUDSMITH_API_KEY: ${{ secrets.CLOUDSMITH_API_KEY }}
        CLOUDSMITH_DRY_RUN: ''
        IGNORE_CLOUDSMITH_FAILURES: ${{ vars.IGNORE_CLOUDSMITH_FAILURES }}
        USE_CLOUDSMITH: ${{ vars.USE_CLOUDSMITH }}
      run: |
        sha256sum bazel-bin/pkg/*

        # set the version input as tags passed to release-scripts
        # note: release-scripts rejects user tags if missing internal flag
        #
        # this can be a comma-sepratated list of tags to apply
        if [[ "$OFFICIAL_RELEASE" == 'false' ]]; then
          if echo "$INPUT_VERSION" | grep -qs -E 'rc|alpha|beta|nightly'; then
            PACKAGE_TAGS="$INPUT_VERSION"
            export PACKAGE_TAGS
          fi
        fi

        scripts/release-kong.sh

  release-images:
    name: Release Images - ${{ matrix.label }} - ${{ needs.metadata.outputs.release-desc }}
    needs: [metadata, build-images]
    runs-on: ubuntu-24.04
    if: fromJSON(needs.metadata.outputs.matrix)['release-images'] != ''

    strategy:
      # limit to 3 jobs at a time
      max-parallel: 3
      fail-fast: false
      matrix:
        include: "${{ fromJSON(needs.metadata.outputs.matrix)['release-images'] }}"

    steps:
    - name: Login to Docker Hub
      if: ${{ env.HAS_ACCESS_TO_GITHUB_TOKEN == 'true' }}
      uses: docker/login-action@e92390c5fb421da1463c202d546fed0ec5c39f20 # v2.1.0
      with:
        username: ${{ env.DOCKER_ORGANIZATION }}
        password: ${{ secrets.DOCKER_OAT_PUSH }}

    - uses: actions/checkout@v4

    - name: Get latest commit SHA on master
      run: |
        echo "latest_sha=$(git ls-remote origin -h refs/heads/master | cut -f1)" >> $GITHUB_ENV

    - name: Docker meta
      id: meta
      uses: docker/metadata-action@369eb591f429131d6889c46b94e711f089e6ca96 # v5
      with:
        images: ${{ needs.metadata.outputs.docker-repository }}
        sep-tags: " "
        tags: |
          type=raw,value=latest,enable=${{ matrix.label == 'ubuntu' && github.ref_name == 'master' && env.latest_sha == needs.metadata.outputs.commit-sha }}
          type=match,enable=${{ github.event_name == 'workflow_dispatch' }},pattern=^\d+\.\d+,value=${{ github.event.inputs.version }}
          type=match,enable=${{ github.event_name == 'workflow_dispatch' && matrix.label == 'ubuntu' }},pattern=^\d+\.\d+,value=${{ github.event.inputs.version }},suffix=
          type=raw,enable=${{ github.event_name == 'workflow_dispatch' }},${{ github.event.inputs.version }}
          type=raw,enable=${{ github.event_name == 'workflow_dispatch' && matrix.label == 'ubuntu' }},${{ github.event.inputs.version }},suffix=
          type=ref,event=branch
          type=ref,enable=${{ matrix.label == 'ubuntu' }},event=branch,suffix=
          type=ref,event=tag
          type=ref,enable=${{ matrix.label == 'ubuntu' }},event=tag,suffix=
          type=ref,event=pr
          type=schedule,pattern=nightly
          type=schedule,enable=${{ matrix.label == 'ubuntu' }},pattern=nightly,suffix=
          type=schedule,pattern={{date 'YYYYMMDD'}}
          type=schedule,enable=${{ matrix.label == 'ubuntu' }},pattern={{date 'YYYYMMDD'}},suffix=
        flavor: |
          latest=false
          suffix=-${{ matrix.label }}

    - name: Install regctl
      uses: regclient/actions/regctl-installer@b6614f5f56245066b533343a85f4109bdc38c8cc

    - name: Push Images
      if: ${{ env.HAS_ACCESS_TO_GITHUB_TOKEN == 'true' }}
      env:
        TAGS: "${{ steps.meta.outputs.tags }}"
      run: |
        PRERELEASE_IMAGE=${{ env.PRERELEASE_DOCKER_REPOSITORY }}:${{ needs.metadata.outputs.commit-sha }}-${{ matrix.label }}
        docker pull $PRERELEASE_IMAGE
        for tag in $TAGS; do
          regctl -v debug image copy $PRERELEASE_IMAGE $tag
        done


================================================
FILE: .github/workflows/update-ngx-wasm-module.yml
================================================
name: Update ngx_wasm_module dependency

on:
  workflow_dispatch:
  schedule:
  # run weekly
  - cron: '0 0 * * 0'

jobs:
  update:
    runs-on: ubuntu-22.04

    permissions:
      # required to create a branch and push commits
      contents: write
      # required to open a PR for updates
      pull-requests: write

    steps:
    - name: Checkout Kong source code
      uses: actions/checkout@v4
      with:
        ref: master

    - name: Detect current version of NGX_WASM_MODULE in .requirements
      id: check-kong
      run: |
        SHA=$(sed -nre 's/^NGX_WASM_MODULE=([^ ]+) .*/\1/p' < .requirements)
        echo "sha=$SHA" | tee -a "$GITHUB_OUTPUT"

    - name: Check Kong/ngx_wasm_module HEAD
      id: check-repo
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        SHA=$(gh api repos/Kong/ngx_wasm_module/commits/main --jq '.sha')
        echo "sha=$SHA" | tee -a "$GITHUB_OUTPUT"

    - name: Update .requirements and create a pull request
      if: steps.check-kong.outputs.sha != steps.check-repo.outputs.sha
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        FROM: ${{ steps.check-kong.outputs.sha }}
        TO: ${{ steps.check-repo.outputs.sha }}
      run: |
        set -x
        gh auth status
        gh auth setup-git

        # masquerade as dependabot for the purposes of this commit/PR
        git config --global user.email \
          "49699333+dependabot[bot]@users.noreply.github.com"
        git config --global user.name "dependabot[bot]"

        readonly BRANCH=chore/deps-bump-ngx-wasm-module
        if gh api repos/Kong/kong/branches/"$BRANCH"; then
          echo "branch ($BRANCH) already exists, exiting"
          exit  1
        fi

        EXISTING_PRS=$(
          gh pr list \
            --json id \
            --head "$BRANCH" \
          | jq '.[]'
        )

        if [[ -n ${EXISTING_PRS:-} ]]; then
          echo "existing PR for $BRANCH already exists, exiting"
          echo "$EXISTING_PRS"
          exit 1
        fi

        git switch --create "$BRANCH"

        sed -i \
          -re "s/^NGX_WASM_MODULE=.*/NGX_WASM_MODULE=$TO/" \
          .requirements

        git add .requirements

        # create or update changelog file
        readonly CHANGELOG_FILE=changelog/unreleased/kong/bump-ngx-wasm-module.yml
        {
          printf 'message: "Bumped `ngx_wasm_module` to `%s`"\n' "$TO"
          printf 'type: dependency\n'
        } > "$CHANGELOG_FILE"

        git add "$CHANGELOG_FILE"

        gh api repos/Kong/ngx_wasm_module/compare/"$FROM...$TO" \
          --jq '.commits | reverse | .[] | {
              sha: .sha[0:7],
              url: .html_url,
              message: ( .commit.message | split("\n") | .[0] )
          }' \
          > commits.json

        # craft commit message
        readonly HEADER="chore(deps): bump ngx_wasm_module to $TO"
        {
          printf '%s\n\nChanges since %s:\n\n' \
            "$HEADER" "$FROM"

          jq -r '"* \(.sha) - \(.message)"' \
            < commits.json
        } > commit.txt

        git commit --file commit.txt
        git push origin HEAD

        # craft PR body
        {
          printf '## Changelog `%s...%s`\n\n' \
            "${FROM:0:7}" "${TO:0:7}"

          printf '[Compare on GitHub](%s/compare/%s...%s)\n\n' \
            "https://github.com/Kong/ngx_wasm_module" \
            "$FROM" "$TO"

          # turn the commits into links for the PR body
          jq -r \
            '"* [`\(.sha)`](\(.url)) - \(.message)"' \
            < commits.json

          printf '\n\n'
          printf '**IMPORTANT: Remember to scan this commit log for updates '
          printf 'to Wasmtime/V8/Wasmer and update `.requirements` manually '
          printf 'as needed**\n'
        } > body.md

        gh pr create \
          --base master \
          --head "$BRANCH" \
          --title "$HEADER" \
          --body-file body.md


================================================
FILE: .github/workflows/update-test-runtime-statistics.yml
================================================
name: Update test runtime statistics file for test scheduling
on:
  workflow_dispatch:
  schedule:
    - cron: "1 0 * * SAT"
  # push rule below needed for testing only
  push:
    branches:
      - feat/test-run-scheduler

jobs:
  process-statistics:
    name: Download statistics from GitHub and combine them
    runs-on: ubuntu-22.04
    steps:
      - name: Checkout source code
        uses: actions/checkout@v4
        with:
          token: ${{ secrets.PAT }}

      - name: Process statistics
        uses: Kong/gateway-test-scheduler/analyze@69f0c2a562ac44fc3650b8bfa62106b34094b5ce # v3
        env:
          GITHUB_TOKEN: ${{ secrets.PAT }}
        with:
          workflow-name: build_and_test.yml
          test-file-runtime-file: .ci/runtimes.json
          artifact-name-regexp: "^test-runtime-statistics-\\d+$"

      - name: Upload new runtimes file
        uses: Kong/gh-storage/upload@b196a6b94032e56e414227c749e9f96a6afc2b91 # v1
        env:
          GITHUB_TOKEN: ${{ secrets.PAT }}
        with:
          repo-path: Kong/gateway-action-storage/main/.ci/runtimes.json


================================================
FILE: .github/workflows/upgrade-tests.yml
================================================
name: Upgrade Tests

on:
  pull_request:
    paths:
    - 'scripts/upgrade-tests/**'
    - 'kong/db/migrations/**'
    - 'spec/05-migration/**'
    - 'kong/enterprise_edition/db/migrations/**'
    - '.github/workflows/upgrade-tests.yml'
    - 'kong/plugins/*/migrations/**'
    - 'plugins-ee/**/migrations/**'
  push:
    paths-ignore:
    # ignore markdown files (CHANGELOG.md, README.md, etc.)
    - '**/*.md'
    branches:
    - master
    - release/*
    - test-please/*
  workflow_dispatch:
# cancel previous runs if new commits are pushed to the PR, but run for each commit on master
concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true
env:
  GH_TOKEN: ${{ github.token }}
  BUILD_ROOT: ${{ github.workspace }}/bazel-bin/build

jobs:
  build:
    uses: ./.github/workflows/build.yml
    with:
      relative-build-root: bazel-bin/build

  upgrade-test:
    name: Run migration tests
    runs-on: ubuntu-22.04
    needs: build

    steps:
      - name: Clone Source Code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          submodules: recursive

      - name: Lookup build cache
        id: cache-deps
        uses: actions/cache@v4
        with:
          path: ${{ env.BUILD_ROOT }}
          key: ${{ needs.build.outputs.cache-key }}

      - name: Run Upgrade Tests
        run: |
          bash ./scripts/upgrade-tests/test-upgrade-path.sh -i ${{ env.BUILD_ROOT }}/kong-dev-venv.sh


================================================
FILE: .gitignore
================================================
.DS_Store
.vagrant/
.buildpath
.project
.idea
.env
.vscode
.VSCodeCounter

servroot*
mockserver

# kong
nginx_tmp/
kong*.yml

# luacov
luacov.*
/doc

# autodoc
autodoc/output

# ldoc
spec/docs

kong-build-tools
bin/grpcurl

*.so
*.bak
*.rock

worktree/
bin/bazel
bin/h2client

# wasm
*.wasm
spec/fixtures/proxy_wasm_filters/build
spec/fixtures/proxy_wasm_filters/target

# bazel
bazel-*
# remove it after migrating from WORKSPACE to Bzlmod
MODULE.bazel.lock
spec/fixtures/external_plugins/go/go-hello


================================================
FILE: .luacheckrc
================================================
std             = "ngx_lua"
unused_args     = false
redefined       = false
max_line_length = false


globals = {
    "_KONG",
    "kong",
    "ngx.IS_CLI",
}


not_globals = {
    "string.len",
    "table.getn",
}


ignore = {
    "6.", -- ignore whitespace warnings
}


exclude_files = {
    "spec/fixtures/invalid-module.lua",
    "spec-old-api/fixtures/invalid-module.lua",
    "bazel-bin",
    "bazel-out",
    "bazel-kong",
}

files["kong/tools/sandbox/kong.lua"] = {
     read_globals = {
        "_ENV",
        "table.pack",
        "table.unpack",
     }
}


files["kong/hooks.lua"] = {
    read_globals = {
        "table.pack",
        "table.unpack",
    }
}


files["kong/db/schema/entities/workspaces.lua"] = {
    read_globals = {
        "table.unpack",
    }
}


files["kong/plugins/ldap-auth/*.lua"] = {
    read_globals = {
        "bit.mod",
        "string.pack",
        "string.unpack",
    },
}


files["spec/**/*.lua"] = {
    std = "ngx_lua+busted",
}

files["**/*_test.lua"] = {
    std = "ngx_lua+busted",
}

files["spec-old-api/**/*.lua"] = {
    std = "ngx_lua+busted",
}


================================================
FILE: .luacov
================================================
return {

  includeuntestedfiles = {
    "kong/",
  },
  runreport = true,

  include = {
    "kong$",
    "kong%/.+$",
  },

  exclude = {
    "bazel%-bin/build",
    "^spec/",
  }

}


================================================
FILE: .requirements
================================================
KONG_PACKAGE_NAME=kong

OPENRESTY=1.27.1.2
OPENRESTY_SHA256=74f076f7e364b2a99a6c5f9bb531c27610c78985abe956b442b192a2295f7548
LUAROCKS=3.12.2
LUAROCKS_SHA256=b0e0c85205841ddd7be485f53d6125766d18a81d226588d2366931e9a1484492
OPENSSL=3.4.1
OPENSSL_SHA256=002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3
PCRE=10.45
PCRE_SHA256=0e138387df7835d7403b8351e2226c1377da804e0737db0e071b48f07c9d12ee
ADA=2.9.2
ADA_SHA256=b2cce630590b490d79ea4f4460ba77efd5fb29c5a87a4e8cb7ebc4859bc4b564
LIBEXPAT=2.6.4
LIBEXPAT_SHA256=fd03b7172b3bd7427a3e7a812063f74754f24542429b634e0db6511b53fb2278

# Note: git repositories can be loaded from local path if path is set as value

LUA_KONG_NGINX_MODULE=3f305911823301a98a12ec6ecdd9070b8ebe499b # 0.18.0
LUA_RESTY_LMDB=9da0e9f3313960d06e2d8e718b7ac494faa500f1 # 1.6.0
LUA_RESTY_EVENTS=bc85295b7c23eda2dbf2b4acec35c93f77b26787 # 0.3.1
LUA_RESTY_SIMDJSON=176755a45f128fd4b3069c1bdee24d14bfb6900a # 1.2.0
LUA_RESTY_WEBSOCKET=966c69c39f03029b9b42ec0f8e55aaed7d6eebc0 # 0.4.0.1
ATC_ROUTER=4d29e10517e2c9d1dae3966f4034b38c557e2eaa # 1.7.1
SNAPPY=2c94e11145f0b7b184b831577c93e5a41c4c0346 # 1.2.1

KONG_MANAGER=nightly
NGX_WASM_MODULE=a376e67ce02c916304cc9b9ef25a540865ee6740
WASMER=3.1.1
WASMTIME=26.0.0
V8=12.0.267.17

NGX_BROTLI=a71f9312c2deb28875acc7bacfdd5695a111aa53 # master branch of Oct 9, 2023
BROTLI=ed738e842d2fbdf2d6459e39267a633c4a9b2f5d # 1.1.0


================================================
FILE: BUILD.bazel
================================================
load("@bazel_skylib//lib:selects.bzl", "selects")
load("@bazel_skylib//rules:common_settings.bzl", "bool_flag", "string_flag")
load("//build/nfpm:rules.bzl", "nfpm_pkg")
load("//build/toolchain:managed_toolchain.bzl", "aarch64_glibc_distros")

filegroup(
    name = "distribution_srcs",
    srcs = glob(["distribution/**"]),
    visibility = ["//visibility:public"],
)

filegroup(
    name = "rockspec_srcs",
    srcs = glob([
        "kong/**",
        "*.rockspec",
    ]),
    visibility = ["//visibility:public"],
)

filegroup(
    name = "plugins_ee_rockspec_srcs",
    srcs = glob(["plugins-ee/**/*.rockspec"]),
    visibility = ["//visibility:public"],
)

nfpm_env = {
    "KONG_NAME": "kong",
    "KONG_REPLACES_1": "kong-community-edition",
    "KONG_REPLACES_2": "kong-enterprise-edition-fips",
    "KONG_CONFLICTS_1": "kong-community-edition",
    "KONG_CONFLICTS_2": "kong-enterprise-edition-fips",
}

nfpm_pkg(
    name = "kong_deb",
    config = "//build:package/nfpm.yaml",
    env = nfpm_env,
    packager = "deb",
    pkg_name = "kong",
    visibility = ["//visibility:public"],
)

nfpm_pkg(
    name = "kong_el9",
    config = "//build:package/nfpm.yaml",
    env = nfpm_env,
    packager = "rpm",
    pkg_name = "kong.el9",
    visibility = ["//visibility:public"],
)

nfpm_pkg(
    name = "kong_el8",
    config = "//build:package/nfpm.yaml",
    env = nfpm_env,
    packager = "rpm",
    pkg_name = "kong.el8",
    visibility = ["//visibility:public"],
)

nfpm_pkg(
    name = "kong_aws2",
    config = "//build:package/nfpm.yaml",
    env = nfpm_env,
    extra_env = {
        "RPM_EXTRA_DEPS": "/usr/sbin/useradd",
        "RPM_EXTRA_DEPS_2": "/usr/sbin/groupadd",
    },
    packager = "rpm",
    pkg_name = "kong.aws2",
    visibility = ["//visibility:public"],
)

nfpm_pkg(
    name = "kong_aws2023",
    config = "//build:package/nfpm.yaml",
    env = nfpm_env,
    extra_env = {
        "RPM_EXTRA_DEPS": "/usr/sbin/useradd",
        "RPM_EXTRA_DEPS_2": "/usr/sbin/groupadd",
        "RPM_EXTRA_DEPS_3": "libxcrypt-compat",
    },
    packager = "rpm",
    pkg_name = "kong.aws2023",
    visibility = ["//visibility:public"],
)

###### flags

# --//:debug=true
bool_flag(
    name = "debug",
    build_setting_default = True,
)

config_setting(
    name = "debug_flag",
    flag_values = {
        ":debug": "true",
    },
    visibility = ["//visibility:public"],
)

config_setting(
    name = "debug_linux_flag",
    constraint_values = [
        "@platforms//os:linux",
    ],
    flag_values = {
        ":debug": "true",
    },
    visibility = ["//visibility:public"],
)

# --//:brotli=true
bool_flag(
    name = "brotli",
    build_setting_default = True,
)

config_setting(
    name = "brotli_flag",
    flag_values = {
        ":brotli": "true",
    },
    visibility = ["//visibility:public"],
)

# --//:simdjson=true
bool_flag(
    name = "simdjson",
    build_setting_default = True,
)

config_setting(
    name = "simdjson_flag",
    flag_values = {
        ":simdjson": "true",
    },
    visibility = ["//visibility:public"],
)

# --//:licensing=false
bool_flag(
    name = "licensing",
    build_setting_default = False,
)

config_setting(
    name = "licensing_flag",
    flag_values = {
        ":licensing": "true",
    },
    visibility = ["//visibility:public"],
)

# --//:fips=false
bool_flag(
    name = "fips",
    build_setting_default = False,
)

config_setting(
    name = "fips_flag",
    flag_values = {
        ":fips": "true",
    },
    visibility = ["//visibility:public"],
)

# --//:skip_webui=false
bool_flag(
    name = "skip_webui",
    build_setting_default = False,
)

config_setting(
    name = "skip_webui_flags",
    flag_values = {
        ":skip_webui": "true",
    },
    visibility = ["//visibility:public"],
)

# --//:wasmx=false
bool_flag(
    name = "wasmx",
    build_setting_default = False,
    visibility = ["//visibility:public"],
)

# --//:wasmx_module_flag=dynamic
string_flag(
    name = "wasmx_module_flag",
    build_setting_default = "dynamic",
    values = [
        "dynamic",
        "static",
    ],
)

config_setting(
    name = "wasmx_flag",
    flag_values = {
        ":wasmx": "true",
    },
    visibility = ["//visibility:public"],
)

config_setting(
    name = "wasmx_static_mod",
    flag_values = {
        ":wasmx": "true",
        ":wasmx_module_flag": "static",
    },
    visibility = ["//visibility:public"],
)

config_setting(
    name = "wasmx_dynamic_mod",
    flag_values = {
        ":wasmx": "true",
        ":wasmx_module_flag": "dynamic",
    },
    visibility = ["//visibility:public"],
)

# --//:wasm_runtime=wasmtime
string_flag(
    name = "wasm_runtime",
    build_setting_default = "wasmtime",
    values = [
        "v8",
        "wasmer",
        "wasmtime",
    ],
    visibility = ["//visibility:public"],
)

# --//:skip_tools=false
bool_flag(
    name = "skip_tools",
    build_setting_default = False,
)

config_setting(
    name = "skip_tools_flag",
    flag_values = {
        ":skip_tools": "true",
    },
    visibility = ["//visibility:public"],
)

##### constraints, platforms and config_settings for cross-compile

constraint_setting(name = "cross_build_setting")

constraint_value(
    name = "cross_build",
    constraint_setting = ":cross_build_setting",
)

# platform sets the constraint values based on user input (--platform=//:PLATFOTM)
platform(
    name = "generic-crossbuild-x86_64",
    constraint_values = [
        "@platforms//os:linux",
        "@platforms//cpu:x86_64",
        "//build/platforms/distro:generic",
        ":cross_build",
    ],
)

platform(
    name = "generic-crossbuild-aarch64",
    constraint_values = [
        "@platforms//os:linux",
        "@platforms//cpu:aarch64",
        "//build/platforms/distro:generic",
        ":cross_build",
    ],
)

[
    platform(
        name = vendor + "-crossbuild-aarch64",
        constraint_values = [
            "@platforms//os:linux",
            "@platforms//cpu:aarch64",
            "//build/platforms/distro:" + vendor,
            ":cross_build",
        ],
    )
    for vendor in aarch64_glibc_distros
]

platform(
    name = "aws2-crossbuild-x86_64",
    constraint_values = [
        "@platforms//os:linux",
        "@platforms//cpu:x86_64",
        "//build/platforms/distro:aws2",
        ":cross_build",
    ],
)

# config_settings define a select() condition based on user-set constraint_values
# see https://bazel.build/docs/configurable-attributes
config_setting(
    name = "aarch64-linux-glibc-cross",
    constraint_values = [
        "@platforms//os:linux",
        "@platforms//cpu:aarch64",
        ":cross_build",
    ],
    visibility = ["//visibility:public"],
)

config_setting(
    name = "x86_64-linux-glibc-cross",
    constraint_values = [
        "@platforms//os:linux",
        "@platforms//cpu:x86_64",
        ":cross_build",
    ],
    visibility = ["//visibility:public"],
)

selects.config_setting_group(
    # matches all cross build platforms
    name = "any-cross",
    match_any = [
        ":aarch64-linux-glibc-cross",
        ":x86_64-linux-glibc-cross",
    ],
    visibility = ["//visibility:public"],
)


================================================
FILE: CHANGELOG-OLD.md
================================================
# Table of Contents

Looking for recent releases? Please see [CHANGELOG.md](CHANGELOG.md) instead.

- [2.8.5](#285)
- [2.8.4](#284)
- [2.8.3](#283)
- [2.8.2](#282)
- [2.8.1](#281)
- [2.8.0](#280)
- [2.7.1](#271)
- [2.7.0](#270)
- [2.6.0](#260)
- [2.5.1](#251)
- [2.5.0](#250)
- [2.4.1](#241)
- [2.4.0](#240)
- [2.3.3](#233)
- [2.3.2](#232)
- [2.3.1](#231)
- [2.3.0](#230)
- [2.2.2](#222)
- [2.2.1](#221)
- [2.2.0](#220)
- [2.1.4](#214)
- [2.1.3](#213)
- [2.1.2](#212)
- [2.1.1](#211)
- [2.1.0](#210)
- [2.0.5](#205)
- [2.0.4](#204)
- [2.0.3](#203)
- [2.0.2](#202)
- [2.0.1](#201)
- [2.0.0](#200)
- [1.5.1](#151)
- [1.5.0](#150)
- [1.4.3](#143)
- [1.4.2](#142)
- [1.4.1](#141)
- [1.4.0](#140)
- [1.3.0](#130)
- [1.2.2](#122)
- [1.2.1](#121)
- [1.2.0](#120)
- [1.1.2](#112)
- [1.1.1](#111)
- [1.1.0](#110)
- [1.0.3](#103)
- [1.0.2](#102)
- [1.0.1](#101)
- [1.0.0](#100)
- [0.15.0](#0150)
- [0.14.1](#0141)
- [0.14.0](#0140---20180705)
- [0.13.1](#0131---20180423)
- [0.13.0](#0130---20180322)
- [0.12.3](#0123---20180312)
- [0.12.2](#0122---20180228)
- [0.12.1](#0121---20180118)
- [0.12.0](#0120---20180116)
- [0.11.2](#0112---20171129)
- [0.11.1](#0111---20171024)
- [0.10.4](#0104---20171024)
- [0.11.0](#0110---20170816)
- [0.10.3](#0103---20170524)
- [0.10.2](#0102---20170501)
- [0.10.1](#0101---20170327)
- [0.10.0](#0100---20170307)
- [0.9.9 and prior](#099---20170202)

## [2.8.5]

### Kong

#### Performance
##### Performance

- Fixed an inefficiency issue in the Luajit hashing algorithm
 [#13269](https://github.com/Kong/kong/issues/13269)


#### Fixes
##### Default

- Added zlib1g-dev dependency to Ubuntu packages.
 [#13269](https://github.com/Kong/kong/issues/13269)


## [2.8.4]

### Fixes

- Fixed a bug where internal redirects (i.e. those produced by the error_page directive) could interfere with worker process handling the request when buffered proxying is being used.

## [2.8.3]

### Fixes

##### Plugins

- **HTTP Log**: fix internal error during validating the schema if http_endpoint contains
  userinfo but headers is empty [#9574](https://github.com/Kong/kong/pull/9574)
- Update the batch queues module so that queues no longer grow without bounds if
  their consumers fail to process the entries.  Instead, old batches are now dropped
  and an error is logged.
  [#10247](https://github.com/Kong/kong/pull/10247)

##### CLI

- Fixed a packaging problem affecting a subset of releases where the `kong version`
  command was incorrect

## [2.8.2]

### Dependencies

- Bumped `OpenSSL` from 1.1.1n to 1.1.1o
  [#8635](https://github.com/Kong/kong/pull/8809)

## [2.8.1]

### Dependencies

- Bumped lua-resty-healthcheck from 1.5.0 to 1.5.1
  [#8584](https://github.com/Kong/kong/pull/8584)
- Bumped `OpenSSL` from 1.1.1l to 1.1.1n
  [#8635](https://github.com/Kong/kong/pull/8635)

### Fixes

#### Core

- Only reschedule router and plugin iterator timers after finishing previous
  execution, avoiding unnecessary concurrent executions.
  [#8634](https://github.com/Kong/kong/pull/8634)
- Implements conditional rebuilding of router, plugins iterator and balancer on
  data planes. This means that DPs will not rebuild router if there were no
  changes in routes or services. Similarly, the plugins iterator will not be
  rebuilt if there were no changes to plugins, and, finally, the balancer will not be
  reinitialized if there are no changes to upstreams or targets.
  [#8639](https://github.com/Kong/kong/pull/8639)


## [2.8.0]

### Deprecations

- The external [go-pluginserver](https://github.com/Kong/go-pluginserver) project
is considered deprecated in favor of the embedded server approach described in
the [docs](https://docs.konghq.com/gateway/2.7.x/reference/external-plugins/).

### Dependencies

- OpenSSL bumped to 1.1.1m
  [#8191](https://github.com/Kong/kong/pull/8191)
- Bumped resty.session from 3.8 to 3.10
  [#8294](https://github.com/Kong/kong/pull/8294)
- Bumped lua-resty-openssl to 0.8.5
  [#8368](https://github.com/Kong/kong/pull/8368)

### Additions

#### Core

- Customizable transparent dynamic TLS SNI name.
  Thanks, [@zhangshuaiNB](https://github.com/zhangshuaiNB)!
  [#8196](https://github.com/Kong/kong/pull/8196)
- Routes now support matching headers with regular expressions
  Thanks, [@vanhtuan0409](https://github.com/vanhtuan0409)!
  [#6079](https://github.com/Kong/kong/pull/6079)

#### Beta

- Secrets Management and Vault support as been introduced as a Beta feature.
  This means it is intended for testing in staging environments. It not intended
  for use in Production environments.
  You can read more about Secrets Management in
  [our docs page](https://docs.konghq.com/gateway/latest/plan-and-deploy/security/secrets-management/backends-overview).
  [#8403](https://github.com/Kong/kong/pull/8403)

#### Performance

- Improved the calculation of declarative configuration hash for big configurations
  The new method is faster and uses less memory
  [#8204](https://github.com/Kong/kong/pull/8204)
- Multiple improvements in the Router. Amongst others:
  - The router builds twice as fast compared to prior Kong versions
  - Failures are cached and discarded faster (negative caching)
  - Routes with header matching are cached
  These changes should be particularly noticeable when rebuilding on db-less environments
  [#8087](https://github.com/Kong/kong/pull/8087)
  [#8010](https://github.com/Kong/kong/pull/8010)
- **Prometheus** plugin export performance is improved, it now has less impact to proxy
  side traffic when being scrapped.
  [#9028](https://github.com/Kong/kong/pull/9028)

#### Plugins

- **Response-ratelimiting**: Redis ACL support,
  and genenarized Redis connection support for usernames.
  Thanks, [@27ascii](https://github.com/27ascii) for the original contribution!
  [#8213](https://github.com/Kong/kong/pull/8213)
- **ACME**: Add rsa_key_size config option
  Thanks, [lodrantl](https://github.com/lodrantl)!
  [#8114](https://github.com/Kong/kong/pull/8114)
- **Prometheus**: Added gauges to track `ngx.timer.running_count()` and
  `ngx.timer.pending_count()`
  [#8387](https://github.com/Kong/kong/pull/8387)

#### Clustering

- `CLUSTERING_MAX_PAYLOAD` is now configurable in kong.conf
  Thanks, [@andrewgkew](https://github.com/andrewgkew)!
  [#8337](https://github.com/Kong/kong/pull/8337)

#### Admin API

- The current declarative configuration hash is now returned by the `status`
  endpoint when Kong node is running in dbless or data-plane mode.
  [#8214](https://github.com/Kong/kong/pull/8214)
  [#8425](https://github.com/Kong/kong/pull/8425)

### Fixes

#### Core

- When the Router encounters an SNI FQDN with a trailing dot (`.`),
  the dot will be ignored, since according to
  [RFC-3546](https://datatracker.ietf.org/doc/html/rfc3546#section-3.1)
  said dot is not part of the hostname.
  [#8269](https://github.com/Kong/kong/pull/8269)
- Fixed a bug in the Router that would not prioritize the routes with
  both a wildcard and a port (`route.*:80`) over wildcard-only routes (`route.*`),
  which have less specificity
  [#8233](https://github.com/Kong/kong/pull/8233)
- The internal DNS client isn't confused by the single-dot (`.`) domain
  which can appear in `/etc/resolv.conf` in special cases like `search .`
  [#8307](https://github.com/Kong/kong/pull/8307)
- Cassandra connector now records migration consistency level.
  Thanks, [@mpenick](https://github.com/mpenick)!
  [#8226](https://github.com/Kong/kong/pull/8226)

#### Balancer

- Targets keep their health status when upstreams are updated.
  [#8394](https://github.com/Kong/kong/pull/8394)
- One debug message which was erroneously using the `error` log level
  has been downgraded to the appropiate `debug` log level.
  [#8410](https://github.com/Kong/kong/pull/8410)

#### Clustering

- Replaced cryptic error message with more useful one when
  there is a failure on SSL when connecting with CP:
  [#8260](https://github.com/Kong/kong/pull/8260)

#### Admin API

- Fix incorrect `next` field in when paginating Upstreams
  [#8249](https://github.com/Kong/kong/pull/8249)

#### PDK

- Phase names are correctly selected when performing phase checks
  [#8208](https://github.com/Kong/kong/pull/8208)
- Fixed a bug in the go-PDK where if `kong.request.getrawbody` was
  big enough to be buffered into a temporary file, it would return an
  an empty string.
  [#8390](https://github.com/Kong/kong/pull/8390)

#### Plugins

- **External Plugins**: Fixed incorrect handling of the Headers Protobuf Structure
  and representation of null values, which provoked an error on init with the go-pdk.
  [#8267](https://github.com/Kong/kong/pull/8267)
- **External Plugins**: Unwrap `ConsumerSpec` and `AuthenticateArgs`.
  Thanks, [@raptium](https://github.com/raptium)!
  [#8280](https://github.com/Kong/kong/pull/8280)
- **External Plugins**: Fixed a problem in the stream subsystem would attempt to load
  HTTP headers.
  [#8414](https://github.com/Kong/kong/pull/8414)
- **CORS**: The CORS plugin does not send the `Vary: Origin` header any more when
  the header `Access-Control-Allow-Origin` is set to `*`.
  Thanks, [@jkla-dr](https://github.com/jkla-dr)!
  [#8401](https://github.com/Kong/kong/pull/8401)
- **AWS-Lambda**: Fixed incorrect behavior when configured to use an http proxy
  and deprecated the `proxy_scheme` config attribute for removal in 3.0
  [#8406](https://github.com/Kong/kong/pull/8406)
- **oauth2**: The plugin clears the `X-Authenticated-UserId` and
  `X-Authenticated-Scope` headers when it configured in logical OR and
  is used in conjunction with another authentication plugin.
  [#8422](https://github.com/Kong/kong/pull/8422)
- **Datadog**: The plugin schema now lists the default values
  for configuration options in a single place instead of in two
  separate places.
  [#8315](https://github.com/Kong/kong/pull/8315)


## [2.7.1]

### Fixes

- Reschedule resolve timer only when the previous one has finished.
  [#8344](https://github.com/Kong/kong/pull/8344)
- Plugins, and any entities implemented with subchemas, now can use the `transformations`
  and `shorthand_fields` properties, which were previously only available for non-subschema entities.
  [#8146](https://github.com/Kong/kong/pull/8146)

## [2.7.0]

### Dependencies

- Bumped `kong-plugin-session` from 0.7.1 to 0.7.2
  [#7910](https://github.com/Kong/kong/pull/7910)
- Bumped `resty.openssl` from 0.7.4 to 0.7.5
  [#7909](https://github.com/Kong/kong/pull/7909)
- Bumped `go-pdk` used in tests from v0.6.0 to v0.7.1 [#7964](https://github.com/Kong/kong/pull/7964)
- Cassandra support is deprecated with 2.7 and will be fully removed with 4.0.

### Additions

#### Configuration

-  Deprecated the `worker_consistency` directive, and changed its default to `eventual`. Future versions of Kong will remove the option and act with `eventual` consistency only.

#### Performance

In this release we continued our work on better performance:

- Improved the plugin iterator performance and JITability
  [#7912](https://github.com/Kong/kong/pull/7912)
  [#7979](https://github.com/Kong/kong/pull/7979)
- Simplified the Kong core context read and writes for better performance
  [#7919](https://github.com/Kong/kong/pull/7919)
- Reduced proxy long tail latency while reloading DB-less config
  [#8133](https://github.com/Kong/kong/pull/8133)

#### Core

- DAOs in plugins must be listed in an array, so that their loading order is explicit. Loading them in a
  hash-like table is now **deprecated**.
  [#7942](https://github.com/Kong/kong/pull/7942)
- Postgres credentials `pg_user` and `pg_password`, and `pg_ro_user` and `pg_ro_password` now support
  automatic secret rotation when used together with
  [Kong Secrets Management](https://docs.konghq.com/gateway/latest/plan-and-deploy/security/secrets-management/)
  vault references.
  [#8967](https://github.com/Kong/kong/pull/8967)

#### PDK

- New functions: `kong.response.get_raw_body` and `kong.response.set_raw_body`
  [#7887](https://github.com/Kong/kong/pull/7877)

#### Plugins

- **IP-Restriction**: response status and message can now be customized
  through configurations `status` and `message`.
  [#7728](https://github.com/Kong/kong/pull/7728)
  Thanks [timmkelley](https://github.com/timmkelley) for the patch!
- **Datadog**: add support for the `distribution` metric type.
  [#6231](https://github.com/Kong/kong/pull/6231)
  Thanks [onematchfox](https://github.com/onematchfox) for the patch!
- **Datadog**: allow service, consumer, and status tags to be customized through
  plugin configurations `service_tag`, `consumer_tag`, and `status_tag`.
  [#6230](https://github.com/Kong/kong/pull/6230)
  Thanks [onematchfox](https://github.com/onematchfox) for the patch!
- **gRPC Gateway** and **gRPC Web**: Now share most of the ProtoBuf definitions.
  Both plugins now share the Timestamp transcoding and included `.proto` files features.
  [#7950](https://github.com/Kong/kong/pull/7950)
- **gRPC Gateway**: processes services and methods defined in imported
  `.proto` files.
  [#8107](https://github.com/Kong/kong/pull/8107)
- **Rate-Limiting**: add support for Redis SSL, through configuration properties
  `redis_ssl` (can be set to `true` or `false`), `ssl_verify`, and `ssl_server_name`.
  [#6737](https://github.com/Kong/kong/pull/6737)
  Thanks [gabeio](https://github.com/gabeio) for the patch!
- **LDAP**: basic authentication header was not parsed correctly when
  the password contained colon (`:`).
  [#7977](https://github.com/Kong/kong/pull/7977)
  Thanks [beldahanit](https://github.com/beldahanit) for reporting the issue!
- Old `BasePlugin` is deprecated and will be removed in a future version of Kong.
  Porting tips in the [documentation](https://docs.konghq.com/gateway-oss/2.3.x/plugin-development/custom-logic/#porting-from-old-baseplugin-style)
- The deprecated **BasePlugin** has been removed. [#7961](https://github.com/Kong/kong/pull/7961)

### Configuration

- Removed the following config options, which had been deprecated in previous versions, in favor of other config names. If you have any of these options in your config you will have to rename them: (removed option -> current option).
  - upstream_keepalive -> nginx_upstream_keepalive + nginx_http_upstream_keepalive
  - nginx_http_upstream_keepalive -> nginx_upstream_keepalive
  - nginx_http_upstream_keepalive_requests -> nginx_upstream_keepalive_requests
  - nginx_http_upstream_keepalive_timeout -> nginx_upstream_keepalive_timeout
  - nginx_http_upstream_directives -> nginx_upstream_directives
  - nginx_http_status_directives -> nginx_status_directives
  - nginx_upstream_keepalive -> upstream_keepalive_pool_size
  - nginx_upstream_keepalive_requests -> upstream_keepalive_max_requests
  - nginx_upstream_keepalive_timeout -> upstream_keepalive_idle_timeout
  - client_max_body_size -> nginx_http_client_max_body_size
  - client_body_buffer_size -> nginx_http_client_max_buffer_size
  - cassandra_consistency -> cassandra_write_consistency / cassandra_read_consistency
  - router_update_frequency -> worker_state_update_frequency
- Removed the nginx_optimizations config option. If you have it in your configuration, please remove it before updating to 3.0.

### Fixes

#### Core

- Balancer caches are now reset on configuration reload.
  [#7924](https://github.com/Kong/kong/pull/7924)
- Configuration reload no longer causes a new DNS-resolving timer to be started.
  [#7943](https://github.com/Kong/kong/pull/7943)
- Fixed problem when bootstrapping multi-node Cassandra clusters, where migrations could attempt
  insertions before schema agreement occurred.
  [#7667](https://github.com/Kong/kong/pull/7667)
- Fixed intermittent botting error which happened when a custom plugin had inter-dependent entity schemas
  on its custom DAO and they were loaded in an incorrect order
  [#7911](https://github.com/Kong/kong/pull/7911)
- Fixed problem when the consistent hash header is not found, the balancer tries to hash a nil value.
  [#8141](https://github.com/Kong/kong/pull/8141)
- Fixed DNS client fails to resolve unexpectedly in `ssl_cert` and `ssl_session_fetch` phases.
  [#8161](https://github.com/Kong/kong/pull/8161)

#### PDK

- `kong.log.inspect` log level is now debug instead of warn. It also renders text
  boxes more cleanly now [#7815](https://github.com/Kong/kong/pull/7815)

#### Plugins

- **Prometheus**: Control Plane does not show Upstream Target health metrics
  [#7992](https://github.com/Kong/kong/pull/7922)


### Dependencies

- Bumped `lua-pack` from 1.0.5 to 2.0.0
  [#8004](https://github.com/Kong/kong/pull/8004)

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


## [2.6.0]

> Release date: 2021/10/04

### Dependencies

- Bumped `openresty` from 1.19.3.2 to [1.19.9.1](https://openresty.org/en/changelog-1019009.html)
  [#7430](https://github.com/Kong/kong/pull/7727)
- Bumped `openssl` from `1.1.1k` to `1.1.1l`
  [7767](https://github.com/Kong/kong/pull/7767)
- Bumped `lua-resty-http` from 0.15 to 0.16.1
  [#7797](https://github.com/kong/kong/pull/7797)
- Bumped `Penlight` to 1.11.0
  [#7736](https://github.com/Kong/kong/pull/7736)
- Bumped `lua-resty-http` from 0.15 to 0.16.1
  [#7797](https://github.com/kong/kong/pull/7797)
- Bumped `lua-protobuf` from 0.3.2 to 0.3.3
  [#7656](https://github.com/Kong/kong/pull/7656)
- Bumped `lua-resty-openssl` from 0.7.3 to 0.7.4
  [#7657](https://github.com/Kong/kong/pull/7657)
- Bumped `lua-resty-acme` from 0.6 to 0.7.1
  [#7658](https://github.com/Kong/kong/pull/7658)
- Bumped `grpcurl` from 1.8.1 to 1.8.2
  [#7659](https://github.com/Kong/kong/pull/7659)
- Bumped `luasec` from 1.0.1 to 1.0.2
  [#7750](https://github.com/Kong/kong/pull/7750)
- Bumped `lua-resty-ipmatcher` to 0.6.1
  [#7703](https://github.com/Kong/kong/pull/7703)
  Thanks [EpicEric](https://github.com/EpicEric) for the patch!

All Kong Gateway OSS plugins will be moved from individual repositories and centralized
into the main Kong Gateway (OSS) repository. We are making a gradual transition. On this
release:

- Moved AWS-Lambda inside the Kong repo
  [#7464](https://github.com/Kong/kong/pull/7464).
- Moved ACME inside the Kong repo
  [#7464](https://github.com/Kong/kong/pull/7464).
- Moved Prometheus inside the Kong repo
  [#7666](https://github.com/Kong/kong/pull/7666).
- Moved Session inside the Kong repo
  [#7738](https://github.com/Kong/kong/pull/7738).
- Moved GRPC-web inside the Kong repo
  [#7782](https://github.com/Kong/kong/pull/7782).
- Moved Serverless functions inside the Kong repo
  [#7792](https://github.com/Kong/kong/pull/7792).

### Additions

#### Core

- New schema entity validator: `mutually_exclusive`. It accepts a list of fields. If more than 1 of those fields
  is set simultaneously, the entity is considered invalid.
  [#7765](https://github.com/Kong/kong/pull/7765)

#### Performance

On this release we've done some special efforts with regards to performance.

There's a new performance workflow which periodically checks new code additions against some
typical scenarios [#7030](https://github.com/Kong/kong/pull/7030) [#7547](https://github.com/Kong/kong/pull/7547)

In addition to that, the following changes were specifically included to improve performance:

- Reduced unnecessary reads of `ngx.var`
  [#7840](https://github.com/Kong/kong/pull/7840)
- Loaded more indexed variables
  [#7849](https://github.com/Kong/kong/pull/7849)
- Optimized table creation in Balancer
  [#7852](https://github.com/Kong/kong/pull/7852)
- Reduce calls to `ngx.update_time`
  [#7853](https://github.com/Kong/kong/pull/7853)
- Use read-only replica for PostgreSQL meta-schema reading
  [#7454](https://github.com/Kong/kong/pull/7454)
- URL escaping detects cases when it's not needed and early-exits
  [#7742](https://github.com/Kong/kong/pull/7742)
- Accelerated variable loading via indexes
  [#7818](https://github.com/Kong/kong/pull/7818)
- Removed unnecessary call to `get_phase` in balancer
  [#7854](https://github.com/Kong/kong/pull/7854)

#### Configuration

- Enable IPV6 on `dns_order` as unsupported experimental feature. Please
  give it a try and report back any issues
  [#7819](https://github.com/Kong/kong/pull/7819).
- The template renderer can now use `os.getenv`
  [#6872](https://github.com/Kong/kong/pull/6872).

#### Hybrid Mode

- Data plane is able to eliminate some unknown fields when Control Plane is using a more modern version
  [#7827](https://github.com/Kong/kong/pull/7827).

#### Admin API

- Added support for the HTTP HEAD method for all Admin API endpoints
  [#7796](https://github.com/Kong/kong/pull/7796)
- Added better support for OPTIONS requests. Previously, the Admin API replied the same on all OPTIONS requests, where as now OPTIONS request will only reply to routes that our Admin API has. Non-existing routes will have a 404 returned. It also adds Allow header to responses, both Allow and Access-Control-Allow-Methods now contain only the methods that the specific API supports. [#7830](https://github.com/Kong/kong/pull/7830)

#### Plugins

- **AWS-Lambda**: The plugin will now try to detect the AWS region by using `AWS_REGION` and
  `AWS_DEFAULT_REGION` environment variables (when not specified with the plugin configuration).
  This allows to specify a 'region' on a per Kong node basis, hence adding the ability to invoke the
  Lamda in the same region where Kong is located.
  [#7765](https://github.com/Kong/kong/pull/7765)
- **Datadog**: `host` and `port` config options can be configured from environment variables
  `KONG_DATADOG_AGENT_HOST` and `KONG_DATADOG_AGENT_PORT`. This allows to set different
  destinations on a per Kong node basis, which makes multi-DC setups easier and in Kubernetes allows to
  run the datadog agents as a daemon-set.
  [#7463](https://github.com/Kong/kong/pull/7463)
  Thanks [rallyben](https://github.com/rallyben) for the patch!
- **Prometheus:** A new metric `data_plane_cluster_cert_expiry_timestamp` is added to expose the Data Plane's cluster_cert expiry timestamp for improved monitoring in Hybrid Mode. [#7800](https://github.com/Kong/kong/pull/7800).

**Request Termination**:

- New `trigger` config option, which makes the plugin only activate for any requests with a header or query parameter
  named like the trigger. This can be a great debugging aid, without impacting actual traffic being processed.
  [#6744](https://github.com/Kong/kong/pull/6744).
- The `request-echo` config option was added. If set, the plugin responds with a copy of the incoming request.
  This eases troubleshooting when Kong is behind one or more other proxies or LB's, especially when combined with
  the new 'trigger' option.
  [#6744](https://github.com/Kong/kong/pull/6744).

**GRPC-Gateway**:

- Fields of type `.google.protobuf.Timestamp` on the gRPC side are now
  transcoded to and from ISO8601 strings in the REST side.
  [#7538](https://github.com/Kong/kong/pull/7538)
- URI arguments like `..?foo.bar=x&foo.baz=y` are interpreted as structured
  fields, equivalent to `{"foo": {"bar": "x", "baz": "y"}}`
  [#7564](https://github.com/Kong/kong/pull/7564)
  Thanks [git-torrent](https://github.com/git-torrent) for the patch!

### Fixes

#### Core

- Balancer retries now correctly set the `:authority` pseudo-header on balancer retries
  [#7725](https://github.com/Kong/kong/pull/7725).
- Healthchecks are now stopped while the Balancer is being recreated
  [#7549](https://github.com/Kong/kong/pull/7549).
- Fixed an issue in which a malformed `Accept` header could cause unexpected HTTP 500
  [#7757](https://github.com/Kong/kong/pull/7757).
- Kong no longer removes `Proxy-Authentication` request header and `Proxy-Authenticate` response header
  [#7724](https://github.com/Kong/kong/pull/7724).
- Fixed an issue where Kong would not sort correctly Routes with both regex and prefix paths
  [#7695](https://github.com/Kong/kong/pull/7695)
  Thanks [jiachinzhao](https://github.com/jiachinzhao) for the patch!

#### Hybrid Mode

- Ensure data plane config thread is terminated gracefully, preventing a semi-deadlocked state
  [#7568](https://github.com/Kong/kong/pull/7568)
  Thanks [flrgh](https://github.com/flrgh) for the patch!
- Older data planes using `aws-lambda`, `grpc-web` or `request-termination` plugins can now talk
  with newer control planes by ignoring new plugin fields.
  [#7881](https://github.com/Kong/kong/pull/7881)

##### CLI

- `kong config parse` no longer crashes when there's a Go plugin server enabled
  [#7589](https://github.com/Kong/kong/pull/7589).

##### Configuration

- Declarative Configuration parser now prints more correct errors when pointing unknown foreign references
  [#7756](https://github.com/Kong/kong/pull/7756).
- YAML anchors in Declarative Configuration are properly processed
  [#7748](https://github.com/Kong/kong/pull/7748).

##### Admin API

- `GET /upstreams/:upstreams/targets/:target` no longer returns 404 when target weight is 0
  [#7758](https://github.com/Kong/kong/pull/7758).

##### PDK

- `kong.response.exit` now uses customized "Content-Length" header when found
  [#7828](https://github.com/Kong/kong/pull/7828).

##### Plugins

- **ACME**: Dots in wildcard domains are escaped
  [#7839](https://github.com/Kong/kong/pull/7839).
- **Prometheus**: Upstream's health info now includes previously missing `subsystem` field
  [#7802](https://github.com/Kong/kong/pull/7802).
- **Proxy-Cache**: Fixed an issue where the plugin would sometimes fetch data from the cache but not return it
  [#7775](https://github.com/Kong/kong/pull/7775)
  Thanks [agile6v](https://github.com/agile6v) for the patch!

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


## [2.5.1]

> Release date: 2021/09/07

This is the first patch release in the 2.5 series. Being a patch release,
it strictly contains bugfixes. There are no new features or breaking changes.

### Dependencies

- Bumped `grpcurl` from 1.8.1 to 1.8.2 [#7659](https://github.com/Kong/kong/pull/7659)
- Bumped `lua-resty-openssl` from 0.7.3 to 0.7.4 [#7657](https://github.com/Kong/kong/pull/7657)
- Bumped `penlight` from 1.10.0 to 1.11.0 [#7736](https://github.com/Kong/kong/pull/7736)
- Bumped `luasec` from 1.0.1 to 1.0.2 [#7750](https://github.com/Kong/kong/pull/7750)
- Bumped `OpenSSL` from 1.1.1k to 1.1.1l [#7767](https://github.com/Kong/kong/pull/7767)

### Fixes

##### Core

- You can now successfully delete workspaces after deleting all entities associated with that workspace.
  Previously, Kong Gateway was not correctly cleaning up parent-child relationships. For example, creating
  an Admin also creates a Consumer and RBAC user. When deleting the Admin, the Consumer and RBAC user are
  also deleted, but accessing the `/workspaces/workspace_name/meta` endpoint would show counts for Consumers
  and RBAC users, which prevented the workspace from being deleted. Now deleting entities correctly updates
  the counts, allowing an empty workspace to be deleted. [#7560](https://github.com/Kong/kong/pull/7560)
- When an upstream event is received from the DAO, `handler.lua` now gets the workspace ID from the request
  and adds it to the upstream entity that will be used in the worker and cluster events. Before this change,
  when posting balancer CRUD events, the workspace ID was lost and the balancer used the default
  workspace ID as a fallback. [#7778](https://github.com/Kong/kong/pull/7778)

##### CLI

- Fixes regression that included an issue where Go plugins prevented CLI commands like `kong config parse`
  or `kong config db_import` from working as expected. [#7589](https://github.com/Kong/kong/pull/7589)

##### CI / Process

- Improves tests reliability. ([#7578](https://github.com/Kong/kong/pull/7578) [#7704](https://github.com/Kong/kong/pull/7704))
- Adds Github Issues template forms. [#7774](https://github.com/Kong/kong/pull/7774)
- Moves "Feature Request" link from Github Issues to Discussions. [#7777](https://github.com/Kong/kong/pull/7777)

##### Admin API

- Kong Gateway now validates workspace names, preventing the use of reserved names on workspaces.
  [#7380](https://github.com/Kong/kong/pull/7380)


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

## [2.5.0]

> Release date: 2021-07-13

This is the final release of Kong 2.5.0, with no breaking changes with respect to the 2.x series.

This release includes Control Plane resiliency to database outages and the new
`declarative_config_string` config option, among other features and fixes.

### Distribution

- :warning: Since 2.4.1, Kong packages are no longer distributed
  through Bintray. Please visit [the installation docs](https://konghq.com/install/#kong-community)
  for more details.

### Dependencies

- Bumped `openresty` from 1.19.3.1 to 1.19.3.2 [#7430](https://github.com/kong/kong/pull/7430)
- Bumped `luasec` from 1.0 to 1.0.1 [#7126](https://github.com/kong/kong/pull/7126)
- Bumped `luarocks` from 3.5.0 to 3.7.0 [#7043](https://github.com/kong/kong/pull/7043)
- Bumped `grpcurl` from 1.8.0 to 1.8.1 [#7128](https://github.com/kong/kong/pull/7128)
- Bumped `penlight` from 1.9.2 to 1.10.0 [#7127](https://github.com/Kong/kong/pull/7127)
- Bumped `lua-resty-dns-client` from 6.0.0 to 6.0.2 [#7539](https://github.com/Kong/kong/pull/7539)
- Bumped `kong-plugin-prometheus` from 1.2 to 1.3 [#7415](https://github.com/Kong/kong/pull/7415)
- Bumped `kong-plugin-zipkin` from 1.3 to 1.4 [#7455](https://github.com/Kong/kong/pull/7455)
- Bumped `lua-resty-openssl` from 0.7.2 to 0.7.3 [#7509](https://github.com/Kong/kong/pull/7509)
- Bumped `lua-resty-healthcheck` from 1.4.1 to 1.4.2 [#7511](https://github.com/Kong/kong/pull/7511)
- Bumped `hmac-auth` from 2.3.0 to 2.4.0 [#7522](https://github.com/Kong/kong/pull/7522)
- Pinned `lua-protobuf` to 0.3.2 (previously unpinned) [#7079](https://github.com/kong/kong/pull/7079)

All Kong Gateway OSS plugins will be moved from individual repositories and centralized
into the main Kong Gateway (OSS) repository. We are making a gradual transition, starting with the
grpc-gateway plugin first:

- Moved grpc-gateway inside the Kong repo. [#7466](https://github.com/Kong/kong/pull/7466)

### Additions

#### Core

- Control Planes can now send updates to new data planes even if the control planes lose connection to the database.
  [#6938](https://github.com/kong/kong/pull/6938)
- Kong now automatically adds `cluster_cert`(`cluster_mtls=shared`) or `cluster_ca_cert`(`cluster_mtls=pki`) into
  `lua_ssl_trusted_certificate` when operating in Hybrid mode. Before, Hybrid mode users needed to configure
  `lua_ssl_trusted_certificate` manually as a requirement for Lua to verify the Control Plane’s certificate.
  See [Starting Data Plane Nodes](https://docs.konghq.com/gateway-oss/2.5.x/hybrid-mode/#starting-data-plane-nodes)
  in the Hybrid Mode guide for more information. [#7044](https://github.com/kong/kong/pull/7044)
- New `declarative_config_string` option allows loading a declarative config directly from a string. See the
  [Loading The Declarative Configuration File](https://docs.konghq.com/2.5.x/db-less-and-declarative-config/#loading-the-declarative-configuration-file)
  section of the DB-less and Declarative Configuration guide for more information.
  [#7379](https://github.com/kong/kong/pull/7379)

#### PDK

- The Kong PDK now accepts tables in the response body for Stream subsystems, just as it does for the HTTP subsystem.
  Before developers had to check the subsystem if they wrote code that used the `exit()` function before calling it,
  because passing the wrong argument type would break the request response.
  [#7082](https://github.com/kong/kong/pull/7082)

#### Plugins

- **hmac-auth**: The HMAC Authentication plugin now includes support for the `@request-target` field in the signature
  string. Before, the plugin used the `request-line` parameter, which contains the HTTP request method, request URI, and
  the HTTP version number. The inclusion of the HTTP version number in the signature caused requests to the same target
  but using different request methods(such as HTTP/2) to have different signatures. The newly added request-target field
  only includes the lowercase request method and request URI when calculating the hash, avoiding those issues.
  See the [HMAC Authentication](https://docs.konghq.com/hub/kong-inc/hmac-auth) documentation for more information.
  [#7037](https://github.com/kong/kong/pull/7037)
- **syslog**: The Syslog plugin now includes facility configuration options, which are a way for the plugin to group
  error messages from different sources. See the description for the facility parameter in the
  [Parameters](https://docs.konghq.com/hub/kong-inc/syslog/#parameters) section of the Syslog documentation for more
  information. [#6081](https://github.com/kong/kong/pull/6081). Thanks, [jideel](https://github.com/jideel)!
- **Prometheus**: The Prometheus plugin now exposes connected data planes' status on the control plane. New metrics include the
  following:  `data_plane_last_seen`, `data_plane_config_hash` and `data_plane_version_compatible`. These
  metrics can be useful for troubleshooting when data planes have inconsistent configurations across the cluster. See the
  [Available metrics](https://docs.konghq.com/hub/kong-inc/prometheus) section of the Prometheus plugin documentation
  for more information. [98](https://github.com/Kong/kong-plugin-prometheus/pull/98)
- **Zipkin**: The Zipkin plugin now includes the following tags: `kong.route`,`kong.service_name` and `kong.route_name`.
  See the [Spans](https://docs.konghq.com/hub/kong-inc/zipkin/#spans) section of the Zipkin plugin documentation for more information.
  [115](https://github.com/Kong/kong-plugin-zipkin/pull/115)

#### Hybrid Mode

- Kong now exposes an upstream health checks endpoint (using the status API) on the data plane for better
  observability. [#7429](https://github.com/Kong/kong/pull/7429)
- Control Planes are now more lenient when checking Data Planes' compatibility in Hybrid mode. See the
  [Version compatibility](https://docs.konghq.com/gateway-oss/2.5.x/hybrid-mode/#version_compatibility)
  section of the Hybrid Mode guide for more information. [#7488](https://github.com/Kong/kong/pull/7488)
- This release starts the groundwork for Hybrid Mode 2.0 Protocol. This code isn't active by default in Kong 2.5,
  but it allows future development. [#7462](https://github.com/Kong/kong/pull/7462)

### Fixes

#### Core

- When using DB-less mode, `select_by_cache_key` now finds entities by using the provided `field` directly
  in ` select_by_key` and does not complete unnecessary cache reads. [#7146](https://github.com/kong/kong/pull/7146)
- Kong can now finish initialization even if a plugin’s `init_worker` handler fails, improving stability.
  [#7099](https://github.com/kong/kong/pull/7099)
- TLS keepalive requests no longer share their context. Before when two calls were made to the same "server+hostname"
  but different routes and using a keepalive connection, plugins that were active in the first call were also sometimes
  (incorrectly) active in the second call. The wrong plugin was active because Kong was passing context in the SSL phase
  to the plugin iterator, creating connection-wide structures in that context, which was then shared between different
  keepalive requests. With this fix, Kong does not pass context to plugi
Download .txt
gitextract_m8kek0kp/

├── .bazelignore
├── .bazelrc
├── .bazelversion
├── .busted
├── .ci/
│   ├── ast-grep/
│   │   ├── README.md
│   │   ├── common/
│   │   │   └── .gitkeep
│   │   ├── rules/
│   │   │   ├── .gitkeep
│   │   │   ├── assert-eventually-terminated.yml
│   │   │   ├── helpers-outside-of-setup.yml
│   │   │   └── ngx-log-string-concat.yml
│   │   └── tests/
│   │       ├── .gitkeep
│   │       ├── __snapshots__/
│   │       │   ├── assert-eventually-terminated-snapshot.yml
│   │       │   ├── helpers-outside-of-setup-snapshot.yml
│   │       │   └── ngx-log-string-concat-snapshot.yml
│   │       ├── assert-eventually-terminated-test.yml
│   │       ├── helpers-outside-of-setup-test.yml
│   │       └── ngx-log-string-concat-test.yml
│   ├── luacov-stats-aggregator.lua
│   └── test_suites.json
├── .devcontainer/
│   ├── Dockerfile
│   ├── devcontainer.json
│   └── docker-compose.yml
├── .editorconfig
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yaml
│   │   └── config.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── actions/
│   │   ├── build-cache-key/
│   │   │   └── action.yml
│   │   └── build-wasm-test-filters/
│   │       └── action.yml
│   ├── dependabot.yml
│   ├── labeler.yml
│   ├── matrix-commitly.yml
│   ├── matrix-full.yml
│   └── workflows/
│       ├── add-release-pongo.yml
│       ├── ast-grep.yml
│       ├── auto-assignee.yml
│       ├── autodocs.yml
│       ├── backport-fail-bot.yml
│       ├── backport-v2.yml
│       ├── build.yml
│       ├── build_and_test.yml
│       ├── buildifier.yml
│       ├── changelog-requirement.yml
│       ├── changelog-validation.yml
│       ├── cherry-picks-v2.yml
│       ├── community-stale.yml
│       ├── copyright-check.yml
│       ├── deck-integration.yml
│       ├── label-check.yml
│       ├── label-community-pr.yml
│       ├── label-schema.yml
│       ├── labeler-v2.yml
│       ├── openresty-patches-companion.yml
│       ├── perf.yml
│       ├── release.yml
│       ├── update-ngx-wasm-module.yml
│       ├── update-test-runtime-statistics.yml
│       └── upgrade-tests.yml
├── .gitignore
├── .luacheckrc
├── .luacov
├── .requirements
├── BUILD.bazel
├── CHANGELOG-OLD.md
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── COMMUNITY_PLEDGE.md
├── CONTRIBUTING.md
├── COPYRIGHT
├── DEVELOPER.md
├── LICENSE
├── MODULE.bazel
├── Makefile
├── README.md
├── SECURITY.md
├── UPGRADE.md
├── WORKSPACE
├── autodoc/
│   ├── README.md
│   ├── cli/
│   │   ├── data.lua
│   │   └── generate.lua
│   └── pdk/
│       ├── generate.lua
│       └── ldoc/
│           ├── config.ld
│           ├── filters.lua
│           ├── json.ltp
│           ├── ldoc.ltp
│           └── nav_yml.ltp
├── bin/
│   ├── busted
│   ├── kong
│   └── kong-health
├── build/
│   ├── BUILD.bazel
│   ├── README.md
│   ├── build_system.bzl
│   ├── cross_deps/
│   │   ├── BUILD.bazel
│   │   ├── README.md
│   │   ├── libxcrypt/
│   │   │   ├── 001-4.4.27-enable-hash-all.patch
│   │   │   ├── BUILD.bazel
│   │   │   ├── BUILD.libxcrypt.bazel
│   │   │   └── repositories.bzl
│   │   ├── libyaml/
│   │   │   ├── BUILD.bazel
│   │   │   ├── BUILD.libyaml.bazel
│   │   │   └── repositories.bzl
│   │   ├── repositories.bzl
│   │   └── zlib/
│   │       ├── BUILD.bazel
│   │       ├── BUILD.zlib.bazel
│   │       └── repositories.bzl
│   ├── dockerfiles/
│   │   ├── deb.Dockerfile
│   │   ├── entrypoint.sh
│   │   └── rpm.Dockerfile
│   ├── kong_bindings.bzl
│   ├── kong_crate/
│   │   ├── BUILD.bazel
│   │   ├── crates.bzl
│   │   └── deps.bzl
│   ├── libexpat/
│   │   ├── BUILD.bazel
│   │   ├── BUILD.libexpat.bazel
│   │   └── repositories.bzl
│   ├── luarocks/
│   │   ├── BUILD.bazel
│   │   ├── BUILD.luarocks.bazel
│   │   ├── lua/
│   │   │   ├── BUILD.bazel
│   │   │   ├── BUILD.lua.bazel
│   │   │   ├── lua_repositories.bzl
│   │   │   └── patches/
│   │   │       └── lua-cross.patch
│   │   ├── luarocks_repositories.bzl
│   │   ├── luarocks_wrap_script.lua
│   │   └── templates/
│   │       ├── luarocks_exec.sh
│   │       ├── luarocks_make.sh
│   │       └── luarocks_target.sh
│   ├── nfpm/
│   │   ├── BUILD.bazel
│   │   ├── BUILD.nfpm.bazel
│   │   ├── repositories.bzl
│   │   └── rules.bzl
│   ├── openresty/
│   │   ├── BUILD.bazel
│   │   ├── BUILD.openresty.bazel
│   │   ├── ada/
│   │   │   ├── BUILD.bazel
│   │   │   └── ada_repositories.bzl
│   │   ├── atc_router/
│   │   │   ├── BUILD.atc_router.bazel
│   │   │   ├── BUILD.bazel
│   │   │   └── atc_router_repositories.bzl
│   │   ├── brotli/
│   │   │   ├── BUILD.bazel
│   │   │   └── brotli_repositories.bzl
│   │   ├── lua-resty-lmdb-cross.patch
│   │   ├── openssl/
│   │   │   ├── BUILD.bazel
│   │   │   ├── README.md
│   │   │   ├── openssl.bzl
│   │   │   └── openssl_repositories.bzl
│   │   ├── patches/
│   │   │   ├── LuaJIT-2.1-20250117_01-patch-macro-luajit-version.patch
│   │   │   ├── LuaJIT-2.1-20250117_02-pass-cc-env.patch
│   │   │   ├── LuaJIT-2.1-20250117_03-revert-reflect-override-of-ljlibd.patch
│   │   │   ├── lua-cjson-2.1.0.14_01-error-on-t-end.patch
│   │   │   ├── nginx-1.27.1_01-upstream-client-certificate-and-ssl-verify.patch
│   │   │   ├── nginx-1.27.1_02-remove-server-tokens-from-special-responses-output.patch
│   │   │   ├── nginx-1.27.1_03-stream-upstream-client-certificate-and-ssl-verify.patch
│   │   │   ├── nginx-1.27.1_04-grpc-authority-override.patch
│   │   │   ├── nginx-1.27.1_05-remove-server-headers-from-ngx-header-filter-module.patch
│   │   │   ├── nginx-1.27.1_06-dynamic-log-level.patch
│   │   │   ├── nginx-1.27.1_07-cross.patch
│   │   │   ├── nginx-1.27.1_08-cross-endianness-fix.patch
│   │   │   ├── nginx-1.27.1_09-proxy-upstream-next.patch
│   │   │   ├── nginx-1.27.1_10-refresh-uri-when-proxy-pass-balancer-recreate.patch
│   │   │   ├── nginx-1.27.1_11-upstream-latency-metrics.patch
│   │   │   ├── ngx_lua-0.10.28_01-dynamic-log-level.patch
│   │   │   ├── ngx_lua-0.10.28_02-fix-invalid-hostname.patch
│   │   │   ├── ngx_lua-0.10.28_03-missing-lightud.patch
│   │   │   ├── ngx_stream_lua-0.0.16_01-expose-request-struct.patch
│   │   │   └── openresty_01-custom-prefix-and-cc.patch
│   │   ├── pcre/
│   │   │   ├── BUILD.bazel
│   │   │   ├── BUILD.pcre.bazel
│   │   │   ├── README.md
│   │   │   └── pcre_repositories.bzl
│   │   ├── repositories.bzl
│   │   ├── simdjson_ffi/
│   │   │   ├── BUILD.bazel
│   │   │   └── simdjson_ffi_repositories.bzl
│   │   ├── snappy/
│   │   │   ├── BUILD.bazel
│   │   │   └── snappy_repositories.bzl
│   │   └── wasmx/
│   │       ├── BUILD.bazel
│   │       ├── filters/
│   │       │   ├── BUILD.bazel
│   │       │   ├── repositories.bzl
│   │       │   └── variables.bzl
│   │       ├── rules.bzl
│   │       └── wasmx_repositories.bzl
│   ├── package/
│   │   ├── kong.logrotate
│   │   ├── kong.service
│   │   ├── nfpm.yaml
│   │   └── postinstall.sh
│   ├── patches/
│   │   ├── 01-revert-LD-environment.patch
│   │   └── 02-revert-Reduce-build-times-especially-on-windows.patch
│   ├── platforms/
│   │   └── distro/
│   │       └── BUILD
│   ├── repositories.bzl
│   ├── templates/
│   │   ├── venv-commons
│   │   ├── venv.fish
│   │   └── venv.sh
│   └── toolchain/
│       ├── .gitignore
│       ├── BUILD
│       ├── bindings.bzl
│       ├── cc_toolchain_config.bzl
│       ├── generate_wrappers.sh
│       ├── managed_toolchain.bzl
│       └── repositories.bzl
├── changelog/
│   ├── 3.5.0/
│   │   ├── 3.5.0.md
│   │   └── kong/
│   │       ├── .gitkeep
│   │       ├── 10570.yml
│   │       ├── 11360-1.yml
│   │       ├── 11360-2.yml
│   │       ├── 11402.yml
│   │       ├── 11424.yml
│   │       ├── 11442.yml
│   │       ├── 11464.yml
│   │       ├── 11468.yml
│   │       ├── 11480.yml
│   │       ├── 11484.yml
│   │       ├── 11502.yml
│   │       ├── 11515.yml
│   │       ├── 11518.yml
│   │       ├── 11523.yml
│   │       ├── 11532.yml
│   │       ├── 11538.yml
│   │       ├── 11551-1.yml
│   │       ├── 11551-2.yml
│   │       ├── 11553.yml
│   │       ├── 11566.yml
│   │       ├── 11578.yml
│   │       ├── 11599.yml
│   │       ├── 11613.yml
│   │       ├── 11638.yml
│   │       ├── 11639.yml
│   │       ├── 11727.yml
│   │       ├── aws_lambda_service_cache.yml
│   │       ├── bump_openssl_3.1.4.yml
│   │       ├── dedicated_config_processing.yml
│   │       ├── fix-cve-2023-44487.yml
│   │       ├── fix-opentelemetry-parent-id.yml
│   │       ├── fix-tcp-log-sslhandshake.yml
│   │       ├── fix_dns_enable_dns_no_sync.yml
│   │       ├── fix_patch_order.yml
│   │       ├── lapis_version_bump.yml
│   │       ├── lua_kong_nginx_module_bump.yml
│   │       ├── luajit_ldp_stp_fusion.yml
│   │       ├── ngx_wasm_module_bump.yml
│   │       ├── on_prem_dp_metadata.yml
│   │       ├── per_reqeuest_deubgging.yml
│   │       ├── plugin-configure-phase.yml
│   │       ├── request-aware-table.yml
│   │       ├── request_id.yml
│   │       ├── session_do_not_read_body_by_default.yml
│   │       ├── vault-declarative.yml
│   │       ├── vault-init-warmup.yml
│   │       ├── vault-resurrect.yml
│   │       ├── wasm-filter-config-schemas.yml
│   │       ├── wasm-filter-json-config.yml
│   │       └── wasmtime_version_bump.yml
│   ├── 3.6.0/
│   │   ├── 3.6.0.md
│   │   ├── kong/
│   │   │   ├── .gitkeep
│   │   │   ├── add-ai-prompt-decorator-plugin.yml
│   │   │   ├── add-ai-prompt-guard-plugin.yml
│   │   │   ├── add-ai-prompt-template-plugin.yml
│   │   │   ├── add-ai-proxy-plugin.yml
│   │   │   ├── add-ai-proxy-telemetry.yml
│   │   │   ├── add-ai-request-transformer-plugin.yml
│   │   │   ├── add-ai-response-transformer-plugin.yml
│   │   │   ├── add-gateway-edition-to-root-endpoint-admin-api.yml
│   │   │   ├── add_ngx_brotli_module.yml
│   │   │   ├── atc_reuse_context.yml
│   │   │   ├── basic_www_authenticate.yml
│   │   │   ├── bump-atc-router.yml
│   │   │   ├── bump-cocurrency-limit-of-timer-ng.yml
│   │   │   ├── bump-lapis-1.16.0.1.yml
│   │   │   ├── bump-lpeg-1.1.0.yml
│   │   │   ├── bump-lua-messagepack-0.5.3.yml
│   │   │   ├── bump-lua-messagepack-0.5.4.yml
│   │   │   ├── bump-lua-resty-aws-1.3.6.yml
│   │   │   ├── bump-lua-resty-healthcheck-3.0.1.yml
│   │   │   ├── bump-lua-resty-lmdb-1.4.1.yml
│   │   │   ├── bump-lua-resty-timer-ng-to-0.2.6.yml
│   │   │   ├── bump-ngx-wasm-module.yml
│   │   │   ├── bump-openresty.yml
│   │   │   ├── bump-openssl.yml
│   │   │   ├── bump-resty-openssl.yml
│   │   │   ├── bump-wasmtime.yml
│   │   │   ├── bump_dns_stale_ttl.yml
│   │   │   ├── bump_ngx_brotli.yml
│   │   │   ├── bump_openssl_from_3_1_4_to_3_2_0.yml
│   │   │   ├── ca_certificates_reference_check.yml
│   │   │   ├── clustering-empty-data-plane-hash-fix.yml
│   │   │   ├── cookie-name-validator.yml
│   │   │   ├── cp-expose-dp-cert-details.yml
│   │   │   ├── dao-pk-as-entity.yml
│   │   │   ├── debian-12-support.yml
│   │   │   ├── declarative_config_fix.yml
│   │   │   ├── default_status_port.yml
│   │   │   ├── deps_bump_lua_resty_healthcheck.yml
│   │   │   ├── display-warning-message-for-km-misconfig.yml
│   │   │   ├── enhance_admin_api_auth_error_response.yml
│   │   │   ├── error_handler_494.yml
│   │   │   ├── expression_http_headers_sensitive.yml
│   │   │   ├── expressions_not_operator.yml
│   │   │   ├── feat-add-cipher-to-the-intermediate.yml
│   │   │   ├── fix-declarative-config-flattened-data-loss.yml
│   │   │   ├── fix-error-message-print.yml
│   │   │   ├── fix-ldoc-intermittent-fail.yml
│   │   │   ├── fix-pdk-response-set-header-with-table.yml
│   │   │   ├── fix-upstream-uri-azure-function-plugin.yml
│   │   │   ├── fix-wasm-module-branch.yml
│   │   │   ├── fix_dns_blocking.yml
│   │   │   ├── fix_dns_disable_dns_no_sync.yml
│   │   │   ├── fix_dns_instrument_error_handling.yml
│   │   │   ├── inject-nginx-directives-location.yml
│   │   │   ├── introduce_lmdb_validation_tag.yml
│   │   │   ├── log-serializer-source-property.yml
│   │   │   ├── optimize_keepalive_parameters.yml
│   │   │   ├── pdk-json-encoding-numbers-precision.yml
│   │   │   ├── pdk-response-send-remove-transfer-encoding.yml
│   │   │   ├── perf-tracing-from-timers.yml
│   │   │   ├── plugin-server-instance-leak.yml
│   │   │   ├── postremove.yml
│   │   │   ├── prometheus_expose_no_service_metrics.yml
│   │   │   ├── rate-limiting-fix-redis-sync-rate.yml
│   │   │   ├── respect-custom-proxy_access_log.yml
│   │   │   ├── rl-shared-sync-timer.yml
│   │   │   ├── router-report-yield.yml
│   │   │   ├── serviceless-routes-still-trigger-datalog-plugin.yml
│   │   │   ├── standardize-redis-conifguration-acme.yml
│   │   │   ├── standardize-redis-conifguration-rate-limiting.yml
│   │   │   ├── standardize-redis-conifguration-response-rl.yml
│   │   │   ├── subsystems_do_not_share_router_schemas.yml
│   │   │   ├── support_http_path_segments_field.yml
│   │   │   ├── support_net_src_dst_field_in_expression.yml
│   │   │   ├── tracing-dns-query-patch.yml
│   │   │   ├── tracing-sampling-rate-scope.yml
│   │   │   ├── validate_private_key.yml
│   │   │   ├── wasm-attach.yml
│   │   │   ├── wasm-dynamic-properties.yml
│   │   │   └── wasm-injected-shm-kv.yml
│   │   └── kong-manager/
│   │       ├── entity_form_preview.yml
│   │       ├── redesigned_basic_components.yml
│   │       ├── standardized_notification_format.yml
│   │       └── unified_plugin_pages.yml
│   ├── 3.7.0/
│   │   ├── 3.7.0.md
│   │   ├── kong/
│   │   │   ├── .gitkeep
│   │   │   ├── add-ai-data-report.yml
│   │   │   ├── add-messages-api-to-anthropic.yml
│   │   │   ├── add_tzdata.yml
│   │   │   ├── ai-proxy-client-params.yml
│   │   │   ├── ai-proxy-preserve-mode.yml
│   │   │   ├── analytics-for-anthropic.yml
│   │   │   ├── bump-atc-router.yml
│   │   │   ├── bump-libexpat.yml
│   │   │   ├── bump-lua-kong-nginx-module.yml
│   │   │   ├── bump-lua-protobuf.yml
│   │   │   ├── bump-lua-resty-acme.yml
│   │   │   ├── bump-lua-resty-aws.yml
│   │   │   ├── bump-lua-resty-http-0.17.2.yml
│   │   │   ├── bump-lua-resty-lmdb.yml
│   │   │   ├── bump-lua-resty-openssl.yml
│   │   │   ├── bump-lua-resty-timer-ng.yml
│   │   │   ├── bump-luarocks.yml
│   │   │   ├── bump-ngx-wasm-module.yml
│   │   │   ├── bump-pcre.yml
│   │   │   ├── bump-penlight.yml
│   │   │   ├── bump-v8.yml
│   │   │   ├── bump-wasmtime.yml
│   │   │   ├── cleanup_ai.yml
│   │   │   ├── decrease-cocurrency-limit-of-timer-ng.yml
│   │   │   ├── disable-TLSv1_1-in-openssl3.yml
│   │   │   ├── feat-add-workspace-label-to-prometheus.yml
│   │   │   ├── feat-ai-proxy-add-streaming.yml
│   │   │   ├── feat-emmy-debugger.yml
│   │   │   ├── feat-hybrid-sync-mixed-route-policy.yml
│   │   │   ├── feat-increase-ai-anthropic-regex-expression-length.yml
│   │   │   ├── feat-jwt-eddsa.yml
│   │   │   ├── feat-jwt-es512.yml
│   │   │   ├── feat-wasm-general-shm-kv.yml
│   │   │   ├── fix-acme-renewal-bug.yml
│   │   │   ├── fix-aws-lambda-kong-latency.yml
│   │   │   ├── fix-cjson-t-end.yml
│   │   │   ├── fix-cli-db-timeout-overrides.yml
│   │   │   ├── fix-ctx-host-port.yml
│   │   │   ├── fix-dbless-duplicate-target-error.yml
│   │   │   ├── fix-default-value-of-upstream-keepalive-max-requests.yml
│   │   │   ├── fix-dns-resolv-timeout-zero.yml
│   │   │   ├── fix-external-plugin-instance.yml
│   │   │   ├── fix-file-permission-of-logrotate.yml
│   │   │   ├── fix-hybrid-dp-certificate-with-vault-not-refresh.yml
│   │   │   ├── fix-jwt-plugin-check.yml
│   │   │   ├── fix-migrations-for-redis-plugins-acme.yml
│   │   │   ├── fix-migrations-for-redis-plugins-response-rl.yml
│   │   │   ├── fix-migrations-for-redis-plugins-rl.yml
│   │   │   ├── fix-missing-router-section-of-request-debugging.yml
│   │   │   ├── fix-mlcache-renew-lock-leaks.yml
│   │   │   ├── fix-router-rebuing-flag.yml
│   │   │   ├── fix-snis-tls-passthrough-in-trad-compat.yml
│   │   │   ├── fix-upstream-status-unset.yml
│   │   │   ├── fix-vault-init-worker.yml
│   │   │   ├── fix-vault-secret-update-without-ttl.yml
│   │   │   ├── fix-vault-workspaces.yml
│   │   │   ├── fix-wasm-disable-pwm-lua-resolver.yml
│   │   │   ├── fix_api_405_vaults_validate_endpoint.yml
│   │   │   ├── fix_balancer_healthecker_unexpected_panic.yml
│   │   │   ├── fix_privileged_agent_id_1.yml
│   │   │   ├── flavor-expressions-supports-traditional-fields.yml
│   │   │   ├── key_auth_www_authenticate.yml
│   │   │   ├── log-serializer-kong-latency.yml
│   │   │   ├── log-serializer-receive-latency.yml
│   │   │   ├── otel-increase-queue-max-batch-size.yml
│   │   │   ├── otel-sampling-panic-when-header-trace-id-enable.yml
│   │   │   ├── plugin-schema-deprecation-record.yml
│   │   │   ├── plugin_server_restart.yml
│   │   │   ├── pluginsocket-proto-wrong-type.yml
│   │   │   ├── propagation-module-rework.yml
│   │   │   ├── revert-req-body-limitation-patch.yml
│   │   │   ├── separate_kong_cache_invalidation_cluster_event_channel.yml
│   │   │   ├── set_grpc_tls_seclevel.yml
│   │   │   ├── speed_up_internal_hooking_mechanism.yml
│   │   │   ├── speed_up_router.yml
│   │   │   ├── tracing-pdk-short-trace-ids.yml
│   │   │   ├── update-ai-proxy-telemetry.yml
│   │   │   └── wasm-bundled-filters.yml
│   │   └── kong-manager/
│   │       ├── .gitkeep
│   │       ├── expressions_routes.yml
│   │       ├── plugin_forms_improvements.yml
│   │       └── ui_improvements.yml
│   ├── 3.8.0/
│   │   ├── 3.8.0.md
│   │   ├── kong/
│   │   │   ├── .gitkeep
│   │   │   ├── acl-always-use-authenticated-groups.yml
│   │   │   ├── add-ai-data-latency.yml
│   │   │   ├── add-ai-data-prometheus.yml
│   │   │   ├── admin-api-map-brackets-syntax.yml
│   │   │   ├── ai-plugin-read-file.yml
│   │   │   ├── ai-proxy-add-allow-override-opt.yml
│   │   │   ├── ai-proxy-add-deep-copy-lib.yml
│   │   │   ├── ai-proxy-aws-bedrock.yml
│   │   │   ├── ai-proxy-azure-streaming.yml
│   │   │   ├── ai-proxy-cloud-identity-transformer-plugins.yml
│   │   │   ├── ai-proxy-fix-model-parameter.yml
│   │   │   ├── ai-proxy-fix-nil-response-token-count.yml
│   │   │   ├── ai-proxy-fix-sending-own-model.yml
│   │   │   ├── ai-proxy-fix-tuning-parameter-precedence.yml
│   │   │   ├── ai-proxy-google-gemini.yml
│   │   │   ├── ai-proxy-mistral-ai.yml
│   │   │   ├── ai-proxy-model-header.yml
│   │   │   ├── ai-proxy-proper-model-assignment.yml
│   │   │   ├── bump-lua-protobuf.yml
│   │   │   ├── bump-lua-resty-acme.yml
│   │   │   ├── bump-lua-resty-aws.yml
│   │   │   ├── bump-lua-resty-events.yml
│   │   │   ├── bump-lua-resty-healthcheck.yml
│   │   │   ├── bump-lua-resty-lmdb.yml
│   │   │   ├── bump-lua-resty-openssl.yml
│   │   │   ├── bump-luarocks.yml
│   │   │   ├── bump-ngx-wasm-module.yml
│   │   │   ├── bump-openresty.yml
│   │   │   ├── bump-pcre.yml
│   │   │   ├── bump-wasmtime.yml
│   │   │   ├── certificates_schema_validate.yml
│   │   │   ├── cp-luarocks-admin-to-bin.yml
│   │   │   ├── feat-ai-prompt-guard-all-roles.yml
│   │   │   ├── feat-aws-lambda-configurable-sts-endpoint.yml
│   │   │   ├── feat-aws-lambda-decode-empty-array.yml
│   │   │   ├── feat-pdk-unlimited-body-size.yml
│   │   │   ├── feat-queue-concurrency-limit.yml
│   │   │   ├── feat-response-transformer-json-rename.yml
│   │   │   ├── feat-via.yml
│   │   │   ├── fix-acme-misleading-deprecation-logs.yml
│   │   │   ├── fix-acme-username-password-auth.yml
│   │   │   ├── fix-ai-gzip-content.yml
│   │   │   ├── fix-ai-metrics-prometheus-compat.yml
│   │   │   ├── fix-ai-plugin-no-consumer.yml
│   │   │   ├── fix-ai-prompt-guard-order.yml
│   │   │   ├── fix-ai-proxy-shared-state.yml
│   │   │   ├── fix-aws-lambda-empty-array-mutli-value.yml
│   │   │   ├── fix-aws-lambda-gateway-compat-version-field.yml
│   │   │   ├── fix-clustering-forward-proxy-authentication.yml
│   │   │   ├── fix-cmd-error-log.yml
│   │   │   ├── fix-correlation-id-config-generator.yml
│   │   │   ├── fix-cors-wildcard.yml
│   │   │   ├── fix-db-read-only.yml
│   │   │   ├── fix-deprecate-shorthands-precedence.yml
│   │   │   ├── fix-dns-initialization.yml
│   │   │   ├── fix-filter-finalize-in-send-header-clear-context.yml
│   │   │   ├── fix-for-null-aware-shorthand.yml
│   │   │   ├── fix-grpc-gateway-json-decode-bug.yml
│   │   │   ├── fix-http-log-host-header.yml
│   │   │   ├── fix-log-upstream-status-nil-subrequest.yml
│   │   │   ├── fix-multi-modal.yml
│   │   │   ├── fix-otel-migrations-exception.yml
│   │   │   ├── fix-propagation-remove-redundant-warnings.yml
│   │   │   ├── fix-realm-compat-changes-basic-auth.yml
│   │   │   ├── fix-realm-compat-changes-key-auth.yml
│   │   │   ├── fix-reports-uninitialized-variable-in-400.yml
│   │   │   ├── fix-request-size-limiting-with-chunked-transfer-encoding-and-no-content-length.yml
│   │   │   ├── fix-request-transformer-uri-replace.yml
│   │   │   ├── fix-response-rl-misleading-deprecation-logs.yml
│   │   │   ├── fix-rl-misleading-deprecation-logs.yml
│   │   │   ├── fix-route-set-priority-with-others.yml
│   │   │   ├── fix-service-tls-verify.yml
│   │   │   ├── fix-sni-cache-invalidate.yml
│   │   │   ├── fix-tracing-sampling-rate.yml
│   │   │   ├── fix-type-of-logrotate.yml
│   │   │   ├── fix-vault-reference-parsing-endslash.yml
│   │   │   ├── fix-vault-resurrect-ttl-multi-worker.yml
│   │   │   ├── fix-vault-secret-rotation-log-level.yml
│   │   │   ├── fix-wasm-enable-pwm-lua-resolver.yml
│   │   │   ├── fix_hash.yml
│   │   │   ├── hmac_www_authenticate.yml
│   │   │   ├── host_header.yml
│   │   │   ├── improve-prometheus-error-logging.yml
│   │   │   ├── jwt_www_authenticate.yml
│   │   │   ├── ldap_www_authenticate.yml
│   │   │   ├── make_rpm_relocatable.yml
│   │   │   ├── migration_of_ai_proxy_plugin.yml
│   │   │   ├── move-sockets-to-subdir.yml
│   │   │   ├── oauth2_www_authenticate.yml
│   │   │   ├── otel-formatted-logs.yml
│   │   │   ├── pdk-log-error.yml
│   │   │   ├── pdk-read-file.yml
│   │   │   ├── pdk-telemetry-log.yml
│   │   │   ├── plugins-add-standard-webhooks.yml
│   │   │   ├── proxy-cache-fix-age-header.yml
│   │   │   ├── refactor_dns_client.yml
│   │   │   ├── reject-config-on-deprecated-fields-mismatch.yml
│   │   │   ├── remove_eol_debian_rhel.yml
│   │   │   ├── req-trans-rename.yml
│   │   │   ├── resty-simdjson.yml
│   │   │   ├── revert-dns-behavior.yml
│   │   │   ├── shorten-socket-names.yml
│   │   │   ├── wasm-module-cache.yml
│   │   │   └── yield-in-gzip.yml
│   │   └── kong-manager/
│   │       ├── .gitkeep
│   │       ├── a11y-improvements.yml
│   │       ├── resizable-entity-lists.yml
│   │       ├── sni-field-in-certificate-form.yml
│   │       └── ui-improvements.yml
│   ├── 3.9.0/
│   │   ├── 3.9.0.md
│   │   ├── kong/
│   │   │   ├── .gitkeep
│   │   │   ├── add-noble-numbat.yml
│   │   │   ├── add_multiple_domain_for_gui.yml
│   │   │   ├── ai-anthropic-fix-function-calling.yml
│   │   │   ├── ai-bedrock-fix-function-calling.yml
│   │   │   ├── ai-bedrock-fix-guardrails.yml
│   │   │   ├── ai-cohere-fix-function-calling.yml
│   │   │   ├── ai-gemini-blocks-content-safety.yml
│   │   │   ├── ai-gemini-fix-function-calling.yml
│   │   │   ├── ai-gemini-fix-transformer-plugins.yml
│   │   │   ├── ai-transformers-bad-error-handling.yml
│   │   │   ├── bump-dockerfile-ubi9.yml
│   │   │   ├── bump-lua-kong-nginx-module.yml
│   │   │   ├── bump-lua-resty-aws.yml
│   │   │   ├── bump-lua-resty-events.yml
│   │   │   ├── bump-lua-resty-ljsonschema.yml
│   │   │   ├── bump-lua-resty-lmdb-2.yml
│   │   │   ├── bump-lua-resty-lmdb.yml
│   │   │   ├── bump-ngx-wasm-module.yml
│   │   │   ├── bump-prometheus-latency-bucket.yml
│   │   │   ├── bump-wasmtime.yml
│   │   │   ├── bump_openssl.yml
│   │   │   ├── chore-clustering-log-level.yml
│   │   │   ├── cp-dp-rpc.yml
│   │   │   ├── deprecate_node_id.yml
│   │   │   ├── feat-add-ada.yml
│   │   │   ├── feat-add-huggingface-llm-driver.yml
│   │   │   ├── feat-ai-proxy-disable-h2-alpn.yml
│   │   │   ├── feat-api-yaml-media-type.yml
│   │   │   ├── feat-correlation-id-order.yml
│   │   │   ├── feat-disable-h2-alpn.yml
│   │   │   ├── feat-kong-drain-cmd.yml
│   │   │   ├── feat-pdk-clear-query-arg.yml
│   │   │   ├── feat-request-debguger-finer-resolution-and-total-latency.yml
│   │   │   ├── feat-tracing-pdk-attributes.yml
│   │   │   ├── fix-admin-api-for-empty-tags.yml
│   │   │   ├── fix-ai-proxy-multi-modal-azure.yml
│   │   │   ├── fix-ai-semantic-cache-model.yml
│   │   │   ├── fix-aws-lambda-multi-value-header-null.yml
│   │   │   ├── fix-balancer-health-checker.yml
│   │   │   ├── fix-core-pass-ctx-to-log-init-worker-errors.yml
│   │   │   ├── fix-jwt-plugin-rsa-public-key-b64decoded.yml
│   │   │   ├── fix-key-auth-retain-query-order.yml
│   │   │   ├── fix-loggly-hostname-notfound.yml
│   │   │   ├── fix-ngx-balancer-recreate-request-api-for-balancer-body-refresh.yml
│   │   │   ├── fix-parse-nested-parameters.yml
│   │   │   ├── fix-pdk-inspect-notice.yml
│   │   │   ├── fix-plugin-conf-ws-id.yml
│   │   │   ├── fix-retries-error-message.yml
│   │   │   ├── fix-return-values-mistaken-in-rate-limiting-plugin.yml
│   │   │   ├── fix-rl-plugin-resp-hdr.yml
│   │   │   ├── fix-schema-validation-with-nil-field.yml
│   │   │   ├── fix-vault-array-config.yml
│   │   │   ├── fix-vault-cache-workspace-id.yml
│   │   │   ├── fix-vault-stream-subsystem.yml
│   │   │   ├── fix-wasm-check-missing-filters.yml
│   │   │   ├── plugins-redirect.yml
│   │   │   ├── prometheus-wasmx-metrics.yml
│   │   │   ├── remove-datakit.yml
│   │   │   ├── revert-http2-limitation-buffered-request.yml
│   │   │   └── wasm-filter-plugins.yml
│   │   └── kong-manager/
│   │       ├── .gitkeep
│   │       ├── hide-plugin-scoping.yml
│   │       ├── ui-improvements.yml
│   │       └── unified-redirection.yml
│   ├── Makefile
│   ├── README.md
│   ├── changelog-template.yaml
│   ├── create_pr
│   ├── unreleased/
│   │   ├── kong/
│   │   │   ├── .gitkeep
│   │   │   ├── add-cp-connectivity-metric-prometheus.yml
│   │   │   ├── add_ai_gemini_boto_support.yml
│   │   │   ├── admin-gui-csp-header.yml
│   │   │   ├── backport-resty-balancer-set-upstream.yml
│   │   │   ├── bump-atc-router.yml
│   │   │   ├── bump-kong-nginx-module.yml
│   │   │   ├── bump-libexpat-to-2_6_4.yml
│   │   │   ├── bump-lua-kong-nginx-module-0140.yml
│   │   │   ├── bump-lua-resty-simdjson.yml
│   │   │   ├── bump-luarocks-to-3_12_2.yml
│   │   │   ├── bump-ngx-wasm-module.yml
│   │   │   ├── bump-openresty.yml
│   │   │   ├── bump-pcre.yml
│   │   │   ├── bump-snappy-library.yml
│   │   │   ├── bump_openssl.yml
│   │   │   ├── deprecate-llm-upstream-url.yml
│   │   │   ├── disable-ngx-wasm-module.yml
│   │   │   ├── dynamic-set-tls-in-pdk-set_scheme.yml
│   │   │   ├── feat-cors-skip-return-acao-when-no-origin-in-request.yml
│   │   │   ├── feat-patch-supprt-set_next_upstream.yml
│   │   │   ├── feat-variable-resource-attributes.yml
│   │   │   ├── fix-admin-api-route-path-response-error.yml
│   │   │   ├── fix-ai-analytics-key.yml
│   │   │   ├── fix-ai-azure-incorrect-path-overriding.yml
│   │   │   ├── fix-ai-azure-streaming.yml
│   │   │   ├── fix-ai-chunking.yml
│   │   │   ├── fix-ai-gemini-multimodal.yml
│   │   │   ├── fix-ai-parameters-typo-in-huggingface.yml
│   │   │   ├── fix-ai-proxy-anthropic-tool-choice.yml
│   │   │   ├── fix-ai-proxy-gemini-incorrect-model-name.yml
│   │   │   ├── fix-ai-upstream-url-trailing-empty.yml
│   │   │   ├── fix-certificate-reference.yml
│   │   │   ├── fix-consistent-hashing-for-hyphenated-pascal-case-headers.yml
│   │   │   ├── fix-cors-allow-empty-string-origin.yml
│   │   │   ├── fix-db_resurrect_ttl.yml
│   │   │   ├── fix-dbless-consumer-credential-error.yml
│   │   │   ├── fix-declarative-config-load.yml
│   │   │   ├── fix-downgrade-routes-plugins-rebuilding-log-level.yml
│   │   │   ├── fix-duplicate-content-type.yml
│   │   │   ├── fix-error-flattening-json.yml
│   │   │   ├── fix-error-handle-certificate.yml
│   │   │   ├── fix-escape-dots-in-logging-plugins.yml
│   │   │   ├── fix-header_cache.yml
│   │   │   ├── fix-invalid-hostname.yml
│   │   │   ├── fix-ip-restriction-tcp-error.yml
│   │   │   ├── fix-jwt-www-authenticate-header-delimiter.yml
│   │   │   ├── fix-new-dns-client-timeout.yml
│   │   │   ├── fix-nil-reference-schema-checker.yml
│   │   │   ├── fix-nonexisting-anonymous-error-message.yml
│   │   │   ├── fix-oauth2-header-delimiter.yml
│   │   │   ├── fix-pdk-clear-query-arg-space-encoding.yml
│   │   │   ├── fix-potential-socket-connection-leak.yml
│   │   │   ├── fix-response-ratelimiting-upstream-headers.yml
│   │   │   ├── fix-socket-path-permissions.yml
│   │   │   ├── fix-target-deletion.yml
│   │   │   ├── fix-upstream-keep-alive-pool-name.yml
│   │   │   ├── fix_ai-gemini-truncated-streams.yml
│   │   │   ├── fix_ai-logger-error-handling.yml
│   │   │   ├── fix_ai-plugins-templating.yml
│   │   │   ├── fix_ai-streaming-function-calls.yml
│   │   │   ├── fix_ai_ollama_content_streaming.yml
│   │   │   ├── fix_ai_proxy_config_issue.yml
│   │   │   ├── fix_ai_proxy_preserve_mode.yml
│   │   │   ├── fix_file_path_not_allowed_whitespace.yml
│   │   │   ├── instana-header-support.yml
│   │   │   ├── perf-lmdb-remove-global-query-key.yml
│   │   │   ├── perf-string-splitting.yml
│   │   │   ├── perf-trace-ID-size-lookup.yml
│   │   │   ├── prometheus-upstream-metrics-toggle.yml
│   │   │   ├── refine-pdk-performance.yml
│   │   │   ├── remove-datakit.yml
│   │   │   ├── remove-duplicate-rl-ctx-check.yml
│   │   │   ├── revert-translate-backwards.yml
│   │   │   ├── session_store_metadata.yml
│   │   │   └── upstream-uri-refresh-when-recreate-request.yml
│   │   └── kong-manager/
│   │       └── .gitkeep
│   └── verify-prs
├── crate_locks/
│   └── README.md
├── kong/
│   ├── admin_gui/
│   │   ├── init.lua
│   │   └── utils.lua
│   ├── api/
│   │   ├── api_helpers.lua
│   │   ├── arguments.lua
│   │   ├── arguments_decoder.lua
│   │   ├── endpoints.lua
│   │   ├── init.lua
│   │   └── routes/
│   │       ├── cache.lua
│   │       ├── certificates.lua
│   │       ├── clustering.lua
│   │       ├── config.lua
│   │       ├── consumers.lua
│   │       ├── debug.lua
│   │       ├── dns.lua
│   │       ├── filter_chains.lua
│   │       ├── health.lua
│   │       ├── kong.lua
│   │       ├── plugins.lua
│   │       ├── snis.lua
│   │       ├── tags.lua
│   │       ├── targets.lua
│   │       └── upstreams.lua
│   ├── cache/
│   │   ├── init.lua
│   │   └── warmup.lua
│   ├── cluster_events/
│   │   ├── init.lua
│   │   └── strategies/
│   │       ├── off.lua
│   │       └── postgres.lua
│   ├── clustering/
│   │   ├── compat/
│   │   │   ├── checkers.lua
│   │   │   ├── init.lua
│   │   │   ├── removed_fields.lua
│   │   │   └── version.lua
│   │   ├── config_helper.lua
│   │   ├── control_plane.lua
│   │   ├── data_plane.lua
│   │   ├── events.lua
│   │   ├── init.lua
│   │   ├── rpc/
│   │   │   ├── callbacks.lua
│   │   │   ├── concentrator.lua
│   │   │   ├── future.lua
│   │   │   ├── json_rpc_v2.lua
│   │   │   ├── manager.lua
│   │   │   ├── queue.lua
│   │   │   ├── socket.lua
│   │   │   └── utils.lua
│   │   ├── services/
│   │   │   └── sync/
│   │   │       ├── hooks.lua
│   │   │       ├── init.lua
│   │   │       ├── rpc.lua
│   │   │       ├── strategies/
│   │   │       │   └── postgres.lua
│   │   │       └── validate.lua
│   │   ├── tls.lua
│   │   └── utils.lua
│   ├── cmd/
│   │   ├── check.lua
│   │   ├── config.lua
│   │   ├── drain.lua
│   │   ├── health.lua
│   │   ├── hybrid.lua
│   │   ├── init.lua
│   │   ├── migrations.lua
│   │   ├── prepare.lua
│   │   ├── quit.lua
│   │   ├── reload.lua
│   │   ├── restart.lua
│   │   ├── roar.lua
│   │   ├── start.lua
│   │   ├── stop.lua
│   │   ├── utils/
│   │   │   ├── env.lua
│   │   │   ├── inject_confs.lua
│   │   │   ├── kill.lua
│   │   │   ├── log.lua
│   │   │   ├── migrations.lua
│   │   │   ├── nginx_signals.lua
│   │   │   ├── prefix_handler.lua
│   │   │   ├── process_secrets.lua
│   │   │   ├── timer.lua
│   │   │   └── tty.lua
│   │   ├── vault.lua
│   │   └── version.lua
│   ├── concurrency.lua
│   ├── conf_loader/
│   │   ├── constants.lua
│   │   ├── init.lua
│   │   ├── listeners.lua
│   │   ├── parse.lua
│   │   └── sys.lua
│   ├── constants.lua
│   ├── db/
│   │   ├── dao/
│   │   │   ├── ca_certificates.lua
│   │   │   ├── certificates.lua
│   │   │   ├── init.lua
│   │   │   ├── key_sets.lua
│   │   │   ├── keys.lua
│   │   │   ├── plugins.lua
│   │   │   ├── services.lua
│   │   │   ├── snis.lua
│   │   │   ├── tags.lua
│   │   │   ├── targets.lua
│   │   │   ├── vaults.lua
│   │   │   └── workspaces.lua
│   │   ├── declarative/
│   │   │   ├── export.lua
│   │   │   ├── import.lua
│   │   │   ├── init.lua
│   │   │   ├── marshaller.lua
│   │   │   └── migrations/
│   │   │       ├── init.lua
│   │   │       └── route_path.lua
│   │   ├── errors.lua
│   │   ├── init.lua
│   │   ├── iteration.lua
│   │   ├── migrations/
│   │   │   ├── core/
│   │   │   │   ├── 000_base.lua
│   │   │   │   ├── 003_100_to_110.lua
│   │   │   │   ├── 004_110_to_120.lua
│   │   │   │   ├── 005_120_to_130.lua
│   │   │   │   ├── 006_130_to_140.lua
│   │   │   │   ├── 007_140_to_150.lua
│   │   │   │   ├── 008_150_to_200.lua
│   │   │   │   ├── 009_200_to_210.lua
│   │   │   │   ├── 010_210_to_211.lua
│   │   │   │   ├── 011_212_to_213.lua
│   │   │   │   ├── 012_213_to_220.lua
│   │   │   │   ├── 013_220_to_230.lua
│   │   │   │   ├── 014_230_to_270.lua
│   │   │   │   ├── 015_270_to_280.lua
│   │   │   │   ├── 016_280_to_300.lua
│   │   │   │   ├── 017_300_to_310.lua
│   │   │   │   ├── 018_310_to_320.lua
│   │   │   │   ├── 019_320_to_330.lua
│   │   │   │   ├── 020_330_to_340.lua
│   │   │   │   ├── 021_340_to_350.lua
│   │   │   │   ├── 022_350_to_360.lua
│   │   │   │   ├── 023_360_to_370.lua
│   │   │   │   ├── 024_380_to_390.lua
│   │   │   │   ├── 025_390_to_3100.lua
│   │   │   │   └── init.lua
│   │   │   ├── migrate_path_280_300.lua
│   │   │   ├── operations/
│   │   │   │   ├── 200_to_210.lua
│   │   │   │   ├── 212_to_213.lua
│   │   │   │   ├── 280_to_300.lua
│   │   │   │   └── 331_to_332.lua
│   │   │   ├── state.lua
│   │   │   └── subsystems.lua
│   │   ├── schema/
│   │   │   ├── entities/
│   │   │   │   ├── ca_certificates.lua
│   │   │   │   ├── certificates.lua
│   │   │   │   ├── clustering_data_planes.lua
│   │   │   │   ├── consumers.lua
│   │   │   │   ├── filter_chains.lua
│   │   │   │   ├── key_sets.lua
│   │   │   │   ├── keys.lua
│   │   │   │   ├── parameters.lua
│   │   │   │   ├── plugins.lua
│   │   │   │   ├── routes.lua
│   │   │   │   ├── routes_subschemas.lua
│   │   │   │   ├── services.lua
│   │   │   │   ├── snis.lua
│   │   │   │   ├── tags.lua
│   │   │   │   ├── targets.lua
│   │   │   │   ├── upstreams.lua
│   │   │   │   ├── vaults.lua
│   │   │   │   └── workspaces.lua
│   │   │   ├── entity.lua
│   │   │   ├── init.lua
│   │   │   ├── json.lua
│   │   │   ├── metaschema.lua
│   │   │   ├── others/
│   │   │   │   ├── declarative_config.lua
│   │   │   │   ├── migrations.lua
│   │   │   │   └── wasm_filter.lua
│   │   │   ├── plugin_loader.lua
│   │   │   ├── topological_sort.lua
│   │   │   ├── typedefs.lua
│   │   │   └── vault_loader.lua
│   │   ├── strategies/
│   │   │   ├── connector.lua
│   │   │   ├── init.lua
│   │   │   ├── off/
│   │   │   │   ├── connector.lua
│   │   │   │   ├── init.lua
│   │   │   │   ├── plugins.lua
│   │   │   │   ├── services.lua
│   │   │   │   └── tags.lua
│   │   │   └── postgres/
│   │   │       ├── connector.lua
│   │   │       ├── init.lua
│   │   │       ├── plugins.lua
│   │   │       ├── services.lua
│   │   │       └── tags.lua
│   │   └── utils.lua
│   ├── deprecation.lua
│   ├── dns/
│   │   ├── README.md
│   │   ├── client.lua
│   │   ├── stats.lua
│   │   └── utils.lua
│   ├── dynamic_hook/
│   │   ├── README.md
│   │   └── init.lua
│   ├── error_handlers.lua
│   ├── global.lua
│   ├── globalpatches.lua
│   ├── hooks.lua
│   ├── include/
│   │   ├── kong/
│   │   │   ├── model/
│   │   │   │   ├── ca_certificate.proto
│   │   │   │   ├── certificate.proto
│   │   │   │   ├── config.proto
│   │   │   │   ├── consumer.proto
│   │   │   │   ├── parameter.proto
│   │   │   │   ├── plugin.proto
│   │   │   │   ├── plugin_entities.proto
│   │   │   │   ├── route.proto
│   │   │   │   ├── service.proto
│   │   │   │   ├── sni.proto
│   │   │   │   ├── target.proto
│   │   │   │   ├── upstream.proto
│   │   │   │   └── workspace.proto
│   │   │   └── pluginsocket.proto
│   │   └── opentelemetry/
│   │       └── proto/
│   │           ├── collector/
│   │           │   ├── logs/
│   │           │   │   └── v1/
│   │           │   │       └── logs_service.proto
│   │           │   └── trace/
│   │           │       └── v1/
│   │           │           └── trace_service.proto
│   │           ├── common/
│   │           │   └── v1/
│   │           │       └── common.proto
│   │           ├── logs/
│   │           │   └── v1/
│   │           │       └── logs.proto
│   │           ├── resource/
│   │           │   └── v1/
│   │           │       └── resource.proto
│   │           └── trace/
│   │               └── v1/
│   │                   └── trace.proto
│   ├── init.lua
│   ├── llm/
│   │   ├── adapters/
│   │   │   ├── bedrock.lua
│   │   │   └── gemini.lua
│   │   ├── drivers/
│   │   │   ├── anthropic.lua
│   │   │   ├── azure.lua
│   │   │   ├── bedrock.lua
│   │   │   ├── cohere.lua
│   │   │   ├── gemini.lua
│   │   │   ├── huggingface.lua
│   │   │   ├── llama2.lua
│   │   │   ├── mistral.lua
│   │   │   ├── openai.lua
│   │   │   └── shared.lua
│   │   ├── init.lua
│   │   ├── plugin/
│   │   │   ├── base.lua
│   │   │   ├── crud_handler.lua
│   │   │   ├── ctx.lua
│   │   │   ├── observability.lua
│   │   │   └── shared-filters/
│   │   │       ├── enable-buffering.lua
│   │   │       ├── normalize-json-response.lua
│   │   │       ├── normalize-request.lua
│   │   │       ├── normalize-response-header.lua
│   │   │       ├── normalize-sse-chunk.lua
│   │   │       ├── parse-json-response.lua
│   │   │       ├── parse-request.lua
│   │   │       ├── parse-sse-chunk.lua
│   │   │       └── serialize-analytics.lua
│   │   └── schemas/
│   │       └── init.lua
│   ├── meta.lua
│   ├── observability/
│   │   ├── logs.lua
│   │   ├── otlp/
│   │   │   ├── init.lua
│   │   │   └── proto.lua
│   │   └── tracing/
│   │       ├── instrumentation.lua
│   │       ├── propagation/
│   │       │   ├── extractors/
│   │       │   │   ├── _base.lua
│   │       │   │   ├── aws.lua
│   │       │   │   ├── b3.lua
│   │       │   │   ├── datadog.lua
│   │       │   │   ├── gcp.lua
│   │       │   │   ├── instana.lua
│   │       │   │   ├── jaeger.lua
│   │       │   │   ├── ot.lua
│   │       │   │   └── w3c.lua
│   │       │   ├── init.lua
│   │       │   ├── injectors/
│   │       │   │   ├── _base.lua
│   │       │   │   ├── aws.lua
│   │       │   │   ├── b3-single.lua
│   │       │   │   ├── b3.lua
│   │       │   │   ├── datadog.lua
│   │       │   │   ├── gcp.lua
│   │       │   │   ├── instana.lua
│   │       │   │   ├── jaeger.lua
│   │       │   │   ├── ot.lua
│   │       │   │   └── w3c.lua
│   │       │   ├── schema.lua
│   │       │   └── utils.lua
│   │       ├── request_id.lua
│   │       └── tracing_context.lua
│   ├── pdk/
│   │   ├── client/
│   │   │   └── tls.lua
│   │   ├── client.lua
│   │   ├── cluster.lua
│   │   ├── ctx.lua
│   │   ├── init.lua
│   │   ├── ip.lua
│   │   ├── log.lua
│   │   ├── nginx.lua
│   │   ├── node.lua
│   │   ├── plugin.lua
│   │   ├── private/
│   │   │   ├── checks.lua
│   │   │   ├── node.lua
│   │   │   ├── phases.lua
│   │   │   └── rate_limiting.lua
│   │   ├── request.lua
│   │   ├── response.lua
│   │   ├── router.lua
│   │   ├── service/
│   │   │   ├── request.lua
│   │   │   └── response.lua
│   │   ├── service.lua
│   │   ├── table.lua
│   │   ├── telemetry.lua
│   │   ├── tracing.lua
│   │   └── vault.lua
│   ├── plugins/
│   │   ├── acl/
│   │   │   ├── acls.lua
│   │   │   ├── api.lua
│   │   │   ├── daos.lua
│   │   │   ├── groups.lua
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_acl.lua
│   │   │   │   ├── 002_130_to_140.lua
│   │   │   │   ├── 003_200_to_210.lua
│   │   │   │   ├── 004_212_to_213.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── acme/
│   │   │   ├── api.lua
│   │   │   ├── client.lua
│   │   │   ├── clustering/
│   │   │   │   └── compat/
│   │   │   │       └── redis_translation.lua
│   │   │   ├── daos.lua
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_acme.lua
│   │   │   │   ├── 001_280_to_300.lua
│   │   │   │   ├── 002_320_to_330.lua
│   │   │   │   ├── 003_350_to_360.lua
│   │   │   │   └── init.lua
│   │   │   ├── reserved_words.lua
│   │   │   ├── schema.lua
│   │   │   └── storage/
│   │   │       ├── config_adapters/
│   │   │       │   ├── init.lua
│   │   │       │   └── redis.lua
│   │   │       └── kong.lua
│   │   ├── ai-prompt-decorator/
│   │   │   ├── filters/
│   │   │   │   └── decorate-prompt.lua
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── ai-prompt-guard/
│   │   │   ├── filters/
│   │   │   │   └── guard-prompt.lua
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── ai-prompt-template/
│   │   │   ├── filters/
│   │   │   │   └── render-prompt-template.lua
│   │   │   ├── handler.lua
│   │   │   ├── schema.lua
│   │   │   └── templater.lua
│   │   ├── ai-proxy/
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 001_360_to_370.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── ai-request-transformer/
│   │   │   ├── filters/
│   │   │   │   └── transform-request.lua
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── ai-response-transformer/
│   │   │   ├── filters/
│   │   │   │   └── transform-response.lua
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── aws-lambda/
│   │   │   ├── handler.lua
│   │   │   ├── request-util.lua
│   │   │   └── schema.lua
│   │   ├── azure-functions/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── basic-auth/
│   │   │   ├── access.lua
│   │   │   ├── crypto.lua
│   │   │   ├── daos.lua
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_basic_auth.lua
│   │   │   │   ├── 002_130_to_140.lua
│   │   │   │   ├── 003_200_to_210.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── bot-detection/
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 001_200_to_210.lua
│   │   │   │   └── init.lua
│   │   │   ├── rules.lua
│   │   │   └── schema.lua
│   │   ├── correlation-id/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── cors/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── datadog/
│   │   │   ├── handler.lua
│   │   │   ├── schema.lua
│   │   │   └── statsd_logger.lua
│   │   ├── file-log/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── grpc-gateway/
│   │   │   ├── deco.lua
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── grpc-web/
│   │   │   ├── deco.lua
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── hmac-auth/
│   │   │   ├── access.lua
│   │   │   ├── daos.lua
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_hmac_auth.lua
│   │   │   │   ├── 002_130_to_140.lua
│   │   │   │   ├── 003_200_to_210.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── http-log/
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 001_280_to_300.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── ip-restriction/
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 001_200_to_210.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── jwt/
│   │   │   ├── daos.lua
│   │   │   ├── handler.lua
│   │   │   ├── jwt_parser.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_jwt.lua
│   │   │   │   ├── 002_130_to_140.lua
│   │   │   │   ├── 003_200_to_210.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── key-auth/
│   │   │   ├── daos.lua
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_key_auth.lua
│   │   │   │   ├── 002_130_to_140.lua
│   │   │   │   ├── 003_200_to_210.lua
│   │   │   │   ├── 004_320_to_330.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── ldap-auth/
│   │   │   ├── access.lua
│   │   │   ├── asn1.lua
│   │   │   ├── handler.lua
│   │   │   ├── ldap.lua
│   │   │   └── schema.lua
│   │   ├── loggly/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── oauth2/
│   │   │   ├── access.lua
│   │   │   ├── daos/
│   │   │   │   └── oauth2_tokens.lua
│   │   │   ├── daos.lua
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_oauth2.lua
│   │   │   │   ├── 003_130_to_140.lua
│   │   │   │   ├── 004_200_to_210.lua
│   │   │   │   ├── 005_210_to_211.lua
│   │   │   │   ├── 006_320_to_330.lua
│   │   │   │   ├── 007_320_to_330.lua
│   │   │   │   └── init.lua
│   │   │   ├── schema.lua
│   │   │   └── secret.lua
│   │   ├── opentelemetry/
│   │   │   ├── handler.lua
│   │   │   ├── logs.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 001_331_to_332.lua
│   │   │   │   └── init.lua
│   │   │   ├── schema.lua
│   │   │   ├── traces.lua
│   │   │   └── utils.lua
│   │   ├── post-function/
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 001_280_to_300.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── pre-function/
│   │   │   ├── _handler.lua
│   │   │   ├── _schema.lua
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 001_280_to_300.lua
│   │   │   │   ├── _001_280_to_300.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── prometheus/
│   │   │   ├── api.lua
│   │   │   ├── exporter.lua
│   │   │   ├── grafana/
│   │   │   │   ├── README.md
│   │   │   │   └── kong-official.json
│   │   │   ├── handler.lua
│   │   │   ├── prometheus.lua
│   │   │   ├── schema.lua
│   │   │   ├── serve.lua
│   │   │   ├── status_api.lua
│   │   │   └── wasmx.lua
│   │   ├── proxy-cache/
│   │   │   ├── api.lua
│   │   │   ├── cache_key.lua
│   │   │   ├── handler.lua
│   │   │   ├── schema.lua
│   │   │   └── strategies/
│   │   │       ├── init.lua
│   │   │       └── memory.lua
│   │   ├── rate-limiting/
│   │   │   ├── clustering/
│   │   │   │   └── compat/
│   │   │   │       └── redis_translation.lua
│   │   │   ├── daos.lua
│   │   │   ├── expiration.lua
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_rate_limiting.lua
│   │   │   │   ├── 003_10_to_112.lua
│   │   │   │   ├── 004_200_to_210.lua
│   │   │   │   ├── 005_320_to_330.lua
│   │   │   │   ├── 006_350_to_360.lua
│   │   │   │   └── init.lua
│   │   │   ├── policies/
│   │   │   │   ├── cluster.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── redirect/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── request-size-limiting/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── request-termination/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── request-transformer/
│   │   │   ├── access.lua
│   │   │   ├── handler.lua
│   │   │   ├── migrations/
│   │   │   │   ├── common.lua
│   │   │   │   └── postgres.lua
│   │   │   └── schema.lua
│   │   ├── response-ratelimiting/
│   │   │   ├── access.lua
│   │   │   ├── clustering/
│   │   │   │   └── compat/
│   │   │   │       └── redis_translation.lua
│   │   │   ├── handler.lua
│   │   │   ├── header_filter.lua
│   │   │   ├── log.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_response_rate_limiting.lua
│   │   │   │   ├── 001_350_to_360.lua
│   │   │   │   └── init.lua
│   │   │   ├── policies/
│   │   │   │   ├── cluster.lua
│   │   │   │   └── init.lua
│   │   │   └── schema.lua
│   │   ├── response-transformer/
│   │   │   ├── body_transformer.lua
│   │   │   ├── handler.lua
│   │   │   ├── header_transformer.lua
│   │   │   └── schema.lua
│   │   ├── session/
│   │   │   ├── access.lua
│   │   │   ├── daos/
│   │   │   │   └── session_metadatas.lua
│   │   │   ├── daos.lua
│   │   │   ├── handler.lua
│   │   │   ├── header_filter.lua
│   │   │   ├── migrations/
│   │   │   │   ├── 000_base_session.lua
│   │   │   │   ├── 001_add_ttl_index.lua
│   │   │   │   ├── 002_320_to_330.lua
│   │   │   │   ├── 003_330_to_3100.lua
│   │   │   │   └── init.lua
│   │   │   ├── schema.lua
│   │   │   ├── session.lua
│   │   │   ├── storage/
│   │   │   │   └── kong.lua
│   │   │   └── strategies/
│   │   │       └── postgres/
│   │   │           └── session_metadatas.lua
│   │   ├── standard-webhooks/
│   │   │   ├── handler.lua
│   │   │   ├── internal.lua
│   │   │   └── schema.lua
│   │   ├── statsd/
│   │   │   ├── constants.lua
│   │   │   ├── handler.lua
│   │   │   ├── log.lua
│   │   │   ├── schema.lua
│   │   │   └── statsd_logger.lua
│   │   ├── syslog/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── tcp-log/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   ├── udp-log/
│   │   │   ├── handler.lua
│   │   │   └── schema.lua
│   │   └── zipkin/
│   │       ├── README.md
│   │       ├── handler.lua
│   │       ├── reporter.lua
│   │       ├── request_tags.lua
│   │       ├── schema.lua
│   │       └── span.lua
│   ├── reports.lua
│   ├── resty/
│   │   ├── ctx.lua
│   │   ├── dns/
│   │   │   ├── client.lua
│   │   │   └── utils.lua
│   │   └── mlcache/
│   │       ├── init.lua
│   │       └── ipc.lua
│   ├── router/
│   │   ├── atc.lua
│   │   ├── compat.lua
│   │   ├── expressions.lua
│   │   ├── fields.lua
│   │   ├── init.lua
│   │   ├── traditional.lua
│   │   ├── transform.lua
│   │   └── utils.lua
│   ├── runloop/
│   │   ├── balancer/
│   │   │   ├── balancers.lua
│   │   │   ├── consistent_hashing.lua
│   │   │   ├── healthcheckers.lua
│   │   │   ├── init.lua
│   │   │   ├── latency.lua
│   │   │   ├── least_connections.lua
│   │   │   ├── round_robin.lua
│   │   │   ├── targets.lua
│   │   │   └── upstreams.lua
│   │   ├── certificate.lua
│   │   ├── events.lua
│   │   ├── handler.lua
│   │   ├── log_level.lua
│   │   ├── plugin_servers/
│   │   │   ├── init.lua
│   │   │   ├── plugin.lua
│   │   │   ├── process.lua
│   │   │   └── rpc/
│   │   │       ├── init.lua
│   │   │       ├── mp_rpc.lua
│   │   │       ├── pb_rpc.lua
│   │   │       └── util.lua
│   │   ├── plugins_iterator.lua
│   │   ├── upstream_retry.lua
│   │   ├── upstream_ssl.lua
│   │   ├── wasm/
│   │   │   ├── plugins.lua
│   │   │   └── properties.lua
│   │   └── wasm.lua
│   ├── status/
│   │   ├── init.lua
│   │   └── ready.lua
│   ├── templates/
│   │   ├── kong_defaults.lua
│   │   ├── kong_yml.lua
│   │   ├── nginx.lua
│   │   ├── nginx_inject.lua
│   │   ├── nginx_kong.lua
│   │   ├── nginx_kong_gui_include.lua
│   │   ├── nginx_kong_inject.lua
│   │   ├── nginx_kong_stream.lua
│   │   ├── nginx_kong_stream_inject.lua
│   │   └── wasmtime_cache_config.lua
│   ├── timing/
│   │   ├── context.lua
│   │   ├── hooks/
│   │   │   ├── dns.lua
│   │   │   ├── http.lua
│   │   │   ├── init.lua
│   │   │   ├── redis.lua
│   │   │   └── socket.lua
│   │   └── init.lua
│   ├── tools/
│   │   ├── aws_stream.lua
│   │   ├── cjson.lua
│   │   ├── dns.lua
│   │   ├── emmy_debugger.lua
│   │   ├── grpc.lua
│   │   ├── gzip.lua
│   │   ├── http.lua
│   │   ├── ip.lua
│   │   ├── kong-lua-sandbox.lua
│   │   ├── mime_type.lua
│   │   ├── module.lua
│   │   ├── protobuf.lua
│   │   ├── queue.lua
│   │   ├── queue_schema.lua
│   │   ├── rand.lua
│   │   ├── redis/
│   │   │   └── schema.lua
│   │   ├── request_aware_table.lua
│   │   ├── sandbox/
│   │   │   ├── environment/
│   │   │   │   ├── handler.lua
│   │   │   │   ├── init.lua
│   │   │   │   ├── lua.lua
│   │   │   │   └── schema.lua
│   │   │   ├── init.lua
│   │   │   ├── kong.lua
│   │   │   └── require/
│   │   │       ├── handler.lua
│   │   │       ├── init.lua
│   │   │       ├── lua.lua
│   │   │       └── schema.lua
│   │   ├── sha256.lua
│   │   ├── stream_api.lua
│   │   ├── string.lua
│   │   ├── system.lua
│   │   ├── table.lua
│   │   ├── time.lua
│   │   ├── timestamp.lua
│   │   ├── uri.lua
│   │   ├── utils.lua
│   │   ├── uuid.lua
│   │   └── yield.lua
│   ├── vaults/
│   │   └── env/
│   │       ├── init.lua
│   │       └── schema.lua
│   └── workspaces/
│       └── init.lua
├── kong-latest.rockspec
├── kong.conf.default
├── scripts/
│   ├── Dockerfile
│   ├── autodoc
│   ├── build-wasm-test-filters.sh
│   ├── changelog-helper.lua
│   ├── check-labeler.pl
│   ├── check_spec_files_spelling.sh
│   ├── dependency_services/
│   │   ├── 00-create-pg-db.sh
│   │   ├── common.sh
│   │   ├── docker-compose-test-services.yml
│   │   ├── up.fish
│   │   └── up.sh
│   ├── explain_manifest/
│   │   ├── .gitignore
│   │   ├── config.py
│   │   ├── docker_image_filelist.txt
│   │   ├── expect.py
│   │   ├── explain.py
│   │   ├── filelist.txt
│   │   ├── fixtures/
│   │   │   ├── amazonlinux-2-amd64.txt
│   │   │   ├── amazonlinux-2023-amd64.txt
│   │   │   ├── amazonlinux-2023-arm64.txt
│   │   │   ├── debian-11-amd64.txt
│   │   │   ├── debian-12-amd64.txt
│   │   │   ├── el8-amd64.txt
│   │   │   ├── el9-amd64.txt
│   │   │   ├── el9-arm64.txt
│   │   │   ├── ubuntu-20.04-amd64.txt
│   │   │   ├── ubuntu-22.04-amd64.txt
│   │   │   ├── ubuntu-22.04-arm64.txt
│   │   │   ├── ubuntu-24.04-amd64.txt
│   │   │   └── ubuntu-24.04-arm64.txt
│   │   ├── main.py
│   │   ├── requirements.txt
│   │   └── suites.py
│   ├── grep-kong-version.sh
│   ├── make-release
│   ├── release-kong.sh
│   ├── release-lib.sh
│   ├── update-copyright
│   ├── upgrade-tests/
│   │   ├── docker-compose.yml
│   │   ├── luarocks-system-lua
│   │   ├── source-versions
│   │   └── test-upgrade-path.sh
│   └── validate-rockspec
├── sgconfig.yml
├── spec/
│   ├── 01-unit/
│   │   ├── 01-db/
│   │   │   ├── 01-schema/
│   │   │   │   ├── 01-schema_spec.lua
│   │   │   │   ├── 02-metaschema_spec.lua
│   │   │   │   ├── 03-typedefs_spec.lua
│   │   │   │   ├── 04-entities_schema_spec.lua
│   │   │   │   ├── 05-services_spec.lua
│   │   │   │   ├── 06-routes_spec.lua
│   │   │   │   ├── 07-plugins_spec.lua
│   │   │   │   ├── 08-targets_spec.lua
│   │   │   │   ├── 09-upstreams_spec.lua
│   │   │   │   ├── 10-migrations_spec.lua
│   │   │   │   ├── 11-declarative_config/
│   │   │   │   │   ├── 01-validate_spec.lua
│   │   │   │   │   ├── 02-process_auto_fields_spec.lua
│   │   │   │   │   ├── 03-flatten_spec.lua
│   │   │   │   │   ├── 04-on-the-fly-migration_spec.lua
│   │   │   │   │   └── 05-error-flattening_spec.lua
│   │   │   │   ├── 11-snis_spec.lua
│   │   │   │   ├── 12-topological_sort_spec.lua
│   │   │   │   ├── 13-cluster_status_spec.lua
│   │   │   │   ├── 14-consumers_spec.lua
│   │   │   │   └── 15-workspaces_spec.lua
│   │   │   ├── 02-db-errors_spec.lua
│   │   │   ├── 03-arguments_spec.lua
│   │   │   ├── 04-dao_spec.lua
│   │   │   ├── 06-postgres_spec.lua
│   │   │   ├── 07-dao/
│   │   │   │   ├── 01-plugins_spec.lua
│   │   │   │   └── 02-tags_spec.lua
│   │   │   ├── 07-db_spec.lua
│   │   │   ├── 08-cache_warmup_spec.lua
│   │   │   ├── 09-no_broadcast_crud_event_spec.lua
│   │   │   ├── 10-declarative_spec.lua
│   │   │   ├── 11-declarative_lmdb_spec.lua
│   │   │   ├── 12-missing-migrations_spec.lua
│   │   │   └── 13-off/
│   │   │       └── 01-select-by-ca-certificate_spec.lua
│   │   ├── 02-rockspec_meta_spec.lua
│   │   ├── 03-conf_loader_spec.lua
│   │   ├── 04-prefix_handler_spec.lua
│   │   ├── 05-utils_spec.lua
│   │   ├── 06-timestamp_spec.lua
│   │   ├── 07-api_helpers_spec.lua
│   │   ├── 08-router_spec.lua
│   │   ├── 09-balancer/
│   │   │   ├── 01-generic_spec.lua
│   │   │   ├── 02-least_connections_spec.lua
│   │   │   ├── 03-consistent_hashing_spec.lua
│   │   │   ├── 04-round_robin_spec.lua
│   │   │   ├── 05-worker_consistency_spec.lua
│   │   │   └── 06-latency_spec.lua
│   │   ├── 10-log_serializer_spec.lua
│   │   ├── 11-reports_spec.lua
│   │   ├── 12-plugins_order_spec.lua
│   │   ├── 13-plugins_version_spec.lua
│   │   ├── 14-dns_spec.lua
│   │   ├── 16-runloop_handler_spec.lua
│   │   ├── 17-concurrency_spec.lua
│   │   ├── 18-tools_uri_spec.lua
│   │   ├── 19-hooks_spec.lua
│   │   ├── 19-hybrid/
│   │   │   ├── 02-clustering_spec.lua
│   │   │   ├── 03-compat_spec.lua
│   │   │   ├── 04-validate_deltas_spec.lua
│   │   │   └── 05-validate-versions_spec.lua
│   │   ├── 20-sandbox_spec.lua
│   │   ├── 21-dns-client/
│   │   │   ├── 01-utils_spec.lua
│   │   │   ├── 02-client_spec.lua
│   │   │   └── 03-client_cache_spec.lua
│   │   ├── 22-grpc-utils_spec.lua
│   │   ├── 23-vaults_spec.lua
│   │   ├── 24-runloop_certificate_spec.lua
│   │   ├── 25-msgpack_rpc_spec.lua
│   │   ├── 26-mime-type_spec.lua
│   │   ├── 26-observability/
│   │   │   ├── 01-tracer_pdk_spec.lua
│   │   │   ├── 02-propagation_strategies_spec.lua
│   │   │   ├── 03-propagation_module_spec.lua
│   │   │   ├── 04-request-id_spec.lua
│   │   │   ├── 05-logs_spec.lua
│   │   │   └── 06-telemetry-pdk_spec.lua
│   │   ├── 27-queue_spec.lua
│   │   ├── 28-inject_confs_spec.lua
│   │   ├── 28-plugins-iterator/
│   │   │   ├── 01-compound_key_spec.lua
│   │   │   └── 02-lookup_cfg_spec.lua
│   │   ├── 29-admin_gui/
│   │   │   ├── 01-admin_gui_spec.lua
│   │   │   └── 02-admin_gui_template_spec.lua
│   │   ├── 29-lua_cjson_large_str_spec.lua
│   │   ├── 30-new-dns-client/
│   │   │   ├── 01-utils_spec.lua
│   │   │   ├── 02-old_client_spec.lua
│   │   │   ├── 03-old_client_cache_spec.lua
│   │   │   ├── 04-client_ipc_spec.lua
│   │   │   └── 05-client_stat_spec.lua
│   │   ├── 30-standardized_redis_config_spec.lua
│   │   ├── 31-ada-url_spec.lua
│   │   ├── 31-simdjson/
│   │   │   ├── 01-cjson_compatibility_spec.lua
│   │   │   └── 02-yield_spec.lua
│   │   └── 32-tools_string_spec.lua
│   ├── 02-integration/
│   │   ├── 01-helpers/
│   │   │   ├── 01-helpers_spec.lua
│   │   │   ├── 02-blueprints_spec.lua
│   │   │   ├── 03-http_mock_spec.lua
│   │   │   ├── 04-redis_helper_spec.lua
│   │   │   └── 05-rpc-mock_spec.lua
│   │   ├── 02-cmd/
│   │   │   ├── 01-cmds_spec.lua
│   │   │   ├── 02-start_stop_spec.lua
│   │   │   ├── 03-reload_spec.lua
│   │   │   ├── 04-version_spec.lua
│   │   │   ├── 05-check_spec.lua
│   │   │   ├── 06-restart_spec.lua
│   │   │   ├── 07-health_spec.lua
│   │   │   ├── 08-quit_spec.lua
│   │   │   ├── 09-prepare_spec.lua
│   │   │   ├── 10-migrations_spec.lua
│   │   │   ├── 11-config_spec.lua
│   │   │   ├── 12-hybrid_spec.lua
│   │   │   ├── 13-signals_spec.lua
│   │   │   ├── 14-vault_spec.lua
│   │   │   ├── 15-utils_spec.lua
│   │   │   ├── 16-verbose_spec.lua
│   │   │   └── 17-drain_spec.lua
│   │   ├── 03-db/
│   │   │   ├── 01-db_spec.lua
│   │   │   ├── 02-db_core_entities_spec.lua
│   │   │   ├── 03-plugins_spec.lua
│   │   │   ├── 04-db_cluster_mutex_spec.lua
│   │   │   ├── 06-migrations_state_spec.lua
│   │   │   ├── 07-tags_spec.lua
│   │   │   ├── 08-declarative_spec.lua
│   │   │   ├── 09-query-semaphore_spec.lua
│   │   │   ├── 10-db_unique_foreign_spec.lua
│   │   │   ├── 11-db_transformations_spec.lua
│   │   │   ├── 11-postgres-ro_spec.lua
│   │   │   ├── 12-dao_hooks_spec.lua
│   │   │   ├── 13-cluster_status_spec.lua
│   │   │   ├── 14-dao_spec.lua
│   │   │   ├── 15-connection_pool_spec.lua
│   │   │   ├── 18-keys_spec.lua
│   │   │   ├── 19-key-sets_spec.lua
│   │   │   ├── 20-ttl-cleanup_spec.lua
│   │   │   ├── 21-services_spec.lua
│   │   │   ├── 22-ca_certificates_spec.lua
│   │   │   └── 23-shorthand_fields_translate_backwards_spec.lua
│   │   ├── 04-admin_api/
│   │   │   ├── 01-admin_api_spec.lua
│   │   │   ├── 02-kong_routes_spec.lua
│   │   │   ├── 03-consumers_routes_spec.lua
│   │   │   ├── 04-plugins_routes_spec.lua
│   │   │   ├── 05-cache_routes_spec.lua
│   │   │   ├── 06-certificates_routes_spec.lua
│   │   │   ├── 07-upstreams_routes_spec.lua
│   │   │   ├── 08-targets_routes_spec.lua
│   │   │   ├── 09-routes_routes_spec.lua
│   │   │   ├── 10-services_routes_spec.lua
│   │   │   ├── 11-reports_spec.lua
│   │   │   ├── 12-plugins-conf_spec.lua
│   │   │   ├── 13-plugin-endpoints_spec.lua
│   │   │   ├── 14-tags_spec.lua
│   │   │   ├── 15-off_spec.lua
│   │   │   ├── 16-ca_certificates_routes_spec.lua
│   │   │   ├── 17-foreign-entity_spec.lua
│   │   │   ├── 19-vaults_spec.lua
│   │   │   ├── 20-timers_spec.lua
│   │   │   ├── 21-admin-api-keys_spec.lua
│   │   │   ├── 21-truncated_arguments_spec.lua
│   │   │   ├── 22-debug_spec.lua
│   │   │   ├── 23-cors_spec.lua
│   │   │   ├── 25-max_safe_integer_spec.lua
│   │   │   └── 25-workspaces_spec.lua
│   │   ├── 05-proxy/
│   │   │   ├── 01-proxy_spec.lua
│   │   │   ├── 02-router_spec.lua
│   │   │   ├── 03-upstream_headers_spec.lua
│   │   │   ├── 04-plugins_triggering_spec.lua
│   │   │   ├── 05-dns_spec.lua
│   │   │   ├── 06-ssl_spec.lua
│   │   │   ├── 07-upstream_timeouts_spec.lua
│   │   │   ├── 08-uri_encoding_spec.lua
│   │   │   ├── 09-websockets_spec.lua
│   │   │   ├── 10-balancer/
│   │   │   │   ├── 01-healthchecks_spec.lua
│   │   │   │   ├── 02-least-connections_spec.lua
│   │   │   │   ├── 03-consistent-hashing_spec.lua
│   │   │   │   ├── 04-round-robin_spec.lua
│   │   │   │   ├── 05-recreate-request_spec.lua
│   │   │   │   ├── 05-stress.lua
│   │   │   │   ├── 06-stream_spec.lua
│   │   │   │   └── 07-latency_spec.lua
│   │   │   ├── 11-handler_spec.lua
│   │   │   ├── 12-error_default_type_spec.lua
│   │   │   ├── 13-error_handlers_spec.lua
│   │   │   ├── 14-server_tokens_spec.lua
│   │   │   ├── 15-upstream-status-header_spec.lua
│   │   │   ├── 16-custom_nginx_directive_spec.lua
│   │   │   ├── 18-upstream_tls_spec.lua
│   │   │   ├── 19-grpc_proxy_spec.lua
│   │   │   ├── 21-grpc_plugins_triggering_spec.lua
│   │   │   ├── 22-reports_spec.lua
│   │   │   ├── 23-context_spec.lua
│   │   │   ├── 24-buffered_spec.lua
│   │   │   ├── 25-upstream_keepalive_spec.lua
│   │   │   ├── 26-udp_spec.lua
│   │   │   ├── 27-lua-ssl-trusted-cert_spec.lua
│   │   │   ├── 27-unbuffered_spec.lua
│   │   │   ├── 28-stream_plugins_triggering_spec.lua
│   │   │   ├── 29-collect-plugin-errors_spec.lua
│   │   │   ├── 30-max-args_spec.lua
│   │   │   ├── 31-stream_tls_spec.lua
│   │   │   ├── 32-query-params_spec.lua
│   │   │   ├── 33-request-aware-table_spec.lua
│   │   │   ├── 33-request-id-header_spec.lua
│   │   │   ├── 34-proxy_with_compress_spec.lua
│   │   │   └── 35-via_spec.lua
│   │   ├── 06-invalidations/
│   │   │   ├── 01-cluster_events_spec.lua
│   │   │   ├── 02-core_entities_invalidations_spec.lua
│   │   │   ├── 03-plugins_iterator_invalidation_spec.lua
│   │   │   └── 04-balancer_cache_correctness_spec.lua
│   │   ├── 07-sdk/
│   │   │   ├── 01-ctx_spec.lua
│   │   │   ├── 02-log_spec.lua
│   │   │   ├── 03-cluster_spec.lua
│   │   │   ├── 04-plugin-config_spec.lua
│   │   │   ├── 05-pdk_spec.lua
│   │   │   └── 06-worker_events_spec.lua
│   │   ├── 08-status_api/
│   │   │   ├── 01-core_routes_spec.lua
│   │   │   ├── 02-targets_routes_spec.lua
│   │   │   ├── 03-readiness_endpoint_spec.lua
│   │   │   ├── 04-config_spec.lua
│   │   │   └── 05-dns_client_spec.lua
│   │   ├── 09-hybrid_mode/
│   │   │   ├── 01-sync_spec.lua
│   │   │   ├── 02-start_stop_spec.lua
│   │   │   ├── 03-pki_spec.lua
│   │   │   ├── 04-cp_cluster_sync_spec.lua
│   │   │   ├── 05-ocsp_spec.lua
│   │   │   ├── 08-lazy_export_spec.lua
│   │   │   ├── 09-config-compat_spec.lua
│   │   │   ├── 09-node-id-persistence_spec.lua
│   │   │   ├── 10-forward-proxy_spec.lua
│   │   │   ├── 11-status_spec.lua
│   │   │   ├── 12-errors_spec.lua
│   │   │   ├── 13-deprecations_spec.lua
│   │   │   ├── 14-dp_privileged_agent_spec.lua
│   │   │   └── 15-cp_inert_rpc_sync_spec.lua
│   │   ├── 10-external-plugins/
│   │   │   ├── 01-process-management_spec.lua
│   │   │   ├── 02-execution_spec.lua
│   │   │   ├── 03-wasm_spec.lua
│   │   │   └── 99-reports_spec.lua
│   │   ├── 11-dbless/
│   │   │   ├── 01-respawn_spec.lua
│   │   │   ├── 02-workers_spec.lua
│   │   │   ├── 03-config_persistence_spec.lua
│   │   │   └── 04-pagination_spec.lua
│   │   ├── 12-stream_api/
│   │   │   └── 01-stream_api_endpoint_spec.lua
│   │   ├── 13-vaults/
│   │   │   ├── 01-vault_spec.lua
│   │   │   ├── 02-env_vault_spec.lua
│   │   │   ├── 03-mock_spec.lua
│   │   │   ├── 04-echo_spec.lua
│   │   │   ├── 05-ttl_spec.lua
│   │   │   ├── 06-refresh-secrets_spec.lua
│   │   │   └── 07-resurrect_spec.lua
│   │   ├── 14-observability/
│   │   │   ├── 01-instrumentations_spec.lua
│   │   │   ├── 02-propagation_spec.lua
│   │   │   ├── 03-tracer-pdk_spec.lua
│   │   │   ├── 04-trace-ids-log_spec.lua
│   │   │   ├── 05-logs_spec.lua
│   │   │   └── 06-telemetry-pdk_spec.lua
│   │   ├── 15-plugins-iterator/
│   │   │   ├── 01-precedence_spec.lua
│   │   │   └── 02-correctness_spec.lua
│   │   ├── 16-queues/
│   │   │   └── 01-shutdown_spec.lua
│   │   ├── 17-admin_gui/
│   │   │   ├── 01-admin-gui-path_spec.lua
│   │   │   ├── 02-log_spec.lua
│   │   │   └── 03-reports_spec.lua
│   │   ├── 18-hybrid_rpc/
│   │   │   ├── 01-rpc_spec.lua
│   │   │   ├── 02-error_spec.lua
│   │   │   ├── 03-inert_spec.lua
│   │   │   ├── 04-concentrator_spec.lua
│   │   │   ├── 05-sync-rpc_spec.lua
│   │   │   ├── 06-batch-rpc_spec.lua
│   │   │   ├── 07-notification_spec.lua
│   │   │   ├── 08-sync_v2_get_delta_spec.lua
│   │   │   ├── 09-notify_new_version_spec.lua
│   │   │   └── 10-validate_deltas_spec.lua
│   │   ├── 21-request-debug/
│   │   │   └── 01-request-debug_spec.lua
│   │   └── 22-ai_plugins/
│   │       └── 01-reports_spec.lua
│   ├── 03-plugins/
│   │   ├── 01-legacy_queue_parameter_warning_spec.lua
│   │   ├── 01-tcp-log/
│   │   │   └── 01-tcp-log_spec.lua
│   │   ├── 02-legacy_propagation_parameter_warning_spec.lua
│   │   ├── 02-udp-log/
│   │   │   └── 01-udp-log_spec.lua
│   │   ├── 03-http-log/
│   │   │   ├── 01-log_spec.lua
│   │   │   ├── 02-schema_spec.lua
│   │   │   ├── 03-schem-vault_spec.lua
│   │   │   ├── 04-legacy_queue_sharing_spec.lua
│   │   │   └── 05-old-plugin-compatibility_spec.lua
│   │   ├── 04-file-log/
│   │   │   ├── 01-log_spec.lua
│   │   │   └── 02-schema_spec.lua
│   │   ├── 05-syslog/
│   │   │   └── 01-log_spec.lua
│   │   ├── 06-statsd/
│   │   │   ├── 01-log_spec.lua
│   │   │   ├── 02-schema_spec.lua
│   │   │   └── 03-allow_status_codes_spec.lua
│   │   ├── 07-loggly/
│   │   │   └── 01-log_spec.lua
│   │   ├── 08-datadog/
│   │   │   ├── 01-log_spec.lua
│   │   │   └── 02-schema_spec.lua
│   │   ├── 09-key-auth/
│   │   │   ├── 01-api_spec.lua
│   │   │   ├── 02-access_spec.lua
│   │   │   ├── 03-invalidations_spec.lua
│   │   │   └── 04-hybrid_mode_spec.lua
│   │   ├── 10-basic-auth/
│   │   │   ├── 01-crypto_spec.lua
│   │   │   ├── 02-api_spec.lua
│   │   │   ├── 03-access_spec.lua
│   │   │   ├── 04-invalidations_spec.lua
│   │   │   └── 05-declarative_spec.lua
│   │   ├── 11-correlation-id/
│   │   │   ├── 01-access_spec.lua
│   │   │   └── 02-schema_spec.lua
│   │   ├── 12-request-size-limiting/
│   │   │   └── 01-access_spec.lua
│   │   ├── 13-cors/
│   │   │   ├── 01-access_spec.lua
│   │   │   └── 02-schema_spec.lua
│   │   ├── 14-request-termination/
│   │   │   ├── 01-schema_spec.lua
│   │   │   ├── 02-access_spec.lua
│   │   │   └── 03-integration_spec.lua
│   │   ├── 15-response-transformer/
│   │   │   ├── 01-header_transformer_spec.lua
│   │   │   ├── 02-body_transformer_spec.lua
│   │   │   ├── 03-api_spec.lua
│   │   │   ├── 04-filter_spec.lua
│   │   │   └── 05-big_response_body_spec.lua
│   │   ├── 16-jwt/
│   │   │   ├── 01-jwt_parser_spec.lua
│   │   │   ├── 02-api_spec.lua
│   │   │   ├── 03-access_spec.lua
│   │   │   ├── 04-invalidations_spec.lua
│   │   │   ├── 06-schema_spec.lua
│   │   │   └── fixtures.lua
│   │   ├── 17-ip-restriction/
│   │   │   ├── 01-schema_spec.lua
│   │   │   └── 02-access_spec.lua
│   │   ├── 18-acl/
│   │   │   ├── 01-api_spec.lua
│   │   │   ├── 02-access_spec.lua
│   │   │   └── 03-invalidations_spec.lua
│   │   ├── 19-hmac-auth/
│   │   │   ├── 01-schema_spec.lua
│   │   │   ├── 02-api_spec.lua
│   │   │   ├── 03-access_spec.lua
│   │   │   └── 04-invalidations_spec.lua
│   │   ├── 20-ldap-auth/
│   │   │   ├── 01-access_spec.lua
│   │   │   ├── 02-invalidations_spec.lua
│   │   │   ├── 02-schema_spec.lua
│   │   │   └── 03-decode_spec.lua
│   │   ├── 21-bot-detection/
│   │   │   ├── 01-access_spec.lua
│   │   │   ├── 02-invalidations_spec.lua
│   │   │   └── 03-api_spec.lua
│   │   ├── 23-rate-limiting/
│   │   │   ├── 01-schema_spec.lua
│   │   │   ├── 02-policies_spec.lua
│   │   │   ├── 03-api_spec.lua
│   │   │   ├── 04-access_spec.lua
│   │   │   ├── 05-integration_spec.lua
│   │   │   ├── 06-shorthand_fields_spec.lua
│   │   │   └── 07-hybrid_mode_spec.lua
│   │   ├── 24-response-rate-limiting/
│   │   │   ├── 01-schema_spec.lua
│   │   │   ├── 02-policies_spec.lua
│   │   │   ├── 03-api_spec.lua
│   │   │   ├── 04-access_spec.lua
│   │   │   ├── 05-integration_spec.lua
│   │   │   └── 06-shorthand_fields_spec.lua
│   │   ├── 25-oauth2/
│   │   │   ├── 01-schema_spec.lua
│   │   │   ├── 02-api_spec.lua
│   │   │   ├── 03-access_spec.lua
│   │   │   ├── 04-invalidations_spec.lua
│   │   │   └── 05-kdf_spec.lua
│   │   ├── 26-prometheus/
│   │   │   ├── 01-api_spec.lua
│   │   │   ├── 02-access_spec.lua
│   │   │   ├── 03-custom-serve_spec.lua
│   │   │   ├── 04-status_api_spec.lua
│   │   │   ├── 05-metrics_spec.lua
│   │   │   ├── 06-hybrid-mode_metrics_spec.lua
│   │   │   ├── 07-optional_fields_spec.lua
│   │   │   ├── 08-unit_spec.lua
│   │   │   └── 09-wasmx_spec.lua
│   │   ├── 27-aws-lambda/
│   │   │   ├── 02-schema_spec.lua
│   │   │   ├── 05-aws-serializer_spec.lua
│   │   │   ├── 06-request-util_spec.lua
│   │   │   ├── 08-sam-integration_spec.lua
│   │   │   └── 99-access_spec.lua
│   │   ├── 28-grpc-gateway/
│   │   │   └── 01-proxy_spec.lua
│   │   ├── 29-acme/
│   │   │   ├── 01-client_spec.lua
│   │   │   ├── 02-kong_storage_spec.lua
│   │   │   ├── 03-access_spec.lua
│   │   │   ├── 04-schema_spec.lua
│   │   │   ├── 05-redis_storage_spec.lua
│   │   │   ├── 06-hybrid_mode_spec.lua
│   │   │   └── 07-shorthand_fields_spec.lua
│   │   ├── 30-session/
│   │   │   ├── 01-access_spec.lua
│   │   │   ├── 02-kong_storage_adapter_spec.lua
│   │   │   └── 03-session_spec.lua
│   │   ├── 31-proxy-cache/
│   │   │   ├── 01-schema_spec.lua
│   │   │   ├── 02-access_spec.lua
│   │   │   ├── 03-api_spec.lua
│   │   │   ├── 04-invalidations_spec.lua
│   │   │   └── 05-cache_key_spec.lua
│   │   ├── 32-grpc-web/
│   │   │   └── 01-proxy_spec.lua
│   │   ├── 33-serverless-functions/
│   │   │   ├── 01-schema_spec.lua
│   │   │   ├── 02-access_spec.lua
│   │   │   ├── 03-dbless_spec.lua
│   │   │   └── 04-phases_spec.lua
│   │   ├── 34-zipkin/
│   │   │   ├── request_tags_spec.lua
│   │   │   ├── schema_spec.lua
│   │   │   ├── zipkin_no_endpoint_spec.lua
│   │   │   ├── zipkin_queue_spec.lua
│   │   │   └── zipkin_spec.lua
│   │   ├── 35-azure-functions/
│   │   │   └── 01-access_spec.lua
│   │   ├── 36-request-transformer/
│   │   │   ├── 01-schema_spec.lua
│   │   │   ├── 02-access_spec.lua
│   │   │   └── 03-api_spec.lua
│   │   ├── 37-opentelemetry/
│   │   │   ├── 01-otlp_spec.lua
│   │   │   ├── 02-schema_spec.lua
│   │   │   ├── 03-propagation_spec.lua
│   │   │   ├── 04-exporter_spec.lua
│   │   │   ├── 05-otelcol_spec.lua
│   │   │   ├── 06-regression_spec.lua
│   │   │   └── 07-utils_spec.lua
│   │   ├── 38-ai-proxy/
│   │   │   ├── 00-config_spec.lua
│   │   │   ├── 01-unit_spec.lua
│   │   │   ├── 02-openai_integration_spec.lua
│   │   │   ├── 03-anthropic_integration_spec.lua
│   │   │   ├── 04-cohere_integration_spec.lua
│   │   │   ├── 05-azure_integration_spec.lua
│   │   │   ├── 06-mistral_integration_spec.lua
│   │   │   ├── 07-llama2_integration_spec.lua
│   │   │   ├── 08-encoding_integration_spec.lua
│   │   │   ├── 09-streaming_integration_spec.lua
│   │   │   ├── 10-huggingface_integration_spec.lua
│   │   │   ├── 11-gemini_integration_spec.lua
│   │   │   ├── 12-native_unit_spec.lua
│   │   │   ├── json-schema.json
│   │   │   └── oas.yaml
│   │   ├── 39-ai-request-transformer/
│   │   │   ├── 00-config_spec.lua
│   │   │   ├── 01-transformer_spec.lua
│   │   │   └── 02-integration_spec.lua
│   │   ├── 39-reconfiguration-completion/
│   │   │   ├── 01-access_spec.lua
│   │   │   └── 02-helper_spec.lua
│   │   ├── 40-ai-response-transformer/
│   │   │   ├── 00-config_spec.lua
│   │   │   ├── 01-transformer_spec.lua
│   │   │   └── 02-integration_spec.lua
│   │   ├── 41-ai-prompt-decorator/
│   │   │   ├── 00-config_spec.lua
│   │   │   ├── 01-unit_spec.lua
│   │   │   └── 02-integration_spec.lua
│   │   ├── 42-ai-prompt-guard/
│   │   │   ├── 00-config_spec.lua
│   │   │   ├── 01-unit_spec.lua
│   │   │   └── 02-integration_spec.lua
│   │   ├── 43-ai-prompt-template/
│   │   │   ├── 01-unit_spec.lua
│   │   │   └── 02-integration_spec.lua
│   │   ├── 44-standard-webhooks/
│   │   │   ├── 01-unit_spec.lua
│   │   │   └── 02-integration_spec.lua
│   │   └── 45-redirect/
│   │       ├── 01-schema_spec.lua
│   │       ├── 02-access_spec.lua
│   │       └── 03-integration_spec.lua
│   ├── 04-perf/
│   │   ├── 01-rps/
│   │   │   ├── 01-simple_spec.lua
│   │   │   ├── 02-balancer_spec.lua
│   │   │   ├── 03-plugin_iterator_spec.lua
│   │   │   ├── 04-simple_hybrid_spec.lua
│   │   │   ├── 05-prometheus.lua
│   │   │   ├── 06-core_entities_crud_spec.lua
│   │   │   └── 07-upstream_lock_regression_spec.lua
│   │   ├── 02-flamegraph/
│   │   │   ├── 01-simple_spec.lua
│   │   │   ├── 03-plugin_iterator_spec.lua
│   │   │   ├── 05-prometheus.lua
│   │   │   └── 07-upstream_lock_regression_spec.lua
│   │   └── 99-teardown/
│   │       └── 01-teardown_spec.lua
│   ├── 05-migration/
│   │   ├── db/
│   │   │   └── migrations/
│   │   │       └── core/
│   │   │           ├── 016_280_to_300_spec.lua
│   │   │           ├── 017_300_to_310_spec.lua
│   │   │           ├── 018_310_to_320_spec.lua
│   │   │           ├── 019_320_to_330_spec.lua
│   │   │           ├── 020_330_to_340_spec.lua
│   │   │           ├── 021_340_to_350_spec.lua
│   │   │           ├── 022_350_to_360_spec.lua
│   │   │           ├── 023_360_to_370_spec.lua
│   │   │           ├── 024_380_to_390_spec.lua
│   │   │           └── 025_390_to_3100_spec.lua
│   │   └── plugins/
│   │       ├── acme/
│   │       │   └── migrations/
│   │       │       ├── 001_280_to_300_spec.lua
│   │       │       ├── 002_320_to_330_spec.lua
│   │       │       └── 003_350_to_360_spec.lua
│   │       ├── ai-proxy/
│   │       │   └── migrations/
│   │       │       └── 001_360_to_370_spec.lua
│   │       ├── http-log/
│   │       │   └── migrations/
│   │       │       └── 001_280_to_300_spec.lua
│   │       ├── key-auth/
│   │       │   └── migrations/
│   │       │       └── 004_320_to_330_spec.lua
│   │       ├── oauth2/
│   │       │   └── migrations/
│   │       │       ├── 006_320_to_330_spec.lua
│   │       │       └── 007_320_to_330_spec.lua
│   │       ├── opentelemetry/
│   │       │   └── migrations/
│   │       │       └── 001_331_to_332_spec.lua
│   │       ├── post-function/
│   │       │   └── migrations/
│   │       │       └── 001_280_to_300_spec.lua
│   │       ├── pre-function/
│   │       │   └── migrations/
│   │       │       └── 001_280_to_300_spec.lua
│   │       ├── rate-limiting/
│   │       │   └── migrations/
│   │       │       ├── 005_320_to_330_spec.lua
│   │       │       └── 006_350_to_360_spec.lua
│   │       ├── response-ratelimiting/
│   │       │   └── migrations/
│   │       │       └── 001_350_to_360_spec.lua
│   │       └── session/
│   │           └── migrations/
│   │               ├── 002_320_to_330_spec.lua
│   │               └── 003_330_to_3100_spec.lua
│   ├── 06-third-party/
│   │   └── 01-deck/
│   │       └── 01-deck-integration_spec.lua
│   ├── README.md
│   ├── busted-ci-helper.lua
│   ├── config.ld
│   ├── fixtures/
│   │   ├── 1.2_custom_nginx.template
│   │   ├── admin_api.lua
│   │   ├── ai-proxy/
│   │   │   ├── anthropic/
│   │   │   │   ├── llm-v1-chat/
│   │   │   │   │   ├── requests/
│   │   │   │   │   │   ├── bad_request.json
│   │   │   │   │   │   ├── good-stream.json
│   │   │   │   │   │   ├── good.json
│   │   │   │   │   │   └── good_own_model.json
│   │   │   │   │   └── responses/
│   │   │   │   │       ├── bad_request.json
│   │   │   │   │       ├── bad_upstream_response.json
│   │   │   │   │       ├── good.json
│   │   │   │   │       ├── internal_server_error.html
│   │   │   │   │       ├── malformed_usage_response.json
│   │   │   │   │       ├── no_usage_response.json
│   │   │   │   │       └── unauthorized.json
│   │   │   │   ├── llm-v1-completions/
│   │   │   │   │   ├── requests/
│   │   │   │   │   │   ├── bad_request.json
│   │   │   │   │   │   └── good.json
│   │   │   │   │   └── responses/
│   │   │   │   │       ├── bad_request.json
│   │   │   │   │       ├── good.json
│   │   │   │   │       └── unauthorized.json
│   │   │   │   └── request-transformer/
│   │   │   │       └── response-in-json.json
│   │   │   ├── azure/
│   │   │   │   └── request-transformer/
│   │   │   │       └── response-in-json.json
│   │   │   ├── bedrock/
│   │   │   │   └── chunks/
│   │   │   │       ├── chunk-1.txt
│   │   │   │       ├── chunk-2.txt
│   │   │   │       └── chunk-3.txt
│   │   │   ├── cohere/
│   │   │   │   ├── llm-v1-chat/
│   │   │   │   │   ├── requests/
│   │   │   │   │   │   ├── bad_request.json
│   │   │   │   │   │   ├── good-stream.json
│   │   │   │   │   │   ├── good.json
│   │   │   │   │   │   └── good_own_model.json
│   │   │   │   │   └── responses/
│   │   │   │   │       ├── bad_request.json
│   │   │   │   │       ├── bad_upstream_response.json
│   │   │   │   │       ├── good.json
│   │   │   │   │       ├── internal_server_error.html
│   │   │   │   │       └── unauthorized.json
│   │   │   │   ├── llm-v1-completions/
│   │   │   │   │   ├── requests/
│   │   │   │   │   │   ├── bad_request.json
│   │   │   │   │   │   └── good.json
│   │   │   │   │   └── responses/
│   │   │   │   │       ├── bad_request.json
│   │   │   │   │       ├── good.json
│   │   │   │   │       └── unauthorized.json
│   │   │   │   └── request-transformer/
│   │   │   │       └── response-in-json.json
│   │   │   ├── gemini/
│   │   │   │   ├── llm-v1-chat/
│   │   │   │   │   └── responses/
│   │   │   │   │       ├── fails_safety.json
│   │   │   │   │       └── good.json
│   │   │   │   └── request-transformer/
│   │   │   │       └── response-in-json.json
│   │   │   ├── huggingface/
│   │   │   │   ├── llm-v1-chat/
│   │   │   │   │   ├── requests/
│   │   │   │   │   │   └── good.json
│   │   │   │   │   └── responses/
│   │   │   │   │       ├── bad_request.json
│   │   │   │   │       ├── bad_response_model_load.json
│   │   │   │   │       ├── bad_response_timeout.json
│   │   │   │   │       ├── good.json
│   │   │   │   │       └── unauthorized.json
│   │   │   │   └── llm-v1-completions/
│   │   │   │       ├── requests/
│   │   │   │       │   └── good.json
│   │   │   │       └── responses/
│   │   │   │           ├── bad_request.json
│   │   │   │           ├── good.json
│   │   │   │           └── unauthorized.json
│   │   │   ├── json-schema.json
│   │   │   ├── llama2/
│   │   │   │   ├── ollama/
│   │   │   │   │   └── chat-stream.json
│   │   │   │   ├── raw/
│   │   │   │   │   ├── requests/
│   │   │   │   │   │   ├── good-chat.json
│   │   │   │   │   │   └── good-completions.json
│   │   │   │   │   └── responses/
│   │   │   │   │       ├── bad_request.json
│   │   │   │   │       ├── good.json
│   │   │   │   │       └── unauthorized.json
│   │   │   │   └── request-transformer/
│   │   │   │       └── response-in-json.json
│   │   │   ├── mistral/
│   │   │   │   ├── llm-v1-chat/
│   │   │   │   │   └── responses/
│   │   │   │   │       └── good.json
│   │   │   │   ├── llm-v1-completions/
│   │   │   │   │   └── responses/
│   │   │   │   │       └── good.json
│   │   │   │   └── request-transformer/
│   │   │   │       └── response-in-json.json
│   │   │   ├── native/
│   │   │   │   ├── bedrock/
│   │   │   │   │   └── request/
│   │   │   │   │       └── with-functions-and-chatter.json
│   │   │   │   ├── gemini/
│   │   │   │   │   └── request/
│   │   │   │   │       ├── basic-chat.json
│   │   │   │   │       ├── basic-multimodal.json
│   │   │   │   │       ├── with-functions-and-chatter.json
│   │   │   │   │       └── with-functions.json
│   │   │   │   └── target/
│   │   │   │       ├── target-openai-complete-stream.json
│   │   │   │       └── target-openai-complete.json
│   │   │   ├── oas.yaml
│   │   │   ├── openai/
│   │   │   │   ├── llm-v1-chat/
│   │   │   │   │   ├── requests/
│   │   │   │   │   │   ├── bad_request.json
│   │   │   │   │   │   ├── good-stream-with-functions.json
│   │   │   │   │   │   ├── good-stream.json
│   │   │   │   │   │   ├── good.json
│   │   │   │   │   │   ├── good_multi_modal.json
│   │   │   │   │   │   ├── good_own_model.json
│   │   │   │   │   │   ├── tool_choice_auto.json
│   │   │   │   │   │   ├── tool_choice_none.json
│   │   │   │   │   │   ├── tool_choice_object_function.json
│   │   │   │   │   │   └── tool_choice_required.json
│   │   │   │   │   └── responses/
│   │   │   │   │       ├── bad_request.json
│   │   │   │   │       ├── bad_upstream_response.json
│   │   │   │   │       ├── good.json
│   │   │   │   │       ├── internal_server_error.html
│   │   │   │   │       └── unauthorized.json
│   │   │   │   ├── llm-v1-completions/
│   │   │   │   │   ├── requests/
│   │   │   │   │   │   ├── bad_request.json
│   │   │   │   │   │   └── good.json
│   │   │   │   │   └── responses/
│   │   │   │   │       ├── bad_request.json
│   │   │   │   │       ├── good.json
│   │   │   │   │       └── unauthorized.json
│   │   │   │   ├── llm-v1-embeddings/
│   │   │   │   │   └── responses/
│   │   │   │   │       └── good.json
│   │   │   │   └── request-transformer/
│   │   │   │       ├── response-in-json.json
│   │   │   │       ├── response-not-json.json
│   │   │   │       ├── response-with-bad-instructions.json
│   │   │   │       └── response-with-instructions.json
│   │   │   └── unit/
│   │   │       ├── expected-requests/
│   │   │       │   ├── anthropic/
│   │   │       │   │   ├── llm-v1-chat.json
│   │   │       │   │   └── llm-v1-completions.json
│   │   │       │   ├── azure/
│   │   │       │   │   ├── llm-v1-chat.json
│   │   │       │   │   └── llm-v1-completions.json
│   │   │       │   ├── bedrock/
│   │   │       │   │   └── llm-v1-chat.json
│   │   │       │   ├── cohere/
│   │   │       │   │   ├── llm-v1-chat.json
│   │   │       │   │   └── llm-v1-completions.json
│   │   │       │   ├── gemini/
│   │   │       │   │   └── llm-v1-chat.json
│   │   │       │   ├── llama2/
│   │   │       │   │   ├── ollama/
│   │   │       │   │   │   ├── llm-v1-chat.json
│   │   │       │   │   │   └── llm-v1-completions.json
│   │   │       │   │   └── raw/
│   │   │       │   │       ├── llm-v1-chat.json
│   │   │       │   │       └── llm-v1-completions.json
│   │   │       │   ├── mistral/
│   │   │       │   │   ├── ollama/
│   │   │       │   │   │   └── llm-v1-chat.json
│   │   │       │   │   └── openai/
│   │   │       │   │       └── llm-v1-chat.json
│   │   │       │   └── openai/
│   │   │       │       ├── llm-v1-chat.json
│   │   │       │       └── llm-v1-completions.json
│   │   │       ├── expected-responses/
│   │   │       │   ├── anthropic/
│   │   │       │   │   ├── llm-v1-chat.json
│   │   │       │   │   └── llm-v1-completions.json
│   │   │       │   ├── azure/
│   │   │       │   │   ├── llm-v1-chat.json
│   │   │       │   │   └── llm-v1-completions.json
│   │   │       │   ├── bedrock/
│   │   │       │   │   └── llm-v1-chat.json
│   │   │       │   ├── cohere/
│   │   │       │   │   ├── llm-v1-chat.json
│   │   │       │   │   └── llm-v1-completions.json
│   │   │       │   ├── gemini/
│   │   │       │   │   └── llm-v1-chat.json
│   │   │       │   ├── llama2/
│   │   │       │   │   ├── ollama/
│   │   │       │   │   │   ├── llm-v1-chat.json
│   │   │       │   │   │   └── llm-v1-completions.json
│   │   │       │   │   └── raw/
│   │   │       │   │       ├── llm-v1-chat.json
│   │   │       │   │       └── llm-v1-completions.json
│   │   │       │   ├── mistral/
│   │   │       │   │   ├── ollama/
│   │   │       │   │   │   └── llm-v1-chat.json
│   │   │       │   │   └── openai/
│   │   │       │   │       └── llm-v1-chat.json
│   │   │       │   └── openai/
│   │   │       │       ├── llm-v1-chat.json
│   │   │       │       └── llm-v1-completions.json
│   │   │       ├── real-responses/
│   │   │       │   ├── anthropic/
│   │   │       │   │   ├── llm-v1-chat.json
│   │   │       │   │   └── llm-v1-completions.json
│   │   │       │   ├── azure/
│   │   │       │   │   ├── llm-v1-chat.json
│   │   │       │   │   └── llm-v1-completions.json
│   │   │       │   ├── bedrock/
│   │   │       │   │   └── llm-v1-chat.json
│   │   │       │   ├── cohere/
│   │   │       │   │   ├── llm-v1-chat.json
│   │   │       │   │   └── llm-v1-completions.json
│   │   │       │   ├── gemini/
│   │   │       │   │   └── llm-v1-chat.json
│   │   │       │   ├── llama2/
│   │   │       │   │   ├── ollama/
│   │   │       │   │   │   ├── llm-v1-chat.json
│   │   │       │   │   │   └── llm-v1-completions.json
│   │   │       │   │   └── raw/
│   │   │       │   │       ├── llm-v1-chat.json
│   │   │       │   │       └── llm-v1-completions.json
│   │   │       │   ├── mistral/
│   │   │       │   │   ├── ollama/
│   │   │       │   │   │   └── llm-v1-chat.json
│   │   │       │   │   └── openai/
│   │   │       │   │       └── llm-v1-chat.json
│   │   │       │   └── openai/
│   │   │       │       ├── llm-v1-chat.json
│   │   │       │       └── llm-v1-completions.json
│   │   │       ├── real-stream-frames/
│   │   │       │   ├── cohere/
│   │   │       │   │   ├── llm-v1-chat.txt
│   │   │       │   │   └── llm-v1-completions.txt
│   │   │       │   └── openai/
│   │   │       │       ├── llm-v1-chat.txt
│   │   │       │       └── llm-v1-completions.txt
│   │   │       ├── requests/
│   │   │       │   ├── llm-v1-chat.json
│   │   │       │   ├── llm-v1-completion-template.json
│   │   │       │   └── llm-v1-completions.json
│   │   │       └── streaming-chunk-formats/
│   │   │           ├── aws/
│   │   │           │   └── expected-output.json
│   │   │           ├── complete-json/
│   │   │           │   └── expected-output.json
│   │   │           ├── partial-json-beginning/
│   │   │           │   └── expected-output.json
│   │   │           ├── partial-json-end/
│   │   │           │   └── expected-output.json
│   │   │           └── text-event-stream/
│   │   │               └── expected-output.json
│   │   ├── aws-lambda.lua
│   │   ├── aws-sam.lua
│   │   ├── balancer_utils.lua
│   │   ├── blueprints.lua
│   │   ├── burst.yml
│   │   ├── custom_nginx.template
│   │   ├── custom_plugins/
│   │   │   └── kong/
│   │   │       └── plugins/
│   │   │           ├── admin-api-method/
│   │   │           │   ├── api.lua
│   │   │           │   ├── handler.lua
│   │   │           │   ├── schema.lua
│   │   │           │   └── status_api.lua
│   │   │           ├── api-override/
│   │   │           │   ├── api.lua
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── cache/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── cache-key-vs-endpoint-key/
│   │   │           │   ├── daos.lua
│   │   │           │   ├── handler.lua
│   │   │           │   ├── migrations/
│   │   │           │   │   ├── 000_base_cache_key_vs_endpoint_key.lua
│   │   │           │   │   └── init.lua
│   │   │           │   └── schema.lua
│   │   │           ├── cluster-error-reporting/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── ctx-checker/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── ctx-checker-last/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── ctx-tests/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── ctx-tests-response/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── dns-client-test/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── dummy/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── enable-buffering/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── enable-buffering-response/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── error-generator/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── error-generator-last/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── error-handler-log/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── fail-once-auth/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── foreign-entity/
│   │   │           │   ├── api.lua
│   │   │           │   ├── daos.lua
│   │   │           │   ├── handler.lua
│   │   │           │   ├── migrations/
│   │   │           │   │   ├── 000_base_foreign_entity.lua
│   │   │           │   │   └── init.lua
│   │   │           │   └── schema.lua
│   │   │           ├── get-plugin-id/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── init-worker-lua-error/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── invalid-schema/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── invalidations/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── logger/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── logger-last/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── max-args/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── muti-external-http-calls/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── older-version/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── pdk-logger/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── plugin-config-dump/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── plugin-with-custom-dao/
│   │   │           │   ├── custom_dao.lua
│   │   │           │   ├── daos.lua
│   │   │           │   ├── handler.lua
│   │   │           │   ├── schema.lua
│   │   │           │   └── strategies/
│   │   │           │       └── postgres/
│   │   │           │           └── custom_dao.lua
│   │   │           ├── preserve-nulls/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── reconfiguration-completion/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── redis-dummy/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── reference-ca-cert/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── reports-api/
│   │   │           │   ├── api.lua
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── request-aware-table/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── response-phase/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rewriter/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rpc-batch-test/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rpc-concentrator-test/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rpc-debug/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rpc-error-test/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rpc-get-delta-test/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rpc-hello-test/
│   │   │           │   ├── api.lua
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rpc-notification-test/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rpc-notify-new-version-test/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── rpc-validation-test/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── secret-response/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── short-circuit/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── slow-query/
│   │   │           │   ├── api.lua
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── stream-api-echo/
│   │   │           │   ├── api.lua
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── tcp-trace-exporter/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── transformations/
│   │   │           │   ├── daos.lua
│   │   │           │   ├── handler.lua
│   │   │           │   ├── migrations/
│   │   │           │   │   ├── 000_base_transformations.lua
│   │   │           │   │   └── init.lua
│   │   │           │   └── schema.lua
│   │   │           ├── translate-backwards-older-plugin/
│   │   │           │   ├── handler.lua
│   │   │           │   └── schema.lua
│   │   │           ├── unique-foreign/
│   │   │           │   ├── daos.lua
│   │   │           │   ├── handler.lua
│   │   │           │   ├── migrations/
│   │   │           │   │   ├── 000_base_unique_foreign.lua
│   │   │           │   │   └── init.lua
│   │   │           │   └── schema.lua
│   │   │           ├── with-migrations/
│   │   │           │   ├── daos.lua
│   │   │           │   ├── handler.lua
│   │   │           │   ├── migrations/
│   │   │           │   │   ├── 000_base_with_migrations.lua
│   │   │           │   │   ├── 001_14_to_15.lua
│   │   │           │   │   └── init.lua
│   │   │           │   └── schema.lua
│   │   │           └── worker-events/
│   │   │               ├── handler.lua
│   │   │               └── schema.lua
│   │   ├── custom_vaults/
│   │   │   └── kong/
│   │   │       └── vaults/
│   │   │           ├── echo/
│   │   │           │   ├── init.lua
│   │   │           │   └── schema.lua
│   │   │           ├── mock/
│   │   │           │   ├── init.lua
│   │   │           │   └── schema.lua
│   │   │           ├── mocksocket/
│   │   │           │   ├── init.lua
│   │   │           │   └── schema.lua
│   │   │           ├── random/
│   │   │           │   ├── init.lua
│   │   │           │   └── schema.lua
│   │   │           └── test/
│   │   │               ├── init.lua
│   │   │               └── schema.lua
│   │   ├── dc_blueprints.lua
│   │   ├── default_status_listen.conf
│   │   ├── dump_lmdb_key.lua
│   │   ├── error_templates/
│   │   │   ├── error_template.html
│   │   │   ├── error_template.json
│   │   │   ├── error_template.plain
│   │   │   └── error_template.xml
│   │   ├── external_plugins/
│   │   │   ├── go/
│   │   │   │   ├── go-hello.go
│   │   │   │   ├── go.mod
│   │   │   │   └── go.sum
│   │   │   ├── js/
│   │   │   │   └── js-hello.js
│   │   │   └── py/
│   │   │       ├── py-hello.py
│   │   │       └── requirements.txt
│   │   ├── factories/
│   │   │   └── plugins.lua
│   │   ├── forward-proxy-server.lua
│   │   ├── grpc/
│   │   │   ├── direct_imports.proto
│   │   │   ├── google/
│   │   │   │   ├── api/
│   │   │   │   │   ├── annotations.proto
│   │   │   │   │   ├── http.proto
│   │   │   │   │   └── httpbody.proto
│   │   │   │   └── protobuf/
│   │   │   │       ├── any.proto
│   │   │   │       ├── api.proto
│   │   │   │       ├── descriptor.proto
│   │   │   │       ├── duration.proto
│   │   │   │       ├── empty.proto
│   │   │   │       ├── field_mask.proto
│   │   │   │       ├── source_context.proto
│   │   │   │       ├── struct.proto
│   │   │   │       ├── timestamp.proto
│   │   │   │       ├── type.proto
│   │   │   │       └── wrappers.proto
│   │   │   ├── hello.proto
│   │   │   ├── helloworld.proto
│   │   │   ├── second_level_imports.proto
│   │   │   ├── target/
│   │   │   │   ├── go.mod
│   │   │   │   ├── go.sum
│   │   │   │   ├── grpc-target.go
│   │   │   │   └── targetservice/
│   │   │   │       ├── targetservice.pb.go
│   │   │   │       └── targetservice_grpc.pb.go
│   │   │   └── targetservice.proto
│   │   ├── headers.conf
│   │   ├── hosts
│   │   ├── https_server.lua
│   │   ├── invalid-module.lua
│   │   ├── invalid.conf
│   │   ├── invalid_nginx_directives.conf
│   │   ├── kong_clustering.crt
│   │   ├── kong_clustering.key
│   │   ├── kong_clustering_ca.crt
│   │   ├── kong_clustering_client.crt
│   │   ├── kong_clustering_client.key
│   │   ├── kong_spec.crt
│   │   ├── kong_spec.key
│   │   ├── migrations/
│   │   │   └── kong/
│   │   │       └── db/
│   │   │           └── migrations/
│   │   │               └── core/
│   │   │                   ├── 000_base.lua
│   │   │                   ├── 001_14_to_15.lua
│   │   │                   └── init.lua
│   │   ├── mock_cp.lua
│   │   ├── mock_upstream.lua
│   │   ├── mock_webserver_tpl.lua
│   │   ├── mocker.lua
│   │   ├── mocks/
│   │   │   ├── lua-resty-dns/
│   │   │   │   └── resty/
│   │   │   │       └── dns/
│   │   │   │           └── resolver.lua
│   │   │   └── lua-resty-websocket/
│   │   │       └── resty/
│   │   │           └── websocket/
│   │   │               └── peer.lua
│   │   ├── mtls_certs/
│   │   │   ├── ca.crt
│   │   │   ├── ca.key
│   │   │   ├── example.com.crt
│   │   │   ├── example.com.key
│   │   │   ├── example2.com.crt
│   │   │   └── example2.com.key
│   │   ├── nginx-directives.conf
│   │   ├── ocsp_certs/
│   │   │   ├── ca-chain.crt
│   │   │   ├── ca.crt
│   │   │   ├── index.txt
│   │   │   ├── index.txt.revoked
│   │   │   ├── kong_clustering.crt
│   │   │   ├── kong_clustering.key
│   │   │   ├── kong_data_plane.crt
│   │   │   ├── kong_data_plane.key
│   │   │   ├── ocsp.crt
│   │   │   └── ocsp.key
│   │   ├── opentelemetry/
│   │   │   └── otelcol.yaml
│   │   ├── perf/
│   │   │   ├── 500services-each-4-routes.sql
│   │   │   ├── charts/
│   │   │   │   ├── test_data1.json
│   │   │   │   └── test_data2.json
│   │   │   └── terraform/
│   │   │       ├── aws-ec2/
│   │   │       │   ├── .gitignore
│   │   │       │   ├── ec2.tf
│   │   │       │   ├── main.tf
│   │   │       │   ├── output.tf
│   │   │       │   ├── ssh.tf
│   │   │       │   └── variables.tf
│   │   │       ├── bring-your-own/
│   │   │       │   ├── main.tf
│   │   │       │   ├── output.tf
│   │   │       │   ├── ssh.tf
│   │   │       │   └── variables.tf
│   │   │       ├── digitalocean/
│   │   │       │   ├── .gitignore
│   │   │       │   ├── droplets.tf
│   │   │       │   ├── main.tf
│   │   │       │   ├── output.tf
│   │   │       │   ├── project.tf
│   │   │       │   ├── ssh.tf
│   │   │       │   └── variables.tf
│   │   │       └── equinix-metal/
│   │   │           ├── .gitignore
│   │   │           ├── README.md
│   │   │           ├── main.tf
│   │   │           ├── metal.tf
│   │   │           ├── output.tf
│   │   │           ├── scripts/
│   │   │           │   └── wrk.lua
│   │   │           ├── ssh.tf
│   │   │           ├── tls.tf
│   │   │           └── variables.tf
│   │   ├── prometheus/
│   │   │   └── metrics.conf
│   │   ├── proxy_wasm_filters/
│   │   │   ├── Cargo.toml
│   │   │   ├── response_transformer/
│   │   │   │   ├── Cargo.toml
│   │   │   │   └── src/
│   │   │   │       ├── filter.rs
│   │   │   │       └── types.rs
│   │   │   └── tests/
│   │   │       ├── Cargo.toml
│   │   │       └── src/
│   │   │           ├── filter.rs
│   │   │           ├── metrics.rs
│   │   │           ├── routines.rs
│   │   │           ├── test_cases.rs
│   │   │           ├── test_http.rs
│   │   │           └── types.rs
│   │   ├── redis/
│   │   │   ├── ca.crt
│   │   │   ├── ca.key
│   │   │   ├── docker-entrypoint.sh
│   │   │   ├── server.crt
│   │   │   └── server.key
│   │   ├── reload.conf
│   │   ├── router_path_handling_tests.lua
│   │   ├── sam-app/
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── __init__.py
│   │   │   ├── events/
│   │   │   │   └── event.json
│   │   │   ├── hello_world/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── app.py
│   │   │   │   └── requirements.txt
│   │   │   ├── template.yaml
│   │   │   └── tests/
│   │   │       ├── __init__.py
│   │   │       ├── integration/
│   │   │       │   ├── __init__.py
│   │   │       │   └── test_api_gateway.py
│   │   │       ├── requirements.txt
│   │   │       └── unit/
│   │   │           ├── __init__.py
│   │   │           └── test_handler.py
│   │   ├── shared_dict.lua
│   │   ├── shm-stub.lua
│   │   ├── ssl.lua
│   │   ├── stress_generator.lua
│   │   ├── template_inject/
│   │   │   ├── nginx_kong_test_custom_inject_http.lua
│   │   │   ├── nginx_kong_test_custom_inject_stream.lua
│   │   │   └── nginx_kong_test_tcp_echo_server_custom_inject_stream.lua
│   │   ├── to-strip.conf
│   │   └── valid-module.lua
│   ├── helpers/
│   │   ├── dns.lua
│   │   ├── http_mock/
│   │   │   ├── asserts.lua
│   │   │   ├── clients.lua
│   │   │   ├── debug_port.lua
│   │   │   ├── nginx_instance.lua
│   │   │   ├── tapping.lua
│   │   │   └── template.lua
│   │   ├── http_mock.lua
│   │   ├── perf/
│   │   │   ├── charts/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── charts.py
│   │   │   │   └── requirements.txt
│   │   │   ├── charts.lua
│   │   │   ├── drivers/
│   │   │   │   ├── docker.lua
│   │   │   │   └── terraform.lua
│   │   │   ├── git.lua
│   │   │   ├── logger.lua
│   │   │   └── utils.lua
│   │   ├── perf.lua
│   │   ├── redis_helper.lua
│   │   ├── rpc_mock/
│   │   │   ├── cp.lua
│   │   │   ├── default.lua
│   │   │   ├── dp.lua
│   │   │   ├── readme.md
│   │   │   └── setup.lua
│   │   └── wait.lua
│   ├── helpers.lua
│   ├── hybrid.lua
│   ├── internal/
│   │   ├── asserts.lua
│   │   ├── client.lua
│   │   ├── cmd.lua
│   │   ├── conf.lua
│   │   ├── constants.lua
│   │   ├── db.lua
│   │   ├── dns.lua
│   │   ├── grpc.lua
│   │   ├── misc.lua
│   │   ├── module.lua
│   │   ├── pid.lua
│   │   ├── server.lua
│   │   ├── shell.lua
│   │   ├── ssl.lua
│   │   ├── sys.lua
│   │   └── wait.lua
│   ├── kong_tests.conf
│   ├── ldoc.css
│   ├── on_demand_specs
│   ├── renderdocs.sh
│   ├── require.lua
│   └── upgrade_helpers.lua
└── t/
    ├── 01-pdk/
    │   ├── 01-table.t
    │   ├── 02-log/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-sanity.t
    │   │   ├── 02-new.t
    │   │   ├── 03-set_format.t
    │   │   ├── 04-inspect.t
    │   │   ├── 05-set_serialize_value.t
    │   │   └── 06-deprecation.t
    │   ├── 03-ip/
    │   │   └── 01-is_trusted.t
    │   ├── 04-request/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-get_scheme.t
    │   │   ├── 02-get_host.t
    │   │   ├── 03-get_port.t
    │   │   ├── 04-get_forwarded_scheme.t
    │   │   ├── 05-get_forwarded_host.t
    │   │   ├── 06-get_forwarded_port.t
    │   │   ├── 07-get_http_version.t
    │   │   ├── 08-get_method.t
    │   │   ├── 09-get_path.t
    │   │   ├── 10-get_raw_query.t
    │   │   ├── 11-get_query_arg.t
    │   │   ├── 12-get_query.t
    │   │   ├── 13-get_header.t
    │   │   ├── 14-get_headers.t
    │   │   ├── 15-get_raw_body.t
    │   │   ├── 16-get_body.t
    │   │   ├── 17-get_path_with_query.t
    │   │   ├── 18-get_forwarded_path.t
    │   │   ├── 19-get_forwarded_prefix.t
    │   │   ├── 20-get_raw_path.t
    │   │   ├── 20-get_start_time.t
    │   │   └── 21-get_uri_captures.t
    │   ├── 05-client/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-get_ip.t
    │   │   ├── 02-get_forwarded_ip.t
    │   │   ├── 03-get_port.t
    │   │   ├── 04-get_forwarded_port.t
    │   │   ├── 05-get_credential.t
    │   │   ├── 06-get_consumer.t
    │   │   ├── 07-authenticate.t
    │   │   ├── 08-get_protocol.t
    │   │   └── 09-load-consumer.t
    │   ├── 06-service-request/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-set_scheme.t
    │   │   ├── 04-set_path.t
    │   │   ├── 05-set_raw_query.t
    │   │   ├── 06-set_method.t
    │   │   ├── 07-set_body.t
    │   │   ├── 08-set_query.t
    │   │   ├── 09-set_header.t
    │   │   ├── 10-add_header.t
    │   │   ├── 11-clear_header.t
    │   │   ├── 12-set_headers.t
    │   │   ├── 13-set_raw_body.t
    │   │   └── 14-clear_query_arg.t
    │   ├── 07-service-response/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-get_status.t
    │   │   ├── 02-get_headers.t
    │   │   ├── 03-get_header.t
    │   │   ├── 04-get_raw_body.t
    │   │   └── 05-get_body.t
    │   ├── 08-response/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-get_status.t
    │   │   ├── 02-get_header.t
    │   │   ├── 03-get_headers.t
    │   │   ├── 04-set_status.t
    │   │   ├── 05-set_header.t
    │   │   ├── 06-add_header.t
    │   │   ├── 07-clear_header.t
    │   │   ├── 08-set_headers.t
    │   │   ├── 09-set_raw_body.t
    │   │   ├── 10-set_body.t
    │   │   ├── 11-exit.t
    │   │   ├── 12-get_source.t
    │   │   ├── 13-error.t
    │   │   └── 14-get_raw_body.t
    │   ├── 09-service/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-set-upstream.t
    │   │   ├── 02-set-target.t
    │   │   ├── 03-set-tls-cert-key.t
    │   │   ├── 04-set-retries.t
    │   │   └── 05-set-timeouts.t
    │   ├── 10-nginx/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-get_subsystem.t
    │   │   └── 02-get_statistics.t
    │   ├── 11-ctx.t
    │   ├── 12-node/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-get_id.t
    │   │   ├── 02-get_memory_stats.t
    │   │   └── 03-get_hostname.t
    │   ├── 13-router/
    │   │   ├── 00-phase_checks.t
    │   │   ├── 01-get_route.t
    │   │   └── 02-get_service.t
    │   ├── 14-client-tls/
    │   │   ├── 00-phase_checks.t
    │   │   └── 01-request_client_certificate.t
    │   ├── 15-tracing/
    │   │   └── 01-context.t
    │   └── 16-rl-ctx.t
    ├── 02-global/
    │   ├── 01-init-pdk.t
    │   ├── 02-set-named-ctx.t
    │   └── 03-namespaced_log.t
    ├── 03-dns-client/
    │   ├── 00-sanity.t
    │   ├── 01-phases.t
    │   └── 02-timer-usage.t
    ├── 04-patch/
    │   ├── 01-ngx-buf-double-free.t
    │   ├── 02-ngx-read-body-block.t
    │   ├── 03-fix-ngx-send-header-filter-finalize-ctx.t
    │   ├── 04-fix-ngx-recreate-request-work-for-body.t
    │   └── 05-ngx-refresh-upstream-uri-when-balancer-retry.t
    ├── 05-mlcache/
    │   ├── 00-ipc.t
    │   ├── 01-new.t
    │   ├── 02-get.t
    │   ├── 03-peek.t
    │   ├── 04-update.t
    │   ├── 05-set.t
    │   ├── 06-delete.t
    │   ├── 07-l1_serializer.t
    │   ├── 08-purge.t
    │   ├── 09-isolation.t
    │   ├── 10-ipc_shm.t
    │   ├── 11-locks_shm.t
    │   ├── 12-resurrect-stale.t
    │   ├── 13-get_bulk.t
    │   ├── 14-bulk-and-res.t
    │   └── 15-renew.t
    ├── Util.pm
    ├── certs/
    │   ├── ca.crt
    │   ├── ca.key
    │   ├── client_example.com.crt
    │   ├── client_example.com.key
    │   ├── intermediate.crt
    │   ├── intermediate.key
    │   ├── test.crt
    │   └── test.key
    ├── pdk.luacov
    └── phase_checks.luacov
Download .txt
SYMBOL INDEX (231 symbols across 23 files)

FILE: scripts/explain_manifest/config.py
  function transform (line 10) | def transform(f: FileInfo):

FILE: scripts/explain_manifest/expect.py
  function glob_match_ignore_slash (line 17) | def glob_match_ignore_slash(path, globs):
  function write_color (line 28) | def write_color(color):
  function write_block_desc (line 51) | def write_block_desc(desc_verb):
  class ExpectSuite (line 66) | class ExpectSuite():
    method __init__ (line 67) | def __init__(self, name, manifest, use_rpath=False, tests={}):
  class ExpectChain (line 74) | class ExpectChain():
    method __init__ (line 75) | def __init__(self, infos):
    method _reset (line 83) | def _reset(self):
    method _ctx_info (line 93) | def _ctx_info(self):
    method _log (line 100) | def _log(self, *args):
    method _print_title (line 105) | def _print_title(self):
    method _print_fail (line 112) | def _print_fail(self, msg):
    method _print_ok (line 118) | def _print_ok(self, msg):
    method _print_error (line 122) | def _print_error(self, msg):
    method _print_result (line 125) | def _print_result(self):
    method _print_all_fails (line 136) | def _print_all_fails(self):
    method _compare (line 145) | def _compare(self, attr, fn):
    method _exist (line 171) | def _exist(self):
    method _equal (line 181) | def _equal(self, attr, expect):
    method _match (line 184) | def _match(self, attr, expect):
    method _less_than (line 189) | def _less_than(self, attr, expect):
    method _greater_than (line 198) | def _greater_than(self, attr, expect):
    method _contain (line 207) | def _contain(self, attr, expect):
    method _contain_match (line 225) | def _contain_match(self, attr, expect):
    method to (line 239) | def to(self):
    method expect (line 243) | def expect(self, path_glob, msg):
    method do_not (line 260) | def do_not(self):
    method does_not (line 264) | def does_not(self):
    method is_not (line 267) | def is_not(self):
    method key (line 271) | def key(self, key):
    method exist (line 275) | def exist(self):
    method exists (line 278) | def exists(self):
    method __getattr__ (line 281) | def __getattr__(self, name):
    method compare_manifest (line 317) | def compare_manifest(self, suite: ExpectSuite, manifest: str):
    method run (line 333) | def run(self, suite: ExpectSuite):
    method get_last_macthes (line 342) | def get_last_macthes(self):

FILE: scripts/explain_manifest/explain.py
  function lazy_evaluate_cache (line 13) | def lazy_evaluate_cache():
  class ExplainOpts (line 26) | class ExplainOpts():
    method from_args (line 39) | def from_args(this, args):
  class FileInfo (line 52) | class FileInfo():
    method __init__ (line 53) | def __init__(self, path, relpath):
    method __getattr__ (line 80) | def __getattr__(self, name):
    method explain (line 94) | def explain(self, opts: ExplainOpts):
  class ElfFileInfo (line 112) | class ElfFileInfo(FileInfo):
    method __init__ (line 113) | def __init__(self, path, relpath):
    method explain (line 165) | def explain(self, opts: ExplainOpts):
  class NginxInfo (line 192) | class NginxInfo(ElfFileInfo):
    method __init__ (line 193) | def __init__(self, path, relpath):
    method explain (line 239) | def explain(self, opts: ExplainOpts):

FILE: scripts/explain_manifest/main.py
  function parse_args (line 22) | def parse_args():
  function read_glob (line 56) | def read_glob(path: str):
  function gather_files (line 63) | def gather_files(path: str, image: str):
  function walk_files (line 108) | def walk_files(path: str, globs: List[str]):
  function write_manifest (line 137) | def write_manifest(title: str, results: List[FileInfo], globs: List[str]...

FILE: scripts/explain_manifest/suites.py
  function read_requirements (line 16) | def read_requirements(path=None):
  function common_suites (line 24) | def common_suites(expect, libxcrypt_no_obsolete_api: bool = False, skip_...
  function libc_libcpp_suites (line 116) | def libc_libcpp_suites(expect, libc_max_version: str = None, libcxx_max_...
  function arm64_suites (line 133) | def arm64_suites(expect):
  function docker_suites (line 140) | def docker_suites(expect):

FILE: spec/fixtures/external_plugins/go/go-hello.go
  type Config (line 13) | type Config struct
    method Access (line 25) | func (conf Config) Access(kong *pdk.PDK) {
    method Log (line 38) | func (conf Config) Log(kong *pdk.PDK) {
    method Response (line 72) | func (conf Config) Response(kong *pdk.PDK) {
  function New (line 17) | func New() interface{} {
  function main (line 21) | func main() {

FILE: spec/fixtures/external_plugins/js/js-hello.js
  class KongPlugin (line 5) | class KongPlugin {
    method constructor (line 6) | constructor(config) {
    method access (line 10) | async access(kong) {

FILE: spec/fixtures/external_plugins/py/py-hello.py
  class Plugin (line 14) | class Plugin(object):
    method __init__ (line 15) | def __init__(self, config):
    method access (line 18) | def access(self, kong: kong.kong):

FILE: spec/fixtures/grpc/target/grpc-target.go
  constant port (line 17) | port = ":15010"
  type server (line 20) | type server struct
    method SayHello (line 24) | func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*...
    method BounceIt (line 31) | func (s *server) BounceIt(ctx context.Context, in *pb.BallIn) (*pb.Bal...
    method GrowTail (line 46) | func (s *server) GrowTail(ctx context.Context, in *pb.Body) (*pb.Body,...
    method Echo (line 52) | func (s *server) Echo(ctx context.Context, in *pb.EchoMsg) (*pb.EchoMs...
  function main (line 56) | func main() {

FILE: spec/fixtures/grpc/target/targetservice/targetservice.pb.go
  constant _ (line 20) | _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
  constant _ (line 22) | _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
  type HelloRequest (line 25) | type HelloRequest struct
    method Reset (line 34) | func (x *HelloRequest) Reset() {
    method String (line 43) | func (x *HelloRequest) String() string {
    method ProtoMessage (line 47) | func (*HelloRequest) ProtoMessage() {}
    method ProtoReflect (line 49) | func (x *HelloRequest) ProtoReflect() protoreflect.Message {
    method Descriptor (line 62) | func (*HelloRequest) Descriptor() ([]byte, []int) {
    method GetGreeting (line 66) | func (x *HelloRequest) GetGreeting() string {
    method GetBooleanTest (line 73) | func (x *HelloRequest) GetBooleanTest() bool {
  type HelloResponse (line 80) | type HelloResponse struct
    method Reset (line 89) | func (x *HelloResponse) Reset() {
    method String (line 98) | func (x *HelloResponse) String() string {
    method ProtoMessage (line 102) | func (*HelloResponse) ProtoMessage() {}
    method ProtoReflect (line 104) | func (x *HelloResponse) ProtoReflect() protoreflect.Message {
    method Descriptor (line 117) | func (*HelloResponse) Descriptor() ([]byte, []int) {
    method GetReply (line 121) | func (x *HelloResponse) GetReply() string {
    method GetBooleanTest (line 128) | func (x *HelloResponse) GetBooleanTest() bool {
  type BallIn (line 135) | type BallIn struct
    method Reset (line 145) | func (x *BallIn) Reset() {
    method String (line 154) | func (x *BallIn) String() string {
    method ProtoMessage (line 158) | func (*BallIn) ProtoMessage() {}
    method ProtoReflect (line 160) | func (x *BallIn) ProtoReflect() protoreflect.Message {
    method Descriptor (line 173) | func (*BallIn) Descriptor() ([]byte, []int) {
    method GetMessage (line 177) | func (x *BallIn) GetMessage() string {
    method GetWhen (line 184) | func (x *BallIn) GetWhen() *timestamp.Timestamp {
    method GetNow (line 191) | func (x *BallIn) GetNow() *timestamp.Timestamp {
  type BallOut (line 198) | type BallOut struct
    method Reset (line 208) | func (x *BallOut) Reset() {
    method String (line 217) | func (x *BallOut) String() string {
    method ProtoMessage (line 221) | func (*BallOut) ProtoMessage() {}
    method ProtoReflect (line 223) | func (x *BallOut) ProtoReflect() protoreflect.Message {
    method Descriptor (line 236) | func (*BallOut) Descriptor() ([]byte, []int) {
    method GetReply (line 240) | func (x *BallOut) GetReply() string {
    method GetTimeMessage (line 247) | func (x *BallOut) GetTimeMessage() string {
    method GetNow (line 254) | func (x *BallOut) GetNow() *timestamp.Timestamp {
  type Limb (line 261) | type Limb struct
    method Reset (line 270) | func (x *Limb) Reset() {
    method String (line 279) | func (x *Limb) String() string {
    method ProtoMessage (line 283) | func (*Limb) ProtoMessage() {}
    method ProtoReflect (line 285) | func (x *Limb) ProtoReflect() protoreflect.Message {
    method Descriptor (line 298) | func (*Limb) Descriptor() ([]byte, []int) {
    method GetCount (line 302) | func (x *Limb) GetCount() int32 {
    method GetEndings (line 309) | func (x *Limb) GetEndings() string {
  type Body (line 316) | type Body struct
    method Reset (line 327) | func (x *Body) Reset() {
    method String (line 336) | func (x *Body) String() string {
    method ProtoMessage (line 340) | func (*Body) ProtoMessage() {}
    method ProtoReflect (line 342) | func (x *Body) ProtoReflect() protoreflect.Message {
    method Descriptor (line 355) | func (*Body) Descriptor() ([]byte, []int) {
    method GetName (line 359) | func (x *Body) GetName() string {
    method GetHands (line 366) | func (x *Body) GetHands() *Limb {
    method GetLegs (line 373) | func (x *Body) GetLegs() *Limb {
    method GetTail (line 380) | func (x *Body) GetTail() *Limb {
  type EchoMsg (line 387) | type EchoMsg struct
    method Reset (line 396) | func (x *EchoMsg) Reset() {
    method String (line 405) | func (x *EchoMsg) String() string {
    method ProtoMessage (line 409) | func (*EchoMsg) ProtoMessage() {}
    method ProtoReflect (line 411) | func (x *EchoMsg) ProtoReflect() protoreflect.Message {
    method Descriptor (line 424) | func (*EchoMsg) Descriptor() ([]byte, []int) {
    method GetArray (line 428) | func (x *EchoMsg) GetArray() []string {
    method GetNullable (line 435) | func (x *EchoMsg) GetNullable() string {
  function file_targetservice_proto_rawDescGZIP (line 534) | func file_targetservice_proto_rawDescGZIP() []byte {
  function init (line 576) | func init() { file_targetservice_proto_init() }
  function file_targetservice_proto_init (line 577) | func file_targetservice_proto_init() {

FILE: spec/fixtures/grpc/target/targetservice/targetservice_grpc.pb.go
  constant _ (line 19) | _ = grpc.SupportPackageIsVersion7
  type BouncerClient (line 24) | type BouncerClient interface
  type bouncerClient (line 33) | type bouncerClient struct
    method SayHello (line 41) | func (c *bouncerClient) SayHello(ctx context.Context, in *HelloRequest...
    method UnknownMethod (line 50) | func (c *bouncerClient) UnknownMethod(ctx context.Context, in *HelloRe...
    method BounceIt (line 59) | func (c *bouncerClient) BounceIt(ctx context.Context, in *BallIn, opts...
    method GrowTail (line 68) | func (c *bouncerClient) GrowTail(ctx context.Context, in *Body, opts ....
    method Echo (line 77) | func (c *bouncerClient) Echo(ctx context.Context, in *EchoMsg, opts .....
  function NewBouncerClient (line 37) | func NewBouncerClient(cc grpc.ClientConnInterface) BouncerClient {
  type BouncerServer (line 89) | type BouncerServer interface
  type UnimplementedBouncerServer (line 100) | type UnimplementedBouncerServer struct
    method SayHello (line 103) | func (UnimplementedBouncerServer) SayHello(context.Context, *HelloRequ...
    method UnknownMethod (line 106) | func (UnimplementedBouncerServer) UnknownMethod(context.Context, *Hell...
    method BounceIt (line 109) | func (UnimplementedBouncerServer) BounceIt(context.Context, *BallIn) (...
    method GrowTail (line 112) | func (UnimplementedBouncerServer) GrowTail(context.Context, *Body) (*B...
    method Echo (line 115) | func (UnimplementedBouncerServer) Echo(context.Context, *EchoMsg) (*Ec...
    method mustEmbedUnimplementedBouncerServer (line 118) | func (UnimplementedBouncerServer) mustEmbedUnimplementedBouncerServer(...
  type UnsafeBouncerServer (line 123) | type UnsafeBouncerServer interface
  function RegisterBouncerServer (line 127) | func RegisterBouncerServer(s grpc.ServiceRegistrar, srv BouncerServer) {
  function _Bouncer_SayHello_Handler (line 131) | func _Bouncer_SayHello_Handler(srv interface{}, ctx context.Context, dec...
  function _Bouncer_UnknownMethod_Handler (line 149) | func _Bouncer_UnknownMethod_Handler(srv interface{}, ctx context.Context...
  function _Bouncer_BounceIt_Handler (line 167) | func _Bouncer_BounceIt_Handler(srv interface{}, ctx context.Context, dec...
  function _Bouncer_GrowTail_Handler (line 185) | func _Bouncer_GrowTail_Handler(srv interface{}, ctx context.Context, dec...
  function _Bouncer_Echo_Handler (line 203) | func _Bouncer_Echo_Handler(srv interface{}, ctx context.Context, dec fun...

FILE: spec/fixtures/proxy_wasm_filters/response_transformer/src/filter.rs
  type ResponseTransformerContext (line 17) | struct ResponseTransformerContext {
  method on_configure (line 25) | fn on_configure(&mut self, _: usize) -> bool {
  method create_http_context (line 39) | fn create_http_context(&self, _: u32) -> Option<Box<dyn HttpContext>> {
  method get_type (line 45) | fn get_type(&self) -> Option<ContextType> {
  method on_done (line 51) | fn on_done(&mut self) -> bool {
  method on_http_response_headers (line 57) | fn on_http_response_headers(&mut self, _num_headers: usize, _end_of_stre...

FILE: spec/fixtures/proxy_wasm_filters/response_transformer/src/types.rs
  type InvalidHeader (line 7) | pub(crate) struct InvalidHeader(String);
    method fmt (line 10) | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  type KeyValuePair (line 17) | pub(crate) struct KeyValuePair(pub(crate) String, pub(crate) String);
    type Error (line 20) | type Error = InvalidHeader;
    method try_from (line 22) | fn try_from(input: String) -> std::result::Result<Self, Self::Error> {
    type Error (line 36) | type Error = InvalidHeader;
    method try_from (line 38) | fn try_from(value: &str) -> std::result::Result<Self, Self::Error> {
    method new (line 72) | pub(crate) fn new<T: std::string::ToString>(name: T, value: T) -> Self {
  type Transformations (line 44) | pub(crate) struct Transformations<T = KeyValuePair> {
  method default (line 49) | fn default() -> Self {
  type Config (line 56) | pub(crate) struct Config {
  function test_header_try_from_valid (line 79) | fn test_header_try_from_valid() {
  function test_header_try_from_invalid (line 84) | fn test_header_try_from_invalid() {
  function test_json_deserialize_transformations (line 91) | fn test_json_deserialize_transformations() {

FILE: spec/fixtures/proxy_wasm_filters/tests/src/filter.rs
  type TestRoot (line 23) | struct TestRoot {
  method on_vm_start (line 30) | fn on_vm_start(&mut self, conf_size: usize) -> bool {
  method on_configure (line 35) | fn on_configure(&mut self, conf_size: usize) -> bool {
  method get_type (line 53) | fn get_type(&self) -> Option<ContextType> {
  method create_http_context (line 57) | fn create_http_context(&self, context_id: u32) -> Option<Box<dyn HttpCon...
  method on_tick (line 72) | fn on_tick(&mut self) {
  method on_http_call_response (line 78) | fn on_http_call_response(
  method on_http_request_headers (line 111) | fn on_http_request_headers(&mut self, nheaders: usize, eof: bool) -> Act...
  method on_http_request_body (line 120) | fn on_http_request_body(&mut self, size: usize, eof: bool) -> Action {
  method on_http_response_headers (line 129) | fn on_http_response_headers(&mut self, nheaders: usize, eof: bool) -> Ac...
  method on_http_response_body (line 138) | fn on_http_response_body(&mut self, size: usize, eof: bool) -> Action {
  method on_log (line 147) | fn on_log(&mut self) {

FILE: spec/fixtures/proxy_wasm_filters/tests/src/metrics.rs
  type Metrics (line 10) | struct Metrics {
    method new (line 15) | fn new() -> Metrics {
    method get_metric_id (line 21) | fn get_metric_id(&self, metric_type: MetricType, name: &str) -> Result...
  function define (line 40) | pub fn define(m_type: MetricType, name: &str) -> Result<u32, Status> {
  function increment_counter (line 44) | pub fn increment_counter(name: &str) -> Result<(), Status> {
  function record_gauge (line 48) | pub fn record_gauge(name: &str, value: u64) -> Result<(), Status> {
  function record_histogram (line 52) | pub fn record_histogram(name: &str, value: u64) -> Result<(), Status> {

FILE: spec/fixtures/proxy_wasm_filters/tests/src/routines.rs
  function add_request_header (line 3) | pub(crate) fn add_request_header(ctx: &mut TestHttp) {
  function add_response_header (line 14) | pub(crate) fn add_response_header(ctx: &mut TestHttp) {

FILE: spec/fixtures/proxy_wasm_filters/tests/src/test_cases.rs
  function add_request_header (line 3) | pub(crate) fn add_request_header(ctx: &mut TestHttpHostcalls) {
  function add_response_header (line 14) | pub(crate) fn add_response_header(ctx: &mut TestHttpHostcalls) {

FILE: spec/fixtures/proxy_wasm_filters/tests/src/test_http.rs
  type TestHttp (line 3) | pub struct TestHttp {
    method send_plain_response (line 8) | pub fn send_plain_response(&mut self, status: StatusCode, body: Option...
    method get_prop (line 12) | fn get_prop(&self, ns: &str, prop: &str) -> String {
    method set_prop (line 23) | fn set_prop(&self, ns: &str, prop: &str, value: Option<&str>) {
    method update_metrics (line 28) | fn update_metrics(&self) {
    method send_http_dispatch (line 50) | fn send_http_dispatch(&mut self, config: TestConfig) -> Action {
    method run_tests (line 105) | pub fn run_tests(&mut self, cur_phase: TestPhase) -> Action {

FILE: spec/fixtures/proxy_wasm_filters/tests/src/types.rs
  type TestConfig (line 4) | pub struct TestConfig {
    method fmt (line 23) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type Err (line 9) | type Err = std::str::Utf8Error;
  method from_str (line 11) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type TestPhase (line 34) | pub enum TestPhase {

FILE: spec/fixtures/sam-app/hello_world/app.py
  function lambda_handler (line 6) | def lambda_handler(event, context):

FILE: spec/fixtures/sam-app/tests/integration/test_api_gateway.py
  class TestApiGateway (line 12) | class TestApiGateway:
    method api_gateway_url (line 15) | def api_gateway_url(self):
    method test_api_gateway (line 40) | def test_api_gateway(self, api_gateway_url):

FILE: spec/fixtures/sam-app/tests/unit/test_handler.py
  function apigw_event (line 9) | def apigw_event():
  function test_lambda_handler (line 65) | def test_lambda_handler(apigw_event):

FILE: spec/helpers/perf/charts/charts.py
  function adjust_fig_tick_y (line 12) | def adjust_fig_tick_y(fig, min_y, max_y, row):
  function main (line 16) | def main(args: dict):
Copy disabled (too large) Download .json
Condensed preview — 2479 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (15,771K chars).
[
  {
    "path": ".bazelignore",
    "chars": 708,
    "preview": "# NB: sematics here are not the same as .gitignore\n# see https://github.com/bazelbuild/bazel/issues/8106\n# Ignore backup"
  },
  {
    "path": ".bazelrc",
    "chars": 1752,
    "preview": "# Bazel doesn't need more than 200MB of memory for local build based on memory profiling:\n# https://docs.bazel.build/ver"
  },
  {
    "path": ".bazelversion",
    "chars": 6,
    "preview": "7.3.1\n"
  },
  {
    "path": ".busted",
    "chars": 195,
    "preview": "return {\n  default = {\n    lpath = \"./?.lua;./?/init.lua;\",\n    -- make setup() and teardown() behave like their lazy_ v"
  },
  {
    "path": ".ci/ast-grep/README.md",
    "chars": 1741,
    "preview": "# ast-grep\n\n`ast-grep` is a tool for querying source code in a (relatively)\nlanguage-agnostic manner. It allows us to wr"
  },
  {
    "path": ".ci/ast-grep/common/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": ".ci/ast-grep/rules/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": ".ci/ast-grep/rules/assert-eventually-terminated.yml",
    "chars": 843,
    "preview": "id: assert-eventually-terminated\nlanguage: lua\nmessage: Unterminated eventual assertion\nseverity: error\nnote: |\n  `asser"
  },
  {
    "path": ".ci/ast-grep/rules/helpers-outside-of-setup.yml",
    "chars": 2717,
    "preview": "id: helpers-outside-of-setup\nlanguage: lua\nmessage: Calling test setup helper function in the wrong scope\nseverity: warn"
  },
  {
    "path": ".ci/ast-grep/rules/ngx-log-string-concat.yml",
    "chars": 1424,
    "preview": "id: ngx-log-string-concat\nlanguage: lua\nmessage: Using string concatenation to build arguments for ngx.log()\nseverity: e"
  },
  {
    "path": ".ci/ast-grep/tests/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": ".ci/ast-grep/tests/__snapshots__/assert-eventually-terminated-snapshot.yml",
    "chars": 2598,
    "preview": "id: assert-eventually-terminated\nsnapshots:\n  assert.eventually(function() end):\n    labels:\n    - source: assert.eventu"
  },
  {
    "path": ".ci/ast-grep/tests/__snapshots__/helpers-outside-of-setup-snapshot.yml",
    "chars": 2289,
    "preview": "id: helpers-outside-of-setup\nsnapshots:\n  ? |\n    describe(\"my test\", function()\n      for , strategy in helpers.each_st"
  },
  {
    "path": ".ci/ast-grep/tests/__snapshots__/ngx-log-string-concat-snapshot.yml",
    "chars": 6230,
    "preview": "id: ngx-log-string-concat\nsnapshots:\n  ? |\n    local foo = ngx.log\n\n    foo(ngx.NOTICE, b .. c .. \": STRING\")\n  : labels"
  },
  {
    "path": ".ci/ast-grep/tests/assert-eventually-terminated-test.yml",
    "chars": 1382,
    "preview": "id: assert-eventually-terminated\n\nvalid:\n  # simple, all terminators\n  - |\n    assert.eventually(function() end).is_trut"
  },
  {
    "path": ".ci/ast-grep/tests/helpers-outside-of-setup-test.yml",
    "chars": 3014,
    "preview": "id: helpers-outside-of-setup\n\nvalid:\n  # inside `lazy_setup()`\n  - |\n    lazy_setup(function()\n      local a = 123\n     "
  },
  {
    "path": ".ci/ast-grep/tests/ngx-log-string-concat-test.yml",
    "chars": 1454,
    "preview": "id: ngx-log-string-concat\n\nvalid:\n  # normal, expected usage\n  - |\n    ngx.log(ngx.ERR, \"STRING: \", my_var)\n\n  # string "
  },
  {
    "path": ".ci/luacov-stats-aggregator.lua",
    "chars": 1650,
    "preview": "-- Aggregates stats from multiple luacov stat files.\n-- Example stats for a 12 lines file `my/file.lua`\n-- that received"
  },
  {
    "path": ".ci/test_suites.json",
    "chars": 1072,
    "preview": "[\n  {\n    \"name\": \"unit\",\n    \"exclude_tags\": \"flaky,ipv6\",\n    \"venv_script\": \"kong-dev-venv.sh\",\n    \"specs\": [\"spec/0"
  },
  {
    "path": ".devcontainer/Dockerfile",
    "chars": 189,
    "preview": "FROM kong/kong:3.0.0-ubuntu\n\nUSER root\n\nRUN apt-get update\n\nRUN apt-get install -y \\\n        build-essential \\\n        u"
  },
  {
    "path": ".devcontainer/devcontainer.json",
    "chars": 1545,
    "preview": "// For format details, see https://code.visualstudio.com/docs/remote/devcontainerjson-reference\n{\n    \"name\": \"Kong Gate"
  },
  {
    "path": ".devcontainer/docker-compose.yml",
    "chars": 1683,
    "preview": "version: \"3.8\"\n\nservices:\n\n  db:\n    image: postgres:9.6\n    environment:\n      POSTGRES_PASSWORD: kong\n      POSTGRES_U"
  },
  {
    "path": ".editorconfig",
    "chars": 672,
    "preview": "root                     = true\n\n[*]\nend_of_line              = lf\ninsert_final_newline     = true\ntrim_trailing_whitesp"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yaml",
    "chars": 1801,
    "preview": "name: 🐞 Bug\ndescription: Something is not working as indended.\nbody:\n- type: checkboxes\n  attributes:\n    label: Is ther"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 515,
    "preview": "blank_issues_enabled: true\ncontact_links:\n  - name: Kong Gateway Open Source Community Pledge\n    url: https://github.co"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 922,
    "preview": "<!--\nNOTE: Please read the CONTRIBUTING.md guidelines before submitting your patch,\nand ensure you followed them all:\nht"
  },
  {
    "path": ".github/actions/build-cache-key/action.yml",
    "chars": 1734,
    "preview": "name: Build Cache Key\n\ndescription: >\n  Generates a cache key suitable for save/restore of Kong builds.\n\ninputs:\n  prefi"
  },
  {
    "path": ".github/actions/build-wasm-test-filters/action.yml",
    "chars": 2528,
    "preview": "name: Build WASM Test Filters\n\ndescription: >\n  Installs the rust toolchain and builds the WASM filters that are used\n  "
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 216,
    "preview": "# Set update schedule for GitHub Actions\n\nversion: 2\nupdates:\n\n  - package-ecosystem: \"github-actions\"\n    directory: \"/"
  },
  {
    "path": ".github/labeler.yml",
    "chars": 6912,
    "preview": "'cherry-pick kong-ee':\n- changed-files:\n  - any-glob-to-any-file: ['kong/**/*', 'spec/**/*', 'build/**/*', 'bin/**/*', '"
  },
  {
    "path": ".github/matrix-commitly.yml",
    "chars": 412,
    "preview": "# please see matrix-full.yml for meaning of each field\nbuild-packages:\n- label: ubuntu-24.04\n  image: ubuntu:24.04\n  pac"
  },
  {
    "path": ".github/matrix-full.yml",
    "chars": 5309,
    "preview": "build-packages:\n# label: used to distinguish artifacts for later use\n# image: docker image name if the build is running "
  },
  {
    "path": ".github/workflows/add-release-pongo.yml",
    "chars": 1743,
    "preview": "name: Add New Release to Pongo\n\non:\n  push:\n    tags:\n    - '[1-9]+.[0-9]+.[0-9]+'\n\njobs:\n  set_vars:\n    name: Set Vars"
  },
  {
    "path": ".github/workflows/ast-grep.yml",
    "chars": 4202,
    "preview": "name: ast-grep lint\n\non:\n  pull_request:\n    paths:\n      - .github/workflows/ast-grep.yml # this workflow\n      - sgcon"
  },
  {
    "path": ".github/workflows/auto-assignee.yml",
    "chars": 483,
    "preview": "name: Add assignee to PRs\non:\n  pull_request:\n    types: [ opened, reopened ]\npermissions:\n  pull-requests: write\njobs:\n"
  },
  {
    "path": ".github/workflows/autodocs.yml",
    "chars": 5032,
    "preview": "name: Autodocs\n\non:\n  workflow_dispatch:\n    inputs:\n      version:\n        description: \"Version (e.g. 2.4.x)\"\n        "
  },
  {
    "path": ".github/workflows/backport-fail-bot.yml",
    "chars": 1946,
    "preview": "name: Forward failed backport alert to Slack\n\non:\n  issue_comment:\n    types: [created]\n\njobs:\n  check_comment:\n    runs"
  },
  {
    "path": ".github/workflows/backport-v2.yml",
    "chars": 1593,
    "preview": "name: Backport v2\non:\n  pull_request:\n    types: [closed, labeled] # runs when the pull request is closed/merged or labe"
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 2105,
    "preview": "name: Build\non:\n  workflow_call:\n    inputs:\n      relative-build-root:\n        required: true\n        type: string\n    "
  },
  {
    "path": ".github/workflows/build_and_test.yml",
    "chars": 16333,
    "preview": "name: Build & Test\non:\n  pull_request:\n    paths-ignore:\n    # ignore markdown files (CHANGELOG.md, README.md, etc.)\n   "
  },
  {
    "path": ".github/workflows/buildifier.yml",
    "chars": 1590,
    "preview": "name: Buildifier\n\non:\n  pull_request:\n    paths:\n    - '**/*.bzl'\n    - '**/*.bazel'\n    - 'BUILD*'\n    - 'WORKSPACE*'\n "
  },
  {
    "path": ".github/workflows/changelog-requirement.yml",
    "chars": 2713,
    "preview": "name: Changelog Requirement\n\non:\n  pull_request:\n    types: [ opened, synchronize, labeled, unlabeled ]\n    paths:\n     "
  },
  {
    "path": ".github/workflows/changelog-validation.yml",
    "chars": 386,
    "preview": "name: Changelog Validation\n\non:\n  pull_request:\n    types: [ opened, synchronize ]\n\njobs:\n  validate-changelog:\n    name"
  },
  {
    "path": ".github/workflows/cherry-picks-v2.yml",
    "chars": 2070,
    "preview": "name: Cherry Pick to remote repository v2\non:\n  pull_request:\n    types: [closed, labeled]\n  issue_comment:\n    types: ["
  },
  {
    "path": ".github/workflows/community-stale.yml",
    "chars": 2111,
    "preview": "name: Close inactive issues\non:\n  schedule:\n    - cron: \"30 1 * * *\"\n\njobs:\n  close-issues:\n    runs-on: ubuntu-latest\n "
  },
  {
    "path": ".github/workflows/copyright-check.yml",
    "chars": 1634,
    "preview": "name: Detect Unexpected EE Changes\n\non:\n  pull_request:\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n"
  },
  {
    "path": ".github/workflows/deck-integration.yml",
    "chars": 2080,
    "preview": "name: Gateway decK Integration Tests\n\non:\n  pull_request:\n    paths:\n    - 'kong/db/schema/**/*.lua'\n    - 'kong/**/sche"
  },
  {
    "path": ".github/workflows/label-check.yml",
    "chars": 451,
    "preview": "name: Pull Request Label Checker\non:\n  pull_request:\n    types: [opened, edited, synchronize, labeled, unlabeled]\njobs:\n"
  },
  {
    "path": ".github/workflows/label-community-pr.yml",
    "chars": 941,
    "preview": "name: Label community PRs\n\non:\n  schedule:\n    - cron: '*/30 * * * *'\n\npermissions:\n  pull-requests: write\n\njobs:\n  chec"
  },
  {
    "path": ".github/workflows/label-schema.yml",
    "chars": 672,
    "preview": "name: Pull Request Schema Labeler\non:\n  pull_request:\n    types: [opened, edited, labeled, unlabeled]\njobs:\n  schema-cha"
  },
  {
    "path": ".github/workflows/labeler-v2.yml",
    "chars": 260,
    "preview": "name: \"Pull Request Labeler v2\"\non:\n- pull_request\n\njobs:\n  labeler:\n    if: ${{ !github.event.pull_request.head.repo.fo"
  },
  {
    "path": ".github/workflows/openresty-patches-companion.yml",
    "chars": 779,
    "preview": "name: Openresty patches review companion\non:\n  pull_request:\n    paths:\n    - 'build/openresty/patches/**'\n\njobs:\n  crea"
  },
  {
    "path": ".github/workflows/perf.yml",
    "chars": 11777,
    "preview": "name: Performance Test\n\non:\n  pull_request:\n  schedule:\n  # don't know the timezone but it's daily at least\n  - cron:  '"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 24612,
    "preview": "name: Package & Release\n\n# The workflow to build and release official Kong packages and images.\n\non:  # yamllint disable"
  },
  {
    "path": ".github/workflows/update-ngx-wasm-module.yml",
    "chars": 3944,
    "preview": "name: Update ngx_wasm_module dependency\n\non:\n  workflow_dispatch:\n  schedule:\n  # run weekly\n  - cron: '0 0 * * 0'\n\njobs"
  },
  {
    "path": ".github/workflows/update-test-runtime-statistics.yml",
    "chars": 1093,
    "preview": "name: Update test runtime statistics file for test scheduling\non:\n  workflow_dispatch:\n  schedule:\n    - cron: \"1 0 * * "
  },
  {
    "path": ".github/workflows/upgrade-tests.yml",
    "chars": 1483,
    "preview": "name: Upgrade Tests\n\non:\n  pull_request:\n    paths:\n    - 'scripts/upgrade-tests/**'\n    - 'kong/db/migrations/**'\n    -"
  },
  {
    "path": ".gitignore",
    "chars": 501,
    "preview": ".DS_Store\n.vagrant/\n.buildpath\n.project\n.idea\n.env\n.vscode\n.VSCodeCounter\n\nservroot*\nmockserver\n\n# kong\nnginx_tmp/\nkong*"
  },
  {
    "path": ".luacheckrc",
    "chars": 1103,
    "preview": "std             = \"ngx_lua\"\nunused_args     = false\nredefined       = false\nmax_line_length = false\n\n\nglobals = {\n    \"_"
  },
  {
    "path": ".luacov",
    "chars": 185,
    "preview": "return {\n\n  includeuntestedfiles = {\n    \"kong/\",\n  },\n  runreport = true,\n\n  include = {\n    \"kong$\",\n    \"kong%/.+$\",\n"
  },
  {
    "path": ".requirements",
    "chars": 1387,
    "preview": "KONG_PACKAGE_NAME=kong\n\nOPENRESTY=1.27.1.2\nOPENRESTY_SHA256=74f076f7e364b2a99a6c5f9bb531c27610c78985abe956b442b192a2295f"
  },
  {
    "path": "BUILD.bazel",
    "chars": 7163,
    "preview": "load(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@bazel_skylib//rules:common_settings.bzl\", \"bool_flag\", \"string_"
  },
  {
    "path": "CHANGELOG-OLD.md",
    "chars": 334560,
    "preview": "# Table of Contents\n\nLooking for recent releases? Please see [CHANGELOG.md](CHANGELOG.md) instead.\n\n- [2.8.5](#285)\n- [2"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 154331,
    "preview": "# Table of Contents\n\n- [3.9.1](#391)\n- [3.9.0](#390)\n- [3.8.1](#381)\n- [3.8.0](#380)\n- [3.7.1](#371)\n- [3.7.0](#370)\n- ["
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3224,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "COMMUNITY_PLEDGE.md",
    "chars": 1630,
    "preview": "# Our pledge to the open source community\n\nKong Gateway is not only an awesome open source project, but also part\nof the"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 27221,
    "preview": "# Contributing to Kong :monkey_face:\n\nHello, and welcome! Whether you are looking for help, trying to report a bug,\nthin"
  },
  {
    "path": "COPYRIGHT",
    "chars": 175105,
    "preview": "%%%%%%%%%\n\nLibrary\n\nLibrary URL\nLicense URL\n\nLicense text\n\n\n%%%%%%%%%\n\nansicolors\n\nhttps://github.com/kikito/ansicolors."
  },
  {
    "path": "DEVELOPER.md",
    "chars": 24288,
    "preview": "\n## Development\n\nWe encourage community contributions to Kong. To make sure it is a smooth\nexperience (both for you and "
  },
  {
    "path": "LICENSE",
    "chars": 11345,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "MODULE.bazel",
    "chars": 399,
    "preview": "###############################################################################\n# Bazel now uses Bzlmod by default to ma"
  },
  {
    "path": "Makefile",
    "chars": 6901,
    "preview": "OS := $(shell uname | awk '{print tolower($$0)}')\nMACHINE := $(shell uname -m)\n\nDEV_ROCKS = \"busted 2.2.0\" \"busted-hjtes"
  },
  {
    "path": "README.md",
    "chars": 9314,
    "preview": "[![][kong-logo]][kong-url]\n\n![Stars](https://img.shields.io/github/stars/Kong/kong?style=flat-square) ![GitHub commit ac"
  },
  {
    "path": "SECURITY.md",
    "chars": 446,
    "preview": "# Security Policy\n\n## Reporting a Vulnerability\nTo report a vulnerability in the Kong gateway, Insomnia or other Kong so"
  },
  {
    "path": "UPGRADE.md",
    "chars": 190425,
    "preview": "This document guides you through the process of upgrading Kong. First, check if\na section named \"Upgrade to `x.x.x`\" exi"
  },
  {
    "path": "WORKSPACE",
    "chars": 3135,
    "preview": "workspace(name = \"kong\")\n\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\n\nhttp_archive(\n    name ="
  },
  {
    "path": "autodoc/README.md",
    "chars": 771,
    "preview": "Prerequisites:\n```\ncd kong-root-repo\nmake dev\ngit checkout branch/tag/release\n```\n\nGenerate everything:\n\n```\ncd kong-roo"
  },
  {
    "path": "autodoc/cli/data.lua",
    "chars": 1069,
    "preview": "local data = {}\n\ndata.header = [[\n---\n#\n#  WARNING: this file was auto-generated by a script.\n#  DO NOT edit this file d"
  },
  {
    "path": "autodoc/cli/generate.lua",
    "chars": 1204,
    "preview": "#!/usr/bin/env resty\n\n-- This file must be executed from the root folder, i.e.\n-- ./autodoc/cli/generate.lua\nsetmetatabl"
  },
  {
    "path": "autodoc/pdk/generate.lua",
    "chars": 1428,
    "preview": "#!/usr/bin/env resty\n\n-- This file must be executed from the root folder, i.e.\n-- ./autodoc/pdk/generate.lua\nsetmetatabl"
  },
  {
    "path": "autodoc/pdk/ldoc/config.ld",
    "chars": 357,
    "preview": "project = \"kong\"\ntitle = \"Plugin Development Kit\"\nformat = \"markdown\"\nbacktick_references = false\nno_lua_ref = true\nall "
  },
  {
    "path": "autodoc/pdk/ldoc/filters.lua",
    "chars": 725,
    "preview": "local output_folder = \"pdk\"\nlocal pl_template = require \"pl.template\"\n\nreturn {\n  nav = function(t)\n    local tf = asser"
  },
  {
    "path": "autodoc/pdk/ldoc/json.ltp",
    "chars": 251,
    "preview": "[\n# for i, mod in ipairs(modules) do\n#   local name = mod.name\n#   if string.lower(name) == \"pdk\" then\n#     name = \"ind"
  },
  {
    "path": "autodoc/pdk/ldoc/ldoc.ltp",
    "chars": 5103,
    "preview": "> local iter = ldoc.modules.iter\n>\n> local function trim(s)\n>   return (s:gsub(\"^%s*(.-)%s*$\", \"%1\"))\n> end\n>\n> local fu"
  },
  {
    "path": "autodoc/pdk/ldoc/nav_yml.ltp",
    "chars": 228,
    "preview": "    - text: Plugin Development Kit\n      url: $(base_url)\n      items:\n# for _, mod in ipairs(modules) do\n#   if string."
  },
  {
    "path": "bin/busted",
    "chars": 3465,
    "preview": "#!/usr/bin/env resty\n\nsetmetatable(_G, nil)\n\nif not os.getenv(\"KONG_BUSTED_RESPAWNED\") then\n  local pl_path = require(\"p"
  },
  {
    "path": "bin/kong",
    "chars": 3767,
    "preview": "#!/usr/bin/env resty\n\nsetmetatable(_G, nil)\npackage.path = (os.getenv(\"KONG_LUA_PATH_OVERRIDE\") or \"\") .. \"./?.lua;./?/i"
  },
  {
    "path": "bin/kong-health",
    "chars": 2127,
    "preview": "#!/usr/bin/env resty\n\nsetmetatable(_G, nil)\npackage.path = (os.getenv(\"KONG_LUA_PATH_OVERRIDE\") or \"\") .. \"./?.lua;./?/i"
  },
  {
    "path": "build/BUILD.bazel",
    "chars": 8788,
    "preview": "load(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@kong//build/openresty/wasmx/filters:variables.bzl\", \"WASM_FILTE"
  },
  {
    "path": "build/README.md",
    "chars": 11631,
    "preview": "# Build\n\nThis directory contains the build system for the project.\nThe build system is designed to be used with the [Baz"
  },
  {
    "path": "build/build_system.bzl",
    "chars": 17847,
    "preview": "\"\"\"\nLoad this file for all Kong-specific build macros\nand rules that you'd like to use in your BUILD files.\n\"\"\"\n\nload(\"@"
  },
  {
    "path": "build/cross_deps/BUILD.bazel",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "build/cross_deps/README.md",
    "chars": 908,
    "preview": "# Dependencies for cross build\n\nWhen cross building Kong (the target architecture is different from the host),\nwe need t"
  },
  {
    "path": "build/cross_deps/libxcrypt/001-4.4.27-enable-hash-all.patch",
    "chars": 2693,
    "preview": "This is roughly adapted from https://patchwork.yoctoproject.org/project/oe-core/patch/20230726131331.2239727-1-Martin.Ja"
  },
  {
    "path": "build/cross_deps/libxcrypt/BUILD.bazel",
    "chars": 105,
    "preview": "exports_files(\n    [\n        \"BUILD.libxcrypt.bazel\",\n    ],\n    visibility = [\"//visibility:public\"],\n)\n"
  },
  {
    "path": "build/cross_deps/libxcrypt/BUILD.libxcrypt.bazel",
    "chars": 1506,
    "preview": "load(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@kong_bindings//:variables.bzl\", \"KONG_VAR\")\nload(\"@rules_foreig"
  },
  {
    "path": "build/cross_deps/libxcrypt/repositories.bzl",
    "chars": 991,
    "preview": "\"\"\"A module defining the third party dependency OpenResty\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http"
  },
  {
    "path": "build/cross_deps/libyaml/BUILD.bazel",
    "chars": 294,
    "preview": "load(\"@bazel_skylib//rules:build_test.bzl\", \"build_test\")\n\nexports_files(\n    [\n        \"BUILD.libyaml.bazel\",\n    ],\n  "
  },
  {
    "path": "build/cross_deps/libyaml/BUILD.libyaml.bazel",
    "chars": 805,
    "preview": "load(\"@kong_bindings//:variables.bzl\", \"KONG_VAR\")\nload(\"@rules_foreign_cc//foreign_cc:defs.bzl\", \"configure_make\")\n\nfil"
  },
  {
    "path": "build/cross_deps/libyaml/repositories.bzl",
    "chars": 680,
    "preview": "\"\"\"A module defining the third party dependency OpenResty\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http"
  },
  {
    "path": "build/cross_deps/repositories.bzl",
    "chars": 338,
    "preview": "load(\"//build/cross_deps/libxcrypt:repositories.bzl\", \"libxcrypt_repositories\")\nload(\"//build/cross_deps/libyaml:reposit"
  },
  {
    "path": "build/cross_deps/zlib/BUILD.bazel",
    "chars": 285,
    "preview": "load(\"@bazel_skylib//rules:build_test.bzl\", \"build_test\")\n\nexports_files(\n    [\n        \"BUILD.zlib.bazel\",\n    ],\n    v"
  },
  {
    "path": "build/cross_deps/zlib/BUILD.zlib.bazel",
    "chars": 1676,
    "preview": "load(\"@kong_bindings//:variables.bzl\", \"KONG_VAR\")\nload(\"@rules_foreign_cc//foreign_cc:defs.bzl\", \"cmake\")\n\nfilegroup(\n "
  },
  {
    "path": "build/cross_deps/zlib/repositories.bzl",
    "chars": 733,
    "preview": "\"\"\"A module defining the third party dependency OpenResty\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http"
  },
  {
    "path": "build/dockerfiles/deb.Dockerfile",
    "chars": 1361,
    "preview": "ARG KONG_BASE_IMAGE=debian:bookworm-slim\nFROM --platform=$TARGETPLATFORM $KONG_BASE_IMAGE\n\nLABEL maintainer=\"Kong Docker"
  },
  {
    "path": "build/dockerfiles/entrypoint.sh",
    "chars": 2261,
    "preview": "#!/usr/bin/env bash\nset -Eeo pipefail\n\n# usage: file_env VAR [DEFAULT]\n#    ie: file_env 'XYZ_DB_PASSWORD' 'example'\n# ("
  },
  {
    "path": "build/dockerfiles/rpm.Dockerfile",
    "chars": 1594,
    "preview": "ARG KONG_BASE_IMAGE=redhat/ubi9\nFROM --platform=$TARGETPLATFORM $KONG_BASE_IMAGE\n\nLABEL maintainer=\"Kong Docker Maintain"
  },
  {
    "path": "build/kong_bindings.bzl",
    "chars": 4535,
    "preview": "\"\"\"\nGlobal variables\n\"\"\"\n\ndef _load_vars(ctx):\n    # Read env from .requirements\n    requirements = ctx.read(Label(\"@kon"
  },
  {
    "path": "build/kong_crate/BUILD.bazel",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "build/kong_crate/crates.bzl",
    "chars": 186,
    "preview": "\"\"\"Setup Crates repostories \"\"\"\n\nload(\"@atc_router_crate_index//:defs.bzl\", atc_router_crate_repositories = \"crate_repos"
  },
  {
    "path": "build/kong_crate/deps.bzl",
    "chars": 2899,
    "preview": "\"\"\"Setup dependencies after repostories are downloaded.\"\"\"\n\nload(\"@rules_rust//crate_universe:defs.bzl\", \"crates_reposit"
  },
  {
    "path": "build/libexpat/BUILD.bazel",
    "chars": 286,
    "preview": "load(\"@bazel_skylib//rules:build_test.bzl\", \"build_test\")\n\nexports_files(\n    [\n        \"BUILD.libexpat.bazel\",\n    ],\n "
  },
  {
    "path": "build/libexpat/BUILD.libexpat.bazel",
    "chars": 1546,
    "preview": "load(\"@kong_bindings//:variables.bzl\", \"KONG_VAR\")\nload(\"@rules_foreign_cc//foreign_cc:defs.bzl\", \"configure_make\")\n\nfil"
  },
  {
    "path": "build/libexpat/repositories.bzl",
    "chars": 727,
    "preview": "\"\"\"A module defining the third party dependency OpenResty\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http"
  },
  {
    "path": "build/luarocks/BUILD.bazel",
    "chars": 489,
    "preview": "load(\"//build:build_system.bzl\", \"kong_rules_group\")\n\nexports_files(\n    [\n        \"BUILD.luarocks.bazel\",\n        \"luar"
  },
  {
    "path": "build/luarocks/BUILD.luarocks.bazel",
    "chars": 3340,
    "preview": "load(\"@kong//build:build_system.bzl\", \"kong_template_genrule\")\nload(\"@kong_bindings//:variables.bzl\", \"KONG_VAR\")\nload(\""
  },
  {
    "path": "build/luarocks/lua/BUILD.bazel",
    "chars": 271,
    "preview": "load(\"@bazel_skylib//rules:build_test.bzl\", \"build_test\")\n\nexports_files(\n    [\n        \"BUILD.lua.bazel\",\n    ],\n    vi"
  },
  {
    "path": "build/luarocks/lua/BUILD.lua.bazel",
    "chars": 630,
    "preview": "load(\"@kong_bindings//:variables.bzl\", \"KONG_VAR\")\nload(\"@rules_foreign_cc//foreign_cc:defs.bzl\", \"make\")\n\nfilegroup(\n  "
  },
  {
    "path": "build/luarocks/lua/lua_repositories.bzl",
    "chars": 638,
    "preview": "\"\"\"A module defining the third party dependency LUA\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archi"
  },
  {
    "path": "build/luarocks/lua/patches/lua-cross.patch",
    "chars": 264,
    "preview": "diff --git a/src/Makefile b/src/Makefile\nindex e0d4c9f..23f8273 100644\n--- a/src/Makefile\n+++ b/src/Makefile\n@@ -7,7 +7,"
  },
  {
    "path": "build/luarocks/luarocks_repositories.bzl",
    "chars": 666,
    "preview": "\"\"\"A module defining the third party dependency luarocks\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_"
  },
  {
    "path": "build/luarocks/luarocks_wrap_script.lua",
    "chars": 1005,
    "preview": "local cfg = require(\"luarocks.core.cfg\")\nassert(cfg.init())\n-- print(require(\"inspect\")(cfg))\n\nlocal fs = require \"luaro"
  },
  {
    "path": "build/luarocks/templates/luarocks_exec.sh",
    "chars": 3854,
    "preview": "#!/bin/bash -e\n\n# template variables starts\nlibexpat_path=\"{{@@libexpat//:libexpat}}\"\nlibxml2_path=\"invalid\"\nopenssl_pat"
  },
  {
    "path": "build/luarocks/templates/luarocks_make.sh",
    "chars": 984,
    "preview": "#!/bin/bash -e\n\n# template variables starts\nluarocks_exec=\"{{@@luarocks//:luarocks_exec}}\"\n# template variables ends\n\nif"
  },
  {
    "path": "build/luarocks/templates/luarocks_target.sh",
    "chars": 2020,
    "preview": "#!/bin/bash -e\n\n# template variables starts\nluarocks_version=\"{{luarocks_version}}\"\ninstall_destdir=\"{{install_destdir}}"
  },
  {
    "path": "build/nfpm/BUILD.bazel",
    "chars": 103,
    "preview": "filegroup(\n    name = \"all_srcs\",\n    srcs = glob([\"**\"]),\n    visibility = [\"//visibility:public\"],\n)\n"
  },
  {
    "path": "build/nfpm/BUILD.nfpm.bazel",
    "chars": 99,
    "preview": "filegroup(\n    name = \"srcs\",\n    srcs = glob([\"**\"]),\n    visibility = [\"//visibility:public\"],\n)\n"
  },
  {
    "path": "build/nfpm/repositories.bzl",
    "chars": 2028,
    "preview": "\"\"\"A module defining the third party dependency OpenResty\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http"
  },
  {
    "path": "build/nfpm/rules.bzl",
    "chars": 2778,
    "preview": "\"\"\"\nNFPM package rule.\n\"\"\"\n\nload(\"@bazel_skylib//lib:dicts.bzl\", \"dicts\")\nload(\"@kong_bindings//:variables.bzl\", \"KONG_V"
  },
  {
    "path": "build/openresty/BUILD.bazel",
    "chars": 105,
    "preview": "exports_files(\n    [\n        \"BUILD.openresty.bazel\",\n    ],\n    visibility = [\"//visibility:public\"],\n)\n"
  },
  {
    "path": "build/openresty/BUILD.openresty.bazel",
    "chars": 11986,
    "preview": "load(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@kong//build:build_system.bzl\", \"kong_cc_static_library\")\nload(\""
  },
  {
    "path": "build/openresty/ada/BUILD.bazel",
    "chars": 289,
    "preview": "cc_library(\n    name = \"ada-lib\",\n    srcs = [\"ada.cpp\"],\n    hdrs = [\n        \"ada.h\",\n        \"ada_c.h\",\n    ],\n    co"
  },
  {
    "path": "build/openresty/ada/ada_repositories.bzl",
    "chars": 615,
    "preview": "\"\"\"A module defining the third party dependency Ada\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archi"
  },
  {
    "path": "build/openresty/atc_router/BUILD.atc_router.bazel",
    "chars": 774,
    "preview": "load(\"@atc_router_crate_index//:defs.bzl\", \"aliases\", \"all_crate_deps\")\nload(\"@rules_rust//rust:defs.bzl\", \"rust_shared_"
  },
  {
    "path": "build/openresty/atc_router/BUILD.bazel",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "build/openresty/atc_router/atc_router_repositories.bzl",
    "chars": 430,
    "preview": "\"\"\"A module defining the dependency atc-router\"\"\"\n\nload(\"@kong_bindings//:variables.bzl\", \"KONG_VAR\")\nload(\"//build:buil"
  },
  {
    "path": "build/openresty/brotli/BUILD.bazel",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "build/openresty/brotli/brotli_repositories.bzl",
    "chars": 408,
    "preview": "\"\"\"A module defining the dependency \"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@kong_bind"
  },
  {
    "path": "build/openresty/lua-resty-lmdb-cross.patch",
    "chars": 1464,
    "preview": "lua-resty-lmdb is an external repository, previous artifact may carry\nthus we always clean here\n\ndiff --git a/config b/c"
  },
  {
    "path": "build/openresty/openssl/BUILD.bazel",
    "chars": 108,
    "preview": "load(\"@kong//build/openresty/openssl:openssl.bzl\", \"build_openssl\")\n\nbuild_openssl(\n    name = \"openssl\",\n)\n"
  },
  {
    "path": "build/openresty/openssl/README.md",
    "chars": 439,
    "preview": "This target is modified from https://github.com/bazelbuild/rules_foreign_cc/tree/main/examples/third_party\nwith followin"
  },
  {
    "path": "build/openresty/openssl/openssl.bzl",
    "chars": 3328,
    "preview": "\"\"\"An openssl build file based on a snippet found in the github issue:\nhttps://github.com/bazelbuild/rules_foreign_cc/is"
  },
  {
    "path": "build/openresty/openssl/openssl_repositories.bzl",
    "chars": 674,
    "preview": "\"\"\"A module defining the third party dependency OpenSSL\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_a"
  },
  {
    "path": "build/openresty/patches/LuaJIT-2.1-20250117_01-patch-macro-luajit-version.patch",
    "chars": 545,
    "preview": "diff --git a/bundle/LuaJIT-2.1-20250117/src/luajit_rolling.h b/bundle/LuaJIT-2.1-20250117/src/luajit_rolling.h\nindex 900"
  },
  {
    "path": "build/openresty/patches/LuaJIT-2.1-20250117_02-pass-cc-env.patch",
    "chars": 1287,
    "preview": "diff --git a/bundle/LuaJIT-2.1-20250117/src/Makefile b/bundle/LuaJIT-2.1-20250117/src/Makefile\nindex 8e544f7..285082a 10"
  },
  {
    "path": "build/openresty/patches/LuaJIT-2.1-20250117_03-revert-reflect-override-of-ljlibd.patch",
    "chars": 2090,
    "preview": "diff --git a/bundle/LuaJIT-2.1-20250117/Makefile b/bundle/LuaJIT-2.1-20250117/Makefile\nindex d789e9f..19b6bfa 100644\n---"
  },
  {
    "path": "build/openresty/patches/lua-cjson-2.1.0.14_01-error-on-t-end.patch",
    "chars": 577,
    "preview": "diff --git a/bundle/lua-cjson-2.1.0.14/lua_cjson.c b/bundle/lua-cjson-2.1.0.14/lua_cjson.c\nindex bbd8eff..c39c425 100644"
  },
  {
    "path": "build/openresty/patches/nginx-1.27.1_01-upstream-client-certificate-and-ssl-verify.patch",
    "chars": 1646,
    "preview": "diff --git a/bundle/nginx-1.27.1/src/http/ngx_http_upstream.c b/bundle/nginx-1.27.1/src/http/ngx_http_upstream.c\nindex d"
  },
  {
    "path": "build/openresty/patches/nginx-1.27.1_02-remove-server-tokens-from-special-responses-output.patch",
    "chars": 744,
    "preview": "diff --git a/bundle/nginx-1.27.1/src/http/ngx_http_special_response.c b/bundle/nginx-1.27.1/src/http/ngx_http_special_re"
  },
  {
    "path": "build/openresty/patches/nginx-1.27.1_03-stream-upstream-client-certificate-and-ssl-verify.patch",
    "chars": 2120,
    "preview": "diff --git a/bundle/nginx-1.27.1/src/stream/ngx_stream_proxy_module.c b/bundle/nginx-1.27.1/src/stream/ngx_stream_proxy_"
  },
  {
    "path": "build/openresty/patches/nginx-1.27.1_04-grpc-authority-override.patch",
    "chars": 872,
    "preview": "diff --git a/bundle/nginx-1.27.1/src/http/modules/ngx_http_grpc_module.c b/bundle/nginx-1.27.1/src/http/modules/ngx_http"
  },
  {
    "path": "build/openresty/patches/nginx-1.27.1_05-remove-server-headers-from-ngx-header-filter-module.patch",
    "chars": 2215,
    "preview": "diff --git a/bundle/nginx-1.27.1/src/http/ngx_http_header_filter_module.c b/bundle/nginx-1.27.1/src/http/ngx_http_header"
  },
  {
    "path": "build/openresty/patches/nginx-1.27.1_06-dynamic-log-level.patch",
    "chars": 6539,
    "preview": "diff --git a/bundle/nginx-1.27.1/src/core/ngx_log.c b/bundle/nginx-1.27.1/src/core/ngx_log.c\nindex eb7a989..0862d4d 1006"
  },
  {
    "path": "build/openresty/patches/nginx-1.27.1_07-cross.patch",
    "chars": 7669,
    "preview": "diff --git a/bundle/nginx-1.27.1/auto/feature b/bundle/nginx-1.27.1/auto/feature\nindex 3561f59..d6a2889 100644\n--- a/bun"
  },
  {
    "path": "build/openresty/patches/nginx-1.27.1_08-cross-endianness-fix.patch",
    "chars": 1709,
    "preview": "diff --git a/bundle/nginx-1.27.1/auto/endianness b/bundle/nginx-1.27.1/auto/endianness\nindex 1b552b6..be84487 100644\n---"
  },
  {
    "path": "build/openresty/patches/nginx-1.27.1_09-proxy-upstream-next.patch",
    "chars": 1235,
    "preview": "diff --git a/bundle/nginx-1.27.1/src/http/ngx_http_upstream.c b/bundle/nginx-1.27.1/src/http/ngx_http_upstream.c\nindex 1"
  },
  {
    "path": "build/openresty/patches/nginx-1.27.1_10-refresh-uri-when-proxy-pass-balancer-recreate.patch",
    "chars": 1057,
    "preview": "diff --git a/bundle/nginx-1.27.1/src/http/modules/ngx_http_proxy_module.c b/bundle/nginx-1.27.1/src/http/modules/ngx_htt"
  },
  {
    "path": "build/openresty/patches/nginx-1.27.1_11-upstream-latency-metrics.patch",
    "chars": 7614,
    "preview": "diff --git a/bundle/nginx-1.27.1/src/http/ngx_http_upstream.c b/bundle/nginx-1.27.1/src/http/ngx_http_upstream.c\nindex 3"
  },
  {
    "path": "build/openresty/patches/ngx_lua-0.10.28_01-dynamic-log-level.patch",
    "chars": 933,
    "preview": "diff --git a/bundle/ngx_lua-0.10.28/src/ngx_http_lua_log.c b/bundle/ngx_lua-0.10.28/src/ngx_http_lua_log.c\nindex 43ab820"
  },
  {
    "path": "build/openresty/patches/ngx_lua-0.10.28_02-fix-invalid-hostname.patch",
    "chars": 982,
    "preview": "diff --git a/bundle/ngx_lua-0.10.28/src/ngx_http_lua_balancer.c b/bundle/ngx_lua-0.10.28/src/ngx_http_lua_balancer.c\nind"
  },
  {
    "path": "build/openresty/patches/ngx_lua-0.10.28_03-missing-lightud.patch",
    "chars": 739,
    "preview": "diff --git a/bundle/ngx_lua-0.10.28/src/ngx_http_lua_log.c b/bundle/ngx_lua-0.10.28/src/ngx_http_lua_log.c\nindex 43ab820"
  },
  {
    "path": "build/openresty/patches/ngx_stream_lua-0.0.16_01-expose-request-struct.patch",
    "chars": 421,
    "preview": "diff --git a/bundle/ngx_stream_lua-0.0.16/src/api/ngx_stream_lua_api.h b/bundle/ngx_stream_lua-0.0.16/src/api/ngx_stream"
  },
  {
    "path": "build/openresty/patches/openresty_01-custom-prefix-and-cc.patch",
    "chars": 3760,
    "preview": "diff --git a/configure b/configure\nindex cb7e518..66c17aa 100755\n--- a/configure\n+++ b/configure\n@@ -128,7 +128,7 @@ my "
  },
  {
    "path": "build/openresty/pcre/BUILD.bazel",
    "chars": 274,
    "preview": "load(\"@bazel_skylib//rules:build_test.bzl\", \"build_test\")\n\nexports_files(\n    [\n        \"BUILD.pcre.bazel\",\n    ],\n    v"
  },
  {
    "path": "build/openresty/pcre/BUILD.pcre.bazel",
    "chars": 1061,
    "preview": "load(\"@kong_bindings//:variables.bzl\", \"KONG_VAR\")\nload(\"@rules_foreign_cc//foreign_cc:defs.bzl\", \"cmake\")\n\nfilegroup(\n "
  },
  {
    "path": "build/openresty/pcre/README.md",
    "chars": 230,
    "preview": "This target is modified from https://github.com/bazelbuild/rules_foreign_cc/tree/main/examples/third_party\nwith followin"
  },
  {
    "path": "build/openresty/pcre/pcre_repositories.bzl",
    "chars": 659,
    "preview": "\"\"\"A module defining the third party dependency PCRE\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_arch"
  },
  {
    "path": "build/openresty/repositories.bzl",
    "chars": 4253,
    "preview": "\"\"\"A module defining the third party dependency OpenResty\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http"
  },
  {
    "path": "build/openresty/simdjson_ffi/BUILD.bazel",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "build/openresty/simdjson_ffi/simdjson_ffi_repositories.bzl",
    "chars": 382,
    "preview": "\"\"\"A module defining the dependency lua-resty-simdjson\"\"\"\n\nload(\"@kong_bindings//:variables.bzl\", \"KONG_VAR\")\nload(\"//bu"
  },
  {
    "path": "build/openresty/snappy/BUILD.bazel",
    "chars": 5754,
    "preview": "# Copyright 2023 Google Inc. All Rights Reserved.\n#\n# Redistribution and use in source and binary forms, with or without"
  },
  {
    "path": "build/openresty/snappy/snappy_repositories.bzl",
    "chars": 578,
    "preview": "\"\"\"A module defining the dependency snappy\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"new_git_repository\")"
  },
  {
    "path": "build/openresty/wasmx/BUILD.bazel",
    "chars": 1554,
    "preview": "load(\"@bazel_skylib//rules:write_file.bzl\", \"write_file\")\n\nconfig_setting(\n    name = \"use_v8\",\n    flag_values = {\n    "
  },
  {
    "path": "build/openresty/wasmx/filters/BUILD.bazel",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "build/openresty/wasmx/filters/repositories.bzl",
    "chars": 678,
    "preview": "load(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_file\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", "
  },
  {
    "path": "build/openresty/wasmx/filters/variables.bzl",
    "chars": 193,
    "preview": "\"\"\"\nA list of wasm filters.\n\"\"\"\n\nWASM_FILTERS = []\n\nWASM_FILTERS_TARGETS = [\n    \"@%s-%s//file\" % (filter[\"name\"], file)"
  },
  {
    "path": "build/openresty/wasmx/rules.bzl",
    "chars": 2278,
    "preview": "load(\"//build/openresty/wasmx:wasmx_repositories.bzl\", \"wasm_runtimes\")\n\nwasmx_configure_options = select({\n    \"@kong//"
  },
  {
    "path": "build/openresty/wasmx/wasmx_repositories.bzl",
    "chars": 5936,
    "preview": "\"\"\"A module defining the third party dependency WasmX\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_arc"
  },
  {
    "path": "build/package/kong.logrotate",
    "chars": 265,
    "preview": "/usr/local/kong/logs/*.log {\n  su kong kong\n  rotate 14\n  daily\n  missingok\n  compress\n  delaycompress\n  notifempty\n  sh"
  },
  {
    "path": "build/package/kong.service",
    "chars": 897,
    "preview": "[Unit]\nDescription=Kong\nDocumentation=https://docs.konghq.com/\nAfter=syslog.target network.target remote-fs.target nss-l"
  },
  {
    "path": "build/package/nfpm.yaml",
    "chars": 2214,
    "preview": "name: \"${KONG_NAME}\"\narch: ${ARCH}\nplatform: \"linux\"\nversion: \"${KONG_VERSION}\"\nsection: \"default\"\npriority: \"extra\"\npro"
  },
  {
    "path": "build/package/postinstall.sh",
    "chars": 965,
    "preview": "\nif [ -n \"${VERBOSE:-}\" ]; then\n    set -x\nfi\n\ncreate_user() {\n\n  groupadd -f kong\n  useradd -g kong -s /bin/sh -c \"Kong"
  },
  {
    "path": "build/patches/01-revert-LD-environment.patch",
    "chars": 1537,
    "preview": "From 74001becbbd84108781014d1cd240a09dc57f2ab Mon Sep 17 00:00:00 2001\nFrom: James Sharpe <james.sharpe@zenotech.com>\nDa"
  },
  {
    "path": "build/patches/02-revert-Reduce-build-times-especially-on-windows.patch",
    "chars": 25343,
    "preview": "From 915e2b2c57e5450bf812e31c48675b1d5a8a03e6 Mon Sep 17 00:00:00 2001\nFrom: Wangchong Zhou <wangchong@konghq.com>\nDate:"
  },
  {
    "path": "build/platforms/distro/BUILD",
    "chars": 634,
    "preview": "constraint_setting(name = \"distro\")\n\nconstraint_value(\n    name = \"generic\",\n    constraint_setting = \":distro\",\n    vis"
  },
  {
    "path": "build/repositories.bzl",
    "chars": 3194,
    "preview": "\"\"\"A module defining the third party dependency OpenResty\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http"
  },
  {
    "path": "build/templates/venv-commons",
    "chars": 2359,
    "preview": "#!/bin/bash\n\n# template variables starts\nworkspace_path=\"{{workspace_path}}\"\n# template variables ends\n\nif [ \"$#\" -ne 2 "
  },
  {
    "path": "build/templates/venv.fish",
    "chars": 2698,
    "preview": "#!/usr/bin/env fish\n\n# template variables starts\nset build_name \"{{build_name}}\"\nset workspace_path \"{{workspace_path}}\""
  },
  {
    "path": "build/templates/venv.sh",
    "chars": 1562,
    "preview": "#!/bin/bash\n\n# template variables starts\nbuild_name=\"{{build_name}}\"\nworkspace_path=\"{{workspace_path}}\"\n# template vari"
  },
  {
    "path": "build/toolchain/.gitignore",
    "chars": 11,
    "preview": "wrappers-*\n"
  },
  {
    "path": "build/toolchain/BUILD",
    "chars": 1932,
    "preview": "load(\":cc_toolchain_config.bzl\", \"cc_toolchain_config\")\nload(\":managed_toolchain.bzl\", \"aarch64_glibc_distros\", \"define_"
  },
  {
    "path": "build/toolchain/bindings.bzl",
    "chars": 297,
    "preview": "\"\"\"\nGlobal variables\n\"\"\"\n\ndef _load_bindings_impl(ctx):\n    root = \"/\".join(ctx.execute([\"pwd\"]).stdout.split(\"/\")[:-1])"
  },
  {
    "path": "build/toolchain/cc_toolchain_config.bzl",
    "chars": 14308,
    "preview": "# Copyright 2021 The Bazel Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not us"
  },
  {
    "path": "build/toolchain/generate_wrappers.sh",
    "chars": 696,
    "preview": "#!/bin/bash -e\n\nname=$1\nwrapper=$2\nprefix=$3\ndummy_file=$4\n\nif [[ -z $name || -z $wrapper || -z $prefix ]]; then\n    ech"
  },
  {
    "path": "build/toolchain/managed_toolchain.bzl",
    "chars": 2765,
    "preview": "load(\":cc_toolchain_config.bzl\", \"cc_toolchain_config\")\n\naarch64_glibc_distros = {\n    \"rhel9\": \"11\",\n    \"rhel8\": \"8\",\n"
  },
  {
    "path": "build/toolchain/repositories.bzl",
    "chars": 2456,
    "preview": "\"\"\"A module defining the third party dependency OpenResty\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http"
  },
  {
    "path": "changelog/3.5.0/3.5.0.md",
    "chars": 12075,
    "preview": "## Kong\n\n\n### Performance\n#### Configuration\n\n- Bumped the default value of `upstream_keepalive_pool_size` to `512` and "
  },
  {
    "path": "changelog/3.5.0/kong/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "changelog/3.5.0/kong/10570.yml",
    "chars": 121,
    "preview": "message: \"**response-ratelimiting**: add support for secret rotation with redis connection \"\ntype: feature\nscope: Plugin"
  },
  {
    "path": "changelog/3.5.0/kong/11360-1.yml",
    "chars": 77,
    "preview": "message: \"Bumped lua-resty-healthcheck from 1.6.2 to 1.6.3\"\ntype: dependency\n"
  }
]

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

About this extraction

This page contains the full source code of the Kong/kong GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2479 files (14.1 MB), approximately 3.8M tokens, and a symbol index with 231 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!