特使过滤器拦截上游响应

2023-12-08

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

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

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

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

Thanks.


您需要使用 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 Docs

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

特使过滤器拦截上游响应 的相关文章

随机推荐

  • Android Studio 与实验性 gradle 0.2.0

    我正在尝试使用最新版本的 android studio 设置基本的 ndk 构建 试图跟随本教程 这是我的gradle wrapper properties Thu Sep 17 14 22 34 CST 2015 distribution
  • 加入线程:“避免资源死锁”

    我使用一个 C 类来封装升压 asio io service class IoService public static IoService getInstance static IoService instance return inst
  • 从 xstream 反序列化 xml 文件

    我正在使用 Xstream 序列化 Job 对象 看起来工作正常 但反序列化时 我遇到了一个问题 Exception in thread main com thoughtworks xstream io StreamException on
  • 在表视图外部触摸时隐藏 UITableView

    我有一个小UI表格视图加载视图时隐藏 当我点击 SHOW UIButton the UI表格视图可见myTableView hidden NO 我想隐藏UI表格视图当用户触摸其框架之外时 谢谢你的帮助 最佳方法 简单 在显示 UITable
  • 如何一次将多个 csv 文件读入 R 并知道数据来自哪个文件? [复制]

    这个问题在这里已经有答案了 我想将多个 csv 文件读入 R 并将它们组合成一个大表 然而 我需要一列来标识每行来自哪个文件 基本上 文件中的每一行都有一个唯一的标识号 但这些数字在文件之间会重复 因此 如果我将所有文件绑定到一个表中而不知
  • JavaScript 对象属性可以引用同一对象的另一个属性吗? [复制]

    这个问题在这里已经有答案了 我最近尝试创建一个像这样的对象 var carousel slider carousel1 slider panes carousel slider children length 我的目的是通过缓存结果来提高
  • 将自定义订单状态添加到 WooCommerce 管理订单列表中的过滤器菜单

    我目前正在尝试将新的快速过滤器 subsubsub 添加到 WooCommerce 管理订单列表 我有一个名为 wc test accepted 的自定义订单状态 如何将自定义订单状态的新快速过滤器添加到顶部 要在订单状态菜单过滤器中获取与
  • 使用 CSS 将 pre 元素另存为 PDF

    我制造了一个语法荧光笔我想要一个保存为 PDF 的选项 我看过这个问题 但下载它不会保留 CSS 样式 这会破坏下载突出显示文件的意义 有什么办法可以拯救我的pre元素作为 PDF 同时保留 CSS HTML pre highlighted
  • 如何在列表中放置列表项项目符号?

    你会看到我的 HTML 生成的数字 项目符号使左侧的元素看起来很难看 https i stack imgur com nAb8C jpg 我试图在 CSS 中使用边距和填充 但两者都不起作用 帮助 我希望数字显示距图像左侧至少 5 像素 A
  • Woocommerce:用户只能购买一次产品

    我可以在主题的functions php 文件中添加什么 以使用户只能购买产品一次 就像他们以前在商店购买过任何产品一样 他们将无法再次购买 我想代码看起来像这样 伪代码 并且会使用 woocommerce add cart item da
  • JSON 解析错误:意外的标识符“未定义”(React Native)

    我正在尝试使用异步存储来存储两个作为对象存储的文本输入值 并将其传递到不同的视图 在按下按钮时它们将显示在其中 正如其他 StackOverflow 帖子中提到的 我使用 JSON parse 和 JSON stringify 将对象作为
  • Xcode 签名错误无法创建配置文件并且未找到“com.photo.appwall”的配置文件

    我在签署申请时遇到问题 无法创建配置文件 未找到 com photo appwall 的配置文件 该错误消息似乎不言自明 您需要在 Apple 的开发人员门户上注册您的测试设备 登录 Apple 的开发者门户 Click Certifica
  • 如何在 Node.js 中从 URL 进行请求

    是否有标准方法要求 Node 模块位于某个 URL 而不是本地文件系统上 就像是 require http example com nodejsmodules myModule js 目前 我只是将文件提取到临时文件中 并要求这样做 您可以
  • Windows 资源监视器使用哪个 API?

    Windows 资源监视器显示 除其他外 当前哪些进程正在访问磁盘上的哪些文件 它是实时进行的 How 我知道它可能使用 ETW 并且我可以使用 xperf 等工具生成跟踪 但是如何在无需启动 停止和解析跟踪文件的情况下获取实时信息呢 我需
  • 在Android中向多列GridView添加页脚视图?

    是否可以将页脚视图添加到 GridView 具有多列 其行为类似于 ListView 的页脚 那么这个页脚视图 例如分页视图 仅在用户滚动到 GridView 底部时才会出现 并且它具有整个屏幕的宽度 而不仅仅是 1 个网格元素 不 对不起
  • “num - 1”与“num -= 1”

    在第 4 行中 为什么我们必须在 后面添加 num 5 if num gt 2 print num num 1 print num num 1 产生减去 1 的结果num num没有改变 num 1 减一num并存储该结果 相当于num n
  • 小程序无法从 jar 加载类

    一些用户抱怨小程序不再工作 当他们查看 java 控制台时 他们会遇到 java lang noClassDefFoundError 并检查我的访问日志 我发现他们已经下载了包含该类的 jar 文件 然后发出 get对特定类别的请求 不同的
  • 如何用图像中每个像素的颜色绘制图形?

    我正在研究图像颜色识别 因此我将 RGB 图像转换为 Lab 因为它是最接近人类视觉的颜色空间 之后 我获取实验室的 3 个通道中的每一个 并希望在 3D 图形中绘制我在转换图像中识别出的颜色变化 如何使用图像的颜色绘制图形 import
  • iphone MGTwitterEngine - 使用我的应用程序签名发布推文

    我在 iPhone 应用程序中使用 MGTwitterEngine 效果非常好 我想要更改的一件事是 Twitter 上出现的 从 MGTwitterEngine 发布 显然 我希望它说 来自 MyCoolApp 并链接到该应用程序的网站
  • 特使过滤器拦截上游响应

    我已经为 envoy 编写了 ext authz 过滤器 并且对 envoy 过滤器的工作原理有基本的了解 但现在我想过滤从上游返回的响应 具体来说 我想处理两件事 在 Envoy 发送回下游之前 拦截来自上游的 data jsonBody