From dc26a1aca834622737abf3bc5596160e42d6b4f0 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 17 Apr 2023 14:42:33 +0800 Subject: [PATCH] fix code --- hutool-extra/pom.xml | 2 +- .../hutool/extra/mail/MailAccountTest.java | 2 +- .../org/dromara/hutool/http/HttpUtil.java | 18 ---- .../dromara/hutool/http/auth/Credential.java | 19 ---- .../hutool/http/auth/HttpAuthUtil.java | 57 ++++++++++++ .../hutool/http/client/ClientConfig.java | 16 ++-- .../engine/httpclient4/HttpClient4Engine.java | 74 ++++++++++++---- .../engine/httpclient5/HttpClient5Engine.java | 86 +++++++++++++------ .../okhttp/BasicProxyAuthenticator.java | 52 +++++++++++ .../client/engine/okhttp/OkHttpEngine.java | 35 +++++--- .../dromara/hutool/http/proxy/HttpProxy.java | 32 +++++++ 11 files changed, 289 insertions(+), 104 deletions(-) delete mode 100644 hutool-http/src/main/java/org/dromara/hutool/http/auth/Credential.java create mode 100644 hutool-http/src/main/java/org/dromara/hutool/http/auth/HttpAuthUtil.java create mode 100644 hutool-http/src/main/java/org/dromara/hutool/http/client/engine/okhttp/BasicProxyAuthenticator.java diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml index 7f3f30abe..b5084cd00 100755 --- a/hutool-extra/pom.xml +++ b/hutool-extra/pom.xml @@ -179,7 +179,7 @@ true - com.sun.mail + org.eclipse.angus jakarta.mail 2.0.1 test diff --git a/hutool-extra/src/test/java/org/dromara/hutool/extra/mail/MailAccountTest.java b/hutool-extra/src/test/java/org/dromara/hutool/extra/mail/MailAccountTest.java index 65dbe8e66..17d88a1db 100644 --- a/hutool-extra/src/test/java/org/dromara/hutool/extra/mail/MailAccountTest.java +++ b/hutool-extra/src/test/java/org/dromara/hutool/extra/mail/MailAccountTest.java @@ -1,6 +1,6 @@ package org.dromara.hutool.extra.mail; -import com.sun.mail.util.MailSSLSocketFactory; +import org.eclipse.angus.mail.util.MailSSLSocketFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/HttpUtil.java b/hutool-http/src/main/java/org/dromara/hutool/http/HttpUtil.java index 3a8cd9364..7f61e1926 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/HttpUtil.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/HttpUtil.java @@ -12,7 +12,6 @@ package org.dromara.hutool.http; -import org.dromara.hutool.core.codec.binary.Base64; import org.dromara.hutool.core.net.url.UrlQueryUtil; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.http.client.ClientConfig; @@ -216,21 +215,4 @@ public class HttpUtil { public static SimpleServer createServer(final int port) { return new SimpleServer(port); } - - /** - * 构建简单的账号秘密验证信息,构建后类似于: - *
-	 *     Basic YWxhZGRpbjpvcGVuc2VzYW1l
-	 * 
- * - * @param username 账号 - * @param password 密码 - * @param charset 编码(如果账号或密码中有非ASCII字符适用) - * @return 密码验证信息 - * @since 5.4.6 - */ - public static String buildBasicAuth(final String username, final String password, final Charset charset) { - final String data = username.concat(":").concat(password); - return "Basic " + Base64.encode(data, charset); - } } diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/auth/Credential.java b/hutool-http/src/main/java/org/dromara/hutool/http/auth/Credential.java deleted file mode 100644 index 68ced19f9..000000000 --- a/hutool-http/src/main/java/org/dromara/hutool/http/auth/Credential.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2023 looly(loolly@aliyun.com) - * Hutool is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * http://license.coscl.org.cn/MulanPSL2 - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, - * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, - * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ - -package org.dromara.hutool.http.auth; - -/** - * - */ -public class Credential { -} diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/auth/HttpAuthUtil.java b/hutool-http/src/main/java/org/dromara/hutool/http/auth/HttpAuthUtil.java new file mode 100644 index 000000000..f8002f8da --- /dev/null +++ b/hutool-http/src/main/java/org/dromara/hutool/http/auth/HttpAuthUtil.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.http.auth; + +import org.dromara.hutool.core.codec.binary.Base64; + +import java.net.PasswordAuthentication; +import java.nio.charset.Charset; + +/** + * HTTP验证工具类 + * + * @author looly + * @since 6.0.0 + */ +public class HttpAuthUtil { + + /** + * 构建简单的账号秘密验证信息,构建后类似于: + *
+	 *     Basic YWxhZGRpbjpvcGVuc2VzYW1l
+	 * 
+ * + * @param authentication {@link PasswordAuthentication} + * @param charset 编码(如果账号或密码中有非ASCII字符适用) + * @return 密码验证信息 + */ + public static String buildBasicAuth(final PasswordAuthentication authentication, final Charset charset) { + return buildBasicAuth(authentication.getUserName(), String.valueOf(authentication.getPassword()), charset); + } + + /** + * 构建简单的账号秘密验证信息,构建后类似于: + *
+	 *     Basic YWxhZGRpbjpvcGVuc2VzYW1l
+	 * 
+ * + * @param username 账号 + * @param password 密码 + * @param charset 编码(如果账号或密码中有非ASCII字符适用) + * @return 密码验证信息 + */ + public static String buildBasicAuth(final String username, final String password, final Charset charset) { + final String data = username.concat(":").concat(password); + return "Basic " + Base64.encode(data, charset); + } +} diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/client/ClientConfig.java b/hutool-http/src/main/java/org/dromara/hutool/http/client/ClientConfig.java index 7b8932d83..d4fd6d040 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/client/ClientConfig.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/client/ClientConfig.java @@ -13,11 +13,9 @@ package org.dromara.hutool.http.client; import org.dromara.hutool.http.HttpGlobalConfig; +import org.dromara.hutool.http.proxy.HttpProxy; import org.dromara.hutool.http.ssl.SSLInfo; -import java.net.InetSocketAddress; -import java.net.Proxy; - /** * Http客户端配置 * @@ -53,7 +51,7 @@ public class ClientConfig { /** * 代理 */ - private Proxy proxy; + private HttpProxy proxy; /** * 构造 @@ -169,7 +167,7 @@ public class ClientConfig { * * @return 代理 */ - public Proxy getProxy() { + public HttpProxy getProxy() { return proxy; } @@ -181,18 +179,16 @@ public class ClientConfig { * @return this */ public ClientConfig setHttpProxy(final String host, final int port) { - final Proxy proxy = new Proxy(Proxy.Type.HTTP, - new InetSocketAddress(host, port)); - return setProxy(proxy); + return setProxy(new HttpProxy(host, port)); } /** * 设置代理 * - * @param proxy 代理 {@link Proxy} + * @param proxy 代理 {@link HttpProxy} * @return this */ - public ClientConfig setProxy(final Proxy proxy) { + public ClientConfig setProxy(final HttpProxy proxy) { this.proxy = proxy; return this; } diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient4/HttpClient4Engine.java b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient4/HttpClient4Engine.java index c265175c7..37defbbe4 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient4/HttpClient4Engine.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient4/HttpClient4Engine.java @@ -12,6 +12,19 @@ package org.dromara.hutool.http.client.engine.httpclient4; +import org.apache.http.Header; +import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicHeader; import org.dromara.hutool.core.io.IoUtil; import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.net.url.UrlBuilder; @@ -23,18 +36,11 @@ import org.dromara.hutool.http.client.Request; import org.dromara.hutool.http.client.Response; import org.dromara.hutool.http.client.body.HttpBody; import org.dromara.hutool.http.meta.HeaderName; +import org.dromara.hutool.http.proxy.HttpProxy; import org.dromara.hutool.http.ssl.SSLInfo; -import org.apache.http.Header; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.message.BasicHeader; import java.io.IOException; +import java.net.PasswordAuthentication; import java.net.URI; import java.util.ArrayList; import java.util.Collection; @@ -115,6 +121,9 @@ public class HttpClient4Engine implements ClientEngine { // 设置默认头信息 clientBuilder.setDefaultHeaders(toHeaderList(GlobalHeaders.INSTANCE.headers())); + // 设置代理 + setProxy(clientBuilder, config); + this.engine = clientBuilder.build(); } @@ -143,12 +152,12 @@ public class HttpClient4Engine implements ClientEngine { // 填充自定义消息体 final HttpBody body = message.body(); request.setEntity(new HttpClient4BodyEntity( - // 用户自定义的内容类型 - message.header(HeaderName.CONTENT_TYPE), - // 用户自定义编码 - message.charset(), - message.isChunked(), - body)); + // 用户自定义的内容类型 + message.header(HeaderName.CONTENT_TYPE), + // 用户自定义编码 + message.charset(), + message.isChunked(), + body)); return request; } @@ -171,10 +180,10 @@ public class HttpClient4Engine implements ClientEngine { */ private static SSLConnectionSocketFactory buildSocketFactory(final SSLInfo sslInfo) { return new SSLConnectionSocketFactory( - sslInfo.getSslContext(), - sslInfo.getProtocols(), - null, - sslInfo.getHostnameVerifier()); + sslInfo.getSslContext(), + sslInfo.getProtocols(), + null, + sslInfo.getHostnameVerifier()); } /** @@ -200,4 +209,31 @@ public class HttpClient4Engine implements ClientEngine { return requestConfigBuilder.build(); } + + /** + * 设置代理信息 + * + * @param clientBuilder {@link org.apache.hc.client5.http.impl.classic.HttpClientBuilder} + * @param config 配置 + */ + private static void setProxy(final HttpClientBuilder clientBuilder, final ClientConfig config) { + if (null == config) { + return; + } + + final HttpProxy proxy = config.getProxy(); + if (null != proxy) { + final HttpHost httpHost = new HttpHost(proxy.getHost(), proxy.getPort()); + clientBuilder.setProxy(httpHost); + final PasswordAuthentication auth = proxy.getAuth(); + if (null != auth) { + // 代理验证 + final BasicCredentialsProvider credsProvider = new BasicCredentialsProvider(); + credsProvider.setCredentials( + new AuthScope(httpHost), + new UsernamePasswordCredentials(auth.getUserName(), String.valueOf(auth.getPassword()))); + clientBuilder.setDefaultCredentialsProvider(credsProvider); + } + } + } } diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient5/HttpClient5Engine.java b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient5/HttpClient5Engine.java index 5025f560d..df3eb206f 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient5/HttpClient5Engine.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient5/HttpClient5Engine.java @@ -12,6 +12,23 @@ package org.dromara.hutool.http.client.engine.httpclient5; +import org.apache.hc.client5.http.auth.AuthScope; +import org.apache.hc.client5.http.auth.UsernamePasswordCredentials; +import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase; +import org.apache.hc.client5.http.config.ConnectionConfig; +import org.apache.hc.client5.http.config.RequestConfig; +import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder; +import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder; +import org.apache.hc.core5.http.ClassicHttpRequest; +import org.apache.hc.core5.http.ClassicHttpResponse; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.message.BasicHeader; import org.dromara.hutool.core.io.IoUtil; import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.net.url.UrlBuilder; @@ -23,22 +40,11 @@ import org.dromara.hutool.http.client.Request; import org.dromara.hutool.http.client.Response; import org.dromara.hutool.http.client.body.HttpBody; import org.dromara.hutool.http.meta.HeaderName; +import org.dromara.hutool.http.proxy.HttpProxy; import org.dromara.hutool.http.ssl.SSLInfo; -import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase; -import org.apache.hc.client5.http.config.ConnectionConfig; -import org.apache.hc.client5.http.config.RequestConfig; -import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; -import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; -import org.apache.hc.client5.http.impl.classic.HttpClients; -import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; -import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder; -import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder; -import org.apache.hc.core5.http.ClassicHttpRequest; -import org.apache.hc.core5.http.ClassicHttpResponse; -import org.apache.hc.core5.http.Header; -import org.apache.hc.core5.http.message.BasicHeader; import java.io.IOException; +import java.net.PasswordAuthentication; import java.net.URI; import java.util.ArrayList; import java.util.Collection; @@ -116,7 +122,8 @@ public class HttpClient5Engine implements ClientEngine { // 设置默认头信息 clientBuilder.setDefaultHeaders(toHeaderList(GlobalHeaders.INSTANCE.headers())); - // TODO 设置代理 + // 设置代理 + setProxy(clientBuilder, config); this.engine = clientBuilder.build(); } @@ -141,12 +148,12 @@ public class HttpClient5Engine implements ClientEngine { // 填充自定义消息体 final HttpBody body = message.body(); request.setEntity(new HttpClient5BodyEntity( - // 用户自定义的内容类型 - message.header(HeaderName.CONTENT_TYPE), - // 用户自定义编码 - message.charset(), - message.isChunked(), - body)); + // 用户自定义的内容类型 + message.header(HeaderName.CONTENT_TYPE), + // 用户自定义编码 + message.charset(), + message.isChunked(), + body)); return request; } @@ -174,17 +181,17 @@ public class HttpClient5Engine implements ClientEngine { final SSLInfo sslInfo = config.getSslInfo(); if (null != sslInfo) { connectionManagerBuilder.setSSLSocketFactory(SSLConnectionSocketFactoryBuilder.create() - .setTlsVersions(sslInfo.getProtocols()) - .setSslContext(sslInfo.getSslContext()) - .setHostnameVerifier(sslInfo.getHostnameVerifier()) - .build()); + .setTlsVersions(sslInfo.getProtocols()) + .setSslContext(sslInfo.getSslContext()) + .setHostnameVerifier(sslInfo.getHostnameVerifier()) + .build()); } // 连接超时配置 final int connectionTimeout = config.getConnectionTimeout(); if (connectionTimeout > 0) { connectionManagerBuilder.setDefaultConnectionConfig(ConnectionConfig.custom() - .setSocketTimeout(connectionTimeout, TimeUnit.MILLISECONDS) - .setConnectTimeout(connectionTimeout, TimeUnit.MILLISECONDS).build()); + .setSocketTimeout(connectionTimeout, TimeUnit.MILLISECONDS) + .setConnectTimeout(connectionTimeout, TimeUnit.MILLISECONDS).build()); } return connectionManagerBuilder.build(); @@ -211,4 +218,31 @@ public class HttpClient5Engine implements ClientEngine { return requestConfigBuilder.build(); } + + /** + * 设置代理信息 + * + * @param clientBuilder {@link HttpClientBuilder} + * @param config 配置 + */ + private static void setProxy(final HttpClientBuilder clientBuilder, final ClientConfig config) { + if (null == config) { + return; + } + + final HttpProxy proxy = config.getProxy(); + if (null != proxy) { + final HttpHost httpHost = new HttpHost(proxy.getHost(), proxy.getPort()); + clientBuilder.setProxy(httpHost); + final PasswordAuthentication auth = proxy.getAuth(); + if (null != auth) { + // 代理验证 + final BasicCredentialsProvider credsProvider = new BasicCredentialsProvider(); + credsProvider.setCredentials( + new AuthScope(httpHost), + new UsernamePasswordCredentials(auth.getUserName(), auth.getPassword())); + clientBuilder.setDefaultCredentialsProvider(credsProvider); + } + } + } } diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/okhttp/BasicProxyAuthenticator.java b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/okhttp/BasicProxyAuthenticator.java new file mode 100644 index 000000000..8b9d6f9bb --- /dev/null +++ b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/okhttp/BasicProxyAuthenticator.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.http.client.engine.okhttp; + +import okhttp3.*; +import org.dromara.hutool.http.meta.HeaderName; + +import java.net.PasswordAuthentication; + +/** + * 账号密码形式的代理验证
+ * 生成类似: + *
+ *     Proxy-Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
+ * 
+ * + * @author looly + * @since 6.0.0 + */ +public class BasicProxyAuthenticator implements Authenticator { + + private final PasswordAuthentication auth; + + /** + * 构造 + * + * @param passwordAuthentication 账号密码对 + */ + public BasicProxyAuthenticator(final PasswordAuthentication passwordAuthentication) { + auth = passwordAuthentication; + } + + @Override + public Request authenticate(final Route route, final Response response) { + final String credential = Credentials.basic( + auth.getUserName(), + String.valueOf(auth.getPassword())); + return response.request().newBuilder() + .addHeader(HeaderName.PROXY_AUTHORIZATION.getValue(), credential) + .build(); + } +} diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/okhttp/OkHttpEngine.java b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/okhttp/OkHttpEngine.java index 0a86174ef..1850ccc83 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/okhttp/OkHttpEngine.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/okhttp/OkHttpEngine.java @@ -12,17 +12,18 @@ package org.dromara.hutool.http.client.engine.okhttp; +import okhttp3.OkHttpClient; +import okhttp3.internal.http.HttpMethod; import org.dromara.hutool.core.io.IORuntimeException; import org.dromara.hutool.http.client.ClientConfig; import org.dromara.hutool.http.client.ClientEngine; import org.dromara.hutool.http.client.Request; import org.dromara.hutool.http.client.Response; +import org.dromara.hutool.http.proxy.HttpProxy; import org.dromara.hutool.http.ssl.SSLInfo; -import okhttp3.OkHttpClient; -import okhttp3.internal.http.HttpMethod; import java.io.IOException; -import java.net.Proxy; +import java.net.PasswordAuthentication; import java.util.concurrent.TimeUnit; /** @@ -97,20 +98,17 @@ public class OkHttpEngine implements ClientEngine { if (readTimeout > 0) { // 读写共用读取超时 builder.readTimeout(config.getReadTimeout(), TimeUnit.MILLISECONDS) - .writeTimeout(config.getReadTimeout(), TimeUnit.MILLISECONDS); + .writeTimeout(config.getReadTimeout(), TimeUnit.MILLISECONDS); } // SSL final SSLInfo sslInfo = config.getSslInfo(); - if(null != sslInfo){ + if (null != sslInfo) { builder.sslSocketFactory(sslInfo.getSocketFactory(), sslInfo.getTrustManager()); } // 设置代理 - final Proxy proxy = config.getProxy(); - if (null != proxy) { - builder.proxy(proxy); - } + setProxy(builder, config); } this.client = builder.build(); @@ -124,7 +122,7 @@ public class OkHttpEngine implements ClientEngine { */ private static okhttp3.Request buildRequest(final Request message) { final okhttp3.Request.Builder builder = new okhttp3.Request.Builder() - .url(message.url().toURL()); + .url(message.url().toURL()); final String method = message.method().name(); if (HttpMethod.permitsRequestBody(method)) { @@ -135,4 +133,21 @@ public class OkHttpEngine implements ClientEngine { return builder.build(); } + + /** + * 设置代理信息 + * + * @param builder 客户端构建器 + * @param config 配置 + */ + private static void setProxy(final OkHttpClient.Builder builder, final ClientConfig config) { + final HttpProxy proxy = config.getProxy(); + if (null != proxy) { + builder.proxy(proxy); + final PasswordAuthentication auth = proxy.getAuth(); + if (null != auth) { + builder.proxyAuthenticator(new BasicProxyAuthenticator(auth)); + } + } + } } diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/proxy/HttpProxy.java b/hutool-http/src/main/java/org/dromara/hutool/http/proxy/HttpProxy.java index 65c407398..7fc5c1914 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/proxy/HttpProxy.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/proxy/HttpProxy.java @@ -13,6 +13,7 @@ package org.dromara.hutool.http.proxy; import java.net.InetSocketAddress; +import java.net.PasswordAuthentication; import java.net.Proxy; /** @@ -25,6 +26,7 @@ public class HttpProxy extends Proxy { private final String host; private final int port; + private PasswordAuthentication auth; /** * 构造 @@ -56,4 +58,34 @@ public class HttpProxy extends Proxy { return port; } + /** + * 设置代理验证信息 + * + * @param user 用户名 + * @param pass 密码 + * @return this + */ + public HttpProxy setAuth(final String user, final char[] pass) { + return setAuth(new PasswordAuthentication(user, pass)); + } + + /** + * 设置代理验证信息 + * + * @param auth {@link PasswordAuthentication} + * @return this + */ + public HttpProxy setAuth(final PasswordAuthentication auth) { + this.auth = auth; + return this; + } + + /** + * 获取代理验证信息 + * + * @return {@link PasswordAuthentication} + */ + public PasswordAuthentication getAuth() { + return this.auth; + } }