Envoy 外部处理过滤器:处理请求正文时内容长度标头出现问题

问题描述 投票:0回答:1

我在使用 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 的配置中,有什么我应该特别注意的吗?

任何指点将不胜感激。

编辑:似乎这里的行为是:当正文发生突变时,它会切换到分块传输编码,因此删除内容长度。这是有道理的,但如果上游服务需要内容长度,则会导致问题。标头突变被忽略,因此手动计算内容长度并发送似乎不起作用。

go grpc envoyproxy
1个回答
0
投票

我最近遇到了同样的问题。我尝试了与您相同的代码,但它不起作用。然而,当我切换到标题中的

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,
                        },
                    },
                },
            },
        },
    }
© www.soinside.com 2019 - 2024. All rights reserved.