首页 > 解决方案 > 特使过滤器拦截上游响应

问题描述

我已经为 envoy 编写了 ext_authz 过滤器,并且对 envoy 过滤器是如何完成的有基本的了解。但现在我想过滤从上游返回的响应。具体来说,我想处理两件事:

  1. 拦截来自上游的 data/jsonBody 并在 envoy 发送回下游之前根据某些业务规则过滤/修改 responseJsonBody。

  2. 如果上游关闭(当 http 响应代码 408-Timeout 时),我想将 post-request 保存到 async-msg-que 并将 202-Accepted 发送回下游。这样,当上游返回时,它将处理来自它的 async-msg-que 的未决后请求。

是否有一个现有的过滤器可以用于这些目的,或者使用 envoy-proxy sidecar 的正确方法是什么。

谢谢。

标签: istioenvoyproxyistio-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

请注意,您需要以某种方式处理队列的超时。

Lua 特使

httpCall

Lua 文档


推荐阅读