@@ -25,7 +25,10 @@ import (
25
25
corev1 "k8s.io/api/core/v1"
26
26
apierrors "k8s.io/apimachinery/pkg/api/errors"
27
27
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
28
+ "k8s.io/apimachinery/pkg/runtime"
29
+ "k8s.io/client-go/kubernetes/scheme"
28
30
listcorev1 "k8s.io/client-go/listers/core/v1"
31
+ "k8s.io/klog/v2"
29
32
30
33
clusterapis "github.com/karmada-io/karmada/pkg/apis/cluster"
31
34
clusterv1alpha1 "github.com/karmada-io/karmada/pkg/apis/cluster/v1alpha1"
@@ -118,15 +121,15 @@ func (c *Cluster) Connect(ctx context.Context, request framework.ProxyRequest) (
118
121
// Objects get by client via proxy are edited some fields, different from objects in member clusters.
119
122
// So before update, we shall recover these fields.
120
123
return http .HandlerFunc (func (rw http.ResponseWriter , req * http.Request ) {
121
- if err = modifyRequest (req , clusterName ); err != nil {
124
+ if err = modifyRequest (req , request , clusterName ); err != nil {
122
125
request .Responder .Error (err )
123
126
return
124
127
}
125
128
h .ServeHTTP (rw , req )
126
129
}), nil
127
130
}
128
131
129
- func modifyRequest (req * http.Request , cluster string ) error {
132
+ func modifyRequest (req * http.Request , requestInfo framework. ProxyRequest , cluster string ) error {
130
133
if req .ContentLength == 0 {
131
134
return nil
132
135
}
@@ -143,9 +146,16 @@ func modifyRequest(req *http.Request, cluster string) error {
143
146
req .ContentLength = int64 (body .Len ())
144
147
}()
145
148
146
- obj := & unstructured.Unstructured {}
147
- _ , _ , err = unstructured .UnstructuredJSONScheme .Decode (body .Bytes (), nil , obj )
149
+ encoder , decoder , obj , err := getSerializer (req , requestInfo )
148
150
if err != nil {
151
+ klog .Warningf ("modifyRequest getSerializer error for request %s: %v" , req .RequestURI , err )
152
+ // ignore error
153
+ return nil
154
+ }
155
+
156
+ _ , _ , err = decoder .Decode (body .Bytes (), nil , obj )
157
+ if err != nil {
158
+ klog .Warningf ("modifyRequest decode error for request %s: %v" , req .RequestURI , err )
149
159
// ignore error
150
160
return nil
151
161
}
@@ -156,8 +166,23 @@ func modifyRequest(req *http.Request, cluster string) error {
156
166
if changed {
157
167
// write changed object into body
158
168
body .Reset ()
159
- return unstructured . UnstructuredJSONScheme .Encode (obj , body )
169
+ return encoder .Encode (obj , body )
160
170
}
161
171
162
172
return nil
163
173
}
174
+
175
+ func getSerializer (req * http.Request , requestInfo framework.ProxyRequest ) (runtime.Encoder , runtime.Decoder , runtime.Object , error ) {
176
+ gvk , _ := requestInfo .RestMapper .KindFor (requestInfo .GroupVersionResource )
177
+ if scheme .Scheme .Recognizes (gvk ) {
178
+ negotiator := runtime .NewClientNegotiator (scheme .Codecs .WithoutConversion (), requestInfo .GroupVersionResource .GroupVersion ())
179
+ contentType := req .Header .Get ("Content-Type" )
180
+ encoder , _ := negotiator .Encoder (contentType , nil )
181
+ decoder , _ := negotiator .Decoder (contentType , nil )
182
+
183
+ obj , err := scheme .Scheme .New (gvk )
184
+ return encoder , decoder , obj , err
185
+ }
186
+
187
+ return unstructured .UnstructuredJSONScheme , unstructured .UnstructuredJSONScheme , & unstructured.Unstructured {}, nil
188
+ }
0 commit comments