You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by "allthingssecurity (via GitHub)" <gi...@apache.org> on 2026/10/09 00:04:52 UTC
[PR] CAMEL-22080: camel-http - make the OAuth2 token cache key pluggable [camel]
allthingssecurity opened a new pull request, #27589:
URL: https://github.com/apache/camel/pull/27589
# Description
[CAMEL-22080](https://issues.apache.org/jira/browse/CAMEL-22080)
Reported by Mikael Andersson Wigander. With `oauth2CacheTokens=true`, camel-http keys its token cache on the full request URI. Requests to `https://host/event/1` and `https://host/event/2`, or to `https://host/event?eventId=1` and `?eventId=2`, each request a new token from the token endpoint. The static cache also keeps one entry per URI, so with dynamic paths or queries it grows with every new URI. The token request (`grant_type=client_credentials` with client id/secret, scope and resource indicator) does not include the request URI, so all these requests get equivalent tokens.
This follows the design Claus suggested on the ticket (2025-05-20): make the key configurable, add an API for custom logic, and have a default implementation with the three strategies Mikael listed. The default stays as it is; sharing tokens more widely is opt-in:
- `OAuth2CachedTokensKeyResolver` (new public functional interface): `String resolveKey(URI requestUri)`. Requests with equal keys share a cached token. Returning `null` means the token is not cached for that request. The client id, client secret, token endpoint, scope and resource indicator are always part of the cache key, whatever the resolver returns, so the scope isolation added for the static cache is unchanged.
- `OAuth2CachedTokensKey` (new enum, implements the interface), the default implementation: `FULL_URI` (the request URI, the default and the current behaviour), `HOST_AND_PATH` (scheme, host, port and raw path, no query) and `HOST_ONLY` (scheme, host and port, with default ports and case normalized).
- Two new endpoint options on the http/https endpoint, next to the other `oauth2CachedTokens*` options: `oauth2CachedTokensKey` (default `FULL_URI`) and `oauth2CachedTokensKeyResolver` (advanced, a bean reference or instance, takes precedence). They are read in `HttpComponent.configureOAuth2Authentication` like the other OAuth2 options and are also set on the endpoint.
The options are on camel-http's `HttpEndpoint`, not on `HttpCommonEndpoint`, because only camel-http implements OAuth2. The public `OAuth2ClientConfigurer` constructor keeps its signature and uses `FULL_URI`.
No behaviour change for existing routes: the default is `FULL_URI`, so tokens are cached per request URI as before. Users who want fewer token requests set `oauth2CachedTokensKey=HOST_AND_PATH` or `HOST_ONLY` (the ticket proposed `HOST_ONLY` as the new default; keeping the old default avoids sharing a token across paths for users who did not ask for it). Also not changed: `oauth2CacheTokens` stays `false` by default (the reporter's other suggestion), and the expiry handling. As nothing changes on upgrade, there is no upgrade guide entry.
Docs: a "Caching tokens" section in the OAuth2 part of the http component page (the three strategies, a `toD` example with `HOST_ONLY` in Java/XML/YAML tabs, and the custom resolver). Regenerated: the http/https JSON, configurer and URI factory, the catalog copies and `HttpEndpointBuilderFactory`.
Tests:
- `HttpOAuth2TokenCachingTest`: six new tests for a second request with a different query, a different path or a different `CamelHttpPath` header (the token endpoint is closed after the first request, like the existing tests there). With the default, each of them requests a new token (`HttpHostConnectException` from the closed token endpoint), which guards the unchanged default (these three also pass on main). With `oauth2CachedTokensKey=HOST_ONLY`, each of them reuses the cached token.
- `HttpOAuth2CachedTokensKeyTest`: `HOST_AND_PATH` and explicit `FULL_URI`, a custom resolver bound in the registry (takes precedence; `null` means no caching), and the endpoint options (default `FULL_URI`).
- `OAuth2CachedTokensKeyTest`: the keys of the three strategies.
- camel-http module: 275 tests, 0 failures, 9 skipped (OAuth2 classes: `HttpOAuth2TokenCachingTest` 12, `HttpOAuth2CachedTokensKeyTest` 7, `OAuth2CachedTokensKeyTest` 3, `HttpOAuth2RedirectTokenLeakTest` 4, `HttpOAuth2AuthenticationTest` 3, `HttpOAuth2ScopeTest` 1). Related classes in other modules (camel-jetty `HttpBasicAuthComponentConfiguredTest`, `HttpBridgeMultipartRouteTest`, `MultiThreadedHttpGetTest`, `HttpJavaBodyTest`, `RestJettyRedirectTest`, camel-kamelet `KameletGlobalPropertiesTest`) passed on the earlier revision; this revision only changes the default value.
# Target
- [x] I checked that the commit is targeting the correct branch (Camel 4 uses the `main` branch)
# Tracking
- [x] If this is a large change, bug fix, or code improvement, I checked there is a [JIRA issue](https://issues.apache.org/jira/browse/CAMEL) filed for the change (usually before you start working on it).
# Apache Camel coding standards and style
- [x] I checked that each commit in the pull request has a meaningful subject line and body.
- [ ] I have run `mvn clean install -DskipTests` locally from root folder and I have committed all auto-generated changes.
(I built and tested camel-http with the formatter and import-sort plugins, copied its JSON and docs to the catalog, and regenerated the endpoint DSL with the `generate-endpoint-dsl` generator. Only `HttpEndpointBuilderFactory` changed. I did not run the full root build.)
# AI-assisted contributions
- [x] If this PR includes AI-generated code, commits have proper co-authorship attribution (e.g., `Co-authored-by` trailers) and the PR description identifies the AI tool used.
This PR was prepared with Claude Code (Claude Opus 5.5). The commit carries a `Co-Authored-By` trailer.
_Claude Code on behalf of allthingssecurity_
🤖 Generated with [Claude Code](https://claude.com/claude-code)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-22080: camel-http - make the OAuth2 token cache key pluggable [camel]
Posted by "davsclaus (via GitHub)" <gi...@apache.org>.
davsclaus merged PR #27589:
URL: https://github.com/apache/camel/pull/27589
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-22080: camel-http - make the OAuth2 token cache key pluggable [camel]
Posted by "davsclaus (via GitHub)" <gi...@apache.org>.
davsclaus commented on code in PR #27589:
URL: https://github.com/apache/camel/pull/27589#discussion_r4227328798
##########
components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponent.java:
##########
@@ -299,6 +300,22 @@ private HttpClientConfigurer configureOAuth2Authentication(
"oauth2BodyAuthentication",
boolean.class,
configDefaults.isOauth2BodyAuthentication());
+ // not removed from the parameters, so the endpoint gets the option too
+ OAuth2CachedTokensKeyResolver cachedTokensKeyResolver = null;
+ Object resolver = parameters.get("oauth2CachedTokensKeyResolver");
+ if (resolver instanceof OAuth2CachedTokensKeyResolver r) {
+ cachedTokensKeyResolver = r;
+ } else if (resolver != null) {
+ cachedTokensKeyResolver = EndpointHelper.resolveReferenceParameter(
+ getCamelContext(), resolver.toString(), OAuth2CachedTokensKeyResolver.class);
+ }
Review Comment:
Since `oauth2CachedTokensKeyResolver` stays in the parameters, `setProperties(endpoint, parameters)` resolves it again for the endpoint field. For `#myResolver` that's the same bean, but with `#class:...` the endpoint ends up with a second instance that isn't the one used by the configurer. Putting the resolved instance back into the parameters would make both use the same one. Non-blocking.
```suggestion
} else if (resolver != null) {
cachedTokensKeyResolver = EndpointHelper.resolveReferenceParameter(
getCamelContext(), resolver.toString(), OAuth2CachedTokensKeyResolver.class);
// bind the same instance on the endpoint rather than resolving the reference again
parameters.put("oauth2CachedTokensKeyResolver", cachedTokensKeyResolver);
}
```
##########
components/camel-http/src/main/java/org/apache/camel/component/http/OAuth2CachedTokensKey.java:
##########
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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
+ *
+ * http://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.apache.camel.component.http;
+
+import java.net.URI;
+import java.util.Locale;
+
+/**
+ * The built-in strategies for the cache key of OAuth2 tokens, see {@link OAuth2CachedTokensKeyResolver}.
+ */
+public enum OAuth2CachedTokensKey implements OAuth2CachedTokensKeyResolver {
+
+ /**
+ * One token per scheme, host and port.
+ */
+ HOST_ONLY {
+ @Override
+ public String resolveKey(URI requestUri) {
+ return authority(requestUri);
+ }
+ },
+ /**
+ * One token per scheme, host, port and path. The query is not taken into account.
+ */
+ HOST_AND_PATH {
+ @Override
+ public String resolveKey(URI requestUri) {
+ String path = requestUri.getRawPath();
+ return authority(requestUri) + (path != null ? path : "");
+ }
+ },
+ /**
+ * One token per request URI, including the query (the default).
+ */
+ FULL_URI {
+ @Override
+ public String resolveKey(URI requestUri) {
+ return requestUri.toString();
+ }
+ };
+
+ private static String authority(URI uri) {
+ String scheme = uri.getScheme() != null ? uri.getScheme().toLowerCase(Locale.ROOT) : "";
+ String host = uri.getHost() != null ? uri.getHost().toLowerCase(Locale.ROOT) : "";
+ return scheme + "://" + host + ":" + effectivePort(uri.getPort(), scheme);
+ }
+
+ private static int effectivePort(int port, String scheme) {
Review Comment:
`effectivePort` duplicates `OAuth2ClientConfigurer.effectivePort(URI)`. Could both use one package-private static helper so the default-port rules can't drift apart? Non-blocking.
##########
components/camel-http/src/main/docs/http-component.adoc:
##########
@@ -672,6 +672,63 @@ YAML::
NOTE: Resource Indicator is the URL to the actual endpoint as defined in the component URI.
+==== Caching tokens
+
+With `oauth2CacheTokens=true`, Camel caches the token until it expires (see `oauth2CachedTokensDefaultExpirySeconds`
+and `oauth2CachedTokensExpirationMarginSeconds`). The option `oauth2CachedTokensKey` decides which requests share a
+cached token:
+
+* `FULL_URI` (default): one token per request URI, including the query.
+* `HOST_AND_PATH`: one token per path. The query is not taken into account.
+* `HOST_ONLY`: one token shared by all requests to the same scheme, host and port.
+
+The client id, client secret, token endpoint, scope and resource indicator are always part of the key. The token
+request itself does not depend on the request URI, so with dynamic paths or queries (for example with `toD`),
+`HOST_AND_PATH` or `HOST_ONLY` avoid requesting a new token for every new URI.
Review Comment:
Small precision point: `HOST_AND_PATH` only helps with dynamic queries; with dynamic paths (as in the `toD` example below) only `HOST_ONLY` avoids a new token per URI. Maybe: "...so with dynamic queries `HOST_AND_PATH`, and with dynamic paths (for example with `toD`) `HOST_ONLY`, avoid requesting a new token for every new URI." (The catalog copy needs regenerating as well.)
##########
components/camel-http/src/main/docs/http-component.adoc:
##########
@@ -672,6 +672,63 @@ YAML::
NOTE: Resource Indicator is the URL to the actual endpoint as defined in the component URI.
+==== Caching tokens
Review Comment:
The new `==== Caching tokens` subsection is inserted before the general OAuth2 `[NOTE]` (client credentials flow only) and `[IMPORTANT]` (no token validation) blocks, so those two notes now render as part of "Caching tokens". Could you move this subsection below the `[IMPORTANT]` block, right before `=== Vault-backed credential rotation` (or move the two notes above it)? Please regenerate the catalog copy (`catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/http-component.adoc`) with it.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-22080: camel-http - make the OAuth2 token cache key pluggable [camel]
Posted by "allthingssecurity (via GitHub)" <gi...@apache.org>.
allthingssecurity commented on PR #27589:
URL: https://github.com/apache/camel/pull/27589#issuecomment-6077830062
@davsclaus on the open question: agreed, the default is now `HOST_ONLY` (a9d510ea24db). The token request never includes the request URI, and `FULL_URI` made the JVM-wide cache, which is never pruned, grow by one entry per distinct URI with `toD`. The client id, client secret, token endpoint, scope and resource indicator stay in the key, and the CAMEL-24452 authority check is unchanged, so a token is not shared across a different client, scope or host. The 4.23 upgrade guide has a new entry "OAuth2 cached tokens are shared per host" under camel-http, and `oauth2CachedTokensKey=FULL_URI` restores the old behaviour. The tests now pin the new default and keep `FULL_URI` covered explicitly; camel-http: 279 tests, 0 failures, 9 skipped.
@oscerd, thanks. Your points 1 to 4 are the same as Claus's inline comments, answered there. 5: `FULL_URI` compares the URI as written; ac94275d56cc says so in its Javadoc (URIs that differ only in the case of the scheme or host get separate tokens), and with `HOST_ONLY` as the default it only matters for users who opt in to `FULL_URI`. 6: resolved as above. `@since 4.23` is added to both new public types.
_Claude Code on behalf of allthingssecurity_
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-22080: camel-http - make the OAuth2 token cache key pluggable [camel]
Posted by "allthingssecurity (via GitHub)" <gi...@apache.org>.
allthingssecurity commented on code in PR #27589:
URL: https://github.com/apache/camel/pull/27589#discussion_r4228442691
##########
components/camel-http/src/main/docs/http-component.adoc:
##########
@@ -672,6 +672,63 @@ YAML::
NOTE: Resource Indicator is the URL to the actual endpoint as defined in the component URI.
+==== Caching tokens
Review Comment:
Done in 62811a95ae41: the `==== Caching tokens` subsection now sits after the general OAuth2 NOTE and IMPORTANT blocks, right before `=== Vault-backed credential rotation`. The catalog copy is regenerated.
_Claude Code on behalf of allthingssecurity_
##########
components/camel-http/src/main/docs/http-component.adoc:
##########
@@ -672,6 +672,63 @@ YAML::
NOTE: Resource Indicator is the URL to the actual endpoint as defined in the component URI.
+==== Caching tokens
+
+With `oauth2CacheTokens=true`, Camel caches the token until it expires (see `oauth2CachedTokensDefaultExpirySeconds`
+and `oauth2CachedTokensExpirationMarginSeconds`). The option `oauth2CachedTokensKey` decides which requests share a
+cached token:
+
+* `FULL_URI` (default): one token per request URI, including the query.
+* `HOST_AND_PATH`: one token per path. The query is not taken into account.
+* `HOST_ONLY`: one token shared by all requests to the same scheme, host and port.
+
+The client id, client secret, token endpoint, scope and resource indicator are always part of the key. The token
+request itself does not depend on the request URI, so with dynamic paths or queries (for example with `toD`),
+`HOST_AND_PATH` or `HOST_ONLY` avoid requesting a new token for every new URI.
Review Comment:
Done in 62811a95ae41, and reworded again in a9d510ea24db now that `HOST_ONLY` is the default: the text says the default does not request a new token for every new URI, for example with dynamic paths or queries in `toD`, and lists `FULL_URI` as the pre-4.23 behaviour.
_Claude Code on behalf of allthingssecurity_
##########
components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponent.java:
##########
@@ -299,6 +300,22 @@ private HttpClientConfigurer configureOAuth2Authentication(
"oauth2BodyAuthentication",
boolean.class,
configDefaults.isOauth2BodyAuthentication());
+ // not removed from the parameters, so the endpoint gets the option too
+ OAuth2CachedTokensKeyResolver cachedTokensKeyResolver = null;
+ Object resolver = parameters.get("oauth2CachedTokensKeyResolver");
+ if (resolver instanceof OAuth2CachedTokensKeyResolver r) {
+ cachedTokensKeyResolver = r;
+ } else if (resolver != null) {
+ cachedTokensKeyResolver = EndpointHelper.resolveReferenceParameter(
+ getCamelContext(), resolver.toString(), OAuth2CachedTokensKeyResolver.class);
+ }
Review Comment:
Applied in 62811a95ae41: the resolved instance is put back into the parameters. A new test with a `#class:` resolver checks that the instance on the endpoint is the one that computed the key; it fails without the put-back.
_Claude Code on behalf of allthingssecurity_
##########
components/camel-http/src/main/java/org/apache/camel/component/http/OAuth2CachedTokensKey.java:
##########
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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
+ *
+ * http://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.apache.camel.component.http;
+
+import java.net.URI;
+import java.util.Locale;
+
+/**
+ * The built-in strategies for the cache key of OAuth2 tokens, see {@link OAuth2CachedTokensKeyResolver}.
+ */
+public enum OAuth2CachedTokensKey implements OAuth2CachedTokensKeyResolver {
+
+ /**
+ * One token per scheme, host and port.
+ */
+ HOST_ONLY {
+ @Override
+ public String resolveKey(URI requestUri) {
+ return authority(requestUri);
+ }
+ },
+ /**
+ * One token per scheme, host, port and path. The query is not taken into account.
+ */
+ HOST_AND_PATH {
+ @Override
+ public String resolveKey(URI requestUri) {
+ String path = requestUri.getRawPath();
+ return authority(requestUri) + (path != null ? path : "");
+ }
+ },
+ /**
+ * One token per request URI, including the query (the default).
+ */
+ FULL_URI {
+ @Override
+ public String resolveKey(URI requestUri) {
+ return requestUri.toString();
+ }
+ };
+
+ private static String authority(URI uri) {
+ String scheme = uri.getScheme() != null ? uri.getScheme().toLowerCase(Locale.ROOT) : "";
+ String host = uri.getHost() != null ? uri.getHost().toLowerCase(Locale.ROOT) : "";
+ return scheme + "://" + host + ":" + effectivePort(uri.getPort(), scheme);
+ }
+
+ private static int effectivePort(int port, String scheme) {
Review Comment:
Done in 62811a95ae41: `OAuth2CachedTokensKey` now uses the package-private `OAuth2ClientConfigurer.effectivePort(URI)`, so the authority check and the cache keys share one set of default-port rules.
_Claude Code on behalf of allthingssecurity_
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-22080: camel-http - make the OAuth2 token cache key pluggable [camel]
Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] commented on PR #27589:
URL: https://github.com/apache/camel/pull/27589#issuecomment-6074963906
:star2: Thank you for your contribution to the Apache Camel project! :star2:
:robot: CI automation will test this PR automatically.
:camel: Apache Camel Committers, please review the following items:
* First-time contributors **require MANUAL approval** for the GitHub Actions to run
* You can use the command `/component-test (camel-)component-name1 (camel-)component-name2..` to request a test from the test bot although they are normally detected and executed by CI.
* You can label PRs using `skip-tests` and `test-dependents` to fine-tune the checks executed by this PR.
* Build and test logs are available in the summary page. **Only** [Apache Camel committers](https://camel.apache.org/community/team/#committers) have access to the summary.
:warning: Be careful when sharing logs. Review their contents before sharing them publicly.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] CAMEL-22080: camel-http - make the OAuth2 token cache key pluggable [camel]
Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] commented on PR #27589:
URL: https://github.com/apache/camel/pull/27589#issuecomment-6075185406
<!-- ci-tested-modules -->
:test_tube: **CI tested the following changed modules:**
- `catalog/camel-catalog`
- `components/camel-http`
- `dsl/camel-endpointdsl`
> :information_source: Dependent modules were not tested because the total number of affected modules exceeded the threshold (50). Use the `test-dependents` label to force testing all dependents.
---
<details><summary>:microscope: Scalpel shadow comparison — Scalpel: 75 of 704 tested, 25 compile-only — current: 75 all tested</summary>
[Maveniverse Scalpel](https://github.com/maveniverse/scalpel) detected **75 affected modules** (current approach: 75).
**Skip-tests mode would test 75 modules** (3 direct + 74 downstream), **skip tests for 25** (generated code, meta-modules)
<details><summary>Modules Scalpel would test (75)</summary>
- `camel-a2a` ← downstream of org.apache.camel:camel-vertx-http
- `camel-ai-observability` ← downstream of org.apache.camel:camel-telemetry
- `camel-as2` ← downstream of org.apache.camel:camel-jetty
- `camel-clickup` ← downstream of org.apache.camel:camel-netty-http
- `camel-consul` ← downstream of org.apache.camel:camel-http
- `camel-cxf-rest` ← downstream of org.apache.camel:camel-http
- `camel-cxf-soap` ← downstream of org.apache.camel:camel-http
- `camel-cxf-spring-rest` ← downstream of org.apache.camel:camel-http
- `camel-cxf-spring-soap` ← downstream of org.apache.camel:camel-http
- `camel-cxf-spring-transport` ← downstream of org.apache.camel:camel-cxf-transport
- `camel-cxf-transport` ← downstream of org.apache.camel:camel-undertow
- `camel-graphql` ← downstream of org.apache.camel:camel-http
- `camel-http` ← components/camel-http/src/generated/java/org/apache/camel/component/http/HttpEndpointConfigurer.java, components/camel-http/src/generated/java/org/apache/camel/component/http/HttpEndpointUriFactory.java, components/camel-http/src/generated/resources/META-INF/org/apache/camel/component/http/http.json, components/camel-http/src/generated/resources/META-INF/org/apache/camel/component/http/https.json, components/camel-http/src/main/docs/http-component.adoc, components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponent.java, components/camel-http/src/main/java/org/apache/camel/component/http/HttpEndpoint.java, components/camel-http/src/main/java/org/apache/camel/component/http/OAuth2CachedTokensKey.java, components/camel-http/src/main/java/org/apache/camel/component/http/OAuth2CachedTokensKeyResolver.java, components/camel-http/src/main/java/org/apache/camel/component/http/OAuth2ClientConfigurer.java, components/camel-http/src/test/java/org/apache
/camel/component/http/HttpOAuth2CachedTokensKeyTest.java, components/camel-http/src/test/java/org/apache/camel/component/http/HttpOAuth2TokenCachingTest.java, components/camel-http/src/test/java/org/apache/camel/component/http/OAuth2CachedTokensKeyTest.java
- `camel-java-joor-dsl` ← downstream of org.apache.camel:camel-telegram
- `camel-jbang-mcp` ← downstream of org.apache.camel:camel-catalog
- `camel-jbang-plugin-mcp` ← downstream of org.apache.camel:camel-jbang-core
- `camel-jbang-plugin-route-parser` ← downstream of org.apache.camel:camel-route-parser
- `camel-jbang-plugin-tui` ← downstream of org.apache.camel:camel-catalog
- `camel-jbang-plugin-validate` ← downstream of org.apache.camel:camel-yaml-dsl-validator
- `camel-jetty` ← downstream of org.apache.camel:camel-http
- `camel-jsonpath` ← downstream of org.apache.camel:camel-platform-http-vertx
- `camel-kamelet` ← downstream of org.apache.camel:camel-http
- `camel-knative-http` ← downstream of org.apache.camel:camel-http
- `camel-kubernetes` ← downstream of org.apache.camel:camel-http
- `camel-langchain4j-agent` ← downstream of org.apache.camel:camel-telemetry
- `camel-langchain4j-chat` ← downstream of org.apache.camel:camel-telemetry
- `camel-langchain4j-embeddings` ← downstream of org.apache.camel:camel-telemetry
- `camel-langchain4j-embeddingstore` ← downstream of org.apache.camel:camel-langchain4j-embeddings
- `camel-launcher-container` ← downstream of org.apache.camel:camel-launcher
- `camel-lra` ← downstream of org.apache.camel:camel-undertow
- `camel-mcp-server` ← downstream of org.apache.camel:camel-platform-http-vertx
- `camel-micrometer-observability` ← downstream of org.apache.camel:camel-undertow
- `camel-micrometer-prometheus` ← downstream of org.apache.camel:camel-platform-http-main
- `camel-netty-http` ← downstream of org.apache.camel:camel-http
- `camel-oauth` ← downstream of org.apache.camel:camel-vertx-http
- `camel-observability-services` ← downstream of org.apache.camel:camel-opentelemetry2
- `camel-odata` ← downstream of org.apache.camel:camel-http
- `camel-openai` ← downstream of org.apache.camel:camel-platform-http-vertx
- `camel-openapi-validator` ← downstream of org.apache.camel:camel-rest-openapi
- `camel-opentelemetry` ← downstream of org.apache.camel:camel-undertow
- `camel-opentelemetry2` ← downstream of org.apache.camel:camel-undertow
- `camel-platform-http` ← downstream of org.apache.camel:camel-http
- `camel-platform-http-jolokia` ← downstream of org.apache.camel:camel-platform-http
- `camel-platform-http-main` ← downstream of org.apache.camel:camel-platform-http-vertx
- `camel-platform-http-vertx` ← downstream of org.apache.camel:camel-http
- `camel-quickfix` ← downstream of org.apache.camel:camel-jetty
- `camel-rest-openapi` ← downstream of org.apache.camel:camel-http
- `camel-rest-postman` ← downstream of org.apache.camel:camel-http
- `camel-restdsl-openapi-plugin` ← downstream of org.apache.camel:camel-jetty
- `camel-sap-netweaver` ← downstream of org.apache.camel:camel-http
- `camel-semantic` ← downstream of org.apache.camel:camel-xml-io-dsl
- `camel-slack` ← downstream of org.apache.camel:camel-undertow
- `camel-soap` ← downstream of org.apache.camel:camel-cxf-soap
- `camel-spring-ai-chat` ← downstream of org.apache.camel:camel-telemetry
- `camel-spring-rabbitmq` ← downstream of org.apache.camel:camel-http
- `camel-state-store` ← downstream of org.apache.camel:camel-test-main-junit5
- `camel-telegram` ← downstream of org.apache.camel:camel-netty-http
- `camel-telemetry` ← downstream of org.apache.camel:camel-undertow
- `camel-telemetry-dev` ← downstream of org.apache.camel:camel-undertow
- `camel-test-main-junit5` ← downstream of org.apache.camel:camel-xml-io-dsl
- `camel-test-main-junit6` ← downstream of org.apache.camel:camel-xml-io-dsl
- `camel-typesafe-ai` ← downstream of org.apache.camel:camel-xml-io-dsl
- `camel-undertow` ← downstream of org.apache.camel:camel-http
- `camel-undertow-spring-security` ← downstream of org.apache.camel:camel-undertow
- `camel-vertx-http` ← downstream of org.apache.camel:camel-http
- `camel-webhook` ← downstream of org.apache.camel:camel-netty-http
- `camel-whatsapp` ← downstream of org.apache.camel:camel-netty-http
- `camel-wolf-defender` ← downstream of org.apache.camel:camel-semantic
- `camel-xml-io-dsl` ← downstream of org.apache.camel:camel-kamelet
- `camel-xml-jaxb-dsl` ← downstream of org.apache.camel:camel-telegram
- `camel-xml-jaxb-dsl-test-definition` ← downstream of org.apache.camel:camel-telegram
- `camel-xml-jaxb-dsl-test-spring` ← downstream of org.apache.camel:camel-telegram
- `camel-yaml-dsl-validator` ← downstream of org.apache.camel:camel-catalog
- `camel-yaml-dsl-validator-maven-plugin` ← downstream of org.apache.camel:camel-yaml-dsl-validator
- `camel-zookeeper` ← downstream of org.apache.camel:camel-http
</details>
<details><summary>Modules with tests skipped (25)</summary>
- `apache-camel`
- `camel-allcomponents`
- `camel-catalog-console`
- `camel-catalog-maven`
- `camel-catalog-suggest`
- `camel-componentdsl`
- `camel-endpointdsl-support`
- `camel-itest`
- `camel-jbang-core`
- `camel-jbang-it`
- `camel-jbang-main`
- `camel-jbang-plugin-edit`
- `camel-jbang-plugin-generate`
- `camel-jbang-plugin-kubernetes`
- `camel-jbang-plugin-test`
- `camel-kamelet-main`
- `camel-launcher`
- `camel-report-maven-plugin`
- `camel-route-parser`
- `camel-yaml-dsl`
- `camel-yaml-dsl-deserializers`
- `camel-yaml-dsl-maven-plugin`
- `coverage`
- `docs`
- `dummy-component`
</details>
> :information_source: Shadow mode — Scalpel observes but does not affect test execution. [Learn more](https://github.com/maveniverse/scalpel)
</details>
<details><summary>Build reactor — dependencies compiled but only changed modules were tested (3 modules, 20.4s total)</summary>
**Total reactor time:** 20.4s
| Module | Duration | Status |
| --- | --- | --- |
| Camel :: Catalog :: Camel Catalog | 20.4s | SUCCESS |
| Camel :: Endpoint DSL | n/a | |
| Camel :: HTTP | n/a | |
**Top 20 slowest modules:**
- `Camel :: Catalog :: Camel Catalog` (20.4s)
</details>
---
:gear: [View full build and test results](https://github.com/apache/camel/actions/runs/37862902600)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@camel.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org