如何解决特使过滤器拦截上游响应
我已经为 envoy 编写了 ext_authz 过滤器,并且对 envoy 过滤器的工作方式有了基本的了解。但现在我想过滤从上游回来的响应。具体来说,我想处理两件事:
-
拦截来自上游的数据/jsonBody,并在 Envoy 发送回下游之前根据一些业务规则过滤/修改 responseJsonBody。
-
如果上游关闭(当 http 响应代码为 408-Timeout 时),我想将 post-request 保存到 async-msg-que 并将 202-Accepted 发送回下游。这样,当上游回来时,它会处理来自它的 async-msg-que 的挂起的 post-request。
是否有我可以用于这些目的的现有过滤器,或者使用 envoy-proxy sidecar 执行此操作的正确方法是什么。
谢谢。
解决方法
你需要使用lua自己编写过滤器:
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: custom-filter
namespace: some-namespace
spec:
workloadSelector:
labels:
istio: ingressgateway
configPatches:
- applyTo: HTTP_FILTER
match:
context: GATEWAY
listener:
filterChain:
filter:
name: "envoy.filters.network.http_connection_manager"
subFilter:
name: "envoy.extAuthz" # name of your ext_authz filter
patch:
operation: INSERT_AFTER
value:
name: envoy.custom-resp
typed_config:
"@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua"
inlineCode: |
function envoy_on_response(response_handle)
if response_handle:headers():get(":status") == "408" then
-- send message depending on your queue,eg via httpCall()
-- Overwrite status and body
response_handle:headers():replace(":status","202")
else
-- get response body as jsonString
local body = response_handle:body()
local jsonString = tostring(body:getBytes(0,body:length()))
-- do something,eg replace secret by regex
jsonString = jsonString:gsub("(foo|bar)","")
response_handle:body():set(jsonString)
end
end
请注意,您需要以某种方式处理队列超时。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。