You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2026/09/24 10:17:27 UTC
(httpcomponents-client) branch master updated (7cded0c43 -> 458e7ef87)
This is an automated email from the ASF dual-hosted git repository.
ok2c pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/httpcomponents-client.git
from 7cded0c43 HTTPCLIENT-2434 Deprecate idle connection eviction
new 0e9150389 Upgraded HttpCore to version 5.5-beta3
new 458e7ef87 Auth challenge parsing imprvements
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
httpclient5-jakarta-rest-client/pom.xml | 2 +-
.../hc/client5/http/rest/RestClientBuilder.java | 3 +-
.../hc/client5/http/rest/RestClientResponse.java | 3 +-
.../apache/hc/client5/http/rest/RestContent.java | 9 ++--
.../hc/client5/http/rest/RestContentConsumer.java | 9 ++--
.../client5/http/rest/RestInvocationHandler.java | 9 ++--
.../hc/client5/http/rest/RestResponseConsumer.java | 3 +-
.../http/rest/RestClientIntegrationTest.java | 9 ++--
.../client5/http/rest/RestClientResponseTest.java | 2 +-
.../client5/http/rest/RestContentConsumerTest.java | 3 +-
.../hc/client5/http/rest/RestContentTest.java | 18 ++++----
.../client5/http/rest/examples/RestClientMain.java | 1 +
.../client5/http/impl/ProtocolSwitchStrategy.java | 29 ++++++------
.../http/impl/auth/AuthChallengeParser.java | 31 +++++++++----
.../http/impl/auth/AuthenticationHandler.java | 53 ++++++++++++----------
.../http/impl/cookie/RFC6265CookieSpec.java | 2 +-
.../http/protocol/NextNonceInterceptor.java | 2 +-
.../apache/hc/client5/http/utils/DateUtils.java | 2 +-
.../org/apache/hc/client5/http/validator/ETag.java | 2 +-
pom.xml | 4 +-
20 files changed, 104 insertions(+), 92 deletions(-)
(httpcomponents-client) 01/02: Upgraded HttpCore to version 5.5-beta3
Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
ok2c pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/httpcomponents-client.git
commit 0e9150389d8a466a1be7dd9e92d9d9c7e8bd1947
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Sat Sep 12 16:07:07 2026 +0200
Upgraded HttpCore to version 5.5-beta3
---
httpclient5-jakarta-rest-client/pom.xml | 2 +-
.../hc/client5/http/rest/RestClientBuilder.java | 3 +--
.../hc/client5/http/rest/RestClientResponse.java | 3 +--
.../apache/hc/client5/http/rest/RestContent.java | 9 +++----
.../hc/client5/http/rest/RestContentConsumer.java | 9 +++----
.../client5/http/rest/RestInvocationHandler.java | 9 +++----
.../hc/client5/http/rest/RestResponseConsumer.java | 3 +--
.../http/rest/RestClientIntegrationTest.java | 9 ++++---
.../client5/http/rest/RestClientResponseTest.java | 2 +-
.../client5/http/rest/RestContentConsumerTest.java | 3 +--
.../hc/client5/http/rest/RestContentTest.java | 18 ++++++--------
.../client5/http/rest/examples/RestClientMain.java | 1 +
.../client5/http/impl/ProtocolSwitchStrategy.java | 29 +++++++++++-----------
.../http/impl/auth/AuthenticationHandler.java | 26 +++++++++----------
.../http/impl/cookie/RFC6265CookieSpec.java | 2 +-
.../http/protocol/NextNonceInterceptor.java | 2 +-
.../apache/hc/client5/http/utils/DateUtils.java | 2 +-
.../org/apache/hc/client5/http/validator/ETag.java | 2 +-
pom.xml | 4 +--
19 files changed, 66 insertions(+), 72 deletions(-)
diff --git a/httpclient5-jakarta-rest-client/pom.xml b/httpclient5-jakarta-rest-client/pom.xml
index 15dabff1a..6833aba5f 100644
--- a/httpclient5-jakarta-rest-client/pom.xml
+++ b/httpclient5-jakarta-rest-client/pom.xml
@@ -52,7 +52,7 @@
</dependency>
<dependency>
<groupId>org.apache.httpcomponents.core5</groupId>
- <artifactId>httpcore5-jackson2</artifactId>
+ <artifactId>httpcore5-jackson3</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
diff --git a/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestClientBuilder.java b/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestClientBuilder.java
index f4ad23d21..64463d52c 100644
--- a/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestClientBuilder.java
+++ b/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestClientBuilder.java
@@ -33,10 +33,9 @@
import java.util.Map;
import java.util.stream.Collectors;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient;
import org.apache.hc.core5.util.Args;
+import tools.jackson.databind.ObjectMapper;
/**
* Builds type-safe REST client proxies from Jakarta REST annotated interfaces. The proxy
diff --git a/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestClientResponse.java b/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestClientResponse.java
index f82b0c909..3abdd5422 100644
--- a/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestClientResponse.java
+++ b/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestClientResponse.java
@@ -41,8 +41,6 @@
import java.util.Map;
import java.util.Set;
-import com.fasterxml.jackson.databind.JsonNode;
-
import jakarta.ws.rs.core.EntityTag;
import jakarta.ws.rs.core.GenericType;
import jakarta.ws.rs.core.Link;
@@ -61,6 +59,7 @@
import org.apache.hc.core5.http.message.MessageSupport;
import org.apache.hc.core5.util.Args;
import org.apache.hc.core5.util.CharArrayBuffer;
+import tools.jackson.databind.JsonNode;
/**
* Minimal {@link Response} implementation backed by a consumed {@link JsonNode}
diff --git a/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestContent.java b/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestContent.java
index 4dc9cd1bc..bd0300b91 100644
--- a/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestContent.java
+++ b/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestContent.java
@@ -31,13 +31,12 @@
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
-import com.fasterxml.jackson.databind.JavaType;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ObjectReader;
-
import org.apache.hc.core5.http.ContentType;
import org.apache.hc.core5.util.Args;
+import tools.jackson.databind.JavaType;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.ObjectReader;
/**
* Content of response message that can be represented either
diff --git a/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestContentConsumer.java b/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestContentConsumer.java
index e858c2a1a..cb834fba7 100644
--- a/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestContentConsumer.java
+++ b/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestContentConsumer.java
@@ -31,9 +31,6 @@
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
import org.apache.hc.core5.concurrent.CallbackContribution;
import org.apache.hc.core5.concurrent.FutureCallback;
import org.apache.hc.core5.http.ContentType;
@@ -44,8 +41,10 @@
import org.apache.hc.core5.http.nio.CapacityChannel;
import org.apache.hc.core5.http.nio.entity.BasicAsyncEntityConsumer;
import org.apache.hc.core5.http.nio.entity.StringAsyncEntityConsumer;
-import org.apache.hc.core5.jackson2.http.JsonNodeEntityConsumer;
+import org.apache.hc.core5.jackson3.http.JsonNodeEntityConsumer;
import org.apache.hc.core5.util.Args;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.ObjectMapper;
final class RestContentConsumer implements AsyncEntityConsumer<RestContent> {
@@ -66,7 +65,7 @@ public void streamStart(final EntityDetails entityDetails,
}
final ContentType contentType = ContentType.parseLenient(entityDetails.getContentType());
if (contentType == null || ContentType.APPLICATION_JSON.isSameMimeType(contentType)) {
- final AsyncEntityConsumer<JsonNode> entityConsumer = new JsonNodeEntityConsumer(objectMapper.getFactory());
+ final AsyncEntityConsumer<JsonNode> entityConsumer = new JsonNodeEntityConsumer(objectMapper.tokenStreamFactory());
entityConsumerRef.set(entityConsumer);
entityConsumer.streamStart(entityDetails, new CallbackContribution<>(resultCallback) {
diff --git a/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestInvocationHandler.java b/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestInvocationHandler.java
index 8f7b2ad6f..c40e9829d 100644
--- a/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestInvocationHandler.java
+++ b/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestInvocationHandler.java
@@ -47,8 +47,6 @@
import java.util.concurrent.Future;
import java.util.stream.Collectors;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
import jakarta.ws.rs.ProcessingException;
import jakarta.ws.rs.client.ResponseProcessingException;
import jakarta.ws.rs.core.Response;
@@ -73,11 +71,12 @@
import org.apache.hc.core5.http.nio.entity.StringAsyncEntityProducer;
import org.apache.hc.core5.http.nio.support.BasicRequestProducer;
import org.apache.hc.core5.http.nio.support.BasicResponseConsumer;
-import org.apache.hc.core5.jackson2.http.JsonObjectEntityProducer;
-import org.apache.hc.core5.jackson2.http.JsonResponseConsumers;
+import org.apache.hc.core5.jackson3.http.JsonObjectEntityProducer;
+import org.apache.hc.core5.jackson3.http.JsonResponseConsumers;
import org.apache.hc.core5.net.URIBuilder;
import org.apache.hc.core5.net.WWWFormCodec;
import org.apache.hc.core5.util.Args;
+import tools.jackson.databind.ObjectMapper;
/**
* {@link InvocationHandler} that translates interface method calls into HTTP requests
@@ -257,7 +256,7 @@ private CompletableFuture<?> dispatchAsync(final Method method, final boolean as
throwIfError(result);
final Header header = result.getHead().getFirstHeader(HttpHeaders.CONTENT_TYPE);
final ContentType contentType = header != null
- ? MessageSupport.parserHeaderValue(header, ContentType::parse)
+ ? MessageSupport.parseHeaderValue(header, ContentType::parse)
: null;
if (contentType != null && !ContentType.APPLICATION_FORM_URLENCODED.isSameMimeType(contentType)) {
throw new RestResourceException(
diff --git a/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestResponseConsumer.java b/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestResponseConsumer.java
index 296e7598a..6cb42132c 100644
--- a/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestResponseConsumer.java
+++ b/httpclient5-jakarta-rest-client/src/main/java/org/apache/hc/client5/http/rest/RestResponseConsumer.java
@@ -30,8 +30,6 @@
import java.nio.ByteBuffer;
import java.util.List;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
import org.apache.hc.core5.concurrent.CallbackContribution;
import org.apache.hc.core5.concurrent.FutureCallback;
import org.apache.hc.core5.function.Supplier;
@@ -45,6 +43,7 @@
import org.apache.hc.core5.http.nio.AsyncResponseConsumer;
import org.apache.hc.core5.http.nio.CapacityChannel;
import org.apache.hc.core5.http.protocol.HttpContext;
+import tools.jackson.databind.ObjectMapper;
/**
* Response consumer that routes success and error responses to different entity consumers.
diff --git a/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestClientIntegrationTest.java b/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestClientIntegrationTest.java
index 159a3ffd6..00599c370 100644
--- a/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestClientIntegrationTest.java
+++ b/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestClientIntegrationTest.java
@@ -26,6 +26,9 @@
*/
package org.apache.hc.client5.http.rest;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -36,9 +39,9 @@
import java.util.Arrays;
import java.util.List;
-import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpServer;
+
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.HeaderParam;
@@ -54,9 +57,7 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import tools.jackson.databind.ObjectMapper;
class RestClientIntegrationTest {
diff --git a/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestClientResponseTest.java b/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestClientResponseTest.java
index 8ec4522e7..0d9376cc7 100644
--- a/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestClientResponseTest.java
+++ b/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestClientResponseTest.java
@@ -37,7 +37,6 @@
import java.util.concurrent.CompletionStage;
import java.util.concurrent.TimeUnit;
-import com.fasterxml.jackson.databind.JsonNode;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpServer;
@@ -50,6 +49,7 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import tools.jackson.databind.JsonNode;
class RestClientResponseTest {
diff --git a/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestContentConsumerTest.java b/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestContentConsumerTest.java
index 24feef97b..d5d1e25cd 100644
--- a/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestContentConsumerTest.java
+++ b/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestContentConsumerTest.java
@@ -33,8 +33,6 @@
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
import org.apache.hc.core5.concurrent.FutureCallback;
import org.apache.hc.core5.http.ContentType;
import org.apache.hc.core5.http.impl.BasicEntityDetails;
@@ -42,6 +40,7 @@
import org.assertj.core.api.InstanceOfAssertFactories;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import tools.jackson.databind.ObjectMapper;
class RestContentConsumerTest {
diff --git a/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestContentTest.java b/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestContentTest.java
index b43711364..b990f11d6 100644
--- a/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestContentTest.java
+++ b/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/RestContentTest.java
@@ -31,18 +31,16 @@
import java.util.Arrays;
import java.util.List;
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.BinaryNode;
-import com.fasterxml.jackson.databind.node.TextNode;
-
import org.apache.hc.core5.http.ContentType;
import org.assertj.core.api.Assertions;
import org.assertj.core.api.InstanceOfAssertFactories;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import tools.jackson.core.exc.StreamReadException;
+import tools.jackson.core.type.TypeReference;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.node.BinaryNode;
class RestContentTest {
@@ -125,7 +123,7 @@ void testJsonByteArrayContent() throws Exception {
Assertions.assertThat(content).isNotNull().satisfies(c -> {
Assertions.assertThat(c.asByteArray()).isSameAs(bytes);
Assertions.assertThat(c.asString()).isEqualTo(new String(bytes, StandardCharsets.ISO_8859_1));
- Assertions.assertThatThrownBy(c::asJsonNode).isInstanceOf(JsonParseException.class);
+ Assertions.assertThatThrownBy(c::asJsonNode).isInstanceOf(StreamReadException.class);
});
}
@@ -138,7 +136,7 @@ void testJsonStringContent() throws Exception {
Assertions.assertThat(content).isNotNull().satisfies(c -> {
Assertions.assertThat(c.asByteArray()).containsSequence(string.getBytes(StandardCharsets.UTF_8));
Assertions.assertThat(c.asString()).isEqualTo(string);
- Assertions.assertThatThrownBy(c::asJsonNode).isInstanceOf(JsonParseException.class);
+ Assertions.assertThatThrownBy(c::asJsonNode).isInstanceOf(StreamReadException.class);
});
}
@@ -159,7 +157,7 @@ void testJsonBinaryNodeContent() throws Exception {
@Test
void testJsonTextNodeContent() throws Exception {
final String string = "some stuff with funny characters \u00e9";
- final JsonNode jsonNode = new TextNode(string);
+ final JsonNode jsonNode = objectMapper.stringNode(string);
final RestContent content = RestContent.create(objectMapper, jsonNode, ContentType.APPLICATION_JSON);
diff --git a/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/examples/RestClientMain.java b/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/examples/RestClientMain.java
index 0af55823a..00dacb65c 100644
--- a/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/examples/RestClientMain.java
+++ b/httpclient5-jakarta-rest-client/src/test/java/org/apache/hc/client5/http/rest/examples/RestClientMain.java
@@ -29,6 +29,7 @@
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/ProtocolSwitchStrategy.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/ProtocolSwitchStrategy.java
index b043b9bd4..35af8f10c 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/ProtocolSwitchStrategy.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/ProtocolSwitchStrategy.java
@@ -26,8 +26,9 @@
*/
package org.apache.hc.client5.http.impl;
+import java.util.LinkedList;
+import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
import org.apache.hc.core5.annotation.Internal;
import org.apache.hc.core5.http.HttpHeaders;
@@ -37,7 +38,6 @@
import org.apache.hc.core5.http.ProtocolException;
import org.apache.hc.core5.http.ProtocolVersion;
import org.apache.hc.core5.http.ProtocolVersionParser;
-import org.apache.hc.core5.http.message.HeaderElementConsumer;
import org.apache.hc.core5.http.message.MessageSupport;
import org.apache.hc.core5.http.message.ParserCursor;
import org.apache.hc.core5.http.ssl.TLS;
@@ -61,22 +61,23 @@ public ProtocolVersion switchProtocol(final HttpMessage response) throws Protoco
throw new ProtocolException("Invalid protocol switch response: missing Connection: Upgrade");
}
- final AtomicReference<ProtocolVersion> tlsUpgrade = new AtomicReference<>();
-
+ final List<ProtocolVersion> tlsUpgradeProtocols = new LinkedList<>();
MessageSupport.parseHeadersStrict(response, HttpHeaders.UPGRADE, (buf1, c1) -> {
- MessageSupport.parseElementListStrict(buf1, c1, (HeaderElementConsumer) (buf2, c2) -> {
+ MessageSupport.parseElementListStrict(buf1, c1, (buf2, c2) -> {
final ProtocolVersion protocolVersion = parseProtocolVersion(buf2, c2);
if (protocolVersion != null) {
- if ("TLS".equalsIgnoreCase(protocolVersion.getProtocol())) {
- tlsUpgrade.set(protocolVersion);
- } else if (!protocolVersion.equals(HttpVersion.HTTP_1_1)) {
- throw new ProtocolException("Unsupported protocol or HTTP version: " + protocolVersion);
- }
+ tlsUpgradeProtocols.add(protocolVersion);
}
});
});
-
- final ProtocolVersion result = tlsUpgrade.get();
+ ProtocolVersion result = null;
+ for (final ProtocolVersion protocolVersion : tlsUpgradeProtocols) {
+ if ("TLS".equalsIgnoreCase(protocolVersion.getProtocol())) {
+ result = protocolVersion;
+ } else if (!protocolVersion.equals(HttpVersion.HTTP_1_1)) {
+ throw new ProtocolException("Unsupported protocol or HTTP version: " + protocolVersion);
+ }
+ }
if (result != null) {
return result;
} else {
@@ -94,7 +95,7 @@ private boolean containsConnectionUpgrade(final HttpMessage message) {
return found.get();
}
- private ProtocolVersion parseProtocolVersion(final CharSequence buffer, final ParserCursor cursor) throws ProtocolException {
+ private ProtocolVersion parseProtocolVersion(final CharSequence buffer, final ParserCursor cursor) throws ParseException {
TOKENIZER.skipWhiteSpace(buffer, cursor);
final String proto = TOKENIZER.parseToken(buffer, cursor, LAX_PROTO_DELIMITER);
if (!cursor.atEnd()) {
@@ -112,7 +113,7 @@ private ProtocolVersion parseProtocolVersion(final CharSequence buffer, final Pa
} else if (proto.equalsIgnoreCase("TLS")) {
return TLS.V_1_2.getVersion();
} else {
- throw new ProtocolException("Unsupported or invalid protocol: " + proto);
+ throw new ParseException("Unsupported or invalid protocol: " + proto);
}
}
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/AuthenticationHandler.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/AuthenticationHandler.java
index 89e749aa5..4406ed638 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/AuthenticationHandler.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/AuthenticationHandler.java
@@ -168,11 +168,11 @@ public Map<String, AuthChallenge> extractChallengeMap(
final HttpResponse response,
final HttpClientContext context) {
final Map<String, AuthChallenge> challengeMap = new HashMap<>();
- MessageSupport.parseHeaders(
- response,
- challengeType == ChallengeType.PROXY ? HttpHeaders.PROXY_AUTHENTICATE : HttpHeaders.WWW_AUTHENTICATE,
- (buffer, cursor) -> {
- try {
+ try {
+ MessageSupport.parseHeadersStrict(
+ response,
+ challengeType == ChallengeType.PROXY ? HttpHeaders.PROXY_AUTHENTICATE : HttpHeaders.WWW_AUTHENTICATE,
+ (buffer, cursor) -> {
final List<AuthChallenge> authChallenges = parser.parse(challengeType, buffer, cursor);
for (final AuthChallenge authChallenge : authChallenges) {
final String schemeName = authChallenge.getSchemeName().toLowerCase(Locale.ROOT);
@@ -180,15 +180,15 @@ public Map<String, AuthChallenge> extractChallengeMap(
challengeMap.put(schemeName, authChallenge);
}
}
- } catch (final ParseException ex) {
- if (LOG.isWarnEnabled()) {
- final HttpClientContext clientContext = HttpClientContext.cast(context);
- final String exchangeId = clientContext.getExchangeId();
- LOG.warn("{} Malformed challenge", exchangeId);
- }
- }
- });
+ });
+ } catch (final ParseException ex) {
+ if (LOG.isWarnEnabled()) {
+ final HttpClientContext clientContext = HttpClientContext.cast(context);
+ final String exchangeId = clientContext.getExchangeId();
+ LOG.warn("{} Malformed challenge", exchangeId);
+ }
+ }
return challengeMap;
}
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/RFC6265CookieSpec.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/RFC6265CookieSpec.java
index 4a442c8d3..590cc5a31 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/RFC6265CookieSpec.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/RFC6265CookieSpec.java
@@ -109,7 +109,7 @@ static String getDefaultDomain(final CookieOrigin origin) {
public final List<Cookie> parse(final Header header, final CookieOrigin origin) throws MalformedCookieException {
Args.notNull(header, "Header");
Args.notNull(origin, "Cookie origin");
- final RawCookie rawCookie = MessageSupport.parserHeaderValue(header, this::parseCookie);
+ final RawCookie rawCookie = MessageSupport.parseHeaderValue(header, this::parseCookie);
if (rawCookie == null) {
throw new MalformedCookieException("Cookie value is invalid");
}
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/NextNonceInterceptor.java b/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/NextNonceInterceptor.java
index d68aed719..e5777d527 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/NextNonceInterceptor.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/NextNonceInterceptor.java
@@ -101,7 +101,7 @@ public void process(final HttpResponse response, final EntityDetails entity, fin
final Header header = response.getFirstHeader(AUTHENTICATION_INFO_HEADER);
if (header != null) {
- final String nextNonce = MessageSupport.parserHeaderValue(header, this::parseNextNonce);
+ final String nextNonce = MessageSupport.parseHeaderValue(header, this::parseNextNonce);
if (!TextUtils.isBlank(nextNonce)) {
HttpClientContext.castOrCreate(context).setNextNonce(nextNonce);
}
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/utils/DateUtils.java b/httpclient5/src/main/java/org/apache/hc/client5/http/utils/DateUtils.java
index 74abe39cf..b1365afa4 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/utils/DateUtils.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/utils/DateUtils.java
@@ -219,7 +219,7 @@ public static Instant parseStandardDate(final String dateValue) {
*/
public static Instant parseDate(final Header header, final DateTimeFormatter... dateFormatters) {
Args.notNull(header, "Header");
- return MessageSupport.parserHeaderValue(header, (cs, cursor) -> {
+ return MessageSupport.parseHeaderValue(header, (cs, cursor) -> {
Tokenizer.INSTANCE.skipWhiteSpace(cs, cursor);
return parseDate(cs.subSequence(cursor.getPos(), cursor.getUpperBound()), dateFormatters);
});
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/validator/ETag.java b/httpclient5/src/main/java/org/apache/hc/client5/http/validator/ETag.java
index 497eb97aa..1d0dca29c 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/validator/ETag.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/validator/ETag.java
@@ -139,7 +139,7 @@ public static ETag parse(final Header h) {
if (h == null) {
return null;
}
- return MessageSupport.parserHeaderValue(h, ETag::parse);
+ return MessageSupport.parseHeaderValue(h, ETag::parse);
}
public static ETag get(final MessageHeaders message) {
diff --git a/pom.xml b/pom.xml
index 8b92a98bf..ca0738885 100644
--- a/pom.xml
+++ b/pom.xml
@@ -64,7 +64,7 @@
<maven.compiler.target>1.8</maven.compiler.target>
<!-- Maven itself runs on Java 17+, but compilation and tests can still use an older toolchain JDK. -->
<hc.build.toolchain.version>${maven.compiler.source}</hc.build.toolchain.version>
- <httpcore.version>5.5-beta2</httpcore.version>
+ <httpcore.version>5.5-beta3</httpcore.version>
<log4j.version>2.26.1</log4j.version>
<brotli4j.version>1.23.0</brotli4j.version>
<conscrypt.version>2.6.1</conscrypt.version>
@@ -120,7 +120,7 @@
</dependency>
<dependency>
<groupId>org.apache.httpcomponents.core5</groupId>
- <artifactId>httpcore5-jackson2</artifactId>
+ <artifactId>httpcore5-jackson3</artifactId>
<version>${httpcore.version}</version>
</dependency>
<dependency>
(httpcomponents-client) 02/02: Auth challenge parsing imprvements
Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
ok2c pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/httpcomponents-client.git
commit 458e7ef871ee031ca296fdf8e83d3b29c8097588
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Sat Sep 12 17:14:30 2026 +0200
Auth challenge parsing imprvements
---
.../http/impl/auth/AuthChallengeParser.java | 31 ++++++++++++------
.../http/impl/auth/AuthenticationHandler.java | 37 ++++++++++++----------
2 files changed, 43 insertions(+), 25 deletions(-)
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/AuthChallengeParser.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/AuthChallengeParser.java
index 97cfec6b3..9de81afab 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/AuthChallengeParser.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/AuthChallengeParser.java
@@ -32,6 +32,7 @@
import org.apache.hc.client5.http.auth.AuthChallenge;
import org.apache.hc.client5.http.auth.ChallengeType;
+import org.apache.hc.core5.annotation.Internal;
import org.apache.hc.core5.http.NameValuePair;
import org.apache.hc.core5.http.ParseException;
import org.apache.hc.core5.http.message.BasicHeaderValueParser;
@@ -83,15 +84,14 @@ public String toString() {
}
/**
- * Parses the given sequence of characters into a list of {@link AuthChallenge} elements.
- *
- * @param challengeType the type of challenge (target or proxy).
- * @param buffer the sequence of characters to be parsed.
- * @param cursor the parser cursor.
- * @return a list of auth challenge elements.
+ * @since 5.7
*/
- public List<AuthChallenge> parse(
- final ChallengeType challengeType, final CharSequence buffer, final ParserCursor cursor) throws ParseException {
+ @Internal
+ public void parse(
+ final ChallengeType challengeType,
+ final List<AuthChallenge> challenges,
+ final CharSequence buffer,
+ final ParserCursor cursor) throws ParseException {
tokenParser.skipWhiteSpace(buffer, cursor);
if (cursor.atEnd()) {
throw new ParseException("Malformed auth challenge");
@@ -106,10 +106,23 @@ public List<AuthChallenge> parse(
internalChallenges.add(current);
current = parseChallenge(buffer, cursor, current);
}
- final List<AuthChallenge> challenges = new ArrayList<>(internalChallenges.size());
for (final ChallengeInt internal : internalChallenges) {
challenges.add(parseInt(challengeType, internal));
}
+ }
+
+ /**
+ * Parses the given sequence of characters into a list of {@link AuthChallenge} elements.
+ *
+ * @param challengeType the type of challenge (target or proxy).
+ * @param buffer the sequence of characters to be parsed.
+ * @param cursor the parser cursor.
+ * @return a list of auth challenge elements.
+ */
+ public List<AuthChallenge> parse(
+ final ChallengeType challengeType, final CharSequence buffer, final ParserCursor cursor) throws ParseException {
+ final List<AuthChallenge> challenges = new ArrayList<>(10);
+ parse(challengeType, challenges, buffer, cursor);
return challenges;
}
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/AuthenticationHandler.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/AuthenticationHandler.java
index 4406ed638..1e74d2331 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/AuthenticationHandler.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/AuthenticationHandler.java
@@ -28,12 +28,13 @@
package org.apache.hc.client5.http.impl.auth;
import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Queue;
+import java.util.stream.Collectors;
import org.apache.hc.client5.http.AuthenticationStrategy;
import org.apache.hc.client5.http.auth.AuthChallenge;
@@ -163,33 +164,37 @@ public boolean isChallengeExpected(final AuthExchange authExchange) {
return authScheme != null && authScheme.isChallengeExpected();
}
+ private Map<String, AuthChallenge> extractChallengeMap(
+ final ChallengeType challengeType,
+ final HttpResponse response) throws ParseException {
+ final List<AuthChallenge> authChallenges = new ArrayList<>(10);
+ MessageSupport.parseHeadersStrict(
+ response,
+ challengeType == ChallengeType.PROXY ? HttpHeaders.PROXY_AUTHENTICATE : HttpHeaders.WWW_AUTHENTICATE,
+ (buffer, cursor) ->
+ parser.parse(challengeType, authChallenges, buffer, cursor));
+
+ return authChallenges.stream()
+ .collect(Collectors.toMap(
+ c -> c.getSchemeName().toLowerCase(Locale.ROOT),
+ c -> c,
+ (c1, c2) -> c1));
+ }
+
public Map<String, AuthChallenge> extractChallengeMap(
final ChallengeType challengeType,
final HttpResponse response,
final HttpClientContext context) {
- final Map<String, AuthChallenge> challengeMap = new HashMap<>();
try {
- MessageSupport.parseHeadersStrict(
- response,
- challengeType == ChallengeType.PROXY ? HttpHeaders.PROXY_AUTHENTICATE : HttpHeaders.WWW_AUTHENTICATE,
- (buffer, cursor) -> {
- final List<AuthChallenge> authChallenges = parser.parse(challengeType, buffer, cursor);
- for (final AuthChallenge authChallenge : authChallenges) {
- final String schemeName = authChallenge.getSchemeName().toLowerCase(Locale.ROOT);
- if (!challengeMap.containsKey(schemeName)) {
- challengeMap.put(schemeName, authChallenge);
- }
- }
-
- });
+ return extractChallengeMap(challengeType, response);
} catch (final ParseException ex) {
if (LOG.isWarnEnabled()) {
final HttpClientContext clientContext = HttpClientContext.cast(context);
final String exchangeId = clientContext.getExchangeId();
LOG.warn("{} Malformed challenge", exchangeId);
}
+ return Collections.emptyMap();
}
- return challengeMap;
}
/**