From a0f8e182ecf029baa6c818c8135967faedaf1f16 Mon Sep 17 00:00:00 2001 From: AlphaKitty <31426671+AlphaKitty@users.noreply.github.com> Date: Fri, 16 Apr 2021 22:11:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BD=93host=E4=B8=AD?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E5=86=92=E5=8F=B7(=E6=AF=94=E5=A6=82https:)?= =?UTF-8?q?=E6=8A=9BUnknownHostException=E9=97=AE=E9=A2=98=20(#3223)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 修复当host中存在冒号(比如https:)抛UnknownHostException问题 * 更优雅地解析url --- .../adapter/es6x/support/ESConnection.java | 25 +++++++++++++------ .../adapter/es7x/support/ESConnection.java | 25 +++++++++++++------ 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/client-adapter/es6x/src/main/java/com/alibaba/otter/canal/client/adapter/es6x/support/ESConnection.java b/client-adapter/es6x/src/main/java/com/alibaba/otter/canal/client/adapter/es6x/support/ESConnection.java index 4870c65f..266e0b5b 100644 --- a/client-adapter/es6x/src/main/java/com/alibaba/otter/canal/client/adapter/es6x/support/ESConnection.java +++ b/client-adapter/es6x/src/main/java/com/alibaba/otter/canal/client/adapter/es6x/support/ESConnection.java @@ -2,7 +2,10 @@ package com.alibaba.otter.canal.client.adapter.es6x.support; import java.io.IOException; import java.net.InetAddress; +import java.net.URI; +import java.net.URISyntaxException; import java.net.UnknownHostException; +import java.util.Arrays; import java.util.Map; import org.apache.commons.lang.StringUtils; @@ -78,14 +81,7 @@ public class ESConnection { Integer.parseInt(host.substring(i + 1)))); } } else { - HttpHost[] httpHosts = new HttpHost[hosts.length]; - for (int i = 0; i < hosts.length; i++) { - String host = hosts[i]; - int j = host.indexOf(":"); - HttpHost httpHost = new HttpHost(InetAddress.getByName(host.substring(0, j)), - Integer.parseInt(host.substring(j + 1))); - httpHosts[i] = httpHost; - } + HttpHost[] httpHosts = Arrays.stream(hosts).map(this::createHttpHost).toArray(HttpHost[]::new); RestClientBuilder restClientBuilder = RestClient.builder(httpHosts); String nameAndPwd = properties.get("security.auth"); if (StringUtils.isNotEmpty(nameAndPwd) && nameAndPwd.contains(":")) { @@ -507,4 +503,17 @@ public class ESConnection { public void setRestHighLevelClient(RestHighLevelClient restHighLevelClient) { this.restHighLevelClient = restHighLevelClient; } + + private HttpHost createHttpHost(String uriStr) { + URI uri = URI.create(uriStr); + if (!org.springframework.util.StringUtils.hasLength(uri.getUserInfo())) { + return HttpHost.create(uri.toString()); + } + try { + return HttpHost.create(new URI(uri.getScheme(), null, uri.getHost(), uri.getPort(), uri.getPath(), + uri.getQuery(), uri.getFragment()).toString()); + } catch (URISyntaxException ex) { + throw new IllegalStateException(ex); + } + } } diff --git a/client-adapter/es7x/src/main/java/com/alibaba/otter/canal/client/adapter/es7x/support/ESConnection.java b/client-adapter/es7x/src/main/java/com/alibaba/otter/canal/client/adapter/es7x/support/ESConnection.java index 082aa64d..0867a430 100644 --- a/client-adapter/es7x/src/main/java/com/alibaba/otter/canal/client/adapter/es7x/support/ESConnection.java +++ b/client-adapter/es7x/src/main/java/com/alibaba/otter/canal/client/adapter/es7x/support/ESConnection.java @@ -2,7 +2,10 @@ package com.alibaba.otter.canal.client.adapter.es7x.support; import java.io.IOException; import java.net.InetAddress; +import java.net.URI; +import java.net.URISyntaxException; import java.net.UnknownHostException; +import java.util.Arrays; import java.util.Map; import org.apache.commons.lang.StringUtils; @@ -77,14 +80,7 @@ public class ESConnection { Integer.parseInt(host.substring(i + 1)))); } } else { - HttpHost[] httpHosts = new HttpHost[hosts.length]; - for (int i = 0; i < hosts.length; i++) { - String host = hosts[i]; - int j = host.indexOf(":"); - HttpHost httpHost = new HttpHost(InetAddress.getByName(host.substring(0, j)), - Integer.parseInt(host.substring(j + 1))); - httpHosts[i] = httpHost; - } + HttpHost[] httpHosts = Arrays.stream(hosts).map(this::createHttpHost).toArray(HttpHost[]::new); RestClientBuilder restClientBuilder = RestClient.builder(httpHosts); String nameAndPwd = properties.get("security.auth"); if (StringUtils.isNotEmpty(nameAndPwd) && nameAndPwd.contains(":")) { @@ -501,4 +497,17 @@ public class ESConnection { public void setRestHighLevelClient(RestHighLevelClient restHighLevelClient) { this.restHighLevelClient = restHighLevelClient; } + + private HttpHost createHttpHost(String uriStr) { + URI uri = URI.create(uriStr); + if (!org.springframework.util.StringUtils.hasLength(uri.getUserInfo())) { + return HttpHost.create(uri.toString()); + } + try { + return HttpHost.create(new URI(uri.getScheme(), null, uri.getHost(), uri.getPort(), uri.getPath(), + uri.getQuery(), uri.getFragment()).toString()); + } catch (URISyntaxException ex) { + throw new IllegalStateException(ex); + } + } }