Skip to content

CAMEL-25345: camel-util - URISupport.normalizeUri gives the same uri for a normalized uri with # or two @ in the path - #27468

Merged
davsclaus merged 2 commits into
apache:mainfrom
allthingssecurity:camel-util-normalize-uri-idempotent
Oct 7, 2026
Merged

davsclaus merged 2 commits into
apache:mainfrom
allthingssecurity:camel-util-normalize-uri-idempotent

Conversation

@allthingssecurity

Copy link
Copy Markdown
Contributor

Description

CAMEL-25345

Reported and analysed by @oscerd. CAMEL-25188 made the query side of URISupport.normalizeUri idempotent, but the path side still changes on a second pass in two cases: a path with #, or a user info with more than one @ (an email address as the user), combined with a query value that needs a percent escape (= or #, a #bean reference is enough):

URI first pass (main) second pass (main)
sftp://me@example.com@host/in?password=pa=ss sftp://me@example.com@host/in?password=pa%3Dss sftp://me%40example.com@host/in?password=pa%3Dss
sql:select+*+from+t+where+id=:#id?dataSource=#ds sql://select+*+from+t+where+id=:#id?dataSource=%23ds sql://select+*+from+t+where+id=:%23id?dataSource=%23ds

The fast normalizer copies the path verbatim and only writes the query. Its % sends the second pass to the complex normalizer, which also encodes the path. With two @ this is a duplicate endpoint: getEndpoint(endpoint.getEndpointUri()) creates a second endpoint, and hasEndpoint returns null.

This change follows the fix direction in the ticket. When the fast normalizer would write a % (which can only come from the query, since the fast parser only takes URIs without %), the URI is normalized by the complex normalizer, so a URI is never normalized by two different normalizers. The re-encoding with createQueryString that CAMEL-25188 added to the fast path is no longer needed, because the complex normalizer writes the query the same way.

Only the normalized string changes, and only for URIs whose fast result had a %. For those URIs the result is now what main gave on the second pass, which is the key that getEndpoint(endpoint.getEndpointUri()) already looked up. The path and the parameters that a component gets are the same, because DefaultComponent.createEndpoint encodes # before parsing and the URI decoding gives back @ (a component with useRawUri() gets the URI before normalization anyway). One thing does change, for the better: with more than one @ in the user info, java.net.URI cannot parse me@example.com@host as a server authority, so on main a component that reads the user and host from the URI got null for both. With a camel-ftp endpoint, sftp://me@example.com@host/in?password=pa=ss had host=null and username=null on main, and has host=host and username=me@example.com with this change (the values main gave the duplicate endpoint). A URI whose query needs no % (sftp://me@example.com@host/in?binary=true) is normalized as before, so it still has no host; this change does not touch that. Other URIs normalize as before.

Cost: a URI with a #bean reference or an = in a value now takes the complex normalizer, which is slower than the fast path plus the createQueryString re-encoding it replaces. In the endpoint URI literals of the repository that is 274 of the 2745 URIs the fast parser takes. A rough single-thread measurement (JDK 21, after warm-up): sql:select?dataSource=#ds 0.27 to 0.66 microseconds per normalizeUri, jms:queue:orders?connectionFactory=#cf&concurrentConsumers=5 0.63 to 1.37 microseconds; URIs without such values are unchanged. normalizeUri runs when an endpoint is looked up, so this is paid at route start, and per message only for dynamic URIs (toD, recipient list) with such values. CAMEL-25190 (%2B in a query value decoded to a space, left for Camel 5) is not affected: a URI with %2B already goes to the complex normalizer, and the change only reroutes URIs that have no % (a + in such a value is still a space, as before, and is still written as +).

Found and checked with a Lean 4 model of the dispatch, the fast parser, both normalizers and the query encoding:

  • The model reproduces the outputs in the table, and main is not idempotent for every short path with # or two @ combined with every value with = or # (checked exhaustively).
  • From the three properties of the normalizers that the dispatch needs, it proves for every URI that the fix is idempotent, that it equals main whenever the fast result has no %, and that it equals main's second pass otherwise.

A Java fuzz of 900k random URIs (3 seeds, about 284k of them taken by the fast parser) compared main and the fix:

  • the fix never makes an idempotent URI non-idempotent;
  • the 475 URIs that stay non-idempotent all have a key starting with ? or an empty key (a separate prepareQuery quirk that main has too);
  • the endpoint values (path and parameters as DefaultComponent parses them) are the same except for 3 URIs with a key starting with ?.

An independent re-check (a different generator, 800k random URIs over 4 seeds, plus the 3865 endpoint URI literals found in the repository's sources) found no URI that becomes non-idempotent, no new exception, and no change in the path or parameters (only the user and host above). Of the repository's URI literals, only the URIs of the new tests normalize differently.

Tests:

  • URISupportTest.testNormalizeTwiceGivesTheSameUriWithHashOrTwoAtInPath (the three URIs of the ticket and three more, normalized once and twice);
  • DefaultCamelContextTest.testGetEndpointByItsUriWithHashOrTwoAtInPath (getEndpoint and hasEndpoint with endpoint.getEndpointUri() give the same endpoint, and the registry has 2 endpoints).

Both fail without the change, in two runs. The camel-util suite passes (295 tests), and so does the camel-core suite (8071 tests, 0 failures, 45 skipped; 3 timing tests, FileExclusiveReadNoneStrategyTest, SplitPropertiesFileIssueTest and BackgroundTaskTest, failed once and passed on the surefire rerun and on a separate rerun).

The 4.23 upgrade guide section of CAMEL-24524/CAMEL-25188 now says that such a URI is normalized as a whole, with the sftp example, and its last sentence no longer says "unencoded form" (the doc nit in the ticket).

Target

  • I checked that the commit is targeting the correct branch (Camel 4 uses the main branch)

Tracking

  • If this is a large change, bug fix, or code improvement, I checked there is a JIRA issue filed for the change (usually before you start working on it).

Apache Camel coding standards and style

  • 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 core/camel-util and core/camel-core, including the formatter and import-sort plugins. No generated files change. I did not run the full root build.)

AI-assisted contributions

  • 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

@davsclaus davsclaus left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, the bug is real (the two-@ case is a regression on main against 4.22.1), and returning null before buildUri so the complex normalizer takes over keeps the common fast path free. DefaultCamelContextTest is a good end-to-end check. The URISupport and endpoint tests pass locally.

This duplicates the draft #27428 for the same ticket; I've asked there to close it in favour of this PR.

Nit: the comment in testNormalizeValueWithPercentEscapeFormEncodesTheQuery (URISupportTest, around line 165) still says the fast normalizer form-encodes the whole query; that is no longer true, since it now hands such URIs to the complex normalizer.

Note that URIs with a #bean reference or an = in a value now take the slower complex normalizer; that is fine since it is paid at endpoint lookup.


Claude Code on behalf of davsclaus. This review was generated by an AI agent and may contain inaccuracies. Please verify all suggestions before applying. It does not replace specialized review tools or static analysis.

