diff --git a/src/main/java/org/htmlunit/DefaultCredentialsProvider.java b/src/main/java/org/htmlunit/DefaultCredentialsProvider.java
index 97e9d2147f..f050b88894 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,20 @@ 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;
}
+ // 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().toCharArray());
+ credentials.getPassword());
}
}
@@ -110,7 +116,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 +139,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 +156,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 +226,8 @@ private static Credentials matchCredentials(final MapHttpMethod 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 +297,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 +307,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 +400,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 +412,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 +495,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 +524,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 +563,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 +724,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 {
@@ -1189,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/WebClient.java b/src/main/java/org/htmlunit/WebClient.java
index 18e7fd39d0..0c3bf5517c 100644
--- a/src/main/java/org/htmlunit/WebClient.java
+++ b/src/main/java/org/htmlunit/WebClient.java
@@ -56,9 +56,9 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.http.NoHttpResponseException;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.cookie.MalformedCookieException;
+import org.apache.hc.client5.http.auth.CredentialsProvider;
+import org.apache.hc.client5.http.cookie.MalformedCookieException;
+import org.apache.hc.core5.http.NoHttpResponseException;
import org.htmlunit.attachment.Attachment;
import org.htmlunit.attachment.AttachmentHandler;
import org.htmlunit.csp.Policy;
diff --git a/src/main/java/org/htmlunit/WebRequest.java b/src/main/java/org/htmlunit/WebRequest.java
index 33484e9704..18aacab278 100644
--- a/src/main/java/org/htmlunit/WebRequest.java
+++ b/src/main/java/org/htmlunit/WebRequest.java
@@ -32,7 +32,7 @@
import java.util.Set;
import java.util.regex.Pattern;
-import org.apache.http.auth.Credentials;
+import org.apache.hc.client5.http.auth.Credentials;
import org.htmlunit.http.HttpUtils;
import org.htmlunit.httpclient.HtmlUnitUsernamePasswordCredentials;
import org.htmlunit.util.NameValuePair;
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/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..e032f61664 100644
--- a/src/main/java/org/htmlunit/httpclient/HtmlUnitBrowserCompatCookieSpec.java
+++ b/src/main/java/org/htmlunit/httpclient/HtmlUnitBrowserCompatCookieSpec.java
@@ -23,28 +23,26 @@
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.impl.cookie.BasicClientCookie;
+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;
@@ -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++) {
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..d040164b57 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,9 @@ public boolean equals(final Object o) {
return true;
}
if (o instanceof HtmlUnitUsernamePasswordCredentials that) {
- if (LangUtils.equals(this.getUserPrincipal(), that.getUserPrincipal())) {
+ final Principal thisPrincipal = this.getUserPrincipal();
+ final Principal thatPrincipal = that.getUserPrincipal();
+ if (thisPrincipal != null && thisPrincipal.equals(thatPrincipal)) {
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
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));