/*
 * 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.http.springboot;

import javax.annotation.Generated;
import javax.net.ssl.HostnameVerifier;
import org.apache.camel.component.http.HttpClientConfigurer;
import org.apache.camel.http.common.HttpBinding;
import org.apache.camel.http.common.HttpConfiguration;
import org.apache.camel.spi.HeaderFilterStrategy;
import org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon;
import org.apache.camel.support.jsse.SSLContextParameters;
import org.apache.http.client.CookieStore;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.protocol.HttpContext;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * Send requests to external HTTP servers using Apache HTTP Client 4.x.
 * 
 * Generated by camel-package-maven-plugin - do not edit this file!
 */
@Generated("org.apache.camel.springboot.maven.SpringBootAutoConfigurationMojo")
@ConfigurationProperties(prefix = "camel.component.http")
public class HttpComponentConfiguration
        extends
            ComponentConfigurationPropertiesCommon {

    /**
     * Whether to enable auto configuration of the http component. This is
     * enabled by default.
     */
    private Boolean enabled;
    /**
     * 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.
     */
    private CookieStore cookieStore;
    /**
     * 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).
     */
    private Boolean copyHeaders = true;
    /**
     * 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.
     */
    private Boolean lazyStartProducer = false;
    /**
     * This threshold in bytes controls whether the response payload should be
     * stored in memory as a byte array or be streaming based. Set this to -1 to
     * always use streaming mode.
     */
    private Integer responsePayloadStreamingThreshold = 8192;
    /**
     * Whether to skip mapping all the Camel headers as HTTP request headers. If
     * there are no data from Camel headers needed to be included in the HTTP
     * request then this can avoid parsing overhead with many object allocations
     * for the JVM garbage collector.
     */
    private Boolean skipRequestHeaders = false;
    /**
     * Whether to skip mapping all the HTTP response headers to Camel headers.
     * If there are no data needed from HTTP headers then this can avoid parsing
     * overhead with many object allocations for the JVM garbage collector.
     */
    private Boolean skipResponseHeaders = false;
    /**
     * 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.
     */
    private Boolean allowJavaSerializedObject = false;
    /**
     * Disables authentication scheme caching
     */
    private Boolean authCachingDisabled = false;
    /**
     * Disables automatic request recovery and re-execution
     */
    private Boolean automaticRetriesDisabled = false;
    /**
     * 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 type, which
     * then gets configured on the component. This can be used for automatic
     * configuring JDBC data sources, JMS connection factories, AWS Clients,
     * etc.
     */
    private Boolean autowiredEnabled = true;
    /**
     * 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.
     */
    private HttpClientConnectionManager clientConnectionManager;
    /**
     * The maximum number of connections per route.
     */
    private Integer connectionsPerRoute = 20;
    /**
     * Disables connection state tracking
     */
    private Boolean connectionStateDisabled = false;
    /**
     * The time for connection to live, the time unit is millisecond, the
     * default value is always keep alive.
     */
    private Long connectionTimeToLive;
    /**
     * Disables automatic content decompression
     */
    private Boolean contentCompressionDisabled = false;
    /**
     * Disables state (cookie) management
     */
    private Boolean cookieManagementDisabled = false;
    /**
     * Disables the default user agent set by this builder if none has been
     * provided by the user
     */
    private Boolean defaultUserAgentDisabled = false;
    /**
     * 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.
     */
    private HttpBinding httpBinding;
    /**
     * 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.
     */
    private HttpClientConfigurer httpClientConfigurer;
    /**
     * To use the shared HttpConfiguration as base configuration. The option is
     * a org.apache.camel.http.common.HttpConfiguration type.
     */
    private HttpConfiguration httpConfiguration;
    /**
     * To use a custom org.apache.http.protocol.HttpContext when executing
     * requests. The option is a org.apache.http.protocol.HttpContext type.
     */
    private HttpContext httpContext;
    /**
     * The maximum number of connections.
     */
    private Integer maxTotalConnections = 200;
    /**
     * Disables automatic redirect handling
     */
    private Boolean redirectHandlingDisabled = false;
    /**
     * 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.
     */
    private HeaderFilterStrategy headerFilterStrategy;
    /**
     * Proxy authentication domain to use
     */
    private String proxyAuthDomain;
    /**
     * Proxy authentication host
     */
    private String proxyAuthHost;
    /**
     * Proxy authentication method to use
     */
    private String proxyAuthMethod;
    /**
     * Proxy authentication domain (workstation name) to use with NTML
     */
    private String proxyAuthNtHost;
    /**
     * Proxy authentication password
     */
    private String proxyAuthPassword;
    /**
     * Proxy authentication port
     */
    private Integer proxyAuthPort;
    /**
     * Proxy authentication username
     */
    private String proxyAuthUsername;
    /**
     * 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.
     */
    private SSLContextParameters sslContextParameters;
    /**
     * Enable usage of global SSL context parameters.
     */
    private Boolean useGlobalSslContextParameters = false;
    /**
     * To use a custom X509HostnameVerifier such as DefaultHostnameVerifier or
     * NoopHostnameVerifier. The option is a javax.net.ssl.HostnameVerifier
     * type.
     */
    private HostnameVerifier x509HostnameVerifier;
    /**
     * 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).
     */
    private Integer connectionRequestTimeout = -1;
    /**
     * 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).
     */
    private Integer connectTimeout = -1;
    /**
     * Defines the socket 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).
     */
    private Integer socketTimeout = -1;

    public CookieStore getCookieStore() {
        return cookieStore;
    }

    public void setCookieStore(CookieStore cookieStore) {
        this.cookieStore = cookieStore;
    }

    public Boolean getCopyHeaders() {
        return copyHeaders;
    }

    public void setCopyHeaders(Boolean copyHeaders) {
        this.copyHeaders = copyHeaders;
    }

    public Boolean getLazyStartProducer() {
        return lazyStartProducer;
    }

    public void setLazyStartProducer(Boolean lazyStartProducer) {
        this.lazyStartProducer = lazyStartProducer;
    }

    public Integer getResponsePayloadStreamingThreshold() {
        return responsePayloadStreamingThreshold;
    }

    public void setResponsePayloadStreamingThreshold(
            Integer responsePayloadStreamingThreshold) {
        this.responsePayloadStreamingThreshold = responsePayloadStreamingThreshold;
    }

    public Boolean getSkipRequestHeaders() {
        return skipRequestHeaders;
    }

    public void setSkipRequestHeaders(Boolean skipRequestHeaders) {
        this.skipRequestHeaders = skipRequestHeaders;
    }

    public Boolean getSkipResponseHeaders() {
        return skipResponseHeaders;
    }

    public void setSkipResponseHeaders(Boolean skipResponseHeaders) {
        this.skipResponseHeaders = skipResponseHeaders;
    }

    public Boolean getAllowJavaSerializedObject() {
        return allowJavaSerializedObject;
    }

    public void setAllowJavaSerializedObject(Boolean allowJavaSerializedObject) {
        this.allowJavaSerializedObject = allowJavaSerializedObject;
    }

    public Boolean getAuthCachingDisabled() {
        return authCachingDisabled;
    }

    public void setAuthCachingDisabled(Boolean authCachingDisabled) {
        this.authCachingDisabled = authCachingDisabled;
    }

    public Boolean getAutomaticRetriesDisabled() {
        return automaticRetriesDisabled;
    }

    public void setAutomaticRetriesDisabled(Boolean automaticRetriesDisabled) {
        this.automaticRetriesDisabled = automaticRetriesDisabled;
    }

    public Boolean getAutowiredEnabled() {
        return autowiredEnabled;
    }

    public void setAutowiredEnabled(Boolean autowiredEnabled) {
        this.autowiredEnabled = autowiredEnabled;
    }

    public HttpClientConnectionManager getClientConnectionManager() {
        return clientConnectionManager;
    }

    public void setClientConnectionManager(
            HttpClientConnectionManager clientConnectionManager) {
        this.clientConnectionManager = clientConnectionManager;
    }

    public Integer getConnectionsPerRoute() {
        return connectionsPerRoute;
    }

    public void setConnectionsPerRoute(Integer connectionsPerRoute) {
        this.connectionsPerRoute = connectionsPerRoute;
    }

    public Boolean getConnectionStateDisabled() {
        return connectionStateDisabled;
    }

    public void setConnectionStateDisabled(Boolean connectionStateDisabled) {
        this.connectionStateDisabled = connectionStateDisabled;
    }

    public Long getConnectionTimeToLive() {
        return connectionTimeToLive;
    }

    public void setConnectionTimeToLive(Long connectionTimeToLive) {
        this.connectionTimeToLive = connectionTimeToLive;
    }

    public Boolean getContentCompressionDisabled() {
        return contentCompressionDisabled;
    }

    public void setContentCompressionDisabled(Boolean contentCompressionDisabled) {
        this.contentCompressionDisabled = contentCompressionDisabled;
    }

    public Boolean getCookieManagementDisabled() {
        return cookieManagementDisabled;
    }

    public void setCookieManagementDisabled(Boolean cookieManagementDisabled) {
        this.cookieManagementDisabled = cookieManagementDisabled;
    }

    public Boolean getDefaultUserAgentDisabled() {
        return defaultUserAgentDisabled;
    }

    public void setDefaultUserAgentDisabled(Boolean defaultUserAgentDisabled) {
        this.defaultUserAgentDisabled = defaultUserAgentDisabled;
    }

    public HttpBinding getHttpBinding() {
        return httpBinding;
    }

    public void setHttpBinding(HttpBinding httpBinding) {
        this.httpBinding = httpBinding;
    }

    public HttpClientConfigurer getHttpClientConfigurer() {
        return httpClientConfigurer;
    }

    public void setHttpClientConfigurer(
            HttpClientConfigurer httpClientConfigurer) {
        this.httpClientConfigurer = httpClientConfigurer;
    }

    public HttpConfiguration getHttpConfiguration() {
        return httpConfiguration;
    }

    public void setHttpConfiguration(HttpConfiguration httpConfiguration) {
        this.httpConfiguration = httpConfiguration;
    }

    public HttpContext getHttpContext() {
        return httpContext;
    }

    public void setHttpContext(HttpContext httpContext) {
        this.httpContext = httpContext;
    }

    public Integer getMaxTotalConnections() {
        return maxTotalConnections;
    }

    public void setMaxTotalConnections(Integer maxTotalConnections) {
        this.maxTotalConnections = maxTotalConnections;
    }

    public Boolean getRedirectHandlingDisabled() {
        return redirectHandlingDisabled;
    }

    public void setRedirectHandlingDisabled(Boolean redirectHandlingDisabled) {
        this.redirectHandlingDisabled = redirectHandlingDisabled;
    }

    public HeaderFilterStrategy getHeaderFilterStrategy() {
        return headerFilterStrategy;
    }

    public void setHeaderFilterStrategy(
            HeaderFilterStrategy headerFilterStrategy) {
        this.headerFilterStrategy = headerFilterStrategy;
    }

    public String getProxyAuthDomain() {
        return proxyAuthDomain;
    }

    public void setProxyAuthDomain(String proxyAuthDomain) {
        this.proxyAuthDomain = proxyAuthDomain;
    }

    public String getProxyAuthHost() {
        return proxyAuthHost;
    }

    public void setProxyAuthHost(String proxyAuthHost) {
        this.proxyAuthHost = proxyAuthHost;
    }

    public String getProxyAuthMethod() {
        return proxyAuthMethod;
    }

    public void setProxyAuthMethod(String proxyAuthMethod) {
        this.proxyAuthMethod = proxyAuthMethod;
    }

    public String getProxyAuthNtHost() {
        return proxyAuthNtHost;
    }

    public void setProxyAuthNtHost(String proxyAuthNtHost) {
        this.proxyAuthNtHost = proxyAuthNtHost;
    }

    public String getProxyAuthPassword() {
        return proxyAuthPassword;
    }

    public void setProxyAuthPassword(String proxyAuthPassword) {
        this.proxyAuthPassword = proxyAuthPassword;
    }

    public Integer getProxyAuthPort() {
        return proxyAuthPort;
    }

    public void setProxyAuthPort(Integer proxyAuthPort) {
        this.proxyAuthPort = proxyAuthPort;
    }

    public String getProxyAuthUsername() {
        return proxyAuthUsername;
    }

    public void setProxyAuthUsername(String proxyAuthUsername) {
        this.proxyAuthUsername = proxyAuthUsername;
    }

    public SSLContextParameters getSslContextParameters() {
        return sslContextParameters;
    }

    public void setSslContextParameters(
            SSLContextParameters sslContextParameters) {
        this.sslContextParameters = sslContextParameters;
    }

    public Boolean getUseGlobalSslContextParameters() {
        return useGlobalSslContextParameters;
    }

    public void setUseGlobalSslContextParameters(
            Boolean useGlobalSslContextParameters) {
        this.useGlobalSslContextParameters = useGlobalSslContextParameters;
    }

    public HostnameVerifier getX509HostnameVerifier() {
        return x509HostnameVerifier;
    }

    public void setX509HostnameVerifier(HostnameVerifier x509HostnameVerifier) {
        this.x509HostnameVerifier = x509HostnameVerifier;
    }

    public Integer getConnectionRequestTimeout() {
        return connectionRequestTimeout;
    }

    public void setConnectionRequestTimeout(Integer connectionRequestTimeout) {
        this.connectionRequestTimeout = connectionRequestTimeout;
    }

    public Integer getConnectTimeout() {
        return connectTimeout;
    }

    public void setConnectTimeout(Integer connectTimeout) {
        this.connectTimeout = connectTimeout;
    }

    public Integer getSocketTimeout() {
        return socketTimeout;
    }

    public void setSocketTimeout(Integer socketTimeout) {
        this.socketTimeout = socketTimeout;
    }
}