@github-actions

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

🌟 Thank you for your contribution to the Apache Camel project! 🌟
🤖 CI automation will test this PR automatically.

🐫 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 have access to the summary.

⚠️ Be careful when sharing logs. Review their contents before sharing them publicly.

@github-actions

github-actions Bot commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

🧪 CI tested the following changed modules:

  • core/camel-core
  • core/camel-util
  • docs

ℹ️ 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.


🔬 Scalpel shadow comparison — Scalpel: 575 of 699 tested, 27 compile-only — current: 576 all tested

Maveniverse Scalpel detected 575 affected modules (current approach: 576).

Skip-tests mode would test 575 modules (3 direct + 573 downstream), skip tests for 27 (generated code, meta-modules)

Modules only in current approach (1)
  • camel-test-infra-core
Modules Scalpel would test (575)
  • archetypes ← downstream of org.apache.camel:camel-support
  • camel-a2a ← downstream of org.apache.camel:camel-support
  • camel-activemq ← downstream of org.apache.camel:camel-core-model
  • camel-activemq6 ← downstream of org.apache.camel:camel-core-model
  • camel-ai-observability ← downstream of org.apache.camel:camel-support
  • camel-ai-observability-api ← downstream of org.apache.camel:camel-support
  • camel-ai-parent ← downstream of org.apache.camel:camel-core-model
  • camel-ai-resource ← downstream of org.apache.camel:camel-support
  • camel-ai-tool ← downstream of org.apache.camel:camel-support
  • camel-alibaba-common ← downstream of org.apache.camel:camel-support
  • camel-alibaba-eventbridge ← downstream of org.apache.camel:camel-support
  • camel-alibaba-fc ← downstream of org.apache.camel:camel-support
  • camel-alibaba-kms ← downstream of org.apache.camel:camel-support
  • camel-alibaba-mns ← downstream of org.apache.camel:camel-support
  • camel-alibaba-oss ← downstream of org.apache.camel:camel-support
  • camel-alibaba-ots ← downstream of org.apache.camel:camel-support
  • camel-alibaba-parent ← downstream of org.apache.camel:camel-core-model
  • camel-alibaba-sls ← downstream of org.apache.camel:camel-support
  • camel-alibaba-sms ← downstream of org.apache.camel:camel-support
  • camel-amqp ← downstream of org.apache.camel:camel-core-model
  • camel-api ← downstream of org.apache.camel:camel-util
  • camel-api-component-maven-plugin ← downstream of org.apache.camel:camel-test-junit6
  • camel-arangodb ← downstream of org.apache.camel:camel-support
  • camel-archetype-api-component ← downstream of org.apache.camel:camel-support
  • camel-archetype-component ← downstream of org.apache.camel:camel-support
  • camel-archetype-dataformat ← downstream of org.apache.camel:camel-support
  • camel-archetype-java ← downstream of org.apache.camel:camel-support
  • camel-archetype-main ← downstream of org.apache.camel:camel-support
  • camel-as2 ← downstream of org.apache.camel:camel-support
  • camel-as2-api ← downstream of org.apache.camel:camel-util
  • camel-as2-parent ← downstream of org.apache.camel:camel-core-model
  • camel-asn1 ← downstream of org.apache.camel:camel-support
  • camel-asterisk ← downstream of org.apache.camel:camel-support
  • camel-atmosphere-websocket ← downstream of org.apache.camel:camel-support
  • camel-atom ← downstream of org.apache.camel:camel-support
  • camel-attachments ← downstream of org.apache.camel:camel-support
  • camel-avro ← downstream of org.apache.camel:camel-support
  • camel-avro-rpc ← downstream of org.apache.camel:camel-support
  • camel-avro-rpc-jetty ← downstream of org.apache.camel:camel-api
  • camel-avro-rpc-parent ← downstream of org.apache.camel:camel-core-model
  • camel-avro-rpc-spi ← downstream of org.apache.camel:camel-core-model
  • camel-aws-bedrock ← downstream of org.apache.camel:camel-support
  • camel-aws-cloudtrail ← downstream of org.apache.camel:camel-support
  • camel-aws-common ← downstream of org.apache.camel:camel-support
  • camel-aws-config ← downstream of org.apache.camel:camel-support
  • camel-aws-parameter-store ← downstream of org.apache.camel:camel-support
  • camel-aws-parent ← downstream of org.apache.camel:camel-core-model
  • camel-aws-secrets-manager ← downstream of org.apache.camel:camel-support
  • camel-aws-security-hub ← downstream of org.apache.camel:camel-support
  • camel-aws2-athena ← downstream of org.apache.camel:camel-support
  • camel-aws2-comprehend ← downstream of org.apache.camel:camel-support
  • camel-aws2-cw ← downstream of org.apache.camel:camel-support
  • camel-aws2-ddb ← downstream of org.apache.camel:camel-support
  • camel-aws2-ec2 ← downstream of org.apache.camel:camel-support
  • camel-aws2-ecs ← downstream of org.apache.camel:camel-support
  • camel-aws2-eks ← downstream of org.apache.camel:camel-support
  • camel-aws2-eventbridge ← downstream of org.apache.camel:camel-support
  • camel-aws2-iam ← downstream of org.apache.camel:camel-support
  • camel-aws2-kinesis ← downstream of org.apache.camel:camel-support
  • camel-aws2-kms ← downstream of org.apache.camel:camel-support
  • camel-aws2-lambda ← downstream of org.apache.camel:camel-support
  • camel-aws2-mq ← downstream of org.apache.camel:camel-support
  • camel-aws2-msk ← downstream of org.apache.camel:camel-support
  • camel-aws2-polly ← downstream of org.apache.camel:camel-support
  • camel-aws2-redshift ← downstream of org.apache.camel:camel-support
  • camel-aws2-rekognition ← downstream of org.apache.camel:camel-support
  • camel-aws2-s3 ← downstream of org.apache.camel:camel-support
  • camel-aws2-s3-vectors ← downstream of org.apache.camel:camel-support
  • camel-aws2-ses ← downstream of org.apache.camel:camel-support
  • camel-aws2-sns ← downstream of org.apache.camel:camel-support
  • camel-aws2-sqs ← downstream of org.apache.camel:camel-support
  • camel-aws2-step-functions ← downstream of org.apache.camel:camel-support
  • camel-aws2-sts ← downstream of org.apache.camel:camel-support
  • camel-aws2-textract ← downstream of org.apache.camel:camel-support
  • camel-aws2-timestream ← downstream of org.apache.camel:camel-support
  • camel-aws2-transcribe ← downstream of org.apache.camel:camel-support
  • camel-aws2-translate ← downstream of org.apache.camel:camel-support
  • camel-azure-common ← downstream of org.apache.camel:camel-core-model
  • camel-azure-cosmosdb ← downstream of org.apache.camel:camel-support
  • camel-azure-eventgrid ← downstream of org.apache.camel:camel-support
  • camel-azure-eventhubs ← downstream of org.apache.camel:camel-support
  • camel-azure-files ← downstream of org.apache.camel:camel-core-model
  • camel-azure-functions ← downstream of org.apache.camel:camel-support
  • camel-azure-key-vault ← downstream of org.apache.camel:camel-support
  • camel-azure-parent ← downstream of org.apache.camel:camel-core-model
  • camel-azure-schema-registry ← downstream of org.apache.camel:camel-support
  • camel-azure-servicebus ← downstream of org.apache.camel:camel-support
  • camel-azure-storage-blob ← downstream of org.apache.camel:camel-support
  • camel-azure-storage-datalake ← downstream of org.apache.camel:camel-support
  • camel-azure-storage-queue ← downstream of org.apache.camel:camel-support
  • camel-barcode ← downstream of org.apache.camel:camel-support
  • camel-base ← downstream of org.apache.camel:camel-util
  • camel-base-engine ← downstream of org.apache.camel:camel-util
  • camel-base64 ← downstream of org.apache.camel:camel-support
  • camel-bean ← downstream of org.apache.camel:camel-support
  • camel-bean-validator ← downstream of org.apache.camel:camel-support
  • camel-beanio ← downstream of org.apache.camel:camel-support
  • camel-bindy ← downstream of org.apache.camel:camel-support
  • camel-bonita ← downstream of org.apache.camel:camel-support
  • camel-box ← downstream of org.apache.camel:camel-support
  • camel-box-api ← downstream of org.apache.camel:camel-api
  • camel-box-parent ← downstream of org.apache.camel:camel-core-model
  • camel-braintree ← downstream of org.apache.camel:camel-support
  • camel-browse ← downstream of org.apache.camel:camel-support
  • camel-caffeine ← downstream of org.apache.camel:camel-support
  • camel-camunda ← downstream of org.apache.camel:camel-support
  • camel-cassandraql ← downstream of org.apache.camel:camel-support
  • camel-catalog-common ← downstream of org.apache.camel:camel-support
  • camel-cbor ← downstream of org.apache.camel:camel-support
  • camel-chatscript ← downstream of org.apache.camel:camel-support
  • camel-chunk ← downstream of org.apache.camel:camel-support
  • camel-cli-connector ← downstream of org.apache.camel:camel-support
  • camel-cli-debug ← downstream of org.apache.camel:camel-cli-connector
  • camel-clickhouse ← downstream of org.apache.camel:camel-support
  • camel-clickup ← downstream of org.apache.camel:camel-support
  • camel-cloudevents ← downstream of org.apache.camel:camel-support
  • camel-cluster ← downstream of org.apache.camel:camel-util
  • camel-cm-sms ← downstream of org.apache.camel:camel-support
  • camel-coap ← downstream of org.apache.camel:camel-support
  • camel-cometd ← downstream of org.apache.camel:camel-support
  • camel-console ← downstream of org.apache.camel:camel-support
  • camel-consul ← downstream of org.apache.camel:camel-support
  • camel-controlbus ← downstream of org.apache.camel:camel-support
  • camel-core ← core/camel-core/src/test/java/org/apache/camel/impl/engine/DefaultCamelContextTest.java
  • camel-core-all ← downstream of org.apache.camel:camel-util
  • camel-core-catalog ← downstream of org.apache.camel:camel-util
  • camel-core-engine ← downstream of org.apache.camel:camel-util
  • camel-core-languages ← downstream of org.apache.camel:camel-util
  • camel-core-model ← downstream of org.apache.camel:camel-util
  • camel-core-processor ← downstream of org.apache.camel:camel-util
  • camel-core-reifier ← downstream of org.apache.camel:camel-util
  • camel-core-xml ← downstream of org.apache.camel:camel-core-engine
  • camel-couchbase ← downstream of org.apache.camel:camel-support
  • camel-couchdb ← downstream of org.apache.camel:camel-support
  • camel-cron ← downstream of org.apache.camel:camel-support
  • camel-crypto ← downstream of org.apache.camel:camel-support
  • camel-crypto-pgp ← downstream of org.apache.camel:camel-support
  • camel-csv ← downstream of org.apache.camel:camel-support
  • camel-cxf-common ← downstream of org.apache.camel:camel-support
  • camel-cxf-parent ← downstream of org.apache.camel:camel-core-model
  • camel-cxf-rest ← downstream of org.apache.camel:camel-support
  • camel-cxf-soap ← downstream of org.apache.camel:camel-support
  • camel-cxf-spring-common ← downstream of org.apache.camel:camel-support
  • camel-cxf-spring-rest ← downstream of org.apache.camel:camel-core-model
  • camel-cxf-spring-soap ← downstream of org.apache.camel:camel-core-model
  • camel-cxf-spring-transport ← downstream of org.apache.camel:camel-core-model
  • camel-cxf-transport ← downstream of org.apache.camel:camel-support
  • camel-cyberark-vault ← downstream of org.apache.camel:camel-support
  • camel-dapr ← downstream of org.apache.camel:camel-support
  • camel-dataformat ← downstream of org.apache.camel:camel-support
  • camel-dataset ← downstream of org.apache.camel:camel-core-model
  • camel-datasonnet ← downstream of org.apache.camel:camel-support
  • camel-dataweave ← downstream of org.apache.camel:camel-core-model
  • camel-debezium-common ← downstream of org.apache.camel:camel-support
  • camel-debezium-common-parent ← downstream of org.apache.camel:camel-support
  • camel-debezium-db2 ← downstream of org.apache.camel:camel-core-model
  • camel-debezium-maven-plugin ← downstream of org.apache.camel:camel-support
  • camel-debezium-mongodb ← downstream of org.apache.camel:camel-core-model
  • camel-debezium-mysql ← downstream of org.apache.camel:camel-core-model
  • camel-debezium-oracle ← downstream of org.apache.camel:camel-core-model
  • camel-debezium-parent ← downstream of org.apache.camel:camel-core-model
  • camel-debezium-postgres ← downstream of org.apache.camel:camel-core-model
  • camel-debezium-sqlserver ← downstream of org.apache.camel:camel-core-model
  • camel-debug ← downstream of org.apache.camel:camel-support
  • camel-dependencies ← downstream of org.apache.camel:sync-properties-maven-plugin
  • camel-dfdl ← downstream of org.apache.camel:camel-support
  • camel-dhis2 ← downstream of org.apache.camel:camel-support
  • camel-dhis2-api ← downstream of org.apache.camel:camel-support
  • camel-dhis2-parent ← downstream of org.apache.camel:camel-core-model
  • camel-diagram ← downstream of org.apache.camel:camel-util
  • camel-direct ← downstream of org.apache.camel:camel-support
  • camel-disruptor ← downstream of org.apache.camel:camel-support
  • camel-djl ← downstream of org.apache.camel:camel-support
  • camel-dns ← downstream of org.apache.camel:camel-support
  • camel-docker ← downstream of org.apache.camel:camel-support
  • camel-docling ← downstream of org.apache.camel:camel-support
  • camel-drill ← downstream of org.apache.camel:camel-support
  • camel-dropbox ← downstream of org.apache.camel:camel-support
  • camel-dsl-modeline ← downstream of org.apache.camel:camel-support
  • camel-dsl-support ← downstream of org.apache.camel:camel-support
  • camel-duckdb ← downstream of org.apache.camel:camel-support
  • camel-dynamic-router ← downstream of org.apache.camel:camel-support
  • camel-ehcache ← downstream of org.apache.camel:camel-support
  • camel-eip-documentation-enricher-maven-plugin ← downstream of org.apache.camel:camel-util
  • camel-elasticsearch ← downstream of org.apache.camel:camel-support
  • camel-elasticsearch-rest-client ← downstream of org.apache.camel:camel-support
  • camel-event ← downstream of org.apache.camel:camel-support
  • camel-exec ← downstream of org.apache.camel:camel-support
  • camel-fastjson ← downstream of org.apache.camel:camel-support
  • camel-fhir ← downstream of org.apache.camel:camel-support
  • camel-fhir-api ← downstream of org.apache.camel:camel-support
  • camel-fhir-parent ← downstream of org.apache.camel:camel-core-model
  • camel-file ← downstream of org.apache.camel:camel-support
  • camel-file-watch ← downstream of org.apache.camel:camel-support
  • camel-flatpack ← downstream of org.apache.camel:camel-core-model
  • camel-flink ← downstream of org.apache.camel:camel-support
  • camel-flowable ← downstream of org.apache.camel:camel-support
  • camel-fop ← downstream of org.apache.camel:camel-support
  • camel-fory ← downstream of org.apache.camel:camel-support
  • camel-freemarker ← downstream of org.apache.camel:camel-support
  • camel-ftp ← downstream of org.apache.camel:camel-core-model
  • camel-ftp-common ← downstream of org.apache.camel:camel-core-model
  • camel-geocoder ← downstream of org.apache.camel:camel-support
  • camel-git ← downstream of org.apache.camel:camel-support
  • camel-github2 ← downstream of org.apache.camel:camel-support
  • camel-google-bigquery ← downstream of org.apache.camel:camel-support
  • camel-google-calendar ← downstream of org.apache.camel:camel-support
  • camel-google-common ← downstream of org.apache.camel:camel-support
  • camel-google-drive ← downstream of org.apache.camel:camel-support
  • camel-google-firestore ← downstream of org.apache.camel:camel-support
  • camel-google-functions ← downstream of org.apache.camel:camel-support
  • camel-google-mail ← downstream of org.apache.camel:camel-support
  • camel-google-parent ← downstream of org.apache.camel:camel-core-model
  • camel-google-pubsub ← downstream of org.apache.camel:camel-support
  • camel-google-secret-manager ← downstream of org.apache.camel:camel-support
  • camel-google-sheets ← downstream of org.apache.camel:camel-support
  • camel-google-speech-to-text ← downstream of org.apache.camel:camel-support
  • camel-google-storage ← downstream of org.apache.camel:camel-support
  • camel-google-text-to-speech ← downstream of org.apache.camel:camel-support
  • camel-google-vertexai ← downstream of org.apache.camel:camel-support
  • camel-google-vision ← downstream of org.apache.camel:camel-support
  • camel-graphql ← downstream of org.apache.camel:camel-support
  • camel-grok ← downstream of org.apache.camel:camel-support
  • camel-groovy ← downstream of org.apache.camel:camel-support
  • camel-grpc ← downstream of org.apache.camel:camel-support
  • camel-gson ← downstream of org.apache.camel:camel-support
  • camel-hashicorp-vault ← downstream of org.apache.camel:camel-support
  • camel-hazelcast ← downstream of org.apache.camel:camel-support
  • camel-health ← downstream of org.apache.camel:camel-util
  • camel-hivemq ← downstream of org.apache.camel:camel-support
  • camel-hl7 ← downstream of org.apache.camel:camel-core-model
  • camel-http ← downstream of org.apache.camel:camel-core-model
  • camel-http-base ← downstream of org.apache.camel:camel-support
  • camel-http-common ← downstream of org.apache.camel:camel-support
  • camel-huawei-parent ← downstream of org.apache.camel:camel-core-model
  • camel-huaweicloud-common ← downstream of org.apache.camel:camel-support
  • camel-huaweicloud-dms ← downstream of org.apache.camel:camel-support
  • camel-huaweicloud-frs ← downstream of org.apache.camel:camel-support
  • camel-huaweicloud-functiongraph ← downstream of org.apache.camel:camel-support
  • camel-huaweicloud-iam ← downstream of org.apache.camel:camel-support
  • camel-huaweicloud-imagerecognition ← downstream of org.apache.camel:camel-support
  • camel-huaweicloud-obs ← downstream of org.apache.camel:camel-support
  • camel-huaweicloud-smn ← downstream of org.apache.camel:camel-support
  • camel-huggingface ← downstream of org.apache.camel:camel-support
  • camel-ibm-cos ← downstream of org.apache.camel:camel-support
  • camel-ibm-parent ← downstream of org.apache.camel:camel-core-model
  • camel-ibm-secrets-manager ← downstream of org.apache.camel:camel-support
  • camel-ibm-watson-discovery ← downstream of org.apache.camel:camel-support
  • camel-ibm-watson-language ← downstream of org.apache.camel:camel-support
  • camel-ibm-watson-speech-to-text ← downstream of org.apache.camel:camel-support
  • camel-ibm-watson-text-to-speech ← downstream of org.apache.camel:camel-support
  • camel-ibm-watsonx-ai ← downstream of org.apache.camel:camel-support
  • camel-ibm-watsonx-data ← downstream of org.apache.camel:camel-support
  • camel-ical ← downstream of org.apache.camel:camel-support
  • camel-iggy ← downstream of org.apache.camel:camel-support
  • camel-ignite ← downstream of org.apache.camel:camel-support
  • camel-infinispan ← downstream of org.apache.camel:camel-core-model
  • camel-infinispan-common ← downstream of org.apache.camel:camel-support
  • camel-infinispan-embedded ← downstream of org.apache.camel:camel-core-model
  • camel-infinispan-parent ← downstream of org.apache.camel:camel-core-model
  • camel-influxdb ← downstream of org.apache.camel:camel-support
  • camel-influxdb2 ← downstream of org.apache.camel:camel-support
  • camel-iso8583 ← downstream of org.apache.camel:camel-support
  • camel-jackson ← downstream of org.apache.camel:camel-core-model
  • camel-jackson-avro ← downstream of org.apache.camel:camel-support
  • camel-jackson-protobuf ← downstream of org.apache.camel:camel-support
  • camel-jackson3 ← downstream of org.apache.camel:camel-core-model
  • camel-jackson3-avro ← downstream of org.apache.camel:camel-support
  • camel-jackson3-protobuf ← downstream of org.apache.camel:camel-support
  • camel-jackson3xml ← downstream of org.apache.camel:camel-support
  • camel-jacksonxml ← downstream of org.apache.camel:camel-support
  • camel-jactl ← downstream of org.apache.camel:camel-support
  • camel-jandex ← downstream of org.apache.camel:camel-support
  • camel-jasypt ← downstream of org.apache.camel:camel-base
  • camel-java-io ← downstream of org.apache.camel:camel-xml-io
  • camel-java-joor-dsl ← downstream of org.apache.camel:camel-core-languages
  • camel-javascript ← downstream of org.apache.camel:camel-support
  • camel-jaxb ← downstream of org.apache.camel:camel-core-model
  • camel-jbang-console ← downstream of org.apache.camel:camel-support
  • camel-jbang-mcp ← downstream of org.apache.camel:camel-xml-io
  • camel-jbang-plugin-mcp ← downstream of org.apache.camel:camel-jbang-core
  • camel-jbang-plugin-route-parser ← downstream of org.apache.camel:camel-jbang-core
  • camel-jbang-plugin-tui ← downstream of org.apache.camel:camel-diagram
  • camel-jbang-plugin-validate ← downstream of org.apache.camel:camel-test-junit6
  • camel-jcache ← downstream of org.apache.camel:camel-support
  • camel-jcr ← downstream of org.apache.camel:camel-support
  • camel-jdbc ← downstream of org.apache.camel:camel-support
  • camel-jetty ← downstream of org.apache.camel:camel-support
  • camel-jetty-common ← downstream of org.apache.camel:camel-core-model
  • camel-jfr ← downstream of org.apache.camel:camel-support
  • camel-jgroups ← downstream of org.apache.camel:camel-support
  • camel-jgroups-raft ← downstream of org.apache.camel:camel-support
  • camel-jira ← downstream of org.apache.camel:camel-support
  • camel-jms ← downstream of org.apache.camel:camel-support
  • camel-jmx ← downstream of org.apache.camel:camel-support
  • camel-jolt ← downstream of org.apache.camel:camel-support
  • camel-jooq ← downstream of org.apache.camel:camel-support
  • camel-joor ← downstream of org.apache.camel:camel-support
  • camel-jpa ← downstream of org.apache.camel:camel-support
  • camel-jq ← downstream of org.apache.camel:camel-support
  • camel-jsch ← downstream of org.apache.camel:camel-core-model
  • camel-jslt ← downstream of org.apache.camel:camel-support
  • camel-json-validator ← downstream of org.apache.camel:camel-support
  • camel-jsonapi ← downstream of org.apache.camel:camel-support
  • camel-jsonata ← downstream of org.apache.camel:camel-support
  • camel-jsonb ← downstream of org.apache.camel:camel-support
  • camel-jsonpath ← downstream of org.apache.camel:camel-support
  • camel-jsoup ← downstream of org.apache.camel:camel-support
  • camel-jt400 ← downstream of org.apache.camel:camel-support
  • camel-jta ← downstream of org.apache.camel:camel-support
  • camel-jte ← downstream of org.apache.camel:camel-support
  • camel-kafka ← downstream of org.apache.camel:camel-support
  • camel-kamelet ← downstream of org.apache.camel:camel-core-model
  • camel-kamelet-main-support ← downstream of org.apache.camel:camel-main
  • camel-keycloak ← downstream of org.apache.camel:camel-support
  • camel-knative ← downstream of org.apache.camel:camel-support
  • camel-knative-api ← downstream of org.apache.camel:camel-support
  • camel-knative-http ← downstream of org.apache.camel:camel-core-model
  • camel-knative-parent ← downstream of org.apache.camel:camel-core-model
  • camel-kserve ← downstream of org.apache.camel:camel-support
  • camel-kubernetes ← downstream of org.apache.camel:camel-support
  • camel-kudu ← downstream of org.apache.camel:camel-support
  • camel-langchain4j-agent ← downstream of org.apache.camel:camel-support
  • camel-langchain4j-agent-api ← downstream of org.apache.camel:camel-api
  • camel-langchain4j-chat ← downstream of org.apache.camel:camel-support
  • camel-langchain4j-core ← downstream of org.apache.camel:camel-support
  • camel-langchain4j-embeddings ← downstream of org.apache.camel:camel-support
  • camel-langchain4j-embeddingstore ← downstream of org.apache.camel:camel-support
  • camel-langchain4j-embeddingstore-api ← downstream of org.apache.camel:camel-api
  • camel-langchain4j-ingest ← downstream of org.apache.camel:camel-support
  • camel-langchain4j-tokenizer ← downstream of org.apache.camel:camel-support
  • camel-langchain4j-web-search ← downstream of org.apache.camel:camel-support
  • camel-language ← downstream of org.apache.camel:camel-support
  • camel-launcher-container ← downstream of org.apache.camel:camel-launcher
  • camel-ldap ← downstream of org.apache.camel:camel-support
  • camel-ldif ← downstream of org.apache.camel:camel-support
  • camel-log ← downstream of org.apache.camel:camel-support
  • camel-lra ← downstream of org.apache.camel:camel-core-model
  • camel-lucene ← downstream of org.apache.camel:camel-support
  • camel-lumberjack ← downstream of org.apache.camel:camel-support
  • camel-lzf ← downstream of org.apache.camel:camel-support
  • camel-mail ← downstream of org.apache.camel:camel-support
  • camel-mail-microsoft-oauth ← downstream of org.apache.camel:camel-core-model
  • camel-main ← downstream of org.apache.camel:camel-util
  • camel-management ← downstream of org.apache.camel:camel-xml-io
  • camel-management-api ← downstream of org.apache.camel:camel-util
  • camel-mapstruct ← downstream of org.apache.camel:camel-support
  • camel-master ← downstream of org.apache.camel:camel-support
  • camel-maven-plugin ← downstream of org.apache.camel:camel-spring-main
  • camel-mcp-server ← downstream of org.apache.camel:camel-core-model
  • camel-mcp-server-api ← downstream of org.apache.camel:camel-support
  • camel-mdc ← downstream of org.apache.camel:camel-support
  • camel-metrics ← downstream of org.apache.camel:camel-support
  • camel-micrometer ← downstream of org.apache.camel:camel-support
  • camel-micrometer-observability ← downstream of org.apache.camel:camel-core-model
  • camel-micrometer-prometheus ← downstream of org.apache.camel:camel-core-model
  • camel-microprofile-config ← downstream of org.apache.camel:camel-support
  • camel-microprofile-fault-tolerance ← downstream of org.apache.camel:camel-support
  • camel-microprofile-health ← downstream of org.apache.camel:camel-core-model
  • camel-microprofile-parent ← downstream of org.apache.camel:camel-core-model
  • camel-milo ← downstream of org.apache.camel:camel-support
  • camel-milvus ← downstream of org.apache.camel:camel-support
  • camel-mina ← downstream of org.apache.camel:camel-support
  • camel-mina-sftp ← downstream of org.apache.camel:camel-core-model
  • camel-minio ← downstream of org.apache.camel:camel-support
  • camel-mllp ← downstream of org.apache.camel:camel-support
  • camel-mock ← downstream of org.apache.camel:camel-support
  • camel-mongodb ← downstream of org.apache.camel:camel-support
  • camel-mongodb-gridfs ← downstream of org.apache.camel:camel-support
  • camel-mustache ← downstream of org.apache.camel:camel-support
  • camel-mvel ← downstream of org.apache.camel:camel-support
  • camel-mybatis ← downstream of org.apache.camel:camel-core-model
  • camel-nats ← downstream of org.apache.camel:camel-support
  • camel-neo4j ← downstream of org.apache.camel:camel-support
  • camel-netty ← downstream of org.apache.camel:camel-support
  • camel-netty-http ← downstream of org.apache.camel:camel-core-model
  • camel-oaipmh ← downstream of org.apache.camel:camel-support
  • camel-oauth ← downstream of org.apache.camel:camel-support
  • camel-observability-services ← downstream of org.apache.camel:camel-core-model
  • camel-observation ← downstream of org.apache.camel:camel-support
  • camel-ocsf ← downstream of org.apache.camel:camel-support
  • camel-odata ← downstream of org.apache.camel:camel-support
  • camel-ognl ← downstream of org.apache.camel:camel-support
  • camel-olingo2 ← downstream of org.apache.camel:camel-support
  • camel-olingo2-api ← downstream of org.apache.camel:camel-core-model
  • camel-olingo2-parent ← downstream of org.apache.camel:camel-core-model
  • camel-olingo4 ← downstream of org.apache.camel:camel-support
  • camel-olingo4-api ← downstream of org.apache.camel:camel-support
  • camel-olingo4-parent ← downstream of org.apache.camel:camel-core-model
  • camel-once ← downstream of org.apache.camel:camel-support
  • camel-opa ← downstream of org.apache.camel:camel-support
  • camel-openai ← downstream of org.apache.camel:camel-support
  • camel-openapi-java ← downstream of org.apache.camel:camel-core-model
  • camel-openapi-rest-dsl-generator ← downstream of org.apache.camel:camel-util
  • camel-openapi-validator ← downstream of org.apache.camel:camel-core-model
  • camel-openfga ← downstream of org.apache.camel:camel-support
  • camel-opensearch ← downstream of org.apache.camel:camel-support
  • camel-openstack ← downstream of org.apache.camel:camel-support
  • camel-opentelemetry ← downstream of org.apache.camel:camel-support
  • camel-opentelemetry-metrics ← downstream of org.apache.camel:camel-support
  • camel-opentelemetry2 ← downstream of org.apache.camel:camel-core-model
  • camel-optaplanner ← downstream of org.apache.camel:camel-support
  • camel-paho ← downstream of org.apache.camel:camel-support
  • camel-paho-mqtt5 ← downstream of org.apache.camel:camel-support
  • camel-parquet-avro ← downstream of org.apache.camel:camel-support
  • camel-pdf ← downstream of org.apache.camel:camel-support
  • camel-pg-replication-slot ← downstream of org.apache.camel:camel-support
  • camel-pgevent ← downstream of org.apache.camel:camel-support
  • camel-pgvector ← downstream of org.apache.camel:camel-support
  • camel-pinecone ← downstream of org.apache.camel:camel-support
  • camel-platform-http ← downstream of org.apache.camel:camel-core-model
  • camel-platform-http-jolokia ← downstream of org.apache.camel:camel-support
  • camel-platform-http-main ← downstream of org.apache.camel:camel-core-model
  • camel-platform-http-vertx ← downstream of org.apache.camel:camel-core-model
  • camel-plc4x ← downstream of org.apache.camel:camel-support
  • camel-pqc ← downstream of org.apache.camel:camel-support
  • camel-printer ← downstream of org.apache.camel:camel-support
  • camel-protobuf ← downstream of org.apache.camel:camel-support
  • camel-pubnub ← downstream of org.apache.camel:camel-support
  • camel-pulsar ← downstream of org.apache.camel:camel-support
  • camel-python ← downstream of org.apache.camel:camel-support
  • camel-python3 ← downstream of org.apache.camel:camel-support
  • camel-qdrant ← downstream of org.apache.camel:camel-support
  • camel-quartz ← downstream of org.apache.camel:camel-support
  • camel-quickfix ← downstream of org.apache.camel:camel-support
  • camel-quickjs ← downstream of org.apache.camel:camel-support
  • camel-reactive-streams ← downstream of org.apache.camel:camel-core-model
  • camel-reactor ← downstream of org.apache.camel:camel-support
  • camel-redis ← downstream of org.apache.camel:camel-support
  • camel-ref ← downstream of org.apache.camel:camel-support
  • camel-resilience4j ← downstream of org.apache.camel:camel-support
  • camel-resilience4j-micrometer ← downstream of org.apache.camel:camel-core-model
  • camel-resourceresolver-github ← downstream of org.apache.camel:camel-support
  • camel-rest ← downstream of org.apache.camel:camel-support
  • camel-rest-openapi ← downstream of org.apache.camel:camel-support
  • camel-rest-postman ← downstream of org.apache.camel:camel-support
  • camel-restdsl-openapi-plugin ← downstream of org.apache.camel:camel-core-engine
  • camel-robotframework ← downstream of org.apache.camel:camel-support
  • camel-rocketmq ← downstream of org.apache.camel:camel-support
  • camel-rss ← downstream of org.apache.camel:camel-support
  • camel-rxjava ← downstream of org.apache.camel:camel-support
  • camel-saga ← downstream of org.apache.camel:camel-support
  • camel-salesforce ← downstream of org.apache.camel:camel-core-model
  • camel-salesforce-codegen ← downstream of org.apache.camel:camel-core-model
  • camel-salesforce-parent ← downstream of org.apache.camel:camel-core-model
  • camel-sap-netweaver ← downstream of org.apache.camel:camel-support
  • camel-saxon ← downstream of org.apache.camel:camel-core-model
  • camel-scheduler ← downstream of org.apache.camel:camel-support
  • camel-schematron ← downstream of org.apache.camel:camel-support
  • camel-seda ← downstream of org.apache.camel:camel-support
  • camel-semantic ← downstream of org.apache.camel:camel-support
  • camel-servicenow ← downstream of org.apache.camel:camel-support
  • camel-servicenow-maven-plugin ← downstream of org.apache.camel:camel-core-model
  • camel-servicenow-parent ← downstream of org.apache.camel:camel-core-model
  • camel-servlet ← downstream of org.apache.camel:camel-support
  • camel-shell ← downstream of org.apache.camel:camel-support
  • camel-shiro ← downstream of org.apache.camel:camel-support
  • camel-sjms ← downstream of org.apache.camel:camel-support
  • camel-sjms2 ← downstream of org.apache.camel:camel-support
  • camel-slack ← downstream of org.apache.camel:camel-support
  • camel-smb ← downstream of org.apache.camel:camel-support
  • camel-smooks ← downstream of org.apache.camel:camel-support
  • camel-smpp ← downstream of org.apache.camel:camel-support
  • camel-snakeyaml ← downstream of org.apache.camel:camel-support
  • camel-snmp ← downstream of org.apache.camel:camel-support
  • camel-soap ← downstream of org.apache.camel:camel-support
  • camel-solr ← downstream of org.apache.camel:camel-support
  • camel-spiffe ← downstream of org.apache.camel:camel-support
  • camel-splunk-hec ← downstream of org.apache.camel:camel-support
  • camel-spring ← downstream of org.apache.camel:camel-management-api
  • camel-spring-ai-chat ← downstream of org.apache.camel:camel-support
  • camel-spring-ai-embeddings ← downstream of org.apache.camel:camel-support
  • camel-spring-ai-image ← downstream of org.apache.camel:camel-support
  • camel-spring-ai-parent ← downstream of org.apache.camel:camel-core-model
  • camel-spring-ai-vector-store ← downstream of org.apache.camel:camel-support
  • camel-spring-batch ← downstream of org.apache.camel:camel-support
  • camel-spring-cloud-config ← downstream of org.apache.camel:camel-support
  • camel-spring-jdbc ← downstream of org.apache.camel:camel-core-model
  • camel-spring-ldap ← downstream of org.apache.camel:camel-support
  • camel-spring-main ← downstream of org.apache.camel:camel-core-model
  • camel-spring-parent ← downstream of org.apache.camel:camel-core-model
  • camel-spring-rabbitmq ← downstream of org.apache.camel:camel-support
  • camel-spring-redis ← downstream of org.apache.camel:camel-support
  • camel-spring-security ← downstream of org.apache.camel:camel-core-model
  • camel-spring-ws ← downstream of org.apache.camel:camel-support
  • camel-spring-xml ← downstream of org.apache.camel:camel-core-model
  • camel-sql ← downstream of org.apache.camel:camel-support
  • camel-ssh ← downstream of org.apache.camel:camel-support
  • camel-state-store ← downstream of org.apache.camel:camel-support
  • camel-state-store-parent ← downstream of org.apache.camel:camel-core-model
  • camel-stax ← downstream of org.apache.camel:camel-support
  • camel-stitch ← downstream of org.apache.camel:camel-support
  • camel-stream ← downstream of org.apache.camel:camel-support
  • camel-streamcaching-test ← downstream of org.apache.camel:camel-test-junit6
  • camel-stringtemplate ← downstream of org.apache.camel:camel-support
  • camel-stripe ← downstream of org.apache.camel:camel-support
  • camel-stub ← downstream of org.apache.camel:camel-core-model
  • camel-support ← downstream of org.apache.camel:camel-util
  • camel-swift ← downstream of org.apache.camel:camel-support
  • camel-syslog ← downstream of org.apache.camel:camel-support
  • camel-tahu ← downstream of org.apache.camel:camel-api
  • camel-tarfile ← downstream of org.apache.camel:camel-core-model
  • camel-telegram ← downstream of org.apache.camel:camel-support
  • camel-telemetry ← downstream of org.apache.camel:camel-support
  • camel-telemetry-dev ← downstream of org.apache.camel:camel-core-model
  • camel-tensorflow-serving ← downstream of org.apache.camel:camel-support
  • camel-test-infra-all ← downstream of org.apache.camel:camel-test-infra-jetty
  • camel-test-infra-artemis ← downstream of org.apache.camel:camel-test-junit6
  • camel-test-infra-cli ← downstream of org.apache.camel:camel-util
  • camel-test-infra-jetty ← downstream of org.apache.camel:camel-util
  • camel-test-infra-qdrant ← downstream of org.apache.camel:camel-util
  • camel-test-infra-smb ← downstream of org.apache.camel:camel-test-junit6
  • camel-test-junit5 ← downstream of org.apache.camel:camel-support
  • camel-test-junit6 ← downstream of org.apache.camel:camel-support
  • camel-test-main-junit5 ← downstream of org.apache.camel:camel-core-model
  • camel-test-main-junit6 ← downstream of org.apache.camel:camel-core-model
  • camel-test-parent ← downstream of org.apache.camel:camel-core-model
  • camel-test-spring-junit5 ← downstream of org.apache.camel:camel-core-model
  • camel-test-spring-junit6 ← downstream of org.apache.camel:camel-core-model
  • camel-thrift ← downstream of org.apache.camel:camel-support
  • camel-thymeleaf ← downstream of org.apache.camel:camel-support
  • camel-tika ← downstream of org.apache.camel:camel-support
  • camel-timer ← downstream of org.apache.camel:camel-support
  • camel-tooling-maven ← downstream of org.apache.camel:camel-support
  • camel-toon ← downstream of org.apache.camel:camel-support
  • camel-tracing ← downstream of org.apache.camel:camel-support
  • camel-twilio ← downstream of org.apache.camel:camel-support
  • camel-twitter ← downstream of org.apache.camel:camel-support
  • camel-typesafe-ai ← downstream of org.apache.camel:camel-support
  • camel-ubl ← downstream of org.apache.camel:camel-support
  • camel-undertow ← downstream of org.apache.camel:camel-support
  • camel-undertow-spring-security ← downstream of org.apache.camel:camel-core-model
  • camel-univocity-parsers ← downstream of org.apache.camel:camel-support
  • camel-util ← core/camel-util/src/main/java/org/apache/camel/util/URISupport.java, core/camel-util/src/test/java/org/apache/camel/util/URISupportTest.java
  • camel-validator ← downstream of org.apache.camel:camel-support
  • camel-velocity ← downstream of org.apache.camel:camel-support
  • camel-vertx ← downstream of org.apache.camel:camel-support
  • camel-vertx-common ← downstream of org.apache.camel:camel-support
  • camel-vertx-http ← downstream of org.apache.camel:camel-core-model
  • camel-vertx-parent ← downstream of org.apache.camel:camel-core-model
  • camel-vertx-websocket ← downstream of org.apache.camel:camel-support
  • camel-wal ← downstream of org.apache.camel:camel-support
  • camel-wasm ← downstream of org.apache.camel:camel-support
  • camel-weather ← downstream of org.apache.camel:camel-support
  • camel-weaviate ← downstream of org.apache.camel:camel-support
  • camel-web3j ← downstream of org.apache.camel:camel-support
  • camel-webhook ← downstream of org.apache.camel:camel-support
  • camel-whatsapp ← downstream of org.apache.camel:camel-support
  • camel-wordpress ← downstream of org.apache.camel:camel-support
  • camel-workday ← downstream of org.apache.camel:camel-support
  • camel-xchange ← downstream of org.apache.camel:camel-support
  • camel-xj ← downstream of org.apache.camel:camel-core-model
  • camel-xml-io ← downstream of org.apache.camel:camel-util
  • camel-xml-io-dsl ← downstream of org.apache.camel:camel-xml-io
  • camel-xml-jaxb ← downstream of org.apache.camel:camel-util
  • camel-xml-jaxb-dsl ← downstream of org.apache.camel:camel-core-languages
  • camel-xml-jaxb-dsl-test-definition ← downstream of org.apache.camel:camel-support
  • camel-xml-jaxb-dsl-test-spring ← downstream of org.apache.camel:camel-support
  • camel-xml-jaxp ← downstream of org.apache.camel:camel-util
  • camel-xmlsecurity ← downstream of org.apache.camel:camel-support
  • camel-xmpp ← downstream of org.apache.camel:camel-support
  • camel-xpath ← downstream of org.apache.camel:camel-support
  • camel-xslt ← downstream of org.apache.camel:camel-support
  • camel-xslt-saxon ← downstream of org.apache.camel:camel-core-model
  • camel-yaml-dsl-common ← downstream of org.apache.camel:camel-core-engine
  • camel-yaml-dsl-validator ← downstream of org.apache.camel:camel-xml-io
  • camel-yaml-dsl-validator-maven-plugin ← downstream of org.apache.camel:camel-yaml-dsl-validator
  • camel-yaml-io ← downstream of org.apache.camel:camel-util
  • camel-zendesk ← downstream of org.apache.camel:camel-support
  • camel-zip-deflater ← downstream of org.apache.camel:camel-support
  • camel-zipfile ← downstream of org.apache.camel:camel-support
  • camel-zookeeper ← downstream of org.apache.camel:camel-support
  • camel-zookeeper-master ← downstream of org.apache.camel:camel-support
  • components ← downstream of org.apache.camel:camel-core-model
  • sync-properties-maven-plugin ← downstream of org.apache.camel:camel-util
