J.Santos
J.Santos

Reputation: 161

Camel Http4 2.12.2: "httpClientConfigurer" cannot be inferred from endpointUri

I'm using scala akka-camel with http4 component (2.12.2 version). I'm creating a Camel producer with endpoint:

def endpointUri = "https4://host-path" + 
     "?bridgeEndpoint=true" +
     "&httpClientConfigurer=#configurer" + 
     "&clientConnectionManager=#manager"

where configurer is an HttpClientConfigurer registered in Camel context registry (the same principle applies to manager).

When I'm sending a CamelMessage to that endpoint I can see at akka logs this:

DEBUG o.a.c.component.http4.HttpComponent - Creating endpoint uri https4://host-path?bridgeEndpoint=true&httpClientConfigurer=#configurer&clientConnectionManager=#manager
DEBUG o.a.camel.util.IntrospectionSupport - Configured property: clientConnectionManager on bean: Endpoint["https4://host-path?bridgeEndpoint=true&httpClientConfigurer=#configurer&clientConnectionManager=#manager"] with value: org.apache.http.impl.conn.PoolingClientConnectionManager@3da3d36f
DEBUG o.a.camel.util.IntrospectionSupport - Configured property: bridgeEndpoint on bean: Endpoint["https4://host-path?bridgeEndpoint=true&httpClientConfigurer=#configurer&clientConnectionManager=#manager"] with value: true
INFO  o.a.c.component.http4.HttpComponent - Registering SSL scheme https on port 443
INFO  o.a.c.component.http4.HttpComponent - Registering SSL scheme https4 on port 443

So httpClientConfigurer is not configured and I don't know why it's ignoring this parameter. I've been looking for any related issue at Apache Camel issue tracker but I have found nothing similar.

Any idea? Thanks in advance.

Upvotes: 0

Views: 1940

Answers (2)

J.Santos
J.Santos

Reputation: 161

Finally, it's resolved. I haven't used the none of clientConnectionManager or httpClientConfigurer. I've used SSLContextParams and a trait called TlsConfigurer that is meant to be mixed-in with a Producer.

I want to use different X509 certificates, so, as Camel suggests:

Important: Only one instance of org.apache.camel.util.jsse.SSLContextParameters is supported per HttpComponent. If you need to use 2 or more different instances, you need to define a new HttpComponent per instance you need.

Therefore, TlsConfigurer configure method must be able to get a http4 component instance from camel context and then apply the SSLContextParams and add the modified instance as a new component to camel context.

This is how it looks:

import org.apache.camel.component.http4.HttpComponent
import org.apache.camel.util.jsse._

trait TlsConfigurer { 
    self: {val camel: akka.camel.Camel} =>

    def configure(
        componentName: String, 
        keyStorePath:String, 
        trustStorePath:String, 
        password: String) {

        val ksp = new KeyStoreParameters
        ksp.setResource(keystorePath)
        ksp.setPassword(password)

        val kmp = new KeyManagersParameters
        kmp.setKeyStore(ksp)
        kmp.setKeyPassword(password)

        val scp = new SSLContextParameters
        scp.setKeyManagers(kmp)

        val httpComponent = 
           camel.context.getComponent("http4",classOf[HttpComponent])
        httpComponent.setSslContextParameters(scp)

        camel.context.addComponent(componentName, httpComponent) 

    }

}

This way I can create two different end-points: http-client1://... and http-client2://... and manage their certificates in a separate way.

Upvotes: 1

Willem Jiang
Willem Jiang

Reputation: 3291

httpClientConfigurer is not set to the HttpEndpoint by using IntrospectionSupport, so you don't see the debug log. I think we about to find out the configurer is called when you add some log in the customer configurer.

Upvotes: 0

Related Questions