[[http4-component]]
= HTTP4 Component
:docTitle: HTTP4
:artifactId: camel-http4
:description: For calling out to external HTTP servers using Apache HTTP Client 4.x.
:since: 2.3
:component-header: Only producer is supported

*Since Camel {since}*


The *http4:* component provides HTTP based endpoints
for calling external HTTP resources (as a client to call external
servers using HTTP).

Maven users will need to add the following dependency to their `pom.xml`
for this component:

[source,xml]
------------------------------------------------------------
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-http4</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
------------------------------------------------------------


*camel-http4 vs camel-http*

Camel-http4 uses http://hc.apache.org/httpcomponents-client-ga/[Apache
HttpClient 4.x] while camel-http uses
http://hc.apache.org/httpclient-3.x/[Apache HttpClient 3.x].

== URI format

[source,java]
---------------------------------------------
http4:hostname[:port][/resourceUri][?options]
---------------------------------------------

Will by default use port 80 for HTTP and 443 for HTTPS.

You can append query options to the URI in the following format,
`?option=value&option=value&...`

*camel-http4 vs camel-jetty*

You can only produce to endpoints generated by the HTTP4 component.
Therefore it should never be used as input into your Camel Routes. To
bind/expose an HTTP endpoint via a HTTP server as input to a Camel
route, use the xref:jetty-component.adoc[Jetty] instead.

== Http4 Component Options




// component options: START
The HTTP4 component supports 18 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *httpClientConfigurer* (advanced) | To use the custom HttpClientConfigurer to perform configuration of the HttpClient that will be used. |  | HttpClientConfigurer
| *clientConnectionManager* (advanced) | To use a custom and shared HttpClientConnectionManager to manage connections. If this has been configured then this is always used for all endpoints created by this component. |  | HttpClientConnection Manager
| *httpContext* (advanced) | To use a custom org.apache.http.protocol.HttpContext when executing requests. |  | HttpContext
| *sslContextParameters* (security) | To configure security using SSLContextParameters. 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. |  | SSLContextParameters
| *useGlobalSslContext Parameters* (security) | Enable usage of global SSL context parameters. | false | boolean
| *x509HostnameVerifier* (security) | To use a custom X509HostnameVerifier such as DefaultHostnameVerifier or org.apache.http.conn.ssl.NoopHostnameVerifier. |  | HostnameVerifier
| *maxTotalConnections* (advanced) | The maximum number of connections. | 200 | int
| *connectionsPerRoute* (advanced) | The maximum number of connections per route. | 20 | int
| *connectionTimeToLive* (advanced) | The time for connection to live, the time unit is millisecond, the default value is always keep alive. |  | long
| *cookieStore* (producer) | To use a custom org.apache.http.client.CookieStore. By default the org.apache.http.impl.client.BasicCookieStore is used which is an in-memory only cookie store. Notice if bridgeEndpoint=true then the cookie store is forced to be a noop cookie store as cookie shouldn't be stored as we are just bridging (eg acting as a proxy). |  | CookieStore
| *connectionRequest Timeout* (timeout) | The timeout in milliseconds used when requesting a connection from the connection manager. A timeout value of zero is interpreted as an infinite timeout. A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default). Default: code -1 | -1 | int
| *connectTimeout* (timeout) | Determines the timeout in milliseconds until a connection is established. A timeout value of zero is interpreted as an infinite timeout. A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default). Default: code -1 | -1 | int
| *socketTimeout* (timeout) | Defines the socket timeout (SO_TIMEOUT) in milliseconds, which is the timeout for waiting for data or, put differently, a maximum period inactivity between two consecutive data packets). A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default). Default: code -1 | -1 | int
| *httpBinding* (advanced) | To use a custom HttpBinding to control the mapping between Camel message and HttpClient. |  | HttpBinding
| *httpConfiguration* (advanced) | To use the shared HttpConfiguration as base configuration. |  | HttpConfiguration
| *allowJavaSerialized Object* (advanced) | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
| *headerFilterStrategy* (filter) | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
| *resolveProperty Placeholders* (advanced) | Whether the component should resolve property placeholders on itself when starting. Only properties which are of String type can use property placeholders. | true | boolean
|===
// component options: END