Modules with tests skipped (27)
  • apache-camel
  • camel-allcomponents
  • camel-catalog
  • camel-catalog-console
  • camel-catalog-maven
  • camel-catalog-suggest
  • camel-componentdsl
  • camel-endpointdsl
  • 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-salesforce-maven-plugin
  • camel-yaml-dsl
  • camel-yaml-dsl-deserializers
  • camel-yaml-dsl-maven-plugin
  • coverage
  • dummy-component

ℹ️ Shadow mode — Scalpel observes but does not affect test execution. Learn more

⚠️ Some tests are disabled on GitHub Actions (@DisabledIfSystemProperty(named = "ci.env.name")) and require manual verification:

  • core/camel-core: 4 test(s) disabled on GitHub Actions
Build reactor — dependencies compiled but only changed modules were tested (3 modules, 24.3s total)

Total reactor time: 24.3s

Module Duration Status
Camel :: Docs 13.6s SUCCESS
Camel :: Util 10.7s SUCCESS
Camel :: Core n/a

Top 20 slowest modules:

  • Camel :: Docs (13.6s)
  • Camel :: Util (10.7s)

⚙️ View full build and test results

allthingssecurity added a commit to allthingssecurity/camel that referenced this pull request Oct 7, 2026
…lizeValueWithPercentEscapeFormEncodesTheQuery

