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));