// endpoint options: START
The HTTP4 endpoint is configured using URI syntax:

----
http4:httpUri
----

with the following path and query parameters:

=== Path Parameters (1 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *httpUri* | *Required* The url of the HTTP endpoint to call. |  | URI
|===


=== Query Parameters (50 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *disableStreamCache* (common) | Determines whether or not the raw input stream from Servlet is cached or not (Camel will read the stream into a in memory/overflow to file, Stream caching) cache. By default Camel will cache the Servlet input stream to support reading it multiple times to ensure it Camel can retrieve all data from the stream. However you can set this option to true when you for example need to access the raw stream, such as streaming it directly to a file or other persistent store. DefaultHttpBinding will copy the request input stream into a stream cache and put it into message body if this option is false to support reading the stream multiple times. If you use Servlet to bridge/proxy an endpoint then consider enabling this option to improve performance, in case you do not need to read the message payload multiple times. The http/http4 producer will by default cache the response body stream. If setting this option to true, then the producers will not cache the response body stream but use the response stream as-is as the message body. | false | boolean
| *headerFilterStrategy* (common) | To use a custom HeaderFilterStrategy to filter header to and from Camel message. |  | HeaderFilterStrategy
| *httpBinding* (common) | To use a custom HttpBinding to control the mapping between Camel message and HttpClient. |  | HttpBinding
| *authenticationPreemptive* (producer) | If this option is true, camel-http4 sends preemptive basic authentication to the server. | false | boolean
| *bridgeEndpoint* (producer) | If the option is true, HttpProducer will ignore the Exchange.HTTP_URI header, and use the endpoint's URI for request. You may also set the option throwExceptionOnFailure to be false to let the HttpProducer send all the fault response back. | false | boolean
| *chunked* (producer) | If this option is false the Servlet will disable the HTTP streaming and set the content-length header on the response | true | boolean
| *clearExpiredCookies* (producer) | Whether to clear expired cookies before sending the HTTP request. This ensures the cookies store does not keep growing by adding new cookies which is newer removed when they are expired. | true | boolean
| *connectionClose* (producer) | Specifies whether a Connection Close header must be added to HTTP Request. By default connectionClose is false. | false | boolean
| *cookieStore* (producer) | To use a custom CookieStore. By default the BasicCookieStore is used which is an in-memory only cookie store. Notice if bridgeEndpoint=true then the cookie store is forced to be a noop cookie store as cookie shouldn't be stored as we are just bridging (eg acting as a proxy). If a cookieHandler is set then the cookie store is also forced to be a noop cookie store as cookie handling is then performed by the cookieHandler. |  | CookieStore
| *copyHeaders* (producer) | If this option is true then IN exchange headers will be copied to OUT exchange headers according to copy strategy. Setting this to false, allows to only include the headers from the HTTP response (not propagating IN headers). | true | boolean
| *deleteWithBody* (producer) | Whether the HTTP DELETE should include the message body or not. By default HTTP DELETE do not include any HTTP body. However in some rare cases users may need to be able to include the message body. | false | boolean
| *getWithBody* (producer) | Whether the HTTP GET should include the message body or not. By default HTTP GET do not include any HTTP body. However in some rare cases users may need to be able to include the message body. | false | boolean
| *httpMethod* (producer) | Configure the HTTP method to use. The HttpMethod header cannot override this option if set. |  | HttpMethods
| *ignoreResponseBody* (producer) | If this option is true, The http producer won't read response body and cache the input stream | false | boolean
| *preserveHostHeader* (producer) | If the option is true, HttpProducer will set the Host header to the value contained in the current exchange Host header, useful in reverse proxy applications where you want the Host header received by the downstream server to reflect the URL called by the upstream client, this allows applications which use the Host header to generate accurate URL's for a proxied service | false | boolean
| *throwExceptionOnFailure* (producer) | Option to disable throwing the HttpOperationFailedException in case of failed responses from the remote server. This allows you to get all responses regardless of the HTTP status code. | true | boolean
| *transferException* (producer) | If enabled and an Exchange failed processing on the consumer side, and if the caused Exception was send back serialized in the response as a application/x-java-serialized-object content type. On the producer side the exception will be deserialized and thrown as is, instead of the HttpOperationFailedException. The caused exception is required to be serialized. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | boolean
| *cookieHandler* (producer) | Configure a cookie handler to maintain a HTTP session |  | CookieHandler
| *okStatusCodeRange* (producer) | The status codes which are considered a success response. The values are inclusive. Multiple ranges can be defined, separated by comma, e.g. 200-204,209,301-304. Each range must be a single number or from-to with the dash included. | 200-299 | String
| *urlRewrite* (producer) | *Deprecated* Refers to a custom org.apache.camel.component.http.UrlRewrite which allows you to rewrite urls when you bridge/proxy endpoints. See more details at \http://camel.apache.org/urlrewrite.html |  | UrlRewrite
| *clientBuilder* (advanced) | Provide access to the http client request parameters used on new RequestConfig instances used by producers or consumers of this endpoint. |  | HttpClientBuilder
| *clientConnectionManager* (advanced) | To use a custom HttpClientConnectionManager to manage connections |  | HttpClientConnection Manager
| *connectionsPerRoute* (advanced) | The maximum number of connections per route. | 20 | int
| *httpClient* (advanced) | Sets a custom HttpClient to be used by the producer |  | HttpClient
| *httpClientConfigurer* (advanced) | Register a custom configuration strategy for new HttpClient instances created by producers or consumers such as to configure authentication mechanisms etc |  | HttpClientConfigurer
| *httpClientOptions* (advanced) | To configure the HttpClient using the key/values from the Map. |  | Map
| *httpContext* (advanced) | To use a custom HttpContext instance |  | HttpContext
| *mapHttpMessageBody* (advanced) | If this option is true then IN exchange Body of the exchange will be mapped to HTTP body. Setting this to false will avoid the HTTP mapping. | true | boolean
| *mapHttpMessageFormUrl EncodedBody* (advanced) | If this option is true then IN exchange Form Encoded body of the exchange will be mapped to HTTP. Setting this to false will avoid the HTTP Form Encoded body mapping. | true | boolean
| *mapHttpMessageHeaders* (advanced) | If this option is true then IN exchange Headers of the exchange will be mapped to HTTP headers. Setting this to false will avoid the HTTP Headers mapping. | true | boolean
| *maxTotalConnections* (advanced) | The maximum number of connections. | 200 | int
| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
| *useSystemProperties* (advanced) | To use System Properties as fallback for configuration | false | boolean
| *proxyAuthDomain* (proxy) | Proxy authentication domain to use with NTML |  | String
| *proxyAuthHost* (proxy) | Proxy authentication host |  | String
| *proxyAuthMethod* (proxy) | Proxy authentication method to use |  | String
| *proxyAuthPassword* (proxy) | Proxy authentication password |  | String
| *proxyAuthPort* (proxy) | Proxy authentication port |  | int
| *proxyAuthScheme* (proxy) | Proxy authentication scheme to use |  | String
| *proxyAuthUsername* (proxy) | Proxy authentication username |  | String
| *proxyHost* (proxy) | Proxy hostname to use |  | String
| *proxyPort* (proxy) | Proxy port to use |  | int
| *authDomain* (security) | Authentication domain to use with NTML |  | String
| *authHost* (security) | Authentication host to use with NTML |  | String
| *authMethod* (security) | Authentication methods allowed to use as a comma separated list of values Basic, Digest or NTLM. |  | String
| *authMethodPriority* (security) | Which authentication method to prioritize to use, either as Basic, Digest or NTLM. |  | String
| *authPassword* (security) | Authentication password |  | String
| *authUsername* (security) | Authentication username |  | String
| *sslContextParameters* (security) | To configure security using SSLContextParameters. 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. |  | SSLContextParameters
| *x509HostnameVerifier* (security) | To use a custom X509HostnameVerifier such as DefaultHostnameVerifier or org.apache.http.conn.ssl.NoopHostnameVerifier. |  | HostnameVerifier
|===
// endpoint options: END
// spring-boot-auto-configure options: START
== Spring Boot Auto-Configuration

When using Spring Boot make sure to use the following Maven dependency to have support for auto configuration:

[source,xml]
----
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-http4-starter</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>
----


The component supports 19 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *camel.component.http4.allow-java-serialized-object* | Whether to allow java serialization when a request uses context-type=application/x-java-serialized-object. This is by default turned off. If you enable this then be aware that Java will deserialize the incoming data from the request to Java and that can be a potential security risk. | false | Boolean
| *camel.component.http4.client-connection-manager* | To use a custom and shared HttpClientConnectionManager to manage connections. If this has been configured then this is always used for all endpoints created by this component. The option is a org.apache.http.conn.HttpClientConnectionManager type. |  | String
| *camel.component.http4.connect-timeout* | Determines the timeout in milliseconds until a connection is established. A timeout value of zero is interpreted as an infinite timeout. A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default). Default: code -1 | -1 | Integer
| *camel.component.http4.connection-request-timeout* | The timeout in milliseconds used when requesting a connection from the connection manager. A timeout value of zero is interpreted as an infinite timeout. A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default). Default: code -1 | -1 | Integer
| *camel.component.http4.connection-time-to-live* | The time for connection to live, the time unit is millisecond, the default value is always keep alive. |  | Long
| *camel.component.http4.connections-per-route* | The maximum number of connections per route. | 20 | Integer
| *camel.component.http4.cookie-store* | To use a custom org.apache.http.client.CookieStore. By default the org.apache.http.impl.client.BasicCookieStore is used which is an in-memory only cookie store. Notice if bridgeEndpoint=true then the cookie store is forced to be a noop cookie store as cookie shouldn't be stored as we are just bridging (eg acting as a proxy). The option is a org.apache.http.client.CookieStore type. |  | String
| *camel.component.http4.enabled* | Enable http4 component | true | Boolean
| *camel.component.http4.header-filter-strategy* | To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message. The option is a org.apache.camel.spi.HeaderFilterStrategy type. |  | String
| *camel.component.http4.http-binding* | To use a custom HttpBinding to control the mapping between Camel message and HttpClient. The option is a org.apache.camel.http.common.HttpBinding type. |  | String
| *camel.component.http4.http-client-configurer* | To use the custom HttpClientConfigurer to perform configuration of the HttpClient that will be used. The option is a org.apache.camel.component.http4.HttpClientConfigurer type. |  | String
| *camel.component.http4.http-configuration* | To use the shared HttpConfiguration as base configuration. The option is a org.apache.camel.http.common.HttpConfiguration type. |  | String
| *camel.component.http4.http-context* | To use a custom org.apache.http.protocol.HttpContext when executing requests. The option is a org.apache.http.protocol.HttpContext type. |  | String
| *camel.component.http4.max-total-connections* | The maximum number of connections. | 200 | Integer
| *camel.component.http4.resolve-property-placeholders* | Whether the component should resolve property placeholders on itself when starting. Only properties which are of String type can use property placeholders. | true | Boolean
| *camel.component.http4.socket-timeout* | Defines the socket timeout (SO_TIMEOUT) in milliseconds, which is the timeout for waiting for data or, put differently, a maximum period inactivity between two consecutive data packets). A timeout value of zero is interpreted as an infinite timeout. A negative value is interpreted as undefined (system default). Default: code -1 | -1 | Integer
| *camel.component.http4.ssl-context-parameters* | To configure security using SSLContextParameters. 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. The option is a org.apache.camel.util.jsse.SSLContextParameters type. |  | String
| *camel.component.http4.use-global-ssl-context-parameters* | Enable usage of global SSL context parameters. | false | Boolean
| *camel.component.http4.x509-hostname-verifier* | To use a custom X509HostnameVerifier such as DefaultHostnameVerifier or org.apache.http.conn.ssl.NoopHostnameVerifier. The option is a javax.net.ssl.HostnameVerifier type. |  | String
|===
// spring-boot-auto-configure options: END








