@@ -23,55 +23,93 @@ import (
23
23
24
24
basepb "github.com/envoyproxy/go-control-plane/envoy/config/core/v3"
25
25
eppb "github.com/envoyproxy/go-control-plane/envoy/service/ext_proc/v3"
26
+ extProcPb "github.com/envoyproxy/go-control-plane/envoy/service/ext_proc/v3"
26
27
"sigs.k8s.io/controller-runtime/pkg/log"
27
28
"sigs.k8s.io/gateway-api-inference-extension/pkg/body-based-routing/metrics"
28
29
logutil "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/util/logging"
29
30
)
30
31
32
+ const modelHeader = "X-Gateway-Model-Name"
33
+
31
34
// HandleRequestBody handles request bodies.
32
- func (s * Server ) HandleRequestBody (ctx context.Context , body * eppb. HttpBody ) (* eppb.ProcessingResponse , error ) {
35
+ func (s * Server ) HandleRequestBody (ctx context.Context , data map [ string ] any ) ([] * eppb.ProcessingResponse , error ) {
33
36
logger := log .FromContext (ctx )
37
+ var ret []* eppb.ProcessingResponse
34
38
35
- var data map [ string ] any
36
- if err := json . Unmarshal ( body . GetBody (), & data ); err != nil {
39
+ requestBodyBytes , err := json . Marshal ( data )
40
+ if err != nil {
37
41
return nil , err
38
42
}
39
43
40
44
modelVal , ok := data ["model" ]
41
45
if ! ok {
42
46
metrics .RecordModelNotInBodyCounter ()
43
47
logger .V (logutil .DEFAULT ).Info ("Request body does not contain model parameter" )
44
- return & eppb.ProcessingResponse {
45
- Response : & eppb.ProcessingResponse_RequestBody {
46
- RequestBody : & eppb.BodyResponse {},
47
- },
48
- }, nil
48
+ if s .streaming {
49
+ ret = append (ret , & eppb.ProcessingResponse {
50
+ Response : & eppb.ProcessingResponse_RequestHeaders {
51
+ RequestHeaders : & eppb.HeadersResponse {},
52
+ },
53
+ })
54
+ ret = addStreamedBodyResponse (ret , requestBodyBytes )
55
+ return ret , nil
56
+ } else {
57
+ ret = append (ret , & eppb.ProcessingResponse {
58
+ Response : & eppb.ProcessingResponse_RequestBody {
59
+ RequestBody : & eppb.BodyResponse {},
60
+ },
61
+ })
62
+ }
63
+ return ret , nil
49
64
}
50
65
51
66
modelStr , ok := modelVal .(string )
52
67
if ! ok {
53
68
metrics .RecordModelNotParsedCounter ()
54
69
logger .V (logutil .DEFAULT ).Info ("Model parameter value is not a string" )
55
- return & eppb.ProcessingResponse {
56
- Response : & eppb.ProcessingResponse_RequestBody {
57
- RequestBody : & eppb.BodyResponse {},
58
- },
59
- }, fmt .Errorf ("the model parameter value %v is not a string" , modelVal )
70
+ return nil , fmt .Errorf ("the model parameter value %v is not a string" , modelVal )
60
71
}
61
72
62
73
metrics .RecordSuccessCounter ()
63
- return & eppb.ProcessingResponse {
64
- Response : & eppb.ProcessingResponse_RequestBody {
65
- RequestBody : & eppb.BodyResponse {
66
- Response : & eppb.CommonResponse {
67
- // Necessary so that the new headers are used in the routing decision.
68
- ClearRouteCache : true ,
69
- HeaderMutation : & eppb.HeaderMutation {
70
- SetHeaders : []* basepb.HeaderValueOption {
71
- {
72
- Header : & basepb.HeaderValue {
73
- Key : "X-Gateway-Model-Name" ,
74
- RawValue : []byte (modelStr ),
74
+
75
+ if s .streaming {
76
+ ret = append (ret , & eppb.ProcessingResponse {
77
+ Response : & eppb.ProcessingResponse_RequestHeaders {
78
+ RequestHeaders : & eppb.HeadersResponse {
79
+ Response : & eppb.CommonResponse {
80
+ ClearRouteCache : true ,
81
+ HeaderMutation : & eppb.HeaderMutation {
82
+ SetHeaders : []* basepb.HeaderValueOption {
83
+ {
84
+ Header : & basepb.HeaderValue {
85
+ Key : modelHeader ,
86
+ RawValue : []byte (modelStr ),
87
+ },
88
+ },
89
+ },
90
+ },
91
+ },
92
+ },
93
+ },
94
+ })
95
+ ret = addStreamedBodyResponse (ret , requestBodyBytes )
96
+ return ret , nil
97
+ }
98
+
99
+ return []* eppb.ProcessingResponse {
100
+ {
101
+ Response : & eppb.ProcessingResponse_RequestBody {
102
+ RequestBody : & eppb.BodyResponse {
103
+ Response : & eppb.CommonResponse {
104
+ // Necessary so that the new headers are used in the routing decision.
105
+ ClearRouteCache : true ,
106
+ HeaderMutation : & eppb.HeaderMutation {
107
+ SetHeaders : []* basepb.HeaderValueOption {
108
+ {
109
+ Header : & basepb.HeaderValue {
110
+ Key : modelHeader ,
111
+ RawValue : []byte (modelStr ),
112
+ },
75
113
},
76
114
},
77
115
},
@@ -82,20 +120,43 @@ func (s *Server) HandleRequestBody(ctx context.Context, body *eppb.HttpBody) (*e
82
120
}, nil
83
121
}
84
122
123
+ func addStreamedBodyResponse (responses []* eppb.ProcessingResponse , requestBodyBytes []byte ) []* eppb.ProcessingResponse {
124
+ return append (responses , & extProcPb.ProcessingResponse {
125
+ Response : & extProcPb.ProcessingResponse_RequestBody {
126
+ RequestBody : & extProcPb.BodyResponse {
127
+ Response : & extProcPb.CommonResponse {
128
+ BodyMutation : & extProcPb.BodyMutation {
129
+ Mutation : & extProcPb.BodyMutation_StreamedResponse {
130
+ StreamedResponse : & extProcPb.StreamedBodyResponse {
131
+ Body : requestBodyBytes ,
132
+ EndOfStream : true ,
133
+ },
134
+ },
135
+ },
136
+ },
137
+ },
138
+ },
139
+ })
140
+ }
141
+
85
142
// HandleRequestHeaders handles request headers.
86
- func (s * Server ) HandleRequestHeaders (headers * eppb.HttpHeaders ) (* eppb.ProcessingResponse , error ) {
87
- return & eppb.ProcessingResponse {
88
- Response : & eppb.ProcessingResponse_RequestHeaders {
89
- RequestHeaders : & eppb.HeadersResponse {},
143
+ func (s * Server ) HandleRequestHeaders (headers * eppb.HttpHeaders ) ([]* eppb.ProcessingResponse , error ) {
144
+ return []* eppb.ProcessingResponse {
145
+ {
146
+ Response : & eppb.ProcessingResponse_RequestHeaders {
147
+ RequestHeaders : & eppb.HeadersResponse {},
148
+ },
90
149
},
91
150
}, nil
92
151
}
93
152
94
153
// HandleRequestTrailers handles request trailers.
95
- func (s * Server ) HandleRequestTrailers (trailers * eppb.HttpTrailers ) (* eppb.ProcessingResponse , error ) {
96
- return & eppb.ProcessingResponse {
97
- Response : & eppb.ProcessingResponse_RequestTrailers {
98
- RequestTrailers : & eppb.TrailersResponse {},
154
+ func (s * Server ) HandleRequestTrailers (trailers * eppb.HttpTrailers ) ([]* eppb.ProcessingResponse , error ) {
155
+ return []* eppb.ProcessingResponse {
156
+ {
157
+ Response : & eppb.ProcessingResponse_RequestTrailers {
158
+ RequestTrailers : & eppb.TrailersResponse {},
159
+ },
99
160
},
100
161
}, nil
101
162
}
0 commit comments