From 8b5f097eab59172a9c3ad86b4bf7cc7a2a99eded Mon Sep 17 00:00:00 2001 From: "leilei.gll" Date: Mon, 9 Oct 2023 19:15:08 +0800 Subject: [PATCH] Support StopIteration status in onRequestHeaders and onResponseHeaders function Link: https://code.alibaba-inc.com/Ingress/proxy-wasm-cpp-host/codereview/14120411 * Support StopIteration status in onRequestHeaders and onResponseHeaders function Signed-off-by: leilei.gll * Remove the on_response_headers_abi_03 interface Signed-off-by: leilei.gll * Remove on_response_headers_abi_03 Signed-off-by: leilei.gll --- include/proxy-wasm/wasm.h | 1 + include/proxy-wasm/wasm_vm.h | 2 +- src/bytecode_util.cc | 4 ++++ src/context.cc | 20 ++++++++++++++------ src/wasm.cc | 2 ++ 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/include/proxy-wasm/wasm.h b/include/proxy-wasm/wasm.h index 9fa2bda1f..17bba17a0 100644 --- a/include/proxy-wasm/wasm.h +++ b/include/proxy-wasm/wasm.h @@ -244,6 +244,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 a573212e0..9e5e3419b 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 5353a52a5..91b322e05 100644 --- a/src/context.cc +++ b/src/context.cc @@ -317,14 +317,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); } @@ -493,7 +500,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 cb1dd9b3a..5d92ca05d 100644 --- a/src/wasm.cc +++ b/src/wasm.cc @@ -200,6 +200,8 @@ 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); } #undef _GET_PROXY_ABI #undef _GET_PROXY