From d303cbdfc469dacb731fe00dbc9152d90d59948c Mon Sep 17 00:00:00 2001 From: yue9944882 <291271447@qq.com> Date: Thu, 4 Apr 2019 20:46:22 +0800 Subject: [PATCH] fixes patch format --- .../java/io/kubernetes/client/ApiClient.java | 4 ++ .../kubernetes/client/util/ClientBuilder.java | 37 ++++++++++ .../util/ProxyContentTypeRequestBody.java | 36 ++++++++++ .../client/util/ClientBuilderPatchTest.java | 72 +++++++++++++++++++ .../client/util/ClientBuilderTest.java | 10 +++ 5 files changed, 159 insertions(+) create mode 100644 util/src/main/java/io/kubernetes/client/util/ProxyContentTypeRequestBody.java create mode 100644 util/src/test/java/io/kubernetes/client/util/ClientBuilderPatchTest.java diff --git a/kubernetes/src/main/java/io/kubernetes/client/ApiClient.java b/kubernetes/src/main/java/io/kubernetes/client/ApiClient.java index c6bccd3464..3d1bdee418 100644 --- a/kubernetes/src/main/java/io/kubernetes/client/ApiClient.java +++ b/kubernetes/src/main/java/io/kubernetes/client/ApiClient.java @@ -73,6 +73,10 @@ public class ApiClient { private HttpLoggingInterceptor loggingInterceptor; + public static final String PATCH_FORMAT_JSON_PATCH = "application/json-patch+json"; + public static final String PATCH_FORMAT_JSON_MERGE_PATCH = "application/merge-patch+json"; + public static final String PATCH_FORMAT_STRATEGIC_MERGE_PATCH = "application/strategic-merge-patch+json"; + /* * Constructor for ApiClient */ diff --git a/util/src/main/java/io/kubernetes/client/util/ClientBuilder.java b/util/src/main/java/io/kubernetes/client/util/ClientBuilder.java index 7b559d1f32..3be7bb14a2 100644 --- a/util/src/main/java/io/kubernetes/client/util/ClientBuilder.java +++ b/util/src/main/java/io/kubernetes/client/util/ClientBuilder.java @@ -21,6 +21,8 @@ import static io.kubernetes.client.util.KubeConfig.KUBECONFIG; import static io.kubernetes.client.util.KubeConfig.KUBEDIR; +import com.google.common.base.Strings; +import com.squareup.okhttp.*; import io.kubernetes.client.ApiClient; import io.kubernetes.client.util.credentials.AccessTokenAuthentication; import io.kubernetes.client.util.credentials.Authentication; @@ -43,6 +45,7 @@ public class ClientBuilder { private String basePath = Config.DEFAULT_FALLBACK_HOST; private byte[] caCertBytes = null; private boolean verifyingSsl = true; + private String overridePatchFormat; private Authentication authentication; /** @@ -272,6 +275,15 @@ public ClientBuilder setVerifyingSsl(boolean verifyingSsl) { return this; } + public String overridePatchFormat() { + return overridePatchFormat; + } + + public ClientBuilder setOverridePatchFormat(String patchFormat) { + this.overridePatchFormat = patchFormat; + return this; + } + public ApiClient build() { final ApiClient client = new ApiClient(); @@ -301,6 +313,31 @@ public ApiClient build() { client.setSslCaCert(new ByteArrayInputStream(caCertBytes)); } + if (!Strings.isNullOrEmpty(overridePatchFormat)) { + client + .getHttpClient() + .interceptors() + .add( + new Interceptor() { + @Override + public Response intercept(Chain chain) throws IOException { + Request request = chain.request(); + + if ("PATCH".equals(request.method())) { + + Request newRequest = + request + .newBuilder() + .patch( + new ProxyContentTypeRequestBody( + request.body(), overridePatchFormat)) + .build(); + return chain.proceed(newRequest); + } + return chain.proceed(request); + } + }); + } return client; } } diff --git a/util/src/main/java/io/kubernetes/client/util/ProxyContentTypeRequestBody.java b/util/src/main/java/io/kubernetes/client/util/ProxyContentTypeRequestBody.java new file mode 100644 index 0000000000..a352c8a428 --- /dev/null +++ b/util/src/main/java/io/kubernetes/client/util/ProxyContentTypeRequestBody.java @@ -0,0 +1,36 @@ +/** Alipay.com Inc. Copyright (c) 2004-2019 All Rights Reserved. */ +package io.kubernetes.client.util; + +import com.google.common.base.Strings; +import com.squareup.okhttp.MediaType; +import com.squareup.okhttp.RequestBody; +import java.io.IOException; +import okio.BufferedSink; + +public class ProxyContentTypeRequestBody extends RequestBody { + + private String overridePatchFormat; + private RequestBody delegateRequestBody; + + public ProxyContentTypeRequestBody(RequestBody delegateRequestBody) { + this.delegateRequestBody = delegateRequestBody; + } + + public ProxyContentTypeRequestBody(RequestBody delegateRequestBody, String patchFormat) { + this(delegateRequestBody); + this.overridePatchFormat = patchFormat; + } + + @Override + public MediaType contentType() { + if (!Strings.isNullOrEmpty(overridePatchFormat)) { + return MediaType.parse(overridePatchFormat); + } + return delegateRequestBody.contentType(); + } + + @Override + public void writeTo(BufferedSink bufferedSink) throws IOException { + delegateRequestBody.writeTo(bufferedSink); + } +} diff --git a/util/src/test/java/io/kubernetes/client/util/ClientBuilderPatchTest.java b/util/src/test/java/io/kubernetes/client/util/ClientBuilderPatchTest.java new file mode 100644 index 0000000000..a7da50785a --- /dev/null +++ b/util/src/test/java/io/kubernetes/client/util/ClientBuilderPatchTest.java @@ -0,0 +1,72 @@ +/* +Copyright 2017 The Kubernetes Authors. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + */ +package io.kubernetes.client.util; + +import static com.github.tomakehurst.wiremock.client.WireMock.*; + +import com.github.tomakehurst.wiremock.client.WireMock; +import com.github.tomakehurst.wiremock.junit.WireMockRule; +import com.squareup.okhttp.Call; +import io.kubernetes.client.ApiClient; +import io.kubernetes.client.ApiException; +import java.io.IOException; +import java.util.HashMap; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +/** Tests for the ConfigBuilder helper class */ +public class ClientBuilderPatchTest { + + private ApiClient client; + private static final int PORT = 8089; + + @Rule public WireMockRule wireMockRule = new WireMockRule(PORT); + + @Before + public void setup() throws IOException { + client = + new ClientBuilder() + .setBasePath("http://localhost:" + PORT) + .setOverridePatchFormat(ApiClient.PATCH_FORMAT_STRATEGIC_MERGE_PATCH) + .build(); + } + + @Test + public void testOverridePatchFormatInterceptor() throws IOException, ApiException { + stubFor( + patch(urlPathEqualTo("/apis")) + .willReturn( + aResponse() + .withStatus(200) + .withHeader("Content-Type", ApiClient.PATCH_FORMAT_STRATEGIC_MERGE_PATCH) + .withBody("{}"))); + Call call = + client.buildCall( + "/apis", + "PATCH", + null, + null, + null, + new HashMap<>(), + new HashMap<>(), + new String[] {}, + null); + client.execute(call); + + WireMock.verify( + 1, + patchRequestedFor(urlPathEqualTo("/apis")) + .withHeader("Content-Type", equalTo(ApiClient.PATCH_FORMAT_STRATEGIC_MERGE_PATCH))); + } +} diff --git a/util/src/test/java/io/kubernetes/client/util/ClientBuilderTest.java b/util/src/test/java/io/kubernetes/client/util/ClientBuilderTest.java index 6239aa6709..b2faba947b 100644 --- a/util/src/test/java/io/kubernetes/client/util/ClientBuilderTest.java +++ b/util/src/test/java/io/kubernetes/client/util/ClientBuilderTest.java @@ -12,6 +12,7 @@ */ package io.kubernetes.client.util; +import static com.github.tomakehurst.wiremock.client.WireMock.*; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; @@ -20,6 +21,7 @@ import com.google.common.io.Resources; import io.kubernetes.client.ApiClient; +import io.kubernetes.client.ApiException; import io.kubernetes.client.util.credentials.Authentication; import java.io.File; import java.io.IOException; @@ -162,4 +164,12 @@ public void testSslCertCaBad() throws Exception { .setCertificateAuthority(Files.readAllBytes(Paths.get(INVALID_SSL_CA_CERT_PATH))) .build(); } + + @Test + public void testOverridePatchFormat() throws IOException, ApiException { + final ApiClient client = + new ClientBuilder() + .setOverridePatchFormat(ApiClient.PATCH_FORMAT_STRATEGIC_MERGE_PATCH) + .build(); + } }