PreserveCase插件

在处理HTTP/1.1请求时,Envoy默认会将请求与响应的头部的Key都转化为小写,这对于一些依赖头部大小写的应用产生了很大影响。PreserveCase插件在启用后,能够让网关与Sidecar保持其转发的请求/响应头部的大小写,以解决头部大小写敏感应用的服务网格依赖问题。

前提条件

配置字段

名称

数据类型

填写要求

默认值

描述

request_or_response

string

必填

-

该参数指定了要保留请求头还是响应头的大小写,有三个可能取值:

  • REQUEST_HEADER:保持转发的请求头的大小写。

  • RESPONSE_HEADER:保持转发的响应头的大小写。

  • BOTH_HEADER:同时保持请求头与响应头的大小写。

配置示例

在示例的环境中访问httpbin服务,可以发现返回的响应头都为小写。对于一些依赖响应头大小写的应用,服务网格的这一默认行为可能造成严重的兼容性影响。

$ curl -I {网关ip地址}/get
HTTP/1.1 200 OK
server: istio-envoy
date: Thu, 16 Jun 2022 07:54:10 GMT
content-type: application/json
content-length: 504
access-control-allow-origin: *
access-control-allow-credentials: true
x-envoy-upstream-service-time: 2

此时所有的响应头都为小写。 启用PreserveCase插件,并配置以下参数,以保持网关和Sidecar代理的请求响应头的大小写。

request_or_response: RESPONSE_HEADER

选择插件的生效范围为全局生效,并再次进行测试:

$ curl -I {网关ip地址}/get
HTTP/1.1 200 OK
Server: istio-envoy
Date: Thu, 16 Jun 2022 11:28:43 GMT
Content-Type: application/json
Content-Length: 507
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
x-envoy-upstream-service-time: 8

可以发现,在插件生效后,DateContent-TypeContent-Length等响应头都恢复了原先的大小写形式,而没有被强制转换成小写。