diff --git a/include/proxy-wasm/wasm.h b/include/proxy-wasm/wasm.h index 1a785a8f9..2cb56e0ee 100644 --- a/include/proxy-wasm/wasm.h +++ b/include/proxy-wasm/wasm.h @@ -245,6 +245,7 @@ class WasmBase : public std::enable_shared_from_this { WasmCallWord<2> on_request_headers_abi_01_; WasmCallWord<3> on_request_headers_abi_02_; + WasmCallWord<3> on_request_headers_abi_03_; WasmCallWord<3> on_request_body_; WasmCallWord<2> on_request_trailers_; WasmCallWord<2> on_request_metadata_; diff --git a/include/proxy-wasm/wasm_vm.h b/include/proxy-wasm/wasm_vm.h index acf0ccf3b..98cf86654 100644 --- a/include/proxy-wasm/wasm_vm.h +++ b/include/proxy-wasm/wasm_vm.h @@ -139,7 +139,7 @@ enum class Cloneable { InstantiatedModule // VMs can be cloned from an instantiated module. }; -enum class AbiVersion { ProxyWasm_0_1_0, ProxyWasm_0_2_0, ProxyWasm_0_2_1, Unknown }; +enum class AbiVersion { ProxyWasm_0_1_0, ProxyWasm_0_2_0, ProxyWasm_0_2_1, ProxyWasm_0_2_100, Unknown }; class NullPlugin; diff --git a/src/bytecode_util.cc b/src/bytecode_util.cc index 70a373e01..d0d7dc868 100644 --- a/src/bytecode_util.cc +++ b/src/bytecode_util.cc @@ -83,6 +83,10 @@ bool BytecodeUtil::getAbiVersion(std::string_view bytecode, proxy_wasm::AbiVersi ret = AbiVersion::ProxyWasm_0_2_1; return true; } + if (export_name == "proxy_abi_version_0_2_100") { + ret = AbiVersion::ProxyWasm_0_2_100; + return true; + } } // Skip export's index. if (!parseVarint(pos, end, export_name_size)) { diff --git a/src/context.cc b/src/context.cc index 29037ae43..70467f449 100644 --- a/src/context.cc +++ b/src/context.cc @@ -311,14 +311,21 @@ template static uint32_t headerSize(const P &p) { return p ? p->siz FilterHeadersStatus ContextBase::onRequestHeaders(uint32_t headers, bool end_of_stream) { CHECK_FAIL_HTTP(FilterHeadersStatus::Continue, FilterHeadersStatus::StopAllIterationAndWatermark); - if (!wasm_->on_request_headers_abi_01_ && !wasm_->on_request_headers_abi_02_) { + if (!wasm_->on_request_headers_abi_01_ && !wasm_->on_request_headers_abi_02_ && + !wasm_->on_request_headers_abi_03_) { return FilterHeadersStatus::Continue; } DeferAfterCallActions actions(this); - const auto result = wasm_->on_request_headers_abi_01_ - ? wasm_->on_request_headers_abi_01_(this, id_, headers) - : wasm_->on_request_headers_abi_02_(this, id_, headers, - static_cast(end_of_stream)); + uint64_t result; + if (wasm_->on_request_headers_abi_01_) { + result = wasm_->on_request_headers_abi_01_(this, id_, headers); + } else if (wasm_->on_request_headers_abi_02_) { + result = + wasm_->on_request_headers_abi_02_(this, id_, headers, static_cast(end_of_stream)); + } else if (wasm_->on_request_headers_abi_03_) { + result = + wasm_->on_request_headers_abi_03_(this, id_, headers, static_cast(end_of_stream)); + } CHECK_FAIL_HTTP(FilterHeadersStatus::Continue, FilterHeadersStatus::StopAllIterationAndWatermark); return convertVmCallResultToFilterHeadersStatus(result); } @@ -487,7 +494,8 @@ FilterHeadersStatus ContextBase::convertVmCallResultToFilterHeadersStatus(uint64 result > static_cast(FilterHeadersStatus::StopAllIterationAndWatermark)) { return FilterHeadersStatus::StopAllIterationAndWatermark; } - if (result == static_cast(FilterHeadersStatus::StopIteration)) { + if ((wasm_->on_request_headers_abi_01_ || wasm_->on_request_headers_abi_02_) && + result == static_cast(FilterHeadersStatus::StopIteration)) { // Always convert StopIteration (pause processing headers, but continue processing body) // to StopAllIterationAndWatermark (pause all processing), since the former breaks all // assumptions about HTTP processing. diff --git a/src/wasm.cc b/src/wasm.cc index a7a22fc9c..9a517ec63 100644 --- a/src/wasm.cc +++ b/src/wasm.cc @@ -125,7 +125,8 @@ void WasmBase::registerCallbacks() { } else if (abiVersion() == AbiVersion::ProxyWasm_0_2_0) { _REGISTER_PROXY(continue_stream); _REGISTER_PROXY(close_stream); - } else if (abiVersion() == AbiVersion::ProxyWasm_0_2_1) { + } else if (abiVersion() == AbiVersion::ProxyWasm_0_2_1 || + abiVersion() == AbiVersion::ProxyWasm_0_2_100) { _REGISTER_PROXY(continue_stream); _REGISTER_PROXY(close_stream); _REGISTER_PROXY(get_log_level); @@ -179,6 +180,10 @@ void WasmBase::getFunctions() { _GET_PROXY_ABI(on_request_headers, _abi_02); _GET_PROXY_ABI(on_response_headers, _abi_02); _GET_PROXY(on_foreign_function); + } else if (abiVersion() == AbiVersion::ProxyWasm_0_2_100) { + _GET_PROXY_ABI(on_request_headers, _abi_03); + _GET_PROXY_ABI(on_response_headers, _abi_02); + _GET_PROXY(on_foreign_function); } #undef _GET_PROXY_ABI #undef _GET_PROXY