[[http-component]]
= HTTP Component
:page-source: components/camel-http/src/main/docs/http-component.adoc

*Available as of Camel version 2.3*

The HTTP 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-http</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
------------------------------------------------------------

== URI format

[source,java]
---------------------------------------------
http: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-http vs camel-jetty*

You can only produce to endpoints generated by the HTTP 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 Component] instead.

== Http Component Options




// component options: START
The HTTP 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. |  | HttpClientConnectionManager
| *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.support.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 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: -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: -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: -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
| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
|===
// component options: END










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

----
http: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 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-http 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 message. 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
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | 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
| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *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 |  | HttpClientConnectionManager
| *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-http-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.http.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.http.basic-property-binding* | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | Boolean
| *camel.component.http.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.http.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: -1 | -1 | Integer
| *camel.component.http.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: -1 | -1 | Integer
| *camel.component.http.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.http.connections-per-route* | The maximum number of connections per route. | 20 | Integer
| *camel.component.http.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.http.enabled* | Whether to enable auto configuration of the http component. This is enabled by default. |  | Boolean
| *camel.component.http.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.http.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.http.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.http.HttpClientConfigurer type. |  | String
| *camel.component.http.http-configuration* | To use the shared HttpConfiguration as base configuration. The option is a org.apache.camel.http.common.HttpConfiguration type. |  | String
| *camel.component.http.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.http.max-total-connections* | The maximum number of connections. | 200 | Integer
| *camel.component.http.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: -1 | -1 | Integer
| *camel.component.http.ssl-context-parameters* | To configure security using SSLContextParameters. Important: Only one instance of org.apache.camel.support.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.support.jsse.SSLContextParameters type. |  | String
| *camel.component.http.use-global-ssl-context-parameters* | Enable usage of global SSL context parameters. | false | Boolean
| *camel.component.http.x509-hostname-verifier* | To use a custom X509HostnameVerifier such as DefaultHostnameVerifier or 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.

== Exceptions

`HttpOperationFailedException` 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("http://oldhost");
-------------------------------

And the equivalent Spring sample:

[source,xml]
---------------------------------------------------------------------
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring">
  <route>
    <from uri="direct:start"/>
    <to uri="http://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("http://oldhost");
-----------------------------------------------------------

In the sample above Camel will call the http://newhost despite the
endpoint is configured with http://oldhost. +
If the http 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("http://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("http://oldhost");
---------------------------------------------------------------------

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

The HTTP 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.http.HttpMethods.POST))
  .to("http://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 name="CamelHttpMethod">
        <constant>POST</constant>
    </setHeader>
    <to uri="http://www.google.com"/>
    <to uri="mock:results"/>
  </route>
</camelContext>
---------------------------------------------------------------------

== Using client timeout - SO_TIMEOUT

See the
https://github.com/apache/camel/blob/master/components/camel-http/src/test/java/org/apache/camel/component/http/HttpSOTimeoutTest.java[HttpSOTimeoutTest]
unit test.

== Configuring a Proxy

The HTTP component provides a way to configure a proxy.

[source,java]
------------------------------------------------------------------------
from("direct:start")
  .to("http://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.

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("http://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("http://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("http://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 HTTP component by getting
the value from the Out message header with
`Exchange.HTTP_RESPONSE_CODE`.

[source,java]
------------------------------------------------------------------------------------
Exchange exchange = template.send("http://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`

== Basic auth with the streaming message body

In order to avoid the `NonRepeatableRequestException`, you need to do the
Preemptive Basic Authentication by adding the option: +
 `authenticationPreemptive=true`

== 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

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

The HTTP 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 HTTP component.

[[HTTP-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("https", HttpComponent.class);
httpComponent.setSslContextParameters(scp);
---------------------------------------------------------------------------------------

[[HTTP-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="https://127.0.0.1/mail/?sslContextParameters=#sslContextParameters"/>...
--------------------------------------------------------------------------------------

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

Basically camel-http 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.http.HttpsServerTestSupport` unit test base
class. +
 You can also implement a custom
`org.apache.camel.component.http.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("http", 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="https://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.

[[HTTP-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 http URL:

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

[[HTTP-UsingdifferentSSLContextParameters]]
Using different SSLContextParameters

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

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

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