写点什么

HowTo:Pipy 如何修改请求和响应的内容

作者:Flomesh
  • 2022 年 9 月 28 日
    北京
  • 本文字数:1649 字

    阅读完需:约 5 分钟

HowTo:Pipy 如何修改请求和响应的内容

在使用代理时,免不了因为各种需求要对请求和响应的内容进行修改。作为可编程的代理,这些功能对 Pipy 来说非常 easy。今天,我们就以两个常见的功能为例。

HTTP 缓存

Pipy 有篇教程是《静态资源服务》,这个就是实现静态服务器的原型。我们最新的网站 https://flomesh.io,正是使用 Pipy 作为静态服务器和 CDN 的。对此感兴趣的同学,可以联系交流,后续我们也会对此写一篇详细的介绍文章。

这里说的只是静态服务器的其中一项功能 HTTP 缓存,在实现这项功能时我们对响应进行了修改。HTTP 缓存的实现有多种,各有优缺点,而我们要讲的是 ETags。



ETag HTTP 响应头是资源的特定版本的标识符。这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web 服务器不需要发送完整的响应。而如果内容发生了变化,使用 ETag 有助于防止资源的同时更新相互覆盖(“空中碰撞”)。

来自 Mozilla 的介绍

假如请求头中的 If-None-Match 值与服务器中资源的版本标识一致,则直接返回 304 Not Modified 响应;否则,返回 200 OK 和最新标本标识的 ETag,以及资源内容。

HTTP 304 Not Modified 说明无需再次传输请求的内容,也就是说可以使用缓存的内容。



实现

代码很简单,以增加新模块(etag.js)的方式添加 HTTP 缓存的支持:

pipy({  _etag: Date.now(),})
.import({ __turnDown: 'proxy',})
.pipeline('request') .handleMessage( msg => ( msg?.head?.headers?.['if-none-match'] == _etag && ( __turnDown = true ) ) ) .replaceMessage( msg => __turnDown ? ( new Message({status: 304, headers: {}}, null) ) : msg )
.pipeline('response') .handleMessageStart( msg => msg?.head?.headers['etag'] = _etag )
复制代码

这里的实现我们修改了改响应头和响应的内容,接下来我们以 XFF 为例看下如何修改请求。

XFF

X-Forwarded-For(XFF)是用来识别通过 HTTP 代理或负载均衡方式连接到 Web 服务器的客户端最原始的 IP 地址的 HTTP 头字段。

格式:X-Forwarded-For: client1, proxy1, proxy2 最左边(client1)是最原始客户端的 IP 地址, 代理服务器每成功收到一个请求,就把请求来源 IP 地址添加到右边。

我们在 04-routing 脚本的基础上,增加了逻辑处理:

....pipeline('request')  .handleMessageStart(    msg => (      _target = _router.find(        msg.head.headers.host,        msg.head.path,      ),      _target && (        msg?.head?.headers?.['X-Forwarded-For'] ? (          msg.head.headers['X-Forwarded-For'] = `${msg.head.headers['X-Forwarded-For']}, ${__inbound.remoteAddress}`        ) : (          msg.head.headers['X-Forwarded-For'] = __inbound.remoteAddress        )      )    )  )...
复制代码

作为上游服务的 02-echo 我们增加了代码以便打印出请求头部的信息:

2022-03-12 21:28:51.714 [INF] [listener] Listening on port 8080 at 0.0.0.02022-03-12 21:28:51.714 [INF] [listener] Listening on port 8081 at 0.0.0.02022-03-12 21:28:51.714 [INF] [listener] Listening on port 8082 at 0.0.0.02022-03-12 21:28:53.316 [INF] msg.head.headers: {"host":"192.168.1.110:8000","user-agent":"curl/7.68.0","accept":"*/*","x-forwarded-for":"192.168.1.5","content-length":"0","connection":"keep-alive"}
复制代码

从日志中,我们看到了上游服务的头部已经可以看到客户端的 IP 192.168.1.5

总结

请求和响应的修改对代理来说是经常用到的功能,除了文中在请求响应头部增加内容,实际上也会需要删除某些信息。比如对上游屏蔽用于安全验证的请求头,或者对响应头部内容进行清理,减少响应大小或者避免敏感信息的泄漏。

传统的代理,在这些实现上少了一些灵活性,提供的能力都是固化在内部的逻辑中。而 Pipy 可编程的理念,让这些功能的实现具有更高的灵活性,易扩展。同时,功能的增加和更新都可以实时更新和加载,对基础设施管理维护的成本更低。

发布于: 刚刚阅读数: 4
用户头像

Flomesh

关注

微信订阅号:flomesh 2022.04.07 加入

一站式云原生应用流量管理供应商 官网:https://flomesh.io

评论

发布
暂无评论
HowTo:Pipy 如何修改请求和响应的内容_Service Mesh 服务网格_Flomesh_InfoQ写作社区