Review of apache#27468: the fast normalizer no longer form-encodes the query itself, it
hands such a uri to the complex normalizer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@allthingssecurity

Copy link
Copy Markdown
Contributor Author

Thanks @davsclaus. Fixed the comment in cafc224: it now says that the fast normalizer hands such a uri to the complex normalizer, which form-encodes the whole query. camel-util: 295 tests, 0 failures (URISupportTest 77).

Noted on #27428, and thanks for following up there.

The red build (17, false) / build (25, false) checks are not from this PR. They are the three DumpModelAsYaml* tests of camel-core, which also fail on main without this change, since d7d5290 (CAMEL-25381) changed the order of the endpoint options in the YAML dump. Details in #27466 (comment).

Claude Code on behalf of allthingssecurity

allthingssecurity and others added 2 commits October 7, 2026 10:47
…for a normalized uri with # or two @ in the path

The fast normalizer copies the path verbatim and only writes the query. When a key or
value needs a percent escape (such as = or # in a value) the query gets a %, so a second
pass takes the complex normalizer, which also encodes the path: a # becomes %23, and in a
user info with more than one @ every @ but the last becomes %40. With an email address as
user, getEndpoint(endpoint.getEndpointUri()) then created a duplicate endpoint.

Such a uri is now normalized by the complex normalizer in the first pass too, so a uri is
never normalized by two different normalizers. The fast path no longer re-encodes the
query with createQueryString, as the complex normalizer writes it the same way. Uris whose
fast result has no % are normalized as before; for the others the result is what the
second pass gave before, and the path and parameters a component gets do not change (only an authority with an @ in the user, which main parsed as no host and no user, now gets its user and host).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lizeValueWithPercentEscapeFormEncodesTheQuery

Review of apache#27468: the fast normalizer no longer form-encodes the query itself, it
hands such a uri to the complex normalizer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@davsclaus
davsclaus force-pushed the camel-util-normalize-uri-idempotent branch from cafc224 to 1212492 Compare October 7, 2026 08:47
@davsclaus davsclaus added this to the 4.23.0 milestone Oct 7, 2026
@davsclaus davsclaus added the bug Something isn't working label Oct 7, 2026
@davsclaus
davsclaus merged commit 32ec5a5 into apache:main Oct 7, 2026
7 checks passed
@allthingssecurity
allthingssecurity deleted the camel-util-normalize-uri-idempotent branch October 7, 2026 10:36

@oscerd oscerd left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the dispatch change; it's correct and the verification behind it is unusually thorough. One coordination note at the end.

The fix is the right shape. doFastNormalizeUri now returns null at the point where it would have written a % into the result (which can only come from the query, since the fast parser only accepts URIs that have no %), and the dispatcher falls through to doComplexNormalizeUri for the whole URI. That guarantees the property the bug needed — a given URI is never normalized by two different normalizers across passes: a URI whose normalized form carries a % is handled end-to-end by the complex normalizer on the first pass, and on the second pass the % in the input sends it straight to the complex normalizer again, so the output is stable. Dropping the createQueryString re-encoding that CAMEL-25188 bolted onto the fast path is right, since the complex normalizer already writes the query identically. The two-@/#-in-path non-idempotency (and the duplicate-endpoint it caused via getEndpoint(endpoint.getEndpointUri())) is exactly what this closes, and the incidental win — me@example.com@host now resolving host/username instead of null — is a real improvement, matching the values main already gave the duplicate endpoint.

The Lean 4 proof (idempotent for every URI; equals main when the fast result has no %; equals main's second pass otherwise), the ~1.7M-URI fuzz across two independent generators, and the sweep of every endpoint-URI literal in the repo are about as strong as this kind of change gets, and the two new tests fail on main and pass here. The cost note (274 of 2745 fast-path literals now take the slower complex path, paid at route start / per dynamic URI) is fair and acceptable.

Coordination — for @oscerd. This is CAMEL-25345, which you reported and analysed, and you have your own draft #27428 open for it with a different (smaller) approach. Since it's your issue and your in-progress fix, I'm not going to approve over it — the call on which of the two lands is yours. On the technical merits this PR verifies as correct, complete and green; if you'd rather carry your own, that's equally fine and I'll leave this one to you to close or adopt.

This review was generated with AI assistance and reviewed/issued by the human operator. Claude Code on behalf of oscerd

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working core docs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants