From 8ad070375ae9a278aaec7aa5aaad21a628ebf2d1 Mon Sep 17 00:00:00 2001 From: yndu13 Date: Wed, 24 Jan 2024 19:58:46 +0800 Subject: [PATCH] feat: support disable HTTP/2 in requests --- .../com/aliyun/tea/okhttp/ClientHelper.java | 2 +- .../tea/okhttp/OkHttpClientBuilder.java | 16 +++++++ src/test/java/com/aliyun/tea/TeaTest.java | 44 ++++++++++++++----- .../tea/okhttp/OkHttpClientBuilderTest.java | 23 ++++++++++ 4 files changed, 74 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/aliyun/tea/okhttp/ClientHelper.java b/src/main/java/com/aliyun/tea/okhttp/ClientHelper.java index b30a5f4..3bc8a22 100644 --- a/src/main/java/com/aliyun/tea/okhttp/ClientHelper.java +++ b/src/main/java/com/aliyun/tea/okhttp/ClientHelper.java @@ -38,7 +38,7 @@ public static OkHttpClient getOkHttpClient(String host, int port, Map map) { OkHttpClientBuilder builder = new OkHttpClientBuilder(); - builder = builder.connectTimeout(map).readTimeout(map).connectionPool(map).certificate(map).proxy(map).proxyAuthenticator(map); + builder = builder.protocols(map).connectTimeout(map).readTimeout(map).connectionPool(map).certificate(map).proxy(map).proxyAuthenticator(map); OkHttpClient client = builder.buildOkHttpClient(); return client; } diff --git a/src/main/java/com/aliyun/tea/okhttp/OkHttpClientBuilder.java b/src/main/java/com/aliyun/tea/okhttp/OkHttpClientBuilder.java index 0284cbc..83a6a6e 100644 --- a/src/main/java/com/aliyun/tea/okhttp/OkHttpClientBuilder.java +++ b/src/main/java/com/aliyun/tea/okhttp/OkHttpClientBuilder.java @@ -16,6 +16,7 @@ import java.security.SecureRandom; import java.security.cert.Certificate; import java.security.cert.CertificateFactory; +import java.util.Collections; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -27,6 +28,21 @@ public OkHttpClientBuilder() { builder = new OkHttpClient().newBuilder(); } + public OkHttpClientBuilder protocols(Map map) { + if (map.containsKey("disableHttp2") && null != map.get("disableHttp2")) { + Object object = map.get("disableHttp2"); + boolean disableHttp2 = false; + try { + disableHttp2 = Boolean.parseBoolean(String.valueOf(object)); + } catch (Exception ignored) { + } + if (disableHttp2) { + this.builder.protocols(Collections.singletonList(Protocol.HTTP_1_1)); + } + } + return this; + } + public OkHttpClientBuilder connectTimeout(Map map) { Object object = map.get("connectTimeout"); long timeout; diff --git a/src/test/java/com/aliyun/tea/TeaTest.java b/src/test/java/com/aliyun/tea/TeaTest.java index 4ff519f..4e9a413 100644 --- a/src/test/java/com/aliyun/tea/TeaTest.java +++ b/src/test/java/com/aliyun/tea/TeaTest.java @@ -3,26 +3,17 @@ import com.aliyun.tea.interceptor.InterceptorChain; import com.aliyun.tea.interceptor.MockRequestInterceptor; import com.aliyun.tea.interceptor.MockResponseInterceptor; -import com.aliyun.tea.interceptor.MockRuntimeOptionsInterceptor; import com.aliyun.tea.okhttp.ClientHelper; -import com.aliyun.tea.utils.X509TrustManagerImp; +import okhttp3.Protocol; import org.junit.Assert; import org.junit.Test; -import org.powermock.reflect.Whitebox; - -import javax.net.ssl.SSLSocketFactory; -import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.nio.charset.StandardCharsets; -import java.security.cert.X509Certificate; import java.util.HashMap; import java.util.Map; -import static org.mockito.Mockito.mock; - public class TeaTest { @Test public void init() { @@ -104,6 +95,39 @@ public void doActionTest() { } } + @Test + public void doActionProtocolsTest() { + ClientHelper.clients.clear(); + TeaRequest request = new TeaRequest(); + Map map = new HashMap<>(); + map.put("host", "github.com"); + request.protocol = "http"; + request.headers = map; + request.method = "GET"; + Map runtimeOptions = new HashMap<>(); + TeaResponse response = Tea.doAction(request, runtimeOptions); + Assert.assertEquals(200, response.statusCode); + Assert.assertEquals(Protocol.HTTP_2, response.response.protocol()); + + ClientHelper.clients.clear(); + runtimeOptions.put("disableHttp2", "test"); + response = Tea.doAction(request, runtimeOptions); + Assert.assertEquals(200, response.statusCode); + Assert.assertEquals(Protocol.HTTP_2, response.response.protocol()); + + ClientHelper.clients.clear(); + runtimeOptions.put("disableHttp2", false); + response = Tea.doAction(request, runtimeOptions); + Assert.assertEquals(200, response.statusCode); + Assert.assertEquals(Protocol.HTTP_2, response.response.protocol()); + + ClientHelper.clients.clear(); + runtimeOptions.put("disableHttp2", true); + response = Tea.doAction(request, runtimeOptions); + Assert.assertEquals(200, response.statusCode); + Assert.assertEquals(Protocol.HTTP_1_1, response.response.protocol()); + } + @Test public void doActionWithProxyTest() { ClientHelper.clients.clear(); diff --git a/src/test/java/com/aliyun/tea/okhttp/OkHttpClientBuilderTest.java b/src/test/java/com/aliyun/tea/okhttp/OkHttpClientBuilderTest.java index 4a8350e..4f83a09 100644 --- a/src/test/java/com/aliyun/tea/okhttp/OkHttpClientBuilderTest.java +++ b/src/test/java/com/aliyun/tea/okhttp/OkHttpClientBuilderTest.java @@ -3,6 +3,7 @@ import com.aliyun.tea.TeaException; import com.aliyun.tea.utils.TrueHostnameVerifier; import okhttp3.OkHttpClient; +import okhttp3.Protocol; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; @@ -144,4 +145,26 @@ public void proxyTest() throws Exception { clientBuilder.proxy(map); Mockito.verify(clientBuilder, Mockito.times(5)).proxy(map); } + + @Test + public void protocolsTest() { + map.clear(); + OkHttpClientBuilder clientBuilder = new OkHttpClientBuilder(); + OkHttpClient client = clientBuilder.protocols(map).buildOkHttpClient(); + Assert.assertEquals(2, client.protocols().size()); + Assert.assertTrue(client.protocols().contains(Protocol.HTTP_2)); + Assert.assertTrue(client.protocols().contains(Protocol.HTTP_1_1)); + // HTTP_1_0 在 OkHttp 中已不支持 + Assert.assertFalse(client.protocols().contains(Protocol.HTTP_1_0)); + + map.clear(); + clientBuilder = new OkHttpClientBuilder(); + map.put("disableHttp2", true); + client = clientBuilder.protocols(map).buildOkHttpClient(); + Assert.assertEquals(1, client.protocols().size()); + Assert.assertFalse(client.protocols().contains(Protocol.HTTP_2)); + Assert.assertTrue(client.protocols().contains(Protocol.HTTP_1_1)); + // HTTP_1_0 在 OkHttp 中已不支持 + Assert.assertFalse(client.protocols().contains(Protocol.HTTP_1_0)); + } }