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
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
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 ![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.