== Message Headers

[width="100%",cols="10%,20%,70%",options="header",]
|=======================================================================
|Name |Type |Description

|`Exchange.HTTP_URI` |`String` |URI to call. Will override existing URI set directly on the endpoint.
This uri is the uri of the http server to call. Its not the same as the
Camel endpoint uri, where you can configure endpoint options such as
security etc. This header does not support that, its only the uri of the
http server.

|`Exchange.HTTP_PATH` |`String` |Request URI's path, the header will be used to build the request URI
with the HTTP_URI.

|`Exchange.HTTP_QUERY` |`String` |URI parameters. Will override existing URI parameters set directly on
the endpoint.

|`Exchange.HTTP_RESPONSE_CODE` |`int` |The HTTP response code from the external server. Is 200 for OK.

|`Exchange.HTTP_RESPONSE_TEXT` | `String` |The HTTP response text from the external server.

|`Exchange.HTTP_CHARACTER_ENCODING` |`String` |Character encoding.

|`Exchange.CONTENT_TYPE` |`String` |The HTTP content type. Is set on both the IN and OUT message to provide
a content type, such as `text/html`.

|`Exchange.CONTENT_ENCODING` |`String` |The HTTP content encoding. Is set on both the IN and OUT message to
provide a content encoding, such as `gzip`.
|=======================================================================

