This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 064b58a1235f CAMEL-22658: Ensure goog* headers are filtered from 
Google Pubsub messages (#19823)
064b58a1235f is described below

commit 064b58a1235fc005e8fcdb4aa5a1c84d11a1e626
Author: David Riseley <[email protected]>
AuthorDate: Thu Nov 6 13:52:54 2025 +0000

    CAMEL-22658: Ensure goog* headers are filtered from Google Pubsub messages 
(#19823)
    
    Allow Google Pubsub HeaderFilterStrategy to be configured on the endpoint 
or component
---
 .../camel/catalog/components/google-pubsub.json    | 12 +--
 .../pubsub/GooglePubsubComponentConfigurer.java    |  6 ++
 .../pubsub/GooglePubsubEndpointConfigurer.java     |  6 ++
 .../pubsub/GooglePubsubEndpointUriFactory.java     |  3 +-
 .../component/google/pubsub/google-pubsub.json     | 12 +--
 .../google/pubsub/GooglePubsubComponent.java       |  7 +-
 .../google/pubsub/GooglePubsubConsumer.java        |  2 +-
 .../google/pubsub/GooglePubsubEndpoint.java        | 19 ++++-
 .../pubsub/GooglePubsubHeaderFilterStrategy.java   |  4 +-
 .../google/pubsub/GooglePubsubProducer.java        |  2 +-
 .../pubsub/consumer/CamelMessageReceiver.java      |  3 +-
 .../google/pubsub/unit/PubsubHeaderFilterTest.java | 37 +++++++++
 .../dsl/GooglePubsubComponentBuilderFactory.java   | 19 +++++
 .../dsl/GooglePubsubEndpointBuilderFactory.java    | 96 ++++++++++++++++++++++
 14 files changed, 208 insertions(+), 20 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-pubsub.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-pubsub.json
index c7fd4e91b5b1..9a88de7d4c83 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-pubsub.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-pubsub.json
@@ -33,7 +33,8 @@
     "publisherCacheSize": { "index": 6, "kind": "property", "displayName": 
"Publisher Cache Size", "group": "producer", "label": "producer", "required": 
false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": 
false, "secret": false, "description": "Maximum number of producers to cache. 
This could be increased if you have producers for lots of different topics." },
     "publisherCacheTimeout": { "index": 7, "kind": "property", "displayName": 
"Publisher Cache Timeout", "group": "producer", "label": "producer", 
"required": false, "type": "integer", "javaType": "int", "deprecated": false, 
"autowired": false, "secret": false, "description": "How many milliseconds 
should each producer stay alive in the cache." },
     "autowiredEnabled": { "index": 8, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching t [...]
-    "publisherTerminationTimeout": { "index": 9, "kind": "property", 
"displayName": "Publisher Termination Timeout", "group": "advanced", "label": 
"advanced", "required": false, "type": "integer", "javaType": "int", 
"deprecated": false, "autowired": false, "secret": false, "description": "How 
many milliseconds should a producer be allowed to terminate." }
+    "publisherTerminationTimeout": { "index": 9, "kind": "property", 
"displayName": "Publisher Termination Timeout", "group": "advanced", "label": 
"advanced", "required": false, "type": "integer", "javaType": "int", 
"deprecated": false, "autowired": false, "secret": false, "description": "How 
many milliseconds should a producer be allowed to terminate." },
+    "headerFilterStrategy": { "index": 10, "kind": "property", "displayName": 
"Header Filter Strategy", "group": "filter", "label": "filter", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired": 
false, "secret": false, "description": "To use a custom 
org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel 
message." }
   },
   "headers": {
     "CamelGooglePubsubMessageId": { "index": 0, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The ID of the message, assigned by the 
server when the message is published.", "constantName": 
"org.apache.camel.component.google.pubsub.GooglePubsubConstants#MESSAGE_ID" },
@@ -59,9 +60,10 @@
     "pubsubEndpoint": { "index": 12, "kind": "parameter", "displayName": 
"Pubsub Endpoint", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "Pub\/Sub endpoint to use. Required when using message ordering, 
and ensures that messages are received in order even when multiple publishers 
are used" },
     "retry": { "index": 13, "kind": "parameter", "displayName": "Retry", 
"group": "producer (advanced)", "label": "producer,advanced", "required": 
false, "type": "object", "javaType": 
"com.google.api.gax.retrying.RetrySettings", "deprecated": false, "autowired": 
false, "secret": false, "description": "A custom RetrySettings to control how 
the publisher handles retry-able failures" },
     "serializer": { "index": 14, "kind": "parameter", "displayName": 
"Serializer", "group": "producer (advanced)", "label": "producer,advanced", 
"required": false, "type": "object", "javaType": 
"org.apache.camel.component.google.pubsub.serializer.GooglePubsubSerializer", 
"deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, 
"description": "A custom GooglePubsubSerializer to use for serializing message 
payloads in the producer" },
-    "includeAllGoogleProperties": { "index": 15, "kind": "parameter", 
"displayName": "Include All Google Properties", "group": "advanced", "label": 
"advanced", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "Whether to include all Google headers when mapping from 
Pubsub to Camel Message. Setting this to true will include properties such as 
x-goog etc." },
-    "loggerId": { "index": 16, "kind": "parameter", "displayName": "Logger 
Id", "group": "advanced", "label": "advanced", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": true, "autowired": 
false, "secret": false, "description": "To use a custom logger name" },
-    "authenticate": { "index": 17, "kind": "parameter", "displayName": 
"Authenticate", "group": "security", "label": "security", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": true, "description": "Use Credentials 
when interacting with PubSub service (no authentication is required when using 
emulator)." },
-    "serviceAccountKey": { "index": 18, "kind": "parameter", "displayName": 
"Service Account Key", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "The Service account key 
that can be used as credentials for the PubSub publisher\/subscriber. It can be 
loaded by default from classpath, but you can prefix with classpath:, file:, or 
http: to load the resour [...]
+    "headerFilterStrategy": { "index": 15, "kind": "parameter", "displayName": 
"Header Filter Strategy", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired": 
false, "secret": false, "description": "To use a custom HeaderFilterStrategy to 
filter headers to and from Camel message." },
+    "includeAllGoogleProperties": { "index": 16, "kind": "parameter", 
"displayName": "Include All Google Properties", "group": "advanced", "label": 
"advanced", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "Whether to include all Google headers when mapping from 
Pubsub to Camel Message. Setting this to true will include properties such as 
x-goog etc." },
+    "loggerId": { "index": 17, "kind": "parameter", "displayName": "Logger 
Id", "group": "advanced", "label": "advanced", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": true, "autowired": 
false, "secret": false, "description": "To use a custom logger name" },
+    "authenticate": { "index": 18, "kind": "parameter", "displayName": 
"Authenticate", "group": "security", "label": "security", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": true, "description": "Use Credentials 
when interacting with PubSub service (no authentication is required when using 
emulator)." },
+    "serviceAccountKey": { "index": 19, "kind": "parameter", "displayName": 
"Service Account Key", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "The Service account key 
that can be used as credentials for the PubSub publisher\/subscriber. It can be 
loaded by default from classpath, but you can prefix with classpath:, file:, or 
http: to load the resour [...]
   }
 }
diff --git 
a/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubComponentConfigurer.java
 
b/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubComponentConfigurer.java
index 5a577af5ae7a..f0e979a507ed 100644
--- 
a/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubComponentConfigurer.java
+++ 
b/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubComponentConfigurer.java
@@ -29,6 +29,8 @@ public class GooglePubsubComponentConfigurer extends 
PropertyConfigurerSupport i
         case "bridgeerrorhandler":
         case "bridgeErrorHandler": 
target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); 
return true;
         case "endpoint": target.setEndpoint(property(camelContext, 
java.lang.String.class, value)); return true;
+        case "headerfilterstrategy":
+        case "headerFilterStrategy": 
target.setHeaderFilterStrategy(property(camelContext, 
org.apache.camel.spi.HeaderFilterStrategy.class, value)); return true;
         case "lazystartproducer":
         case "lazyStartProducer": 
target.setLazyStartProducer(property(camelContext, boolean.class, value)); 
return true;
         case "publishercachesize":
@@ -54,6 +56,8 @@ public class GooglePubsubComponentConfigurer extends 
PropertyConfigurerSupport i
         case "bridgeerrorhandler":
         case "bridgeErrorHandler": return boolean.class;
         case "endpoint": return java.lang.String.class;
+        case "headerfilterstrategy":
+        case "headerFilterStrategy": return 
org.apache.camel.spi.HeaderFilterStrategy.class;
         case "lazystartproducer":
         case "lazyStartProducer": return boolean.class;
         case "publishercachesize":
@@ -80,6 +84,8 @@ public class GooglePubsubComponentConfigurer extends 
PropertyConfigurerSupport i
         case "bridgeerrorhandler":
         case "bridgeErrorHandler": return target.isBridgeErrorHandler();
         case "endpoint": return target.getEndpoint();
+        case "headerfilterstrategy":
+        case "headerFilterStrategy": return target.getHeaderFilterStrategy();
         case "lazystartproducer":
         case "lazyStartProducer": return target.isLazyStartProducer();
         case "publishercachesize":
diff --git 
a/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpointConfigurer.java
 
b/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpointConfigurer.java
index c9b1c82003bc..6f60fab7267e 100644
--- 
a/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpointConfigurer.java
+++ 
b/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpointConfigurer.java
@@ -34,6 +34,8 @@ public class GooglePubsubEndpointConfigurer extends 
PropertyConfigurerSupport im
         case "exceptionHandler": 
target.setExceptionHandler(property(camelContext, 
org.apache.camel.spi.ExceptionHandler.class, value)); return true;
         case "exchangepattern":
         case "exchangePattern": 
target.setExchangePattern(property(camelContext, 
org.apache.camel.ExchangePattern.class, value)); return true;
+        case "headerfilterstrategy":
+        case "headerFilterStrategy": 
target.setHeaderFilterStrategy(property(camelContext, 
org.apache.camel.spi.HeaderFilterStrategy.class, value)); return true;
         case "includeallgoogleproperties":
         case "includeAllGoogleProperties": 
target.setIncludeAllGoogleProperties(property(camelContext, boolean.class, 
value)); return true;
         case "lazystartproducer":
@@ -77,6 +79,8 @@ public class GooglePubsubEndpointConfigurer extends 
PropertyConfigurerSupport im
         case "exceptionHandler": return 
org.apache.camel.spi.ExceptionHandler.class;
         case "exchangepattern":
         case "exchangePattern": return org.apache.camel.ExchangePattern.class;
+        case "headerfilterstrategy":
+        case "headerFilterStrategy": return 
org.apache.camel.spi.HeaderFilterStrategy.class;
         case "includeallgoogleproperties":
         case "includeAllGoogleProperties": return boolean.class;
         case "lazystartproducer":
@@ -116,6 +120,8 @@ public class GooglePubsubEndpointConfigurer extends 
PropertyConfigurerSupport im
         case "exceptionHandler": return target.getExceptionHandler();
         case "exchangepattern":
         case "exchangePattern": return target.getExchangePattern();
+        case "headerfilterstrategy":
+        case "headerFilterStrategy": return target.getHeaderFilterStrategy();
         case "includeallgoogleproperties":
         case "includeAllGoogleProperties": return 
target.isIncludeAllGoogleProperties();
         case "lazystartproducer":
diff --git 
a/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpointUriFactory.java
 
b/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpointUriFactory.java
index cdbdb79d556b..2649a9a6eef3 100644
--- 
a/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpointUriFactory.java
+++ 
b/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpointUriFactory.java
@@ -23,7 +23,7 @@ public class GooglePubsubEndpointUriFactory extends 
org.apache.camel.support.com
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Map<String, String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(19);
+        Set<String> props = new HashSet<>(20);
         props.add("ackMode");
         props.add("authenticate");
         props.add("bridgeErrorHandler");
@@ -31,6 +31,7 @@ public class GooglePubsubEndpointUriFactory extends 
org.apache.camel.support.com
         props.add("destinationName");
         props.add("exceptionHandler");
         props.add("exchangePattern");
+        props.add("headerFilterStrategy");
         props.add("includeAllGoogleProperties");
         props.add("lazyStartProducer");
         props.add("loggerId");
diff --git 
a/components/camel-google/camel-google-pubsub/src/generated/resources/META-INF/org/apache/camel/component/google/pubsub/google-pubsub.json
 
b/components/camel-google/camel-google-pubsub/src/generated/resources/META-INF/org/apache/camel/component/google/pubsub/google-pubsub.json
index c7fd4e91b5b1..9a88de7d4c83 100644
--- 
a/components/camel-google/camel-google-pubsub/src/generated/resources/META-INF/org/apache/camel/component/google/pubsub/google-pubsub.json
+++ 
b/components/camel-google/camel-google-pubsub/src/generated/resources/META-INF/org/apache/camel/component/google/pubsub/google-pubsub.json
@@ -33,7 +33,8 @@
     "publisherCacheSize": { "index": 6, "kind": "property", "displayName": 
"Publisher Cache Size", "group": "producer", "label": "producer", "required": 
false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": 
false, "secret": false, "description": "Maximum number of producers to cache. 
This could be increased if you have producers for lots of different topics." },
     "publisherCacheTimeout": { "index": 7, "kind": "property", "displayName": 
"Publisher Cache Timeout", "group": "producer", "label": "producer", 
"required": false, "type": "integer", "javaType": "int", "deprecated": false, 
"autowired": false, "secret": false, "description": "How many milliseconds 
should each producer stay alive in the cache." },
     "autowiredEnabled": { "index": 8, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching t [...]
-    "publisherTerminationTimeout": { "index": 9, "kind": "property", 
"displayName": "Publisher Termination Timeout", "group": "advanced", "label": 
"advanced", "required": false, "type": "integer", "javaType": "int", 
"deprecated": false, "autowired": false, "secret": false, "description": "How 
many milliseconds should a producer be allowed to terminate." }
+    "publisherTerminationTimeout": { "index": 9, "kind": "property", 
"displayName": "Publisher Termination Timeout", "group": "advanced", "label": 
"advanced", "required": false, "type": "integer", "javaType": "int", 
"deprecated": false, "autowired": false, "secret": false, "description": "How 
many milliseconds should a producer be allowed to terminate." },
+    "headerFilterStrategy": { "index": 10, "kind": "property", "displayName": 
"Header Filter Strategy", "group": "filter", "label": "filter", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired": 
false, "secret": false, "description": "To use a custom 
org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel 
message." }
   },
   "headers": {
     "CamelGooglePubsubMessageId": { "index": 0, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The ID of the message, assigned by the 
server when the message is published.", "constantName": 
"org.apache.camel.component.google.pubsub.GooglePubsubConstants#MESSAGE_ID" },
@@ -59,9 +60,10 @@
     "pubsubEndpoint": { "index": 12, "kind": "parameter", "displayName": 
"Pubsub Endpoint", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "Pub\/Sub endpoint to use. Required when using message ordering, 
and ensures that messages are received in order even when multiple publishers 
are used" },
     "retry": { "index": 13, "kind": "parameter", "displayName": "Retry", 
"group": "producer (advanced)", "label": "producer,advanced", "required": 
false, "type": "object", "javaType": 
"com.google.api.gax.retrying.RetrySettings", "deprecated": false, "autowired": 
false, "secret": false, "description": "A custom RetrySettings to control how 
the publisher handles retry-able failures" },
     "serializer": { "index": 14, "kind": "parameter", "displayName": 
"Serializer", "group": "producer (advanced)", "label": "producer,advanced", 
"required": false, "type": "object", "javaType": 
"org.apache.camel.component.google.pubsub.serializer.GooglePubsubSerializer", 
"deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, 
"description": "A custom GooglePubsubSerializer to use for serializing message 
payloads in the producer" },
-    "includeAllGoogleProperties": { "index": 15, "kind": "parameter", 
"displayName": "Include All Google Properties", "group": "advanced", "label": 
"advanced", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "Whether to include all Google headers when mapping from 
Pubsub to Camel Message. Setting this to true will include properties such as 
x-goog etc." },
-    "loggerId": { "index": 16, "kind": "parameter", "displayName": "Logger 
Id", "group": "advanced", "label": "advanced", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": true, "autowired": 
false, "secret": false, "description": "To use a custom logger name" },
-    "authenticate": { "index": 17, "kind": "parameter", "displayName": 
"Authenticate", "group": "security", "label": "security", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": true, "description": "Use Credentials 
when interacting with PubSub service (no authentication is required when using 
emulator)." },
-    "serviceAccountKey": { "index": 18, "kind": "parameter", "displayName": 
"Service Account Key", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "The Service account key 
that can be used as credentials for the PubSub publisher\/subscriber. It can be 
loaded by default from classpath, but you can prefix with classpath:, file:, or 
http: to load the resour [...]
+    "headerFilterStrategy": { "index": 15, "kind": "parameter", "displayName": 
"Header Filter Strategy", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired": 
false, "secret": false, "description": "To use a custom HeaderFilterStrategy to 
filter headers to and from Camel message." },
+    "includeAllGoogleProperties": { "index": 16, "kind": "parameter", 
"displayName": "Include All Google Properties", "group": "advanced", "label": 
"advanced", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "Whether to include all Google headers when mapping from 
Pubsub to Camel Message. Setting this to true will include properties such as 
x-goog etc." },
+    "loggerId": { "index": 17, "kind": "parameter", "displayName": "Logger 
Id", "group": "advanced", "label": "advanced", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": true, "autowired": 
false, "secret": false, "description": "To use a custom logger name" },
+    "authenticate": { "index": 18, "kind": "parameter", "displayName": 
"Authenticate", "group": "security", "label": "security", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": true, "description": "Use Credentials 
when interacting with PubSub service (no authentication is required when using 
emulator)." },
+    "serviceAccountKey": { "index": 19, "kind": "parameter", "displayName": 
"Service Account Key", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "The Service account key 
that can be used as credentials for the PubSub publisher\/subscriber. It can be 
loaded by default from classpath, but you can prefix with classpath:, file:, or 
http: to load the resour [...]
   }
 }
diff --git 
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubComponent.java
 
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubComponent.java
index 04616746ca86..fd2fe9c00dff 100644
--- 
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubComponent.java
+++ 
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubComponent.java
@@ -49,7 +49,7 @@ import org.apache.camel.Endpoint;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.annotations.Component;
-import org.apache.camel.support.DefaultComponent;
+import org.apache.camel.support.HeaderFilterStrategyComponent;
 import org.apache.camel.support.ResourceHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.StringHelper;
@@ -61,7 +61,7 @@ import org.threeten.bp.Duration;
  * Represents the component that manages {@link GooglePubsubEndpoint}.
  */
 @Component("google-pubsub")
-public class GooglePubsubComponent extends DefaultComponent {
+public class GooglePubsubComponent extends HeaderFilterStrategyComponent {
     private static final Logger LOG = 
LoggerFactory.getLogger(GooglePubsubComponent.class);
 
     @Metadata(label = "common",
@@ -128,6 +128,9 @@ public class GooglePubsubComponent extends DefaultComponent 
{
         pubsubEndpoint.setDestinationName(parts[1]);
         pubsubEndpoint.setServiceAccountKey(serviceAccountKey);
         pubsubEndpoint.setAuthenticate(authenticate);
+        if (getHeaderFilterStrategy() != null) {
+            pubsubEndpoint.setHeaderFilterStrategy(getHeaderFilterStrategy());
+        }
 
         setProperties(pubsubEndpoint, parameters);
 
diff --git 
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubConsumer.java
 
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubConsumer.java
index 7c2a4afdbcf7..0848f88f6c98 100644
--- 
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubConsumer.java
+++ 
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubConsumer.java
@@ -73,7 +73,7 @@ public class GooglePubsubConsumer extends DefaultConsumer {
         }
 
         localLog = LoggerFactory.getLogger(loggerId);
-        headerFilterStrategy = new 
GooglePubsubHeaderFilterStrategy(endpoint.isIncludeAllGoogleProperties());
+        headerFilterStrategy = endpoint.getHeaderFilterStrategy();
     }
 
     @Override
diff --git 
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpoint.java
 
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpoint.java
index 48f15df8a833..2fdec64f2e7c 100644
--- 
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpoint.java
+++ 
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpoint.java
@@ -42,7 +42,7 @@ import org.slf4j.LoggerFactory;
 @UriEndpoint(firstVersion = "2.19.0", scheme = "google-pubsub", title = 
"Google Pubsub",
              syntax = "google-pubsub:projectId:destinationName", category = { 
Category.CLOUD, Category.MESSAGING },
              headersClass = GooglePubsubConstants.class)
-public class GooglePubsubEndpoint extends DefaultEndpoint implements 
EndpointServiceLocation {
+public class GooglePubsubEndpoint extends DefaultEndpoint implements 
EndpointServiceLocation, HeaderFilterStrategyAware {
 
     private Logger log;
 
@@ -98,6 +98,9 @@ public class GooglePubsubEndpoint extends DefaultEndpoint 
implements EndpointSer
               description = "Whether to include all Google headers when 
mapping from Pubsub to Camel Message."
                             + " Setting this to true will include properties 
such as x-goog etc.")
     private boolean includeAllGoogleProperties;
+    @UriParam(label = "advanced",
+              description = "To use a custom HeaderFilterStrategy to filter 
headers to and from Camel message.")
+    private HeaderFilterStrategy headerFilterStrategy;
 
     public GooglePubsubEndpoint(String uri, Component component) {
         super(uri, component);
@@ -126,6 +129,10 @@ public class GooglePubsubEndpoint extends DefaultEndpoint 
implements EndpointSer
 
         log.trace("Project ID: {}", this.projectId);
         log.trace("Destination Name: {}", this.destinationName);
+
+        if (headerFilterStrategy == null) {
+            headerFilterStrategy = new 
GooglePubsubHeaderFilterStrategy(includeAllGoogleProperties);
+        }
     }
 
     @Override
@@ -291,4 +298,14 @@ public class GooglePubsubEndpoint extends DefaultEndpoint 
implements EndpointSer
         }
         return null;
     }
+
+    @Override
+    public HeaderFilterStrategy getHeaderFilterStrategy() {
+        return headerFilterStrategy;
+    }
+
+    @Override
+    public void setHeaderFilterStrategy(HeaderFilterStrategy 
headerFilterStrategy) {
+        this.headerFilterStrategy = headerFilterStrategy;
+    }
 }
diff --git 
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubHeaderFilterStrategy.java
 
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubHeaderFilterStrategy.java
index 7232a5c2c6d4..10f513c5924c 100644
--- 
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubHeaderFilterStrategy.java
+++ 
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubHeaderFilterStrategy.java
@@ -34,14 +34,14 @@ public class GooglePubsubHeaderFilterStrategy extends 
DefaultHeaderFilterStrateg
     }
 
     protected void ignoreGoogProperties() {
-        String[] filterStartWith = new 
String[DefaultHeaderFilterStrategy.CAMEL_FILTER_STARTS_WITH.length + 2];
+        String[] filterStartWith = new 
String[DefaultHeaderFilterStrategy.CAMEL_FILTER_STARTS_WITH.length + 3];
         System.arraycopy(DefaultHeaderFilterStrategy.CAMEL_FILTER_STARTS_WITH, 
0,
                 filterStartWith, 0, 
DefaultHeaderFilterStrategy.CAMEL_FILTER_STARTS_WITH.length);
         
filterStartWith[DefaultHeaderFilterStrategy.CAMEL_FILTER_STARTS_WITH.length] = 
"x-goog";
         
filterStartWith[DefaultHeaderFilterStrategy.CAMEL_FILTER_STARTS_WITH.length + 
1] = "X-GOOG";
+        
filterStartWith[DefaultHeaderFilterStrategy.CAMEL_FILTER_STARTS_WITH.length + 
2] = "goog";
         setOutFilterStartsWith(filterStartWith);
         setInFilterStartsWith(filterStartWith);
-        getOutFilter().add("google-cloud-resource-prefix");
         getOutFilter().add("grpc-timeout");
     }
 
diff --git 
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubProducer.java
 
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubProducer.java
index 9c2bc1f7b662..c2b01a985739 100644
--- 
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubProducer.java
+++ 
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubProducer.java
@@ -52,7 +52,7 @@ public class GooglePubsubProducer extends DefaultProducer {
         }
 
         logger = LoggerFactory.getLogger(loggerId);
-        headerFilterStrategy = new 
GooglePubsubHeaderFilterStrategy(endpoint.isIncludeAllGoogleProperties());
+        headerFilterStrategy = endpoint.getHeaderFilterStrategy();
     }
 
     /**
diff --git 
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/consumer/CamelMessageReceiver.java
 
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/consumer/CamelMessageReceiver.java
index 4169c2630f33..ae412505d3d2 100644
--- 
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/consumer/CamelMessageReceiver.java
+++ 
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/consumer/CamelMessageReceiver.java
@@ -25,7 +25,6 @@ import org.apache.camel.Processor;
 import org.apache.camel.component.google.pubsub.GooglePubsubConstants;
 import org.apache.camel.component.google.pubsub.GooglePubsubConsumer;
 import org.apache.camel.component.google.pubsub.GooglePubsubEndpoint;
-import 
org.apache.camel.component.google.pubsub.GooglePubsubHeaderFilterStrategy;
 import org.apache.camel.spi.HeaderFilterStrategy;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -47,7 +46,7 @@ public class CamelMessageReceiver implements MessageReceiver {
             loggerId = this.getClass().getName();
         }
         localLog = LoggerFactory.getLogger(loggerId);
-        headerFilterStrategy = new 
GooglePubsubHeaderFilterStrategy(endpoint.isIncludeAllGoogleProperties());
+        headerFilterStrategy = endpoint.getHeaderFilterStrategy();
     }
 
     @Override
diff --git 
a/components/camel-google/camel-google-pubsub/src/test/java/org/apache/camel/component/google/pubsub/unit/PubsubHeaderFilterTest.java
 
b/components/camel-google/camel-google-pubsub/src/test/java/org/apache/camel/component/google/pubsub/unit/PubsubHeaderFilterTest.java
new file mode 100644
index 000000000000..74ea685c3fda
--- /dev/null
+++ 
b/components/camel-google/camel-google-pubsub/src/test/java/org/apache/camel/component/google/pubsub/unit/PubsubHeaderFilterTest.java
@@ -0,0 +1,37 @@
+/*
+ * 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.google.pubsub.unit;
+
+import org.apache.camel.Exchange;
+import 
org.apache.camel.component.google.pubsub.GooglePubsubHeaderFilterStrategy;
+import org.apache.camel.component.google.pubsub.PubsubTestSupport;
+import org.apache.camel.support.DefaultExchange;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class PubsubHeaderFilterTest extends PubsubTestSupport {
+    @ParameterizedTest
+    @ValueSource(strings = { "google-header", "X-GOOGLE-HEADER", 
"x-google-header" })
+    public void testPubsubHeaderFilter(String headerName) {
+        GooglePubsubHeaderFilterStrategy googlePubsubHeaderFilterStrategy = 
new GooglePubsubHeaderFilterStrategy(false);
+        Exchange exchange = new DefaultExchange(context);
+        
assertTrue(googlePubsubHeaderFilterStrategy.applyFilterToExternalHeaders(headerName,
 "value", exchange),
+                headerName + " not filtered");
+    }
+}
diff --git 
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/GooglePubsubComponentBuilderFactory.java
 
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/GooglePubsubComponentBuilderFactory.java
index 118cf635865a..744ff70df49b 100644
--- 
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/GooglePubsubComponentBuilderFactory.java
+++ 
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/GooglePubsubComponentBuilderFactory.java
@@ -238,6 +238,24 @@ public interface GooglePubsubComponentBuilderFactory {
             doSetProperty("publisherTerminationTimeout", 
publisherTerminationTimeout);
             return this;
         }
+    
+        /**
+         * To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter
+         * header to and from Camel message.
+         * 
+         * The option is a:
+         * &lt;code&gt;org.apache.camel.spi.HeaderFilterStrategy&lt;/code&gt;
+         * type.
+         * 
+         * Group: filter
+         * 
+         * @param headerFilterStrategy the value to set
+         * @return the dsl builder
+         */
+        default GooglePubsubComponentBuilder 
headerFilterStrategy(org.apache.camel.spi.HeaderFilterStrategy 
headerFilterStrategy) {
+            doSetProperty("headerFilterStrategy", headerFilterStrategy);
+            return this;
+        }
     }
 
     class GooglePubsubComponentBuilderImpl
@@ -263,6 +281,7 @@ public interface GooglePubsubComponentBuilderFactory {
             case "publisherCacheTimeout": ((GooglePubsubComponent) 
component).setPublisherCacheTimeout((int) value); return true;
             case "autowiredEnabled": ((GooglePubsubComponent) 
component).setAutowiredEnabled((boolean) value); return true;
             case "publisherTerminationTimeout": ((GooglePubsubComponent) 
component).setPublisherTerminationTimeout((int) value); return true;
+            case "headerFilterStrategy": ((GooglePubsubComponent) 
component).setHeaderFilterStrategy((org.apache.camel.spi.HeaderFilterStrategy) 
value); return true;
             default: return false;
             }
         }
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/GooglePubsubEndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/GooglePubsubEndpointBuilderFactory.java
index 0cad250eacaa..d6ee6fa5a903 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/GooglePubsubEndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/GooglePubsubEndpointBuilderFactory.java
@@ -380,6 +380,38 @@ public interface GooglePubsubEndpointBuilderFactory {
             doSetProperty("synchronousPull", synchronousPull);
             return this;
         }
+        /**
+         * To use a custom HeaderFilterStrategy to filter headers to and from
+         * Camel message.
+         * 
+         * The option is a:
+         * <code>org.apache.camel.spi.HeaderFilterStrategy</code> type.
+         * 
+         * Group: advanced
+         * 
+         * @param headerFilterStrategy the value to set
+         * @return the dsl builder
+         */
+        default AdvancedGooglePubsubEndpointConsumerBuilder 
headerFilterStrategy(org.apache.camel.spi.HeaderFilterStrategy 
headerFilterStrategy) {
+            doSetProperty("headerFilterStrategy", headerFilterStrategy);
+            return this;
+        }
+        /**
+         * To use a custom HeaderFilterStrategy to filter headers to and from
+         * Camel message.
+         * 
+         * The option will be converted to a
+         * <code>org.apache.camel.spi.HeaderFilterStrategy</code> type.
+         * 
+         * Group: advanced
+         * 
+         * @param headerFilterStrategy the value to set
+         * @return the dsl builder
+         */
+        default AdvancedGooglePubsubEndpointConsumerBuilder 
headerFilterStrategy(String headerFilterStrategy) {
+            doSetProperty("headerFilterStrategy", headerFilterStrategy);
+            return this;
+        }
         /**
          * Whether to include all Google headers when mapping from Pubsub to
          * Camel Message. Setting this to true will include properties such as
@@ -656,6 +688,38 @@ public interface GooglePubsubEndpointBuilderFactory {
             doSetProperty("serializer", serializer);
             return this;
         }
+        /**
+         * To use a custom HeaderFilterStrategy to filter headers to and from
+         * Camel message.
+         * 
+         * The option is a:
+         * <code>org.apache.camel.spi.HeaderFilterStrategy</code> type.
+         * 
+         * Group: advanced
+         * 
+         * @param headerFilterStrategy the value to set
+         * @return the dsl builder
+         */
+        default AdvancedGooglePubsubEndpointProducerBuilder 
headerFilterStrategy(org.apache.camel.spi.HeaderFilterStrategy 
headerFilterStrategy) {
+            doSetProperty("headerFilterStrategy", headerFilterStrategy);
+            return this;
+        }
+        /**
+         * To use a custom HeaderFilterStrategy to filter headers to and from
+         * Camel message.
+         * 
+         * The option will be converted to a
+         * <code>org.apache.camel.spi.HeaderFilterStrategy</code> type.
+         * 
+         * Group: advanced
+         * 
+         * @param headerFilterStrategy the value to set
+         * @return the dsl builder
+         */
+        default AdvancedGooglePubsubEndpointProducerBuilder 
headerFilterStrategy(String headerFilterStrategy) {
+            doSetProperty("headerFilterStrategy", headerFilterStrategy);
+            return this;
+        }
         /**
          * Whether to include all Google headers when mapping from Pubsub to
          * Camel Message. Setting this to true will include properties such as
@@ -780,6 +844,38 @@ public interface GooglePubsubEndpointBuilderFactory {
             return (GooglePubsubEndpointBuilder) this;
         }
 
+        /**
+         * To use a custom HeaderFilterStrategy to filter headers to and from
+         * Camel message.
+         * 
+         * The option is a:
+         * <code>org.apache.camel.spi.HeaderFilterStrategy</code> type.
+         * 
+         * Group: advanced
+         * 
+         * @param headerFilterStrategy the value to set
+         * @return the dsl builder
+         */
+        default AdvancedGooglePubsubEndpointBuilder 
headerFilterStrategy(org.apache.camel.spi.HeaderFilterStrategy 
headerFilterStrategy) {
+            doSetProperty("headerFilterStrategy", headerFilterStrategy);
+            return this;
+        }
+        /**
+         * To use a custom HeaderFilterStrategy to filter headers to and from
+         * Camel message.
+         * 
+         * The option will be converted to a
+         * <code>org.apache.camel.spi.HeaderFilterStrategy</code> type.
+         * 
+         * Group: advanced
+         * 
+         * @param headerFilterStrategy the value to set
+         * @return the dsl builder
+         */
+        default AdvancedGooglePubsubEndpointBuilder 
headerFilterStrategy(String headerFilterStrategy) {
+            doSetProperty("headerFilterStrategy", headerFilterStrategy);
+            return this;
+        }
         /**
          * Whether to include all Google headers when mapping from Pubsub to
          * Camel Message. Setting this to true will include properties such as


Reply via email to