我在使用 Envoy 的外部处理过滤器时遇到了一些困难(如此处所述。我目前正在使用与此示例类似的设置,我想对请求和使用 Go 中的 GRPC 服务器将响应主体发送到上游服务。
我面临的问题是,当我尝试更改请求正文时,即使用 BodyMutation 发送新正文(基本上相同的 JSON,但作为示例更改了一个字段)时,缺少 Content-Length 标头当请求转发到上游服务时,这会导致错误。然而,如果我不改变主体(所以没有 BodyMutation),标头就应该在那里。
基本上,如果我尝试像这样设置请求正文的处理响应:
bytesToSend := b.RequestBody.Body
resp = &pb.ProcessingResponse{
Response: &pb.ProcessingResponse_RequestBody{
RequestBody: &pb.BodyResponse{
Response: &pb.CommonResponse{
HeaderMutation: &pb.HeaderMutation{
SetHeaders: []*core.HeaderValueOption{
{
Header: &core.HeaderValue{
Key: "Content-Length",
Value: strconv.Itoa(len(bytesToSend)),
},
},
},
},
BodyMutation: &pb.BodyMutation{
Mutation: &pb.BodyMutation_Body{
Body: bytesToSend,
},
},
},
},
},
ModeOverride: &v3.ProcessingMode{
ResponseHeaderMode: v3.ProcessingMode_SEND,
ResponseBodyMode: v3.ProcessingMode_NONE,
},
}
Content-Length 被完全删除。但如果我不设置 BodyMutation,就像这样:
bytesToSend := b.RequestBody.Body
resp = &pb.ProcessingResponse{
Response: &pb.ProcessingResponse_RequestBody{
RequestBody: &pb.BodyResponse{
Response: &pb.CommonResponse{
HeaderMutation: &pb.HeaderMutation{
SetHeaders: []*core.HeaderValueOption{
{
Header: &core.HeaderValue{
Key: "Content-Length",
Value: strconv.Itoa(len(bytesToSend)),
},
},
},
},
},
},
},
ModeOverride: &v3.ProcessingMode{
ResponseHeaderMode: v3.ProcessingMode_SEND,
ResponseBodyMode: v3.ProcessingMode_NONE,
},
}
然后出现 Content-Length,并且 HeaderMutation 确实将其设置为我设置的任何值(在示例中,它又只是正文的长度)。
我不太清楚这里的行为。在这段代码或 Envoy 的配置中,有什么我应该特别注意的吗?
任何指点将不胜感激。
编辑:似乎这里的行为是:当正文发生突变时,它会切换到分块传输编码,因此删除内容长度。这是有道理的,但如果上游服务需要内容长度,则会导致问题。标头突变被忽略,因此手动计算内容长度并发送似乎不起作用。
我最近遇到了同样的问题。我尝试了与您相同的代码,但它不起作用。然而,当我切换到标题中的
RawValue
后,它起作用了!
像这样:
resp := &extProcPb.ProcessingResponse{
Response: &extProcPb.ProcessingResponse_RequestBody{
RequestBody: &extProcPb.BodyResponse{
Response: &extProcPb.CommonResponse{
HeaderMutation: &extProcPb.HeaderMutation{
SetHeaders: []*core.HeaderValueOption{
{
Header: &core.HeaderValue{
Key: "Content-Length",
RawValue: []byte(strconv.Itoa(len(updatedBody))),
},
},
},
BodyMutation: &extProcPb.BodyMutation{
Mutation: &extProcPb.BodyMutation_Body{
Body: updatedBody,
},
},
},
},
},
}