== Message Body

Camel will store the HTTP response from the external server on the OUT
body. All headers from the IN message will be copied to the OUT message,
so headers are preserved during routing. Additionally Camel will add the
HTTP response headers as well to the OUT message headers.

 


== Using System Properties

When setting useSystemProperties to true, the HTTP Client will look for
the following System Properties and it will use it:

* ssl.TrustManagerFactory.algorithm
* http://javax.net/[javax.net].ssl.trustStoreType
* http://javax.net/[javax.net].ssl.trustStore
* http://javax.net/[javax.net].ssl.trustStoreProvider
* http://javax.net/[javax.net].ssl.trustStorePassword
* java.home
* ssl.KeyManagerFactory.algorithm
* http://javax.net/[javax.net].ssl.keyStoreType
* http://javax.net/[javax.net].ssl.keyStore
* http://javax.net/[javax.net].ssl.keyStoreProvider
* http://javax.net/[javax.net].ssl.keyStorePassword
* http.proxyHost
* http.proxyPort
* http.nonProxyHosts
* http.keepAlive
* http.maxConnections

== Response code

Camel will handle according to the HTTP response code:

* Response code is in the range 100..299, Camel regards it as a success
response.
* Response code is in the range 300..399, Camel regards it as a
redirection response and will throw a `HttpOperationFailedException`
with the information.
* Response code is 400+, Camel regards it as an external server failure
and will throw a `HttpOperationFailedException` with the information.

