From dc61af95fa58e89f300b3ecd3240438796dc6923 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 6 Feb 2026 13:05:33 +0000
Subject: [PATCH 1/6] Initial plan
From b667025072ac0d5324362dd8496bba8feab13d82 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 6 Feb 2026 13:17:28 +0000
Subject: [PATCH 2/6] Update HttpClient 4 to 5 - rename classes, update
imports, delete custom HTTP methods
Co-authored-by: rbri <2544132+rbri@users.noreply.github.com>
---
.../java/org/htmlunit/HttpWebConnection.java | 171 +++++++++---------
...owserCompatCookieHeaderValueFormatter.java | 2 +-
.../HtmlUnitBrowserCompatCookieSpec.java | 44 ++---
...er.java => HtmlUnitCookieSpecFactory.java} | 12 +-
.../httpclient/HtmlUnitCookieStore.java | 13 +-
.../httpclient/HtmlUnitDomainHandler.java | 14 +-
.../httpclient/HtmlUnitExpiresHandler.java | 8 +-
.../httpclient/HtmlUnitHttpOnlyHandler.java | 12 +-
.../httpclient/HtmlUnitMaxAgeHandler.java | 8 +-
.../httpclient/HtmlUnitPathHandler.java | 8 +-
...gie.java => HtmlUnitRedirectStrategy.java} | 12 +-
.../HtmlUnitSSLConnectionSocketFactory.java | 14 +-
.../httpclient/HtmlUnitSameSiteHandler.java | 12 +-
.../httpclient/HtmlUnitSecureHandler.java | 8 +-
.../HtmlUnitUsernamePasswordCredentials.java | 19 +-
.../HtmlUnitVersionAttributeHandler.java | 10 +-
.../httpclient/HttpClientConverter.java | 16 +-
.../htmlunit/httpclient/HttpClientCookie.java | 2 +-
.../org/htmlunit/httpclient/HttpDelete.java | 57 ------
.../org/htmlunit/httpclient/HttpOptions.java | 57 ------
.../SocksConnectionSocketFactory.java | 8 +-
21 files changed, 198 insertions(+), 309 deletions(-)
rename src/main/java/org/htmlunit/httpclient/{HtmlUnitCookieSpecProvider.java => HtmlUnitCookieSpecFactory.java} (74%)
rename src/main/java/org/htmlunit/httpclient/{HtmlUnitRedirectStrategie.java => HtmlUnitRedirectStrategy.java} (75%)
delete mode 100644 src/main/java/org/htmlunit/httpclient/HttpDelete.java
delete mode 100644 src/main/java/org/htmlunit/httpclient/HttpOptions.java
diff --git a/src/main/java/org/htmlunit/HttpWebConnection.java b/src/main/java/org/htmlunit/HttpWebConnection.java
index 7b57672a17..8080edd2dc 100644
--- a/src/main/java/org/htmlunit/HttpWebConnection.java
+++ b/src/main/java/org/htmlunit/HttpWebConnection.java
@@ -44,69 +44,68 @@
import org.apache.commons.lang3.reflect.FieldUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.http.ConnectionClosedException;
-import org.apache.http.Header;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpEntityEnclosingRequest;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpRequestInterceptor;
-import org.apache.http.HttpResponse;
-import org.apache.http.auth.AuthScheme;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.Credentials;
-import org.apache.http.client.AuthCache;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpHead;
-import org.apache.http.client.methods.HttpPatch;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.client.methods.HttpTrace;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.client.protocol.RequestAcceptEncoding;
-import org.apache.http.client.protocol.RequestAddCookies;
-import org.apache.http.client.protocol.RequestAuthCache;
-import org.apache.http.client.protocol.RequestDefaultHeaders;
-import org.apache.http.client.protocol.RequestExpectContinue;
-import org.apache.http.client.protocol.ResponseProcessCookies;
-import org.apache.http.client.utils.URLEncodedUtils;
-import org.apache.http.config.ConnectionConfig;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.config.SocketConfig;
-import org.apache.http.conn.DnsResolver;
-import org.apache.http.conn.routing.RouteInfo;
-import org.apache.http.conn.socket.ConnectionSocketFactory;
-import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
-import org.apache.http.conn.ssl.DefaultHostnameVerifier;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.conn.util.PublicSuffixMatcher;
-import org.apache.http.conn.util.PublicSuffixMatcherLoader;
-import org.apache.http.cookie.CookieSpecProvider;
-import org.apache.http.entity.ContentType;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.entity.mime.MultipartEntityBuilder;
-import org.apache.http.entity.mime.content.InputStreamBody;
-import org.apache.http.impl.client.BasicAuthCache;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpProcessorBuilder;
-import org.apache.http.protocol.RequestContent;
-import org.apache.http.protocol.RequestTargetHost;
-import org.apache.http.ssl.SSLContexts;
-import org.apache.http.util.TextUtils;
+import org.apache.hc.core5.http.ConnectionClosedException;
+import org.apache.hc.core5.http.Header;
+import org.apache.hc.core5.http.HttpEntity;
+import org.apache.hc.core5.http.HttpEntityContainer;
+import org.apache.hc.core5.http.HttpException;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.HttpRequest;
+import org.apache.hc.core5.http.HttpRequestInterceptor;
+import org.apache.hc.core5.http.HttpResponse;
+import org.apache.hc.client5.http.auth.AuthCache;
+import org.apache.hc.client5.http.auth.AuthScheme;
+import org.apache.hc.client5.http.auth.AuthScope;
+import org.apache.hc.client5.http.auth.Credentials;
+import org.apache.hc.client5.http.auth.CredentialsProvider;
+import org.apache.hc.client5.http.classic.methods.HttpGet;
+import org.apache.hc.client5.http.classic.methods.HttpHead;
+import org.apache.hc.client5.http.classic.methods.HttpPatch;
+import org.apache.hc.client5.http.classic.methods.HttpPost;
+import org.apache.hc.client5.http.classic.methods.HttpPut;
+import org.apache.hc.client5.http.classic.methods.HttpTrace;
+import org.apache.hc.client5.http.classic.methods.HttpDelete;
+import org.apache.hc.client5.http.classic.methods.HttpOptions;
+import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
+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.CloseableHttpResponse;
+import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
+import org.apache.hc.client5.http.impl.auth.BasicAuthCache;
+import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.client5.http.protocol.RequestAddCookies;
+import org.apache.hc.client5.http.protocol.RequestAuthCache;
+import org.apache.hc.client5.http.protocol.RequestDefaultHeaders;
+import org.apache.hc.client5.http.protocol.RequestExpectContinue;
+import org.apache.hc.client5.http.protocol.ResponseProcessCookies;
+import org.apache.hc.client5.http.utils.URLEncodedUtils;
+import org.apache.hc.client5.http.config.ConnectionConfig;
+import org.apache.hc.client5.http.config.SocketConfig;
+import org.apache.hc.client5.http.config.TlsConfig;
+import org.apache.hc.client5.http.cookie.CookieSpecFactory;
+import org.apache.hc.client5.http.impl.routing.DefaultRoutePlanner;
+import org.apache.hc.client5.http.io.HttpClientConnectionManager;
+import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
+import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory;
+import org.apache.hc.client5.http.ssl.DefaultHostnameVerifier;
+import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
+import org.apache.hc.core5.http.config.RegistryBuilder;
+import org.apache.hc.core5.http.io.entity.ContentType;
+import org.apache.hc.core5.http.io.entity.StringEntity;
+import org.apache.hc.client5.http.entity.mime.MultipartEntityBuilder;
+import org.apache.hc.client5.http.entity.mime.InputStreamBody;
+import org.apache.hc.core5.http.protocol.HttpContext;
+import org.apache.hc.core5.http.protocol.HttpProcessorBuilder;
+import org.apache.hc.core5.http.protocol.RequestContent;
+import org.apache.hc.core5.http.protocol.RequestTargetHost;
+import org.apache.hc.core5.ssl.SSLContexts;
+import org.apache.hc.core5.util.TextUtils;
import org.htmlunit.WebRequest.HttpHint;
import org.htmlunit.http.HttpUtils;
-import org.htmlunit.httpclient.HtmlUnitCookieSpecProvider;
+import org.htmlunit.httpclient.HtmlUnitCookieSpecFactory;
import org.htmlunit.httpclient.HtmlUnitCookieStore;
-import org.htmlunit.httpclient.HtmlUnitRedirectStrategie;
+import org.htmlunit.httpclient.HtmlUnitRedirectStrategy;
import org.htmlunit.httpclient.HtmlUnitSSLConnectionSocketFactory;
import org.htmlunit.httpclient.SocksConnectionSocketFactory;
import org.htmlunit.util.KeyDataPair;
@@ -142,7 +141,7 @@ public class HttpWebConnection implements WebConnection {
private final WebClient webClient_;
private String virtualHost_;
- private final HtmlUnitCookieSpecProvider htmlUnitCookieSpecProvider_;
+ private final HtmlUnitCookieSpecFactory htmlUnitCookieSpecFactory_;
private final WebClientOptions usedOptions_;
private PoolingHttpClientConnectionManager connectionManager_;
@@ -159,7 +158,7 @@ public class HttpWebConnection implements WebConnection {
public HttpWebConnection(final WebClient webClient) {
super();
webClient_ = webClient;
- htmlUnitCookieSpecProvider_ = new HtmlUnitCookieSpecProvider(webClient.getBrowserVersion());
+ htmlUnitCookieSpecFactory_ = new HtmlUnitCookieSpecFactory(webClient.getBrowserVersion());
usedOptions_ = new WebClientOptions();
}
@@ -170,7 +169,7 @@ public HttpWebConnection(final WebClient webClient) {
public WebResponse getResponse(final WebRequest webRequest) throws IOException {
final HttpClientBuilder builder = reconfigureHttpClientIfNeeded(getHttpClientBuilder(), webRequest);
- HttpUriRequest httpMethod = null;
+ HttpUriRequestBase httpMethod = null;
try {
try {
httpMethod = makeHttpMethod(webRequest, builder);
@@ -229,7 +228,7 @@ public WebResponse getResponse(final WebRequest webRequest) throws IOException {
* the HttpMethod's connection. Subclasses may override.
* @param httpMethod the httpMethod used (can be null)
*/
- protected void onResponseGenerated(final HttpUriRequest httpMethod) {
+ protected void onResponseGenerated(final HttpUriRequestBase httpMethod) {
// nothing to do
}
@@ -249,7 +248,7 @@ private synchronized HttpContext getHttpContext() {
return httpClientContext;
}
- private void setProxy(final HttpRequestBase httpRequest, final WebRequest webRequest) {
+ private void setProxy(final HttpUriRequestBase httpRequest, final WebRequest webRequest) {
final InetAddress localAddress = webClient_.getOptions().getLocalAddress();
final RequestConfig.Builder requestBuilder = createRequestConfigBuilder(getTimeout(webRequest), localAddress);
@@ -277,7 +276,7 @@ private void setProxy(final HttpRequestBase httpRequest, final WebRequest webReq
* @return the HttpMethod instance constructed according to the specified parameters
* @throws URISyntaxException in case of syntax problems
*/
- private HttpUriRequest makeHttpMethod(final WebRequest webRequest, final HttpClientBuilder httpClientBuilder)
+ private HttpUriRequestBase makeHttpMethod(final WebRequest webRequest, final HttpClientBuilder httpClientBuilder)
throws URISyntaxException {
final HttpContext httpContext = getHttpContext();
@@ -292,7 +291,7 @@ private HttpUriRequest makeHttpMethod(final WebRequest webRequest, final HttpCli
if (getVirtualHost() != null) {
uri = URI.create(getVirtualHost());
}
- final HttpRequestBase httpMethod = buildHttpMethod(webRequest.getHttpMethod(), uri);
+ final HttpUriRequestBase httpMethod = buildHttpMethod(webRequest.getHttpMethod(), uri);
setProxy(httpMethod, webRequest);
// developer note:
@@ -302,10 +301,10 @@ private HttpUriRequest makeHttpMethod(final WebRequest webRequest, final HttpCli
if (httpMethod instanceof HttpPost
|| httpMethod instanceof HttpPut
|| httpMethod instanceof HttpPatch
- || httpMethod instanceof org.htmlunit.httpclient.HttpDelete
- || httpMethod instanceof org.htmlunit.httpclient.HttpOptions) {
+ || httpMethod instanceof HttpDelete
+ || httpMethod instanceof HttpOptions) {
- final HttpEntityEnclosingRequest method = (HttpEntityEnclosingRequest) httpMethod;
+ final HttpEntityContainer method = (HttpEntityContainer) httpMethod;
if (FormEncodingType.URL_ENCODED == webRequest.getEncodingType()) {
if (webRequest.getRequestBody() == null) {
@@ -395,7 +394,10 @@ else if (FormEncodingType.MULTIPART == webRequest.getEncodingType()) {
final Credentials requestUrlCredentials = webRequest.getUrlCredentials();
if (null != requestUrlCredentials) {
final URL requestUrl = webRequest.getUrl();
- final AuthScope authScope = new AuthScope(requestUrl.getHost(), requestUrl.getPort());
+ final AuthScope authScope = new AuthScope.Builder()
+ .setHost(requestUrl.getHost())
+ .setPort(requestUrl.getPort())
+ .build();
// updating our client to keep the credentials for the next request
credentialsProvider.setCredentials(authScope, requestUrlCredentials);
}
@@ -404,7 +406,10 @@ else if (FormEncodingType.MULTIPART == webRequest.getEncodingType()) {
final Credentials requestCredentials = webRequest.getCredentials();
if (null != requestCredentials) {
final URL requestUrl = webRequest.getUrl();
- final AuthScope authScope = new AuthScope(requestUrl.getHost(), requestUrl.getPort());
+ final AuthScope authScope = new AuthScope.Builder()
+ .setHost(requestUrl.getHost())
+ .setPort(requestUrl.getPort())
+ .build();
// updating our client to keep the credentials for the next request
credentialsProvider.setCredentials(authScope, requestCredentials);
}
@@ -484,13 +489,13 @@ public long getContentLength() {
* @param uri the uri being used
* @return a new HttpClient HTTP method based on the specified parameters
*/
- private static HttpRequestBase buildHttpMethod(final HttpMethod submitMethod, final URI uri) {
- final HttpRequestBase method = switch (submitMethod) {
+ private static HttpUriRequestBase buildHttpMethod(final HttpMethod submitMethod, final URI uri) {
+ final HttpUriRequestBase method = switch (submitMethod) {
case GET -> new HttpGet(uri);
case POST -> new HttpPost(uri);
case PUT -> new HttpPut(uri);
- case DELETE -> new org.htmlunit.httpclient.HttpDelete(uri);
- case OPTIONS -> new org.htmlunit.httpclient.HttpOptions(uri);
+ case DELETE -> new HttpDelete(uri);
+ case OPTIONS -> new HttpOptions(uri);
case HEAD -> new HttpHead(uri);
case TRACE -> new HttpTrace(uri);
case PATCH -> new HttpPatch(uri);
@@ -513,10 +518,10 @@ protected HttpClientBuilder getHttpClientBuilder() {
// this factory is required later
// to be sure this is done, we do it outside the createHttpClient() call
- final RegistryBuilder registeryBuilder
- = RegistryBuilder.create()
- .register(HACKED_COOKIE_POLICY, htmlUnitCookieSpecProvider_);
- builder.setDefaultCookieSpecRegistry(registeryBuilder.build());
+ final RegistryBuilder registryBuilder
+ = RegistryBuilder.create()
+ .register(HACKED_COOKIE_POLICY, htmlUnitCookieSpecFactory_);
+ builder.setDefaultCookieSpecRegistry(registryBuilder.build());
builder.setDefaultCookieStore(new HtmlUnitCookieStore(webClient_.getCookieManager()));
builder.setUserAgent(webClient_.getBrowserVersion().getUserAgent());
@@ -552,7 +557,7 @@ protected int getTimeout(final WebRequest webRequest) {
*/
protected HttpClientBuilder createHttpClientBuilder() {
final HttpClientBuilder builder = HttpClientBuilder.create();
- builder.setRedirectStrategy(new HtmlUnitRedirectStrategie());
+ builder.setRedirectStrategy(new HtmlUnitRedirectStrategy());
configureTimeout(builder, getTimeout(null));
configureHttpsScheme(builder);
builder.setMaxConnPerRoute(6);
@@ -713,14 +718,14 @@ protected WebResponse makeWebResponse(final HttpResponse httpResponse,
/**
* Downloads the response.
* This calls {@link #downloadResponseBody(HttpResponse)} and constructs the {@link WebResponse}.
- * @param httpMethod the HttpUriRequest
+ * @param httpMethod the HttpUriRequestBase
* @param webRequest the {@link WebRequest}
* @param httpResponse the web server's response
* @param startTime the download start time
* @return a wrapper for the downloaded body.
* @throws IOException in case of problem reading/saving the body
*/
- protected WebResponse downloadResponse(final HttpUriRequest httpMethod,
+ protected WebResponse downloadResponse(final HttpUriRequestBase httpMethod,
final WebRequest webRequest, final HttpResponse httpResponse,
final long startTime) throws IOException {
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitBrowserCompatCookieHeaderValueFormatter.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitBrowserCompatCookieHeaderValueFormatter.java
index de6750fc46..0578dd63ab 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitBrowserCompatCookieHeaderValueFormatter.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitBrowserCompatCookieHeaderValueFormatter.java
@@ -14,7 +14,7 @@
*/
package org.htmlunit.httpclient;
-import org.apache.http.message.BasicHeaderValueFormatter;
+import org.apache.hc.core5.http.message.BasicHeaderValueFormatter;
/**
* Customized BasicHeaderValueFormatter for HtmlUnit.
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitBrowserCompatCookieSpec.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitBrowserCompatCookieSpec.java
index 7f0e2b56ca..2e01be12cf 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitBrowserCompatCookieSpec.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitBrowserCompatCookieSpec.java
@@ -23,28 +23,28 @@
import java.util.List;
import java.util.Locale;
-import org.apache.http.FormattedHeader;
-import org.apache.http.Header;
-import org.apache.http.HeaderElement;
-import org.apache.http.NameValuePair;
-import org.apache.http.ParseException;
-import org.apache.http.client.utils.DateUtils;
-import org.apache.http.cookie.Cookie;
-import org.apache.http.cookie.CookieAttributeHandler;
-import org.apache.http.cookie.CookieOrigin;
-import org.apache.http.cookie.CookiePathComparator;
-import org.apache.http.cookie.MalformedCookieException;
-import org.apache.http.cookie.SM;
-import org.apache.http.impl.cookie.BasicClientCookie;
-import org.apache.http.impl.cookie.BasicCommentHandler;
-import org.apache.http.impl.cookie.CookieSpecBase;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.message.BasicHeaderElement;
-import org.apache.http.message.BasicNameValuePair;
-import org.apache.http.message.BufferedHeader;
-import org.apache.http.message.ParserCursor;
-import org.apache.http.message.TokenParser;
-import org.apache.http.util.CharArrayBuffer;
+import org.apache.hc.core5.http.FormattedHeader;
+import org.apache.hc.core5.http.Header;
+import org.apache.hc.core5.http.HeaderElement;
+import org.apache.hc.core5.http.NameValuePair;
+import org.apache.hc.core5.http.ParseException;
+import org.apache.hc.client5.http.utils.DateUtils;
+import org.apache.hc.client5.http.cookie.Cookie;
+import org.apache.hc.client5.http.cookie.CookieAttributeHandler;
+import org.apache.hc.client5.http.cookie.CookieOrigin;
+import org.apache.hc.client5.http.cookie.CookiePathComparator;
+import org.apache.hc.client5.http.cookie.MalformedCookieException;
+import org.apache.hc.client5.http.cookie.SM;
+import org.apache.hc.client5.http.impl.cookie.BasicClientCookie;
+import org.apache.hc.client5.http.impl.cookie.BasicCommentHandler;
+import org.apache.hc.client5.http.impl.cookie.CookieSpecBase;
+import org.apache.hc.core5.http.message.BasicHeader;
+import org.apache.hc.core5.http.message.BasicHeaderElement;
+import org.apache.hc.core5.http.message.BasicNameValuePair;
+import org.apache.hc.core5.http.message.BufferedHeader;
+import org.apache.hc.core5.http.message.ParserCursor;
+import org.apache.hc.core5.http.message.TokenParser;
+import org.apache.hc.core5.util.CharArrayBuffer;
import org.htmlunit.BrowserVersion;
import org.htmlunit.util.StringUtils;
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitCookieSpecProvider.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitCookieSpecFactory.java
similarity index 74%
rename from src/main/java/org/htmlunit/httpclient/HtmlUnitCookieSpecProvider.java
rename to src/main/java/org/htmlunit/httpclient/HtmlUnitCookieSpecFactory.java
index 99ce1f2b3f..cc6f5fae64 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitCookieSpecProvider.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitCookieSpecFactory.java
@@ -14,17 +14,17 @@
*/
package org.htmlunit.httpclient;
-import org.apache.http.cookie.CookieSpec;
-import org.apache.http.cookie.CookieSpecProvider;
-import org.apache.http.protocol.HttpContext;
+import org.apache.hc.client5.http.cookie.CookieSpec;
+import org.apache.hc.client5.http.cookie.CookieSpecFactory;
+import org.apache.hc.core5.http.protocol.HttpContext;
import org.htmlunit.BrowserVersion;
/**
- * Customized CookieSpecProvider for HtmlUnit.
+ * Customized CookieSpecFactory for HtmlUnit.
*
* @author Ronald Brill
*/
-public final class HtmlUnitCookieSpecProvider implements CookieSpecProvider {
+public final class HtmlUnitCookieSpecFactory implements CookieSpecFactory {
private final BrowserVersion browserVersion_;
@@ -32,7 +32,7 @@ public final class HtmlUnitCookieSpecProvider implements CookieSpecProvider {
* Constructor.
* @param browserVersion the browserVersion
*/
- public HtmlUnitCookieSpecProvider(final BrowserVersion browserVersion) {
+ public HtmlUnitCookieSpecFactory(final BrowserVersion browserVersion) {
browserVersion_ = browserVersion;
}
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitCookieStore.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitCookieStore.java
index 4ddc687773..2d1a46257b 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitCookieStore.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitCookieStore.java
@@ -15,16 +15,17 @@
package org.htmlunit.httpclient;
import java.io.Serializable;
+import java.time.Instant;
import java.util.Date;
import java.util.List;
-import org.apache.http.client.CookieStore;
-import org.apache.http.cookie.ClientCookie;
-import org.apache.http.cookie.Cookie;
+import org.apache.hc.client5.http.cookie.ClientCookie;
+import org.apache.hc.client5.http.cookie.Cookie;
+import org.apache.hc.client5.http.cookie.CookieStore;
import org.htmlunit.CookieManager;
/**
- * Implementation of {@link CookieStore} like {@link org.apache.http.impl.client.BasicCookieStore}
+ * Implementation of {@link CookieStore} like {@link org.apache.hc.client5.http.impl.cookie.BasicCookieStore}
* BUT using our own {@link CookieManager} as back end.
*
* @author Marc Guillemot
@@ -62,8 +63,8 @@ public synchronized List getCookies() {
* {@inheritDoc}
*/
@Override
- public synchronized boolean clearExpired(final Date date) {
- return manager_.clearExpired(date);
+ public synchronized boolean clearExpired(final Instant date) {
+ return manager_.clearExpired(Date.from(date));
}
/**
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitDomainHandler.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitDomainHandler.java
index dbe13b5cae..52d54fa408 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitDomainHandler.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitDomainHandler.java
@@ -20,13 +20,13 @@
import java.net.UnknownHostException;
import java.util.Locale;
-import org.apache.http.cookie.Cookie;
-import org.apache.http.cookie.CookieOrigin;
-import org.apache.http.cookie.MalformedCookieException;
-import org.apache.http.cookie.SetCookie;
-import org.apache.http.impl.cookie.BasicDomainHandler;
-import org.apache.http.util.Args;
-import org.apache.http.util.TextUtils;
+import org.apache.hc.client5.http.cookie.Cookie;
+import org.apache.hc.client5.http.cookie.CookieOrigin;
+import org.apache.hc.client5.http.cookie.MalformedCookieException;
+import org.apache.hc.client5.http.cookie.SetCookie;
+import org.apache.hc.client5.http.impl.cookie.BasicDomainHandler;
+import org.apache.hc.core5.util.Args;
+import org.apache.hc.core5.util.TextUtils;
import org.htmlunit.BrowserVersion;
import org.htmlunit.HttpHeader;
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitExpiresHandler.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitExpiresHandler.java
index 237db1062d..6e294e085c 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitExpiresHandler.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitExpiresHandler.java
@@ -19,10 +19,10 @@
import java.util.Date;
-import org.apache.http.client.utils.DateUtils;
-import org.apache.http.cookie.MalformedCookieException;
-import org.apache.http.cookie.SetCookie;
-import org.apache.http.impl.cookie.BasicExpiresHandler;
+import org.apache.hc.client5.http.utils.DateUtils;
+import org.apache.hc.client5.http.cookie.MalformedCookieException;
+import org.apache.hc.client5.http.cookie.SetCookie;
+import org.apache.hc.client5.http.impl.cookie.BasicExpiresHandler;
import org.htmlunit.BrowserVersion;
/**
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitHttpOnlyHandler.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitHttpOnlyHandler.java
index f40e5c0a26..b114605c09 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitHttpOnlyHandler.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitHttpOnlyHandler.java
@@ -14,12 +14,12 @@
*/
package org.htmlunit.httpclient;
-import org.apache.http.cookie.CommonCookieAttributeHandler;
-import org.apache.http.cookie.Cookie;
-import org.apache.http.cookie.CookieOrigin;
-import org.apache.http.cookie.MalformedCookieException;
-import org.apache.http.cookie.SetCookie;
-import org.apache.http.impl.cookie.BasicClientCookie;
+import org.apache.hc.client5.http.cookie.CommonCookieAttributeHandler;
+import org.apache.hc.client5.http.cookie.Cookie;
+import org.apache.hc.client5.http.cookie.CookieOrigin;
+import org.apache.hc.client5.http.cookie.MalformedCookieException;
+import org.apache.hc.client5.http.cookie.SetCookie;
+import org.apache.hc.client5.http.impl.cookie.BasicClientCookie;
/**
* Customized CookieAttributeHandler for handling of the httponly attribute.
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitMaxAgeHandler.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitMaxAgeHandler.java
index e24b699e10..eed3a9fe85 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitMaxAgeHandler.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitMaxAgeHandler.java
@@ -16,10 +16,10 @@
import java.util.Date;
-import org.apache.http.cookie.MalformedCookieException;
-import org.apache.http.cookie.SetCookie;
-import org.apache.http.impl.cookie.BasicMaxAgeHandler;
-import org.apache.http.util.Args;
+import org.apache.hc.client5.http.cookie.MalformedCookieException;
+import org.apache.hc.client5.http.cookie.SetCookie;
+import org.apache.hc.client5.http.impl.cookie.BasicMaxAgeHandler;
+import org.apache.hc.core5.util.Args;
/**
* Customized BasicMaxAgeHandler for HtmlUnit.
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitPathHandler.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitPathHandler.java
index a963a83151..8963d577c3 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitPathHandler.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitPathHandler.java
@@ -14,10 +14,10 @@
*/
package org.htmlunit.httpclient;
-import org.apache.http.cookie.Cookie;
-import org.apache.http.cookie.CookieOrigin;
-import org.apache.http.cookie.MalformedCookieException;
-import org.apache.http.impl.cookie.BasicPathHandler;
+import org.apache.hc.client5.http.cookie.Cookie;
+import org.apache.hc.client5.http.cookie.CookieOrigin;
+import org.apache.hc.client5.http.cookie.MalformedCookieException;
+import org.apache.hc.client5.http.impl.cookie.BasicPathHandler;
/**
* Customized BasicPathHandler for HtmlUnit.
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitRedirectStrategie.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitRedirectStrategy.java
similarity index 75%
rename from src/main/java/org/htmlunit/httpclient/HtmlUnitRedirectStrategie.java
rename to src/main/java/org/htmlunit/httpclient/HtmlUnitRedirectStrategy.java
index 8672201928..a378118598 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitRedirectStrategie.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitRedirectStrategy.java
@@ -14,18 +14,18 @@
*/
package org.htmlunit.httpclient;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.ProtocolException;
-import org.apache.http.impl.client.DefaultRedirectStrategy;
-import org.apache.http.protocol.HttpContext;
+import org.apache.hc.client5.http.impl.DefaultRedirectStrategy;
+import org.apache.hc.core5.http.HttpRequest;
+import org.apache.hc.core5.http.HttpResponse;
+import org.apache.hc.core5.http.ProtocolException;
+import org.apache.hc.core5.http.protocol.HttpContext;
/**
* Customized DefaultRedirectStrategy for HtmlUnit.
*
* @author Ronald Brill
*/
-public final class HtmlUnitRedirectStrategie extends DefaultRedirectStrategy {
+public final class HtmlUnitRedirectStrategy extends DefaultRedirectStrategy {
@Override
public boolean isRedirected(final HttpRequest request, final HttpResponse response,
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitSSLConnectionSocketFactory.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitSSLConnectionSocketFactory.java
index 85873aac81..1e140c4d35 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitSSLConnectionSocketFactory.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitSSLConnectionSocketFactory.java
@@ -35,13 +35,13 @@
import javax.net.ssl.SSLSocket;
import javax.net.ssl.X509ExtendedTrustManager;
-import org.apache.http.HttpHost;
-import org.apache.http.conn.ConnectTimeoutException;
-import org.apache.http.conn.ssl.DefaultHostnameVerifier;
-import org.apache.http.conn.ssl.NoopHostnameVerifier;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.ssl.SSLContexts;
+import org.apache.hc.client5.http.ConnectTimeoutException;
+import org.apache.hc.client5.http.ssl.DefaultHostnameVerifier;
+import org.apache.hc.client5.http.ssl.NoopHostnameVerifier;
+import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.protocol.HttpContext;
+import org.apache.hc.core5.ssl.SSLContexts;
import org.htmlunit.WebClientOptions;
/**
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitSameSiteHandler.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitSameSiteHandler.java
index 564b0bee26..7ba879a873 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitSameSiteHandler.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitSameSiteHandler.java
@@ -14,12 +14,12 @@
*/
package org.htmlunit.httpclient;
-import org.apache.http.cookie.CommonCookieAttributeHandler;
-import org.apache.http.cookie.Cookie;
-import org.apache.http.cookie.CookieOrigin;
-import org.apache.http.cookie.MalformedCookieException;
-import org.apache.http.cookie.SetCookie;
-import org.apache.http.impl.cookie.BasicClientCookie;
+import org.apache.hc.client5.http.cookie.CommonCookieAttributeHandler;
+import org.apache.hc.client5.http.cookie.Cookie;
+import org.apache.hc.client5.http.cookie.CookieOrigin;
+import org.apache.hc.client5.http.cookie.MalformedCookieException;
+import org.apache.hc.client5.http.cookie.SetCookie;
+import org.apache.hc.client5.http.impl.cookie.BasicClientCookie;
import org.htmlunit.util.StringUtils;
/**
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitSecureHandler.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitSecureHandler.java
index e0798419d2..3d11bc5e78 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitSecureHandler.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitSecureHandler.java
@@ -14,10 +14,10 @@
*/
package org.htmlunit.httpclient;
-import org.apache.http.cookie.Cookie;
-import org.apache.http.cookie.CookieOrigin;
-import org.apache.http.impl.cookie.BasicSecureHandler;
-import org.apache.http.util.Args;
+import org.apache.hc.client5.http.cookie.Cookie;
+import org.apache.hc.client5.http.cookie.CookieOrigin;
+import org.apache.hc.client5.http.impl.cookie.BasicSecureHandler;
+import org.apache.hc.core5.util.Args;
/**
* Customized BasicSecureHandler for HtmlUnit.
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitUsernamePasswordCredentials.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitUsernamePasswordCredentials.java
index 407d96cce8..f71982c6af 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitUsernamePasswordCredentials.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitUsernamePasswordCredentials.java
@@ -17,9 +17,8 @@
import java.io.Serializable;
import java.security.Principal;
-import org.apache.http.auth.Credentials;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.util.LangUtils;
+import org.apache.hc.client5.http.auth.Credentials;
+import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
/**
* Wrapper for {@link UsernamePasswordCredentials} to avoid direct references spread around.
@@ -29,7 +28,7 @@
*/
public class HtmlUnitUsernamePasswordCredentials implements Credentials, Serializable {
- private final UsernamePasswordCredentials httpClientUsernamePasswordCredentials_;
+ private final UsernamePasswordCredentials httpClientCreds_;
/**
* The constructor with the username and password arguments.
@@ -38,19 +37,17 @@ public class HtmlUnitUsernamePasswordCredentials implements Credentials, Seriali
* @param password the password
*/
public HtmlUnitUsernamePasswordCredentials(final String userName, final char[] password) {
- httpClientUsernamePasswordCredentials_ = new UsernamePasswordCredentials(
- userName,
- password == null ? null : String.valueOf(password));
+ httpClientCreds_ = new UsernamePasswordCredentials(userName, password);
}
@Override
- public String getPassword() {
- return httpClientUsernamePasswordCredentials_.getPassword();
+ public char[] getPassword() {
+ return httpClientCreds_.getPassword();
}
@Override
public Principal getUserPrincipal() {
- return httpClientUsernamePasswordCredentials_.getUserPrincipal();
+ return httpClientCreds_.getUserPrincipal();
}
@Override
@@ -64,7 +61,7 @@ public boolean equals(final Object o) {
return true;
}
if (o instanceof HtmlUnitUsernamePasswordCredentials that) {
- if (LangUtils.equals(this.getUserPrincipal(), that.getUserPrincipal())) {
+ if (this.getUserPrincipal().equals(that.getUserPrincipal())) {
return true;
}
}
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitVersionAttributeHandler.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitVersionAttributeHandler.java
index b1348e8feb..d6d4bb8182 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitVersionAttributeHandler.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitVersionAttributeHandler.java
@@ -14,11 +14,11 @@
*/
package org.htmlunit.httpclient;
-import org.apache.http.cookie.ClientCookie;
-import org.apache.http.cookie.CommonCookieAttributeHandler;
-import org.apache.http.cookie.MalformedCookieException;
-import org.apache.http.cookie.SetCookie;
-import org.apache.http.impl.cookie.AbstractCookieAttributeHandler;
+import org.apache.hc.client5.http.cookie.ClientCookie;
+import org.apache.hc.client5.http.cookie.CommonCookieAttributeHandler;
+import org.apache.hc.client5.http.cookie.MalformedCookieException;
+import org.apache.hc.client5.http.cookie.SetCookie;
+import org.apache.hc.client5.http.impl.cookie.AbstractCookieAttributeHandler;
/**
* VersionAttributeHandler for HtmlUnit.
diff --git a/src/main/java/org/htmlunit/httpclient/HttpClientConverter.java b/src/main/java/org/htmlunit/httpclient/HttpClientConverter.java
index 2577074059..99f9e58bca 100644
--- a/src/main/java/org/htmlunit/httpclient/HttpClientConverter.java
+++ b/src/main/java/org/htmlunit/httpclient/HttpClientConverter.java
@@ -21,14 +21,14 @@
import java.util.List;
import java.util.Set;
-import org.apache.http.cookie.ClientCookie;
-import org.apache.http.cookie.Cookie;
-import org.apache.http.cookie.CookieOrigin;
-import org.apache.http.cookie.CookieSpec;
-import org.apache.http.cookie.MalformedCookieException;
-import org.apache.http.impl.cookie.BasicClientCookie;
-import org.apache.http.message.BufferedHeader;
-import org.apache.http.util.CharArrayBuffer;
+import org.apache.hc.client5.http.cookie.ClientCookie;
+import org.apache.hc.client5.http.cookie.Cookie;
+import org.apache.hc.client5.http.cookie.CookieOrigin;
+import org.apache.hc.client5.http.cookie.CookieSpec;
+import org.apache.hc.client5.http.cookie.MalformedCookieException;
+import org.apache.hc.client5.http.impl.cookie.BasicClientCookie;
+import org.apache.hc.core5.http.message.BufferedHeader;
+import org.apache.hc.core5.util.CharArrayBuffer;
import org.htmlunit.BrowserVersion;
import org.htmlunit.util.UrlUtils;
diff --git a/src/main/java/org/htmlunit/httpclient/HttpClientCookie.java b/src/main/java/org/htmlunit/httpclient/HttpClientCookie.java
index e110c8897b..999825281d 100644
--- a/src/main/java/org/htmlunit/httpclient/HttpClientCookie.java
+++ b/src/main/java/org/htmlunit/httpclient/HttpClientCookie.java
@@ -14,7 +14,7 @@
*/
package org.htmlunit.httpclient;
-import org.apache.http.cookie.ClientCookie;
+import org.apache.hc.client5.http.cookie.ClientCookie;
import org.htmlunit.http.Cookie;
/**
diff --git a/src/main/java/org/htmlunit/httpclient/HttpDelete.java b/src/main/java/org/htmlunit/httpclient/HttpDelete.java
deleted file mode 100644
index 5b174a69cb..0000000000
--- a/src/main/java/org/htmlunit/httpclient/HttpDelete.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2002-2026 Gargoyle Software Inc.
- *
- * 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
- * https://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 org.htmlunit.httpclient;
-
-import java.net.URI;
-
-import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
-
-/**
- * Customized HttpDelete for HtmlUnit to be an HttpEntityEnclosingRequestBase.
- *
- * @author Ronald Brill
- */
-public class HttpDelete extends HttpEntityEnclosingRequestBase {
-
- /**
- * Ctor.
- */
- public HttpDelete() {
- super();
- }
-
- /**
- * Ctor.
- * @param uri the uri
- */
- public HttpDelete(final URI uri) {
- super();
- setURI(uri);
- }
-
- /**
- * @param uri the uri
- * @throws IllegalArgumentException if the uri is invalid.
- */
- public HttpDelete(final String uri) {
- super();
- setURI(URI.create(uri));
- }
-
- @Override
- public String getMethod() {
- return org.apache.http.client.methods.HttpDelete.METHOD_NAME;
- }
-}
diff --git a/src/main/java/org/htmlunit/httpclient/HttpOptions.java b/src/main/java/org/htmlunit/httpclient/HttpOptions.java
deleted file mode 100644
index 4f91bcd5a0..0000000000
--- a/src/main/java/org/htmlunit/httpclient/HttpOptions.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2002-2026 Gargoyle Software Inc.
- *
- * 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
- * https://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 org.htmlunit.httpclient;
-
-import java.net.URI;
-
-import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
-
-/**
- * Customized HttpOptions for HtmlUnit to be an HttpEntityEnclosingRequestBase.
- *
- * @author Ronald Brill
- */
-public class HttpOptions extends HttpEntityEnclosingRequestBase {
-
- /**
- * Ctor.
- */
- public HttpOptions() {
- super();
- }
-
- /**
- * Ctor.
- * @param uri the uri
- */
- public HttpOptions(final URI uri) {
- super();
- setURI(uri);
- }
-
- /**
- * @param uri the uri
- * @throws IllegalArgumentException if the uri is invalid.
- */
- public HttpOptions(final String uri) {
- super();
- setURI(URI.create(uri));
- }
-
- @Override
- public String getMethod() {
- return org.apache.http.client.methods.HttpOptions.METHOD_NAME;
- }
-}
diff --git a/src/main/java/org/htmlunit/httpclient/SocksConnectionSocketFactory.java b/src/main/java/org/htmlunit/httpclient/SocksConnectionSocketFactory.java
index f296127d3e..ca42499457 100644
--- a/src/main/java/org/htmlunit/httpclient/SocksConnectionSocketFactory.java
+++ b/src/main/java/org/htmlunit/httpclient/SocksConnectionSocketFactory.java
@@ -19,12 +19,12 @@
import java.net.Proxy;
import java.net.Socket;
-import org.apache.http.HttpHost;
-import org.apache.http.conn.socket.PlainConnectionSocketFactory;
-import org.apache.http.protocol.HttpContext;
+import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.protocol.HttpContext;
/**
- * SOCKS aware {@link org.apache.http.conn.socket.ConnectionSocketFactory}.
+ * SOCKS aware {@link org.apache.hc.client5.http.socket.ConnectionSocketFactory}.
*
* @author Ahmed Ashour
* @author Ronald Brill
From 7b1c038a57ec271733a54c8cd3bd08d1c0efb678 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 6 Feb 2026 13:20:03 +0000
Subject: [PATCH 3/6] Fix remaining v5 compatibility issues - SM constants,
BasicCommentHandler, imports
Co-authored-by: rbri <2544132+rbri@users.noreply.github.com>
---
.../java/org/htmlunit/HttpWebConnection.java | 8 ++-
.../httpclient/BasicCommentHandler.java | 50 +++++++++++++++++++
.../HtmlUnitBrowserCompatCookieSpec.java | 6 +--
3 files changed, 59 insertions(+), 5 deletions(-)
create mode 100644 src/main/java/org/htmlunit/httpclient/BasicCommentHandler.java
diff --git a/src/main/java/org/htmlunit/HttpWebConnection.java b/src/main/java/org/htmlunit/HttpWebConnection.java
index 8080edd2dc..272dc82477 100644
--- a/src/main/java/org/htmlunit/HttpWebConnection.java
+++ b/src/main/java/org/htmlunit/HttpWebConnection.java
@@ -74,6 +74,7 @@
import org.apache.hc.client5.http.impl.auth.BasicAuthCache;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.client5.http.protocol.RequestAcceptEncoding;
import org.apache.hc.client5.http.protocol.RequestAddCookies;
import org.apache.hc.client5.http.protocol.RequestAuthCache;
import org.apache.hc.client5.http.protocol.RequestDefaultHeaders;
@@ -84,8 +85,13 @@
import org.apache.hc.client5.http.config.SocketConfig;
import org.apache.hc.client5.http.config.TlsConfig;
import org.apache.hc.client5.http.cookie.CookieSpecFactory;
+import org.apache.hc.client5.http.DnsResolver;
+import org.apache.hc.client5.http.HttpRoute;
import org.apache.hc.client5.http.impl.routing.DefaultRoutePlanner;
import org.apache.hc.client5.http.io.HttpClientConnectionManager;
+import org.apache.hc.client5.http.psl.PublicSuffixMatcher;
+import org.apache.hc.client5.http.psl.PublicSuffixMatcherLoader;
+import org.apache.hc.client5.http.routing.RoutingSupport;
import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory;
import org.apache.hc.client5.http.ssl.DefaultHostnameVerifier;
@@ -1194,7 +1200,7 @@ public void process(final HttpRequest request, final HttpContext context)
final HttpClientContext clientContext = HttpClientContext.adapt(context);
// Obtain the client connection (required)
- final RouteInfo route = clientContext.getHttpRoute();
+ final HttpRoute route = clientContext.getHttpRoute();
if (route == null) {
return;
}
diff --git a/src/main/java/org/htmlunit/httpclient/BasicCommentHandler.java b/src/main/java/org/htmlunit/httpclient/BasicCommentHandler.java
new file mode 100644
index 0000000000..394cbc0a16
--- /dev/null
+++ b/src/main/java/org/htmlunit/httpclient/BasicCommentHandler.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2002-2026 Gargoyle Software Inc.
+ *
+ * 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
+ * https://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 org.htmlunit.httpclient;
+
+import org.apache.hc.client5.http.cookie.CommonCookieAttributeHandler;
+import org.apache.hc.client5.http.cookie.Cookie;
+import org.apache.hc.client5.http.cookie.CookieOrigin;
+import org.apache.hc.client5.http.cookie.MalformedCookieException;
+import org.apache.hc.client5.http.cookie.SetCookie;
+
+/**
+ * Basic comment handler for cookies.
+ * This is a replacement for the BasicCommentHandler that was removed in HttpClient 5.
+ *
+ * @author Ronald Brill
+ */
+public class BasicCommentHandler implements CommonCookieAttributeHandler {
+
+ @Override
+ public void parse(final SetCookie cookie, final String value) throws MalformedCookieException {
+ cookie.setComment(value);
+ }
+
+ @Override
+ public String getAttributeName() {
+ return "comment";
+ }
+
+ @Override
+ public boolean match(final Cookie cookie, final CookieOrigin origin) {
+ return true;
+ }
+
+ @Override
+ public void validate(final Cookie cookie, final CookieOrigin origin) throws MalformedCookieException {
+ // Do nothing
+ }
+}
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitBrowserCompatCookieSpec.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitBrowserCompatCookieSpec.java
index 2e01be12cf..e032f61664 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitBrowserCompatCookieSpec.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitBrowserCompatCookieSpec.java
@@ -34,9 +34,7 @@
import org.apache.hc.client5.http.cookie.CookieOrigin;
import org.apache.hc.client5.http.cookie.CookiePathComparator;
import org.apache.hc.client5.http.cookie.MalformedCookieException;
-import org.apache.hc.client5.http.cookie.SM;
import org.apache.hc.client5.http.impl.cookie.BasicClientCookie;
-import org.apache.hc.client5.http.impl.cookie.BasicCommentHandler;
import org.apache.hc.client5.http.impl.cookie.CookieSpecBase;
import org.apache.hc.core5.http.message.BasicHeader;
import org.apache.hc.core5.http.message.BasicHeaderElement;
@@ -140,7 +138,7 @@ else if (endPos == 0 || StringUtils.isBlank(text.substring(0, endPos))) {
}
final String headername = header.getName();
- if (!SM.SET_COOKIE.equalsIgnoreCase(headername)) {
+ if (!"Set-Cookie".equalsIgnoreCase(headername)) {
throw new MalformedCookieException("Unrecognized cookie header '" + header + "'");
}
final HeaderElement[] helems = header.getElements();
@@ -221,7 +219,7 @@ public List formatCookies(final List cookies) {
cookies.sort(COOKIE_COMPARATOR);
final CharArrayBuffer buffer = new CharArrayBuffer(20 * cookies.size());
- buffer.append(SM.COOKIE);
+ buffer.append("Cookie");
buffer.append(": ");
final int size = cookies.size();
for (int i = 0; i < size; i++) {
From 8e490bcdd3e888581a7df63a5ba664a71662455d Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 6 Feb 2026 13:22:09 +0000
Subject: [PATCH 4/6] Update remaining v4 imports in WebClient,
DefaultCredentialsProvider, WebRequest
Co-authored-by: rbri <2544132+rbri@users.noreply.github.com>
---
.../htmlunit/DefaultCredentialsProvider.java | 48 +++++++++++++------
src/main/java/org/htmlunit/WebClient.java | 6 +--
src/main/java/org/htmlunit/WebRequest.java | 2 +-
3 files changed, 38 insertions(+), 18 deletions(-)
diff --git a/src/main/java/org/htmlunit/DefaultCredentialsProvider.java b/src/main/java/org/htmlunit/DefaultCredentialsProvider.java
index 97e9d2147f..986bbf834d 100644
--- a/src/main/java/org/htmlunit/DefaultCredentialsProvider.java
+++ b/src/main/java/org/htmlunit/DefaultCredentialsProvider.java
@@ -23,11 +23,11 @@
import java.util.HashMap;
import java.util.Map;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.Credentials;
-import org.apache.http.auth.NTCredentials;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.CredentialsProvider;
+import org.apache.hc.client5.http.auth.AuthScope;
+import org.apache.hc.client5.http.auth.Credentials;
+import org.apache.hc.client5.http.auth.CredentialsProvider;
+import org.apache.hc.client5.http.auth.NTCredentials;
+import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
import org.htmlunit.httpclient.HtmlUnitUsernamePasswordCredentials;
/**
@@ -74,14 +74,18 @@ protected PasswordAuthentication getPasswordAuthentication() {
return null;
}
- final AuthScope authScope = new AuthScope(getRequestingHost(), getRequestingPort(), getRequestingScheme());
- final Credentials credentials = credentialsProvider_.getCredentials(authScope);
+ final AuthScope authScope = new AuthScope.Builder()
+ .setHost(getRequestingHost())
+ .setPort(getRequestingPort())
+ .setScheme(getRequestingScheme())
+ .build();
+ final Credentials credentials = credentialsProvider_.getCredentials(authScope, null);
if (credentials == null) {
return null;
}
return new PasswordAuthentication(credentials.getUserPrincipal().getName(),
- credentials.getPassword().toCharArray());
+ credentials.getPassword());
}
}
@@ -110,7 +114,11 @@ public void addCredentials(final String username, final char[] password) {
*/
public void addCredentials(final String username, final char[] password, final String host,
final int port, final String realm) {
- final AuthScope authscope = new AuthScope(host, port, realm, ANY_SCHEME);
+ final AuthScope authscope = new AuthScope.Builder()
+ .setHost(host)
+ .setPort(port)
+ .setRealm(realm)
+ .build();
final HtmlUnitUsernamePasswordCredentials credentials =
new HtmlUnitUsernamePasswordCredentials(username, password);
setCredentials(authscope, credentials);
@@ -129,8 +137,11 @@ public void addCredentials(final String username, final char[] password, final S
*/
public void addNTLMCredentials(final String username, final char[] password, final String host,
final int port, final String workstation, final String domain) {
- final AuthScope authscope = new AuthScope(host, port, ANY_REALM, ANY_SCHEME);
- final NTCredentials credentials = new NTCredentials(username, String.valueOf(password), workstation, domain);
+ final AuthScope authscope = new AuthScope.Builder()
+ .setHost(host)
+ .setPort(port)
+ .build();
+ final NTCredentials credentials = new NTCredentials(username, password, workstation, domain);
setCredentials(authscope, credentials);
}
@@ -143,7 +154,10 @@ public void addNTLMCredentials(final String username, final char[] password, fin
*/
public void addSocksCredentials(final String username, final char[] password, final String host,
final int port) {
- final AuthScope authscope = new AuthScope(host, port, ANY_REALM, ANY_SCHEME);
+ final AuthScope authscope = new AuthScope.Builder()
+ .setHost(host)
+ .setPort(port)
+ .build();
final HtmlUnitUsernamePasswordCredentials credentials =
new HtmlUnitUsernamePasswordCredentials(username, password);
setCredentials(authscope, credentials);
@@ -210,7 +224,8 @@ private static Credentials matchCredentials(final Map
Date: Fri, 6 Feb 2026 13:23:02 +0000
Subject: [PATCH 5/6] Update HttpClientTest to use HttpClient 5 imports
Co-authored-by: rbri <2544132+rbri@users.noreply.github.com>
---
.../org/htmlunit/httpclient/HttpClientTest.java | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/src/test/java/org/htmlunit/httpclient/HttpClientTest.java b/src/test/java/org/htmlunit/httpclient/HttpClientTest.java
index 511b66cfe8..5c1ea5c28e 100644
--- a/src/test/java/org/htmlunit/httpclient/HttpClientTest.java
+++ b/src/test/java/org/htmlunit/httpclient/HttpClientTest.java
@@ -33,13 +33,13 @@
import org.apache.commons.fileupload2.jakarta.JakartaServletFileUpload;
import org.apache.commons.fileupload2.jakarta.JakartaServletRequestContext;
import org.apache.commons.io.IOUtils;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.ContentType;
-import org.apache.http.entity.mime.HttpMultipartMode;
-import org.apache.http.entity.mime.MultipartEntityBuilder;
-import org.apache.http.entity.mime.content.FileBody;
-import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.hc.client5.http.classic.methods.HttpPost;
+import org.apache.hc.client5.http.entity.mime.FileBody;
+import org.apache.hc.client5.http.entity.mime.HttpMultipartMode;
+import org.apache.hc.client5.http.entity.mime.MultipartEntityBuilder;
+import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
+import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.io.entity.ContentType;
import org.htmlunit.WebServerTestCase;
import org.htmlunit.html.HtmlFileInput;
import org.htmlunit.util.MimeType;
@@ -135,7 +135,7 @@ public void uploadFileWithNonASCIIName_HttpClient() throws Exception {
filePost.setEntity(builder.build());
final HttpClientBuilder clientBuilder = HttpClientBuilder.create();
- final HttpResponse httpResponse = clientBuilder.build().execute(filePost);
+ final ClassicHttpResponse httpResponse = clientBuilder.build().execute(filePost);
try (InputStream content = httpResponse.getEntity().getContent()) {
final String response = new String(IOUtils.toByteArray(content));
From c9653d02d3a09f94cd48a234c90f5cc7d6d7693e Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 6 Feb 2026 13:24:13 +0000
Subject: [PATCH 6/6] Address code review feedback - add null check and
security comment
Co-authored-by: rbri <2544132+rbri@users.noreply.github.com>
---
src/main/java/org/htmlunit/DefaultCredentialsProvider.java | 2 ++
.../httpclient/HtmlUnitUsernamePasswordCredentials.java | 4 +++-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/main/java/org/htmlunit/DefaultCredentialsProvider.java b/src/main/java/org/htmlunit/DefaultCredentialsProvider.java
index 986bbf834d..f050b88894 100644
--- a/src/main/java/org/htmlunit/DefaultCredentialsProvider.java
+++ b/src/main/java/org/htmlunit/DefaultCredentialsProvider.java
@@ -84,6 +84,8 @@ protected PasswordAuthentication getPasswordAuthentication() {
return null;
}
+ // HttpClient 5 uses char[] for passwords instead of String for better security
+ // (char arrays can be cleared from memory after use)
return new PasswordAuthentication(credentials.getUserPrincipal().getName(),
credentials.getPassword());
}
diff --git a/src/main/java/org/htmlunit/httpclient/HtmlUnitUsernamePasswordCredentials.java b/src/main/java/org/htmlunit/httpclient/HtmlUnitUsernamePasswordCredentials.java
index f71982c6af..d040164b57 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitUsernamePasswordCredentials.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitUsernamePasswordCredentials.java
@@ -61,7 +61,9 @@ public boolean equals(final Object o) {
return true;
}
if (o instanceof HtmlUnitUsernamePasswordCredentials that) {
- if (this.getUserPrincipal().equals(that.getUserPrincipal())) {
+ final Principal thisPrincipal = this.getUserPrincipal();
+ final Principal thatPrincipal = that.getUserPrincipal();
+ if (thisPrincipal != null && thisPrincipal.equals(thatPrincipal)) {
return true;
}
}