From af8748d754dea67abe97052191aa0ee3c8158474 Mon Sep 17 00:00:00 2001 From: rinfx Date: Thu, 30 Oct 2025 10:58:25 +0800 Subject: [PATCH] add inject_encoded_data_to_filter_chain_on_header example (#3071) --- .../examples/test-foreign-function/README.md | 26 +++++++++++ .../examples/test-foreign-function/go.mod | 20 +++++++++ .../examples/test-foreign-function/go.sum | 32 ++++++++++++++ .../examples/test-foreign-function/main.go | 43 +++++++++++++++++++ 4 files changed, 121 insertions(+) create mode 100644 plugins/wasm-go/examples/test-foreign-function/README.md create mode 100644 plugins/wasm-go/examples/test-foreign-function/go.mod create mode 100644 plugins/wasm-go/examples/test-foreign-function/go.sum create mode 100644 plugins/wasm-go/examples/test-foreign-function/main.go diff --git a/plugins/wasm-go/examples/test-foreign-function/README.md b/plugins/wasm-go/examples/test-foreign-function/README.md new file mode 100644 index 000000000..168fdbad2 --- /dev/null +++ b/plugins/wasm-go/examples/test-foreign-function/README.md @@ -0,0 +1,26 @@ +## 功能说明 + +此插件示例用于展示在无响应body情况下如何添加body数据。 + +**注意** +1. 原始响应不能够有body,如果有原始的响应body,会造成网关crash +2. header阶段需返回`types.ActionPause` +3. `Endstream`必须设置为`true` + +示例中 `inject_encoded_data_to_filter_chain_on_header` 该函数是异步调用,需要保证调用时流不被销毁,有body或者header阶段不返回`types.ActionPause`都可能导致流被提前销毁。 + +一份无响应body的flask代码示例: + +```python +import os +from flask import Flask, request, Response + +app = Flask(__name__) + +@app.route('/test', methods=['GET', 'POST']) +def print_request(): + return Response(status=200) + +if __name__ == '__main__': + app.run("0.0.0.0", 5000, debug=False) +``` \ No newline at end of file diff --git a/plugins/wasm-go/examples/test-foreign-function/go.mod b/plugins/wasm-go/examples/test-foreign-function/go.mod new file mode 100644 index 000000000..53516f29b --- /dev/null +++ b/plugins/wasm-go/examples/test-foreign-function/go.mod @@ -0,0 +1,20 @@ +module github.com/alibaba/higress/plugins/wasm-go/extensions/test-foreign-function + +go 1.24.1 + +toolchain go1.24.3 + +require ( + github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20250822030947-8345453fddd0 + github.com/higress-group/wasm-go v1.0.3-0.20251011083635-792cb1547bac + github.com/tidwall/gjson v1.18.0 + google.golang.org/protobuf v1.36.6 +) + +require ( + github.com/google/uuid v1.6.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.1 // indirect + github.com/tidwall/resp v0.1.1 // indirect + github.com/tidwall/sjson v1.2.5 // indirect +) diff --git a/plugins/wasm-go/examples/test-foreign-function/go.sum b/plugins/wasm-go/examples/test-foreign-function/go.sum new file mode 100644 index 000000000..b296be8d4 --- /dev/null +++ b/plugins/wasm-go/examples/test-foreign-function/go.sum @@ -0,0 +1,32 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20250822030947-8345453fddd0 h1:YGdj8KBzVjabU3STUfwMZghB+VlX6YLfJtLbrsWaOD0= +github.com/higress-group/proxy-wasm-go-sdk v0.0.0-20250822030947-8345453fddd0/go.mod h1:tRI2LfMudSkKHhyv1uex3BWzcice2s/l8Ah8axporfA= +github.com/higress-group/wasm-go v1.0.3-0.20251011083635-792cb1547bac h1:tdJzS56Xa6BSHAi9P2omvb98bpI8qFGg6jnCPtPmDgA= +github.com/higress-group/wasm-go v1.0.3-0.20251011083635-792cb1547bac/go.mod h1:B8C6+OlpnyYyZUBEdUXA7tYZYD+uwZTNjfkE5FywA+A= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/resp v0.1.1 h1:Ly20wkhqKTmDUPlyM1S7pWo5kk0tDu8OoC/vFArXmwE= +github.com/tidwall/resp v0.1.1/go.mod h1:3/FrruOBAxPTPtundW0VXgmsQ4ZBA0Aw714lVYgwFa0= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/plugins/wasm-go/examples/test-foreign-function/main.go b/plugins/wasm-go/examples/test-foreign-function/main.go new file mode 100644 index 000000000..00e94a597 --- /dev/null +++ b/plugins/wasm-go/examples/test-foreign-function/main.go @@ -0,0 +1,43 @@ +package main + +import ( + "github.com/higress-group/proxy-wasm-go-sdk/proxywasm" + "github.com/higress-group/proxy-wasm-go-sdk/proxywasm/types" + "github.com/higress-group/wasm-go/pkg/log" + pb "github.com/higress-group/wasm-go/pkg/protos" + "github.com/higress-group/wasm-go/pkg/wrapper" + "github.com/tidwall/gjson" + "google.golang.org/protobuf/proto" +) + +type TestConfig struct { +} + +func main() {} + +func init() { + wrapper.SetCtx( + "test-foreign-function", + wrapper.ParseConfig(parseConfig), + wrapper.ProcessResponseHeaders(onHttpResponseHeaders), + ) +} + +func parseConfig(configJson gjson.Result, config *TestConfig) error { + return nil +} + +func onHttpResponseHeaders(ctx wrapper.HttpContext, config TestConfig) types.Action { + proxywasm.RemoveHttpResponseHeader("content-length") + ctx.DontReadResponseBody() + d := &pb.InjectEncodedDataToFilterChainArguments{ + Body: "hello foreign function\n", + Endstream: true, + } + s, _ := proto.Marshal(d) + _, err := proxywasm.CallForeignFunction("inject_encoded_data_to_filter_chain_on_header", s) + if err != nil { + log.Errorf("call inject_encoded_data_to_filter_chain_on_header failed, error: %+v", err) + } + return types.ActionContinue +}