*throwExceptionOnFailure*
The option, `throwExceptionOnFailure`, can be set to `false` to prevent
the `HttpOperationFailedException` from being thrown for failed response
codes. This allows you to get any response from the remote server.

There is a sample below demonstrating this.

== HttpOperationFailedException

This exception contains the following information:

* The HTTP status code
* The HTTP status line (text of the status code)
* Redirect location, if server returned a redirect
* Response body as a `java.lang.String`, if server provided a body as
response

== Which HTTP method will be used

The following algorithm is used to determine what HTTP method should be used:

 1. Use method provided as endpoint configuration (`httpMethod`).

 2. Use method provided in header (`Exchange.HTTP_METHOD`).

 3. `GET` if query string is provided in header.

 4. `GET` if endpoint is configured with a query string.

 5. `POST` if there is data to send (body is not `null`).

 6. `GET` otherwise.

== How to get access to HttpServletRequest and HttpServletResponse

You can get access to these two using the Camel type converter system
using

 *NOTE* You can get the request and response not just from the processor
after the camel-jetty or camel-cxf endpoint.

[source,java]
----------------------------------------------------------------------------------
HttpServletRequest request = exchange.getIn().getBody(HttpServletRequest.class);
HttpServletRequest response = exchange.getIn().getBody(HttpServletResponse.class);
----------------------------------------------------------------------------------

== Configuring URI to call

You can set the HTTP producer's URI directly form the endpoint URI. In
the route below, Camel will call out to the external server, `oldhost`,
using HTTP.

[source,java]
-------------------------------
from("direct:start")
        .to("http4://oldhost");
-------------------------------

And the equivalent Spring sample:

[source,xml]
---------------------------------------------------------------------
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
  <route>
    <from uri="direct:start"/>
    <to uri="http4://oldhost"/>
  </route>
</camelContext>
---------------------------------------------------------------------

You can override the HTTP endpoint URI by adding a header with the key,
`Exchange.HTTP_URI`, on the message.

[source,java]
-----------------------------------------------------------
from("direct:start")
  .setHeader(Exchange.HTTP_URI, constant("http://newhost"))
  .to("http4://oldhost");
-----------------------------------------------------------

In the sample above Camel will call the http://newhost despite the
endpoint is configured with http4://oldhost.

If the http4 endpoint is working in bridge mode, it will ignore the
message header of `Exchange.HTTP_URI`.

== Configuring URI Parameters

The *http* producer supports URI parameters to be sent to the HTTP
server. The URI parameters can either be set directly on the endpoint
URI or as a header with the key `Exchange.HTTP_QUERY` on the message.

[source,java]
------------------------------------------------
from("direct:start")
  .to("http4://oldhost?order=123&detail=short");
------------------------------------------------

Or options provided in a header:

[source,java]
---------------------------------------------------------------------
from("direct:start")
  .setHeader(Exchange.HTTP_QUERY, constant("order=123&detail=short"))
  .to("http4://oldhost");
---------------------------------------------------------------------

== How to set the http method (GET/PATCH/POST/PUT/DELETE/HEAD/OPTIONS/TRACE) to the HTTP producer

*Using the http PATCH method*

The http PATCH method is supported starting with Camel 2.11.3 / 2.12.1.

The HTTP4 component provides a way to set the HTTP request method by
setting the message header. Here is an example:

[source,java]
-----------------------------------------------------------------------------------------------
from("direct:start")
  .setHeader(Exchange.HTTP_METHOD, constant(org.apache.camel.component.http4.HttpMethods.POST))
  .to("http4://www.google.com")
  .to("mock:results");
-----------------------------------------------------------------------------------------------

The method can be written a bit shorter using the string constants:

[source,java]
-----------------------------------------------
.setHeader("CamelHttpMethod", constant("POST"))
-----------------------------------------------

And the equivalent Spring sample:

[source,xml]
---------------------------------------------------------------------
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
  <route>
    <from uri="direct:start"/>
    <setHeader headerName="CamelHttpMethod">
        <constant>POST</constant>
    </setHeader>
    <to uri="http4://www.google.com"/>
    <to uri="mock:results"/>
  </route>
</camelContext>
---------------------------------------------------------------------

== Using client timeout - SO_TIMEOUT

See the
https://svn.apache.org/repos/asf/camel/trunk/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpSOTimeoutTest.java[HttpSOTimeoutTest]
unit test.

*Since Camel 2.13.0*: See the updated
https://github.com/apache/camel/blob/master/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpSOTimeoutTest.java[HttpSOTimeoutTest]
unit test.

== Configuring a Proxy

The HTTP4 component provides a way to configure a proxy.

[source,java]
------------------------------------------------------------------------
from("direct:start")
  .to("http4://oldhost?proxyAuthHost=www.myproxy.com&proxyAuthPort=80");
------------------------------------------------------------------------

There is also support for proxy authentication via the
`proxyAuthUsername` and `proxyAuthPassword` options.

=== Using proxy settings outside of URI

To avoid System properties conflicts, you can set proxy configuration
only from the CamelContext or URI.

 Java DSL :

[source,java]
---------------------------------------------------------------
 context.getProperties().put("http.proxyHost", "172.168.18.9");
 context.getProperties().put("http.proxyPort" "8080");
---------------------------------------------------------------

Spring XML

[source,xml]
----------------------------------------------------------------
   <camelContext>
       <properties>
           <property key="http.proxyHost" value="172.168.18.9"/>
           <property key="http.proxyPort" value="8080"/>
      </properties>
   </camelContext>
----------------------------------------------------------------

Camel will first set the settings from Java System or CamelContext
Properties and then the endpoint proxy options if provided.

 So you can override the system properties with the endpoint options.

Notice in *Camel 2.8* there is also a `http.proxyScheme` property you
can set to explicit configure the scheme to use.

== Configuring charset

If you are using `POST` to send data you can configure the `charset`
using the `Exchange` property:

[source,java]
----------------------------------------------------------
exchange.setProperty(Exchange.CHARSET_NAME, "ISO-8859-1");
----------------------------------------------------------

=== Sample with scheduled poll

This sample polls the Google homepage every 10 seconds and write the
page to the file `message.html`:

[source,java]
------------------------------------------------------------
from("timer://foo?fixedRate=true&delay=0&period=10000")
  .to("http4://www.google.com")
  .setHeader(FileComponent.HEADER_FILE_NAME, "message.html")
  .to("file:target/google");
------------------------------------------------------------

=== URI Parameters from the endpoint URI

In this sample we have the complete URI endpoint that is just what you
would have typed in a web browser. Multiple URI parameters can of course
be set using the `&` character as separator, just as you would in the
web browser. Camel does no tricks here.

[source,java]
-----------------------------------------------------------------
// we query for Camel at the Google page
template.sendBody("http4://www.google.com/search?q=Camel", null);
-----------------------------------------------------------------

=== URI Parameters from the Message

[source,java]
------------------------------------------------------------------
Map headers = new HashMap();
headers.put(Exchange.HTTP_QUERY, "q=Camel&lr=lang_en");
// we query for Camel and English language at Google
template.sendBody("http4://www.google.com/search", null, headers);
------------------------------------------------------------------

In the header value above notice that it should *not* be prefixed with
`?` and you can separate parameters as usual with the `&` char.

=== Getting the Response Code

You can get the HTTP response code from the HTTP4 component by getting
the value from the Out message header with
`Exchange.HTTP_RESPONSE_CODE`.

[source,java]
------------------------------------------------------------------------------------
Exchange exchange = template.send("http4://www.google.com/search", new Processor() {
  public void process(Exchange exchange) throws Exception {
    exchange.getIn().setHeader(Exchange.HTTP_QUERY, constant("hl=en&q=activemq"));
  }
});
Message out = exchange.getOut();
int responseCode = out.getHeader(Exchange.HTTP_RESPONSE_CODE, Integer.class);
------------------------------------------------------------------------------------

== Disabling Cookies

To disable cookies you can set the HTTP Client to ignore cookies by
adding this URI option:

 `httpClient.cookieSpec=ignoreCookies`

== Advanced Usage

If you need more control over the HTTP producer you should use the
`HttpComponent` where you can set various classes to give you custom
behavior.

=== Setting up SSL for HTTP Client

[[HTTP4-UsingtheJSSEConfigurationUtility]]
Using the JSSE Configuration Utility

As of Camel 2.8, the HTTP4 component supports SSL/TLS configuration
through the xref:manual::camel-configuration-utilities.adoc[Camel JSSE
Configuration Utility].  This utility greatly decreases the amount of
component specific code you need to write and is configurable at the
endpoint and component levels.  The following examples demonstrate how
to use the utility with the HTTP4 component.

[[HTTP4-Programmaticconfigurationofthecomponent]]
Programmatic configuration of the component

[source,java]
---------------------------------------------------------------------------------------
KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource("/users/home/server/keystore.jks");
ksp.setPassword("keystorePassword");

KeyManagersParameters kmp = new KeyManagersParameters();
kmp.setKeyStore(ksp);
kmp.setKeyPassword("keyPassword");

SSLContextParameters scp = new SSLContextParameters();
scp.setKeyManagers(kmp);

HttpComponent httpComponent = getContext().getComponent("https4", HttpComponent.class);
httpComponent.setSslContextParameters(scp);
---------------------------------------------------------------------------------------

[[HTTP4-SpringDSLbasedconfigurationofendpoint]]
Spring DSL based configuration of endpoint

[source,xml]
--------------------------------------------------------------------------------------
...
  <camel:sslContextParameters
      id="sslContextParameters">
    <camel:keyManagers
        keyPassword="keyPassword">
      <camel:keyStore
          resource="/users/home/server/keystore.jks"
          password="keystorePassword"/>
    </camel:keyManagers>
  </camel:sslContextParameters>...
...
  <to uri="https4://127.0.0.1/mail/?sslContextParameters=#sslContextParameters"/>...
--------------------------------------------------------------------------------------

[[HTTP4-ConfiguringApacheHTTPClientDirectly]]
Configuring Apache HTTP Client Directly

Basically camel-http4 component is built on the top of
http://hc.apache.org/httpcomponents-client-ga/[Apache HttpClient].
Please refer to
http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e537[SSL/TLS
customization] for details or have a look into the
`org.apache.camel.component.http4.HttpsServerTestSupport` unit test base
class.

 You can also implement a custom
`org.apache.camel.component.http4.HttpClientConfigurer` to do some
configuration on the http client if you need full control of it.

However if you _just_ want to specify the keystore and truststore you
can do this with Apache HTTP `HttpClientConfigurer`, for example:

[source,java]
------------------------------------------------------------------------------------------------------
KeyStore keystore = ...;
KeyStore truststore = ...;

SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("https", 443, new SSLSocketFactory(keystore, "mypassword", truststore)));
------------------------------------------------------------------------------------------------------

And then you need to create a class that implements
`HttpClientConfigurer`, and registers https protocol providing a
keystore or truststore per example above. Then, from your camel route
builder class you can hook it up like so:

[source,java]
--------------------------------------------------------------------------------------
HttpComponent httpComponent = getContext().getComponent("http4", HttpComponent.class);
httpComponent.setHttpClientConfigurer(new MyHttpClientConfigurer());
--------------------------------------------------------------------------------------

If you are doing this using the Spring DSL, you can specify your
`HttpClientConfigurer` using the URI. For example:

[source,xml]
-----------------------------------------------------------------------------------------
<bean id="myHttpClientConfigurer"
 class="my.https.HttpClientConfigurer">
</bean>

<to uri="https4://myhostname.com:443/myURL?httpClientConfigurer=myHttpClientConfigurer"/>
-----------------------------------------------------------------------------------------

As long as you implement the HttpClientConfigurer and configure your
keystore and truststore as described above, it will work fine.

[[HTTP4-UsingHTTPStoauthenticategotchas]]
Using HTTPS to authenticate gotchas

An end user reported that he had problem with authenticating with HTTPS.
The problem was eventually resolved by providing a custom configured
`org.apache.http.protocol.HttpContext`:

* 1. Create a (Spring) factory for HttpContexts:

[source,java]
------------------------------------------------------------------
public class HttpContextFactory {

  private String httpHost = "localhost";
  private String httpPort = 9001;

  private BasicHttpContext httpContext = new BasicHttpContext();
  private BasicAuthCache authCache = new BasicAuthCache();
  private BasicScheme basicAuth = new BasicScheme();

  public HttpContext getObject() {
    authCache.put(new HttpHost(httpHost, httpPort), basicAuth);

    httpContext.setAttribute(ClientContext.AUTH_CACHE, authCache);

    return httpContext;
  }

  // getter and setter
}
------------------------------------------------------------------

* 2. Declare an HttpContext in the Spring application context file:

[source,xml]
---------------------------------------------------------------------------------------
<bean id="myHttpContext" factory-bean="httpContextFactory" factory-method="getObject"/>
---------------------------------------------------------------------------------------

* 3. Reference the context in the http4 URL:

[source,xml]
-----------------------------------------------------------------------
<to uri="https4://myhostname.com:443/myURL?httpContext=myHttpContext"/>
-----------------------------------------------------------------------

[[HTTP4-UsingdifferentSSLContextParameters]]
Using different SSLContextParameters

The xref:http4-component.adoc[HTTP4] component only support one instance of
`org.apache.camel.util.jsse.SSLContextParameters` per component. If you
need to use 2 or more different instances, then you need to setup
multiple xref:http4-component.adoc[HTTP4] components as shown below. Where we have
2 components, each using their own instance of `sslContextParameters`
property.

[source,xml]
----------------------------------------------------------------------------
<bean id="http4-foo" class="org.apache.camel.component.http4.HttpComponent">
   <property name="sslContextParameters" ref="sslContextParams1"/>
   <property name="x509HostnameVerifier" ref="hostnameVerifier"/>
</bean>

<bean id="http4-bar" class="org.apache.camel.component.http4.HttpComponent">
   <property name="sslContextParameters" ref="sslContextParams2"/>
   <property name="x509HostnameVerifier" ref="hostnameVerifier"/>
</bean>
----------------------------------------------------------------------------
