103928aee4356845252ac6b662d5c72c29903813eJake Slack//
203928aee4356845252ac6b662d5c72c29903813eJake Slack//  ========================================================================
303928aee4356845252ac6b662d5c72c29903813eJake Slack//  Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
403928aee4356845252ac6b662d5c72c29903813eJake Slack//  ------------------------------------------------------------------------
503928aee4356845252ac6b662d5c72c29903813eJake Slack//  All rights reserved. This program and the accompanying materials
603928aee4356845252ac6b662d5c72c29903813eJake Slack//  are made available under the terms of the Eclipse Public License v1.0
703928aee4356845252ac6b662d5c72c29903813eJake Slack//  and Apache License v2.0 which accompanies this distribution.
803928aee4356845252ac6b662d5c72c29903813eJake Slack//
903928aee4356845252ac6b662d5c72c29903813eJake Slack//      The Eclipse Public License is available at
1003928aee4356845252ac6b662d5c72c29903813eJake Slack//      http://www.eclipse.org/legal/epl-v10.html
1103928aee4356845252ac6b662d5c72c29903813eJake Slack//
1203928aee4356845252ac6b662d5c72c29903813eJake Slack//      The Apache License v2.0 is available at
1303928aee4356845252ac6b662d5c72c29903813eJake Slack//      http://www.opensource.org/licenses/apache2.0.php
1403928aee4356845252ac6b662d5c72c29903813eJake Slack//
1503928aee4356845252ac6b662d5c72c29903813eJake Slack//  You may elect to redistribute this code under either of these licenses.
1603928aee4356845252ac6b662d5c72c29903813eJake Slack//  ========================================================================
1703928aee4356845252ac6b662d5c72c29903813eJake Slack//
1803928aee4356845252ac6b662d5c72c29903813eJake Slack
1903928aee4356845252ac6b662d5c72c29903813eJake Slackpackage org.eclipse.jetty.client;
2003928aee4356845252ac6b662d5c72c29903813eJake Slack
2103928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.io.IOException;
2203928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.io.InputStream;
2303928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.net.UnknownHostException;
2403928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Enumeration;
2503928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.LinkedList;
2603928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Set;
2703928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.concurrent.ConcurrentHashMap;
2803928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.concurrent.ConcurrentMap;
2903928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.net.ssl.SSLContext;
3003928aee4356845252ac6b662d5c72c29903813eJake Slack
3103928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.client.security.Authentication;
3203928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.client.security.RealmResolver;
3303928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.client.security.SecurityListener;
3403928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.http.HttpBuffers;
3503928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.http.HttpBuffersImpl;
3603928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.http.HttpSchemes;
3703928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.io.Buffers;
3803928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.io.Buffers.Type;
3903928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.Attributes;
4003928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.AttributesMap;
4103928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.component.AggregateLifeCycle;
4203928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.component.Dumpable;
4303928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.component.LifeCycle;
4403928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.ssl.SslContextFactory;
4503928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.thread.QueuedThreadPool;
4603928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.thread.ThreadPool;
4703928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.thread.Timeout;
4803928aee4356845252ac6b662d5c72c29903813eJake Slack
4903928aee4356845252ac6b662d5c72c29903813eJake Slack/**
5003928aee4356845252ac6b662d5c72c29903813eJake Slack * Http Client.
5103928aee4356845252ac6b662d5c72c29903813eJake Slack * <p/>
5203928aee4356845252ac6b662d5c72c29903813eJake Slack * HttpClient is the main active component of the client API implementation.
5303928aee4356845252ac6b662d5c72c29903813eJake Slack * It is the opposite of the Connectors in standard Jetty, in that it listens
5403928aee4356845252ac6b662d5c72c29903813eJake Slack * for responses rather than requests.   Just like the connectors, there is a
5503928aee4356845252ac6b662d5c72c29903813eJake Slack * blocking socket version and a non-blocking NIO version (implemented as nested classes
5603928aee4356845252ac6b662d5c72c29903813eJake Slack * selected by {@link #setConnectorType(int)}).
5703928aee4356845252ac6b662d5c72c29903813eJake Slack * <p/>
5803928aee4356845252ac6b662d5c72c29903813eJake Slack * The an instance of {@link HttpExchange} is passed to the {@link #send(HttpExchange)} method
5903928aee4356845252ac6b662d5c72c29903813eJake Slack * to send a request.  The exchange contains both the headers and content (source) of the request
6003928aee4356845252ac6b662d5c72c29903813eJake Slack * plus the callbacks to handle responses.   A HttpClient can have many exchanges outstanding
6103928aee4356845252ac6b662d5c72c29903813eJake Slack * and they may be queued on the {@link HttpDestination} waiting for a {@link AbstractHttpConnection},
6203928aee4356845252ac6b662d5c72c29903813eJake Slack * queued in the {@link AbstractHttpConnection} waiting to be transmitted or pipelined on the actual
6303928aee4356845252ac6b662d5c72c29903813eJake Slack * TCP/IP connection waiting for a response.
6403928aee4356845252ac6b662d5c72c29903813eJake Slack * <p/>
6503928aee4356845252ac6b662d5c72c29903813eJake Slack * The {@link HttpDestination} class is an aggregation of {@link AbstractHttpConnection}s for the
6603928aee4356845252ac6b662d5c72c29903813eJake Slack * same host, port and protocol.   A destination may limit the number of connections
6703928aee4356845252ac6b662d5c72c29903813eJake Slack * open and they provide a pool of open connections that may be reused.   Connections may also
6803928aee4356845252ac6b662d5c72c29903813eJake Slack * be allocated from a destination, so that multiple request sources are not multiplexed
6903928aee4356845252ac6b662d5c72c29903813eJake Slack * over the same connection.
7003928aee4356845252ac6b662d5c72c29903813eJake Slack *
7103928aee4356845252ac6b662d5c72c29903813eJake Slack * @see HttpExchange
7203928aee4356845252ac6b662d5c72c29903813eJake Slack * @see HttpDestination
7303928aee4356845252ac6b662d5c72c29903813eJake Slack */
7403928aee4356845252ac6b662d5c72c29903813eJake Slackpublic class HttpClient extends AggregateLifeCycle implements HttpBuffers, Attributes, Dumpable
7503928aee4356845252ac6b662d5c72c29903813eJake Slack{
7603928aee4356845252ac6b662d5c72c29903813eJake Slack    public static final int CONNECTOR_SOCKET = 0;
7703928aee4356845252ac6b662d5c72c29903813eJake Slack    public static final int CONNECTOR_SELECT_CHANNEL = 2;
7803928aee4356845252ac6b662d5c72c29903813eJake Slack
7903928aee4356845252ac6b662d5c72c29903813eJake Slack    private int _connectorType = CONNECTOR_SELECT_CHANNEL;
8003928aee4356845252ac6b662d5c72c29903813eJake Slack    private boolean _useDirectBuffers = true;
8103928aee4356845252ac6b662d5c72c29903813eJake Slack    private boolean _connectBlocking = true;
8203928aee4356845252ac6b662d5c72c29903813eJake Slack    private int _maxConnectionsPerAddress = Integer.MAX_VALUE;
8303928aee4356845252ac6b662d5c72c29903813eJake Slack    private int _maxQueueSizePerAddress = Integer.MAX_VALUE;
8403928aee4356845252ac6b662d5c72c29903813eJake Slack    private ConcurrentMap<Address, HttpDestination> _destinations = new ConcurrentHashMap<Address, HttpDestination>();
8503928aee4356845252ac6b662d5c72c29903813eJake Slack    ThreadPool _threadPool;
8603928aee4356845252ac6b662d5c72c29903813eJake Slack    Connector _connector;
8703928aee4356845252ac6b662d5c72c29903813eJake Slack    private long _idleTimeout = 20000;
8803928aee4356845252ac6b662d5c72c29903813eJake Slack    private long _timeout = 320000;
8903928aee4356845252ac6b662d5c72c29903813eJake Slack    private int _connectTimeout = 75000;
9003928aee4356845252ac6b662d5c72c29903813eJake Slack    private Timeout _timeoutQ = new Timeout();
9103928aee4356845252ac6b662d5c72c29903813eJake Slack    private Timeout _idleTimeoutQ = new Timeout();
9203928aee4356845252ac6b662d5c72c29903813eJake Slack    private Address _proxy;
9303928aee4356845252ac6b662d5c72c29903813eJake Slack    private Authentication _proxyAuthentication;
9403928aee4356845252ac6b662d5c72c29903813eJake Slack    private Set<String> _noProxy;
9503928aee4356845252ac6b662d5c72c29903813eJake Slack    private int _maxRetries = 3;
9603928aee4356845252ac6b662d5c72c29903813eJake Slack    private int _maxRedirects = 20;
9703928aee4356845252ac6b662d5c72c29903813eJake Slack    private LinkedList<String> _registeredListeners;
9803928aee4356845252ac6b662d5c72c29903813eJake Slack
9903928aee4356845252ac6b662d5c72c29903813eJake Slack    private final SslContextFactory _sslContextFactory;
10003928aee4356845252ac6b662d5c72c29903813eJake Slack
10103928aee4356845252ac6b662d5c72c29903813eJake Slack    private RealmResolver _realmResolver;
10203928aee4356845252ac6b662d5c72c29903813eJake Slack
10303928aee4356845252ac6b662d5c72c29903813eJake Slack    private AttributesMap _attributes=new AttributesMap();
10403928aee4356845252ac6b662d5c72c29903813eJake Slack
10503928aee4356845252ac6b662d5c72c29903813eJake Slack    private final HttpBuffersImpl _buffers= new HttpBuffersImpl();
10603928aee4356845252ac6b662d5c72c29903813eJake Slack
10703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------------------------- */
10803928aee4356845252ac6b662d5c72c29903813eJake Slack    private void setBufferTypes()
10903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
11003928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_connectorType==CONNECTOR_SOCKET)
11103928aee4356845252ac6b662d5c72c29903813eJake Slack        {
11203928aee4356845252ac6b662d5c72c29903813eJake Slack            _buffers.setRequestBufferType(Type.BYTE_ARRAY);
11303928aee4356845252ac6b662d5c72c29903813eJake Slack            _buffers.setRequestHeaderType(Type.BYTE_ARRAY);
11403928aee4356845252ac6b662d5c72c29903813eJake Slack            _buffers.setResponseBufferType(Type.BYTE_ARRAY);
11503928aee4356845252ac6b662d5c72c29903813eJake Slack            _buffers.setResponseHeaderType(Type.BYTE_ARRAY);
11603928aee4356845252ac6b662d5c72c29903813eJake Slack        }
11703928aee4356845252ac6b662d5c72c29903813eJake Slack        else
11803928aee4356845252ac6b662d5c72c29903813eJake Slack        {
11903928aee4356845252ac6b662d5c72c29903813eJake Slack            _buffers.setRequestBufferType(Type.DIRECT);
12003928aee4356845252ac6b662d5c72c29903813eJake Slack            _buffers.setRequestHeaderType(_useDirectBuffers?Type.DIRECT:Type.INDIRECT);
12103928aee4356845252ac6b662d5c72c29903813eJake Slack            _buffers.setResponseBufferType(Type.DIRECT);
12203928aee4356845252ac6b662d5c72c29903813eJake Slack            _buffers.setResponseHeaderType(_useDirectBuffers?Type.DIRECT:Type.INDIRECT);
12303928aee4356845252ac6b662d5c72c29903813eJake Slack        }
12403928aee4356845252ac6b662d5c72c29903813eJake Slack
12503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
12603928aee4356845252ac6b662d5c72c29903813eJake Slack
12703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------------------------- */
12803928aee4356845252ac6b662d5c72c29903813eJake Slack    public HttpClient()
12903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
13003928aee4356845252ac6b662d5c72c29903813eJake Slack        this(new SslContextFactory());
13103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
13203928aee4356845252ac6b662d5c72c29903813eJake Slack
13303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------------------------- */
13403928aee4356845252ac6b662d5c72c29903813eJake Slack    public HttpClient(SslContextFactory sslContextFactory)
13503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
13603928aee4356845252ac6b662d5c72c29903813eJake Slack        _sslContextFactory = sslContextFactory;
13703928aee4356845252ac6b662d5c72c29903813eJake Slack        addBean(_sslContextFactory);
13803928aee4356845252ac6b662d5c72c29903813eJake Slack        addBean(_buffers);
13903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
14003928aee4356845252ac6b662d5c72c29903813eJake Slack
14103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------------------------- */
14203928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
14303928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return True if connects will be in blocking mode.
14403928aee4356845252ac6b662d5c72c29903813eJake Slack     */
14503928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean isConnectBlocking()
14603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
14703928aee4356845252ac6b662d5c72c29903813eJake Slack        return _connectBlocking;
14803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
14903928aee4356845252ac6b662d5c72c29903813eJake Slack
15003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------------------------- */
15103928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
15203928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param connectBlocking True if connects will be in blocking mode.
15303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
15403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setConnectBlocking(boolean connectBlocking)
15503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
15603928aee4356845252ac6b662d5c72c29903813eJake Slack        _connectBlocking = connectBlocking;
15703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
15803928aee4356845252ac6b662d5c72c29903813eJake Slack
15903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------------------------- */
16003928aee4356845252ac6b662d5c72c29903813eJake Slack    public void send(HttpExchange exchange) throws IOException
16103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
16203928aee4356845252ac6b662d5c72c29903813eJake Slack        boolean ssl = HttpSchemes.HTTPS_BUFFER.equalsIgnoreCase(exchange.getScheme());
16303928aee4356845252ac6b662d5c72c29903813eJake Slack        HttpDestination destination = getDestination(exchange.getAddress(), ssl);
16403928aee4356845252ac6b662d5c72c29903813eJake Slack        destination.send(exchange);
16503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
16603928aee4356845252ac6b662d5c72c29903813eJake Slack
16703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
16803928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
16903928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return the threadpool
17003928aee4356845252ac6b662d5c72c29903813eJake Slack     */
17103928aee4356845252ac6b662d5c72c29903813eJake Slack    public ThreadPool getThreadPool()
17203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
17303928aee4356845252ac6b662d5c72c29903813eJake Slack        return _threadPool;
17403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
17503928aee4356845252ac6b662d5c72c29903813eJake Slack
17603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
17703928aee4356845252ac6b662d5c72c29903813eJake Slack    /** Set the ThreadPool.
17803928aee4356845252ac6b662d5c72c29903813eJake Slack     * The threadpool passed is added via {@link #addBean(Object)} so that
17903928aee4356845252ac6b662d5c72c29903813eJake Slack     * it's lifecycle may be managed as a {@link AggregateLifeCycle}.
18003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param threadPool the threadPool to set
18103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
18203928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setThreadPool(ThreadPool threadPool)
18303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
18403928aee4356845252ac6b662d5c72c29903813eJake Slack        removeBean(_threadPool);
18503928aee4356845252ac6b662d5c72c29903813eJake Slack        _threadPool = threadPool;
18603928aee4356845252ac6b662d5c72c29903813eJake Slack        addBean(_threadPool);
18703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
18803928aee4356845252ac6b662d5c72c29903813eJake Slack
18903928aee4356845252ac6b662d5c72c29903813eJake Slack
19003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
19103928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
19203928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param name
19303928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return Attribute associated with client
19403928aee4356845252ac6b662d5c72c29903813eJake Slack     */
19503928aee4356845252ac6b662d5c72c29903813eJake Slack    public Object getAttribute(String name)
19603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
19703928aee4356845252ac6b662d5c72c29903813eJake Slack        return _attributes.getAttribute(name);
19803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
19903928aee4356845252ac6b662d5c72c29903813eJake Slack
20003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
20103928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
20203928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return names of attributes associated with client
20303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
20403928aee4356845252ac6b662d5c72c29903813eJake Slack    public Enumeration getAttributeNames()
20503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
20603928aee4356845252ac6b662d5c72c29903813eJake Slack        return _attributes.getAttributeNames();
20703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
20803928aee4356845252ac6b662d5c72c29903813eJake Slack
20903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
21003928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
21103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param name
21203928aee4356845252ac6b662d5c72c29903813eJake Slack     */
21303928aee4356845252ac6b662d5c72c29903813eJake Slack    public void removeAttribute(String name)
21403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
21503928aee4356845252ac6b662d5c72c29903813eJake Slack        _attributes.removeAttribute(name);
21603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
21703928aee4356845252ac6b662d5c72c29903813eJake Slack
21803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
21903928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
22003928aee4356845252ac6b662d5c72c29903813eJake Slack     * Set an attribute on the HttpClient.
22103928aee4356845252ac6b662d5c72c29903813eJake Slack     * Attributes are not used by the client, but are provided for
22203928aee4356845252ac6b662d5c72c29903813eJake Slack     * so that users of a shared HttpClient may share other structures.
22303928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param name
22403928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param attribute
22503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
22603928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setAttribute(String name, Object attribute)
22703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
22803928aee4356845252ac6b662d5c72c29903813eJake Slack        _attributes.setAttribute(name,attribute);
22903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
23003928aee4356845252ac6b662d5c72c29903813eJake Slack
23103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
23203928aee4356845252ac6b662d5c72c29903813eJake Slack    public void clearAttributes()
23303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
23403928aee4356845252ac6b662d5c72c29903813eJake Slack        _attributes.clearAttributes();
23503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
23603928aee4356845252ac6b662d5c72c29903813eJake Slack
23703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------------------------- */
23803928aee4356845252ac6b662d5c72c29903813eJake Slack    public HttpDestination getDestination(Address remote, boolean ssl) throws IOException
23903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
24003928aee4356845252ac6b662d5c72c29903813eJake Slack        return getDestination(remote, ssl, getSslContextFactory());
24103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
24203928aee4356845252ac6b662d5c72c29903813eJake Slack
24303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------------------------- */
24403928aee4356845252ac6b662d5c72c29903813eJake Slack    public HttpDestination getDestination(Address remote, boolean ssl, SslContextFactory sslContextFactory) throws IOException
24503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
24603928aee4356845252ac6b662d5c72c29903813eJake Slack        if (remote == null)
24703928aee4356845252ac6b662d5c72c29903813eJake Slack            throw new UnknownHostException("Remote socket address cannot be null.");
24803928aee4356845252ac6b662d5c72c29903813eJake Slack
24903928aee4356845252ac6b662d5c72c29903813eJake Slack        HttpDestination destination = _destinations.get(remote);
25003928aee4356845252ac6b662d5c72c29903813eJake Slack        if (destination == null)
25103928aee4356845252ac6b662d5c72c29903813eJake Slack        {
25203928aee4356845252ac6b662d5c72c29903813eJake Slack            destination = new HttpDestination(this, remote, ssl, sslContextFactory);
25303928aee4356845252ac6b662d5c72c29903813eJake Slack            if (_proxy != null && (_noProxy == null || !_noProxy.contains(remote.getHost())))
25403928aee4356845252ac6b662d5c72c29903813eJake Slack            {
25503928aee4356845252ac6b662d5c72c29903813eJake Slack                destination.setProxy(_proxy);
25603928aee4356845252ac6b662d5c72c29903813eJake Slack                if (_proxyAuthentication != null)
25703928aee4356845252ac6b662d5c72c29903813eJake Slack                    destination.setProxyAuthentication(_proxyAuthentication);
25803928aee4356845252ac6b662d5c72c29903813eJake Slack            }
25903928aee4356845252ac6b662d5c72c29903813eJake Slack            HttpDestination other =_destinations.putIfAbsent(remote, destination);
26003928aee4356845252ac6b662d5c72c29903813eJake Slack            if (other!=null)
26103928aee4356845252ac6b662d5c72c29903813eJake Slack                destination=other;
26203928aee4356845252ac6b662d5c72c29903813eJake Slack        }
26303928aee4356845252ac6b662d5c72c29903813eJake Slack        return destination;
26403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
26503928aee4356845252ac6b662d5c72c29903813eJake Slack
26603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
26703928aee4356845252ac6b662d5c72c29903813eJake Slack    public void schedule(Timeout.Task task)
26803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
26903928aee4356845252ac6b662d5c72c29903813eJake Slack        _timeoutQ.schedule(task);
27003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
27103928aee4356845252ac6b662d5c72c29903813eJake Slack
27203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
27303928aee4356845252ac6b662d5c72c29903813eJake Slack    public void schedule(Timeout.Task task, long timeout)
27403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
27503928aee4356845252ac6b662d5c72c29903813eJake Slack        _timeoutQ.schedule(task, timeout - _timeoutQ.getDuration());
27603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
27703928aee4356845252ac6b662d5c72c29903813eJake Slack
27803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
27903928aee4356845252ac6b662d5c72c29903813eJake Slack    public void scheduleIdle(Timeout.Task task)
28003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
28103928aee4356845252ac6b662d5c72c29903813eJake Slack        _idleTimeoutQ.schedule(task);
28203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
28303928aee4356845252ac6b662d5c72c29903813eJake Slack
28403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
28503928aee4356845252ac6b662d5c72c29903813eJake Slack    public void cancel(Timeout.Task task)
28603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
28703928aee4356845252ac6b662d5c72c29903813eJake Slack        task.cancel();
28803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
28903928aee4356845252ac6b662d5c72c29903813eJake Slack
29003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
29103928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
29203928aee4356845252ac6b662d5c72c29903813eJake Slack     * Get whether the connector can use direct NIO buffers.
29303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
29403928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean getUseDirectBuffers()
29503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
29603928aee4356845252ac6b662d5c72c29903813eJake Slack        return _useDirectBuffers;
29703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
29803928aee4356845252ac6b662d5c72c29903813eJake Slack
29903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
30003928aee4356845252ac6b662d5c72c29903813eJake Slack    /** Set a RealmResolver for client Authentication.
30103928aee4356845252ac6b662d5c72c29903813eJake Slack     * If a realmResolver is set, then the HttpDestinations created by
30203928aee4356845252ac6b662d5c72c29903813eJake Slack     * this client will instantiate a {@link SecurityListener} so that
30303928aee4356845252ac6b662d5c72c29903813eJake Slack     * BASIC and DIGEST authentication can be performed.
30403928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param resolver
30503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
30603928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setRealmResolver(RealmResolver resolver)
30703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
30803928aee4356845252ac6b662d5c72c29903813eJake Slack        _realmResolver = resolver;
30903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
31003928aee4356845252ac6b662d5c72c29903813eJake Slack
31103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
31203928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
31303928aee4356845252ac6b662d5c72c29903813eJake Slack     * returns the SecurityRealmResolver reg_realmResolveristered with the HttpClient or null
31403928aee4356845252ac6b662d5c72c29903813eJake Slack     *
31503928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return the SecurityRealmResolver reg_realmResolveristered with the HttpClient or null
31603928aee4356845252ac6b662d5c72c29903813eJake Slack     */
31703928aee4356845252ac6b662d5c72c29903813eJake Slack    public RealmResolver getRealmResolver()
31803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
31903928aee4356845252ac6b662d5c72c29903813eJake Slack        return _realmResolver;
32003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
32103928aee4356845252ac6b662d5c72c29903813eJake Slack
32203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
32303928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean hasRealms()
32403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
32503928aee4356845252ac6b662d5c72c29903813eJake Slack        return _realmResolver == null ? false : true;
32603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
32703928aee4356845252ac6b662d5c72c29903813eJake Slack
32803928aee4356845252ac6b662d5c72c29903813eJake Slack
32903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
33003928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
33103928aee4356845252ac6b662d5c72c29903813eJake Slack     * Registers a listener that can listen to the stream of execution between the client and the
33203928aee4356845252ac6b662d5c72c29903813eJake Slack     * server and influence events.  Sequential calls to the method wrapper sequentially wrap the preceding
33303928aee4356845252ac6b662d5c72c29903813eJake Slack     * listener in a delegation model.
33403928aee4356845252ac6b662d5c72c29903813eJake Slack     * <p/>
33503928aee4356845252ac6b662d5c72c29903813eJake Slack     * NOTE: the SecurityListener is a special listener which doesn't need to be added via this
33603928aee4356845252ac6b662d5c72c29903813eJake Slack     * mechanic, if you register security realms then it will automatically be added as the top listener of the
33703928aee4356845252ac6b662d5c72c29903813eJake Slack     * delegation stack.
33803928aee4356845252ac6b662d5c72c29903813eJake Slack     *
33903928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param listenerClass
34003928aee4356845252ac6b662d5c72c29903813eJake Slack     */
34103928aee4356845252ac6b662d5c72c29903813eJake Slack    public void registerListener(String listenerClass)
34203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
34303928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_registeredListeners == null)
34403928aee4356845252ac6b662d5c72c29903813eJake Slack        {
34503928aee4356845252ac6b662d5c72c29903813eJake Slack            _registeredListeners = new LinkedList<String>();
34603928aee4356845252ac6b662d5c72c29903813eJake Slack        }
34703928aee4356845252ac6b662d5c72c29903813eJake Slack        _registeredListeners.add(listenerClass);
34803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
34903928aee4356845252ac6b662d5c72c29903813eJake Slack
35003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
35103928aee4356845252ac6b662d5c72c29903813eJake Slack    public LinkedList<String> getRegisteredListeners()
35203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
35303928aee4356845252ac6b662d5c72c29903813eJake Slack        return _registeredListeners;
35403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
35503928aee4356845252ac6b662d5c72c29903813eJake Slack
35603928aee4356845252ac6b662d5c72c29903813eJake Slack
35703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
35803928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
35903928aee4356845252ac6b662d5c72c29903813eJake Slack     * Set to use NIO direct buffers.
36003928aee4356845252ac6b662d5c72c29903813eJake Slack     *
36103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param direct If True (the default), the connector can use NIO direct
36203928aee4356845252ac6b662d5c72c29903813eJake Slack     *               buffers. Some JVMs have memory management issues (bugs) with
36303928aee4356845252ac6b662d5c72c29903813eJake Slack     *               direct buffers.
36403928aee4356845252ac6b662d5c72c29903813eJake Slack     */
36503928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setUseDirectBuffers(boolean direct)
36603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
36703928aee4356845252ac6b662d5c72c29903813eJake Slack        _useDirectBuffers = direct;
36803928aee4356845252ac6b662d5c72c29903813eJake Slack        setBufferTypes();
36903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
37003928aee4356845252ac6b662d5c72c29903813eJake Slack
37103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
37203928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
37303928aee4356845252ac6b662d5c72c29903813eJake Slack     * Get the type of connector (socket, blocking or select) in use.
37403928aee4356845252ac6b662d5c72c29903813eJake Slack     */
37503928aee4356845252ac6b662d5c72c29903813eJake Slack    public int getConnectorType()
37603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
37703928aee4356845252ac6b662d5c72c29903813eJake Slack        return _connectorType;
37803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
37903928aee4356845252ac6b662d5c72c29903813eJake Slack
38003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
38103928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setConnectorType(int connectorType)
38203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
38303928aee4356845252ac6b662d5c72c29903813eJake Slack        this._connectorType = connectorType;
38403928aee4356845252ac6b662d5c72c29903813eJake Slack        setBufferTypes();
38503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
38603928aee4356845252ac6b662d5c72c29903813eJake Slack
38703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
38803928aee4356845252ac6b662d5c72c29903813eJake Slack    public int getMaxConnectionsPerAddress()
38903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
39003928aee4356845252ac6b662d5c72c29903813eJake Slack        return _maxConnectionsPerAddress;
39103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
39203928aee4356845252ac6b662d5c72c29903813eJake Slack
39303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
39403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setMaxConnectionsPerAddress(int maxConnectionsPerAddress)
39503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
39603928aee4356845252ac6b662d5c72c29903813eJake Slack        _maxConnectionsPerAddress = maxConnectionsPerAddress;
39703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
39803928aee4356845252ac6b662d5c72c29903813eJake Slack
39903928aee4356845252ac6b662d5c72c29903813eJake Slack    public int getMaxQueueSizePerAddress()
40003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
40103928aee4356845252ac6b662d5c72c29903813eJake Slack        return _maxQueueSizePerAddress;
40203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
40303928aee4356845252ac6b662d5c72c29903813eJake Slack
40403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setMaxQueueSizePerAddress(int maxQueueSizePerAddress)
40503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
40603928aee4356845252ac6b662d5c72c29903813eJake Slack        this._maxQueueSizePerAddress = maxQueueSizePerAddress;
40703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
40803928aee4356845252ac6b662d5c72c29903813eJake Slack
40903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
41003928aee4356845252ac6b662d5c72c29903813eJake Slack    @Override
41103928aee4356845252ac6b662d5c72c29903813eJake Slack    protected void doStart() throws Exception
41203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
41303928aee4356845252ac6b662d5c72c29903813eJake Slack        setBufferTypes();
41403928aee4356845252ac6b662d5c72c29903813eJake Slack
41503928aee4356845252ac6b662d5c72c29903813eJake Slack        _timeoutQ.setDuration(_timeout);
41603928aee4356845252ac6b662d5c72c29903813eJake Slack        _timeoutQ.setNow();
41703928aee4356845252ac6b662d5c72c29903813eJake Slack        _idleTimeoutQ.setDuration(_idleTimeout);
41803928aee4356845252ac6b662d5c72c29903813eJake Slack        _idleTimeoutQ.setNow();
41903928aee4356845252ac6b662d5c72c29903813eJake Slack
42003928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_threadPool==null)
42103928aee4356845252ac6b662d5c72c29903813eJake Slack        {
42203928aee4356845252ac6b662d5c72c29903813eJake Slack            QueuedThreadPool pool = new LocalQueuedThreadPool();
42303928aee4356845252ac6b662d5c72c29903813eJake Slack            pool.setMaxThreads(16);
42403928aee4356845252ac6b662d5c72c29903813eJake Slack            pool.setDaemon(true);
42503928aee4356845252ac6b662d5c72c29903813eJake Slack            pool.setName("HttpClient");
42603928aee4356845252ac6b662d5c72c29903813eJake Slack            _threadPool = pool;
42703928aee4356845252ac6b662d5c72c29903813eJake Slack            addBean(_threadPool,true);
42803928aee4356845252ac6b662d5c72c29903813eJake Slack        }
42903928aee4356845252ac6b662d5c72c29903813eJake Slack
43003928aee4356845252ac6b662d5c72c29903813eJake Slack        _connector=(_connectorType == CONNECTOR_SELECT_CHANNEL)?new SelectConnector(this):new SocketConnector(this);
43103928aee4356845252ac6b662d5c72c29903813eJake Slack        addBean(_connector,true);
43203928aee4356845252ac6b662d5c72c29903813eJake Slack
43303928aee4356845252ac6b662d5c72c29903813eJake Slack        super.doStart();
43403928aee4356845252ac6b662d5c72c29903813eJake Slack
43503928aee4356845252ac6b662d5c72c29903813eJake Slack        _threadPool.dispatch(new Runnable()
43603928aee4356845252ac6b662d5c72c29903813eJake Slack        {
43703928aee4356845252ac6b662d5c72c29903813eJake Slack            public void run()
43803928aee4356845252ac6b662d5c72c29903813eJake Slack            {
43903928aee4356845252ac6b662d5c72c29903813eJake Slack                while (isRunning())
44003928aee4356845252ac6b662d5c72c29903813eJake Slack                {
44103928aee4356845252ac6b662d5c72c29903813eJake Slack                    _timeoutQ.tick(System.currentTimeMillis());
44203928aee4356845252ac6b662d5c72c29903813eJake Slack                    _idleTimeoutQ.tick(_timeoutQ.getNow());
44303928aee4356845252ac6b662d5c72c29903813eJake Slack                    try
44403928aee4356845252ac6b662d5c72c29903813eJake Slack                    {
44503928aee4356845252ac6b662d5c72c29903813eJake Slack                        Thread.sleep(200);
44603928aee4356845252ac6b662d5c72c29903813eJake Slack                    }
44703928aee4356845252ac6b662d5c72c29903813eJake Slack                    catch (InterruptedException ignored)
44803928aee4356845252ac6b662d5c72c29903813eJake Slack                    {
44903928aee4356845252ac6b662d5c72c29903813eJake Slack                    }
45003928aee4356845252ac6b662d5c72c29903813eJake Slack                }
45103928aee4356845252ac6b662d5c72c29903813eJake Slack            }
45203928aee4356845252ac6b662d5c72c29903813eJake Slack        });
45303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
45403928aee4356845252ac6b662d5c72c29903813eJake Slack
45503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
45603928aee4356845252ac6b662d5c72c29903813eJake Slack    @Override
45703928aee4356845252ac6b662d5c72c29903813eJake Slack    protected void doStop() throws Exception
45803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
45903928aee4356845252ac6b662d5c72c29903813eJake Slack        for (HttpDestination destination : _destinations.values())
46003928aee4356845252ac6b662d5c72c29903813eJake Slack            destination.close();
46103928aee4356845252ac6b662d5c72c29903813eJake Slack
46203928aee4356845252ac6b662d5c72c29903813eJake Slack        _timeoutQ.cancelAll();
46303928aee4356845252ac6b662d5c72c29903813eJake Slack        _idleTimeoutQ.cancelAll();
46403928aee4356845252ac6b662d5c72c29903813eJake Slack
46503928aee4356845252ac6b662d5c72c29903813eJake Slack        super.doStop();
46603928aee4356845252ac6b662d5c72c29903813eJake Slack
46703928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_threadPool instanceof LocalQueuedThreadPool)
46803928aee4356845252ac6b662d5c72c29903813eJake Slack        {
46903928aee4356845252ac6b662d5c72c29903813eJake Slack            removeBean(_threadPool);
47003928aee4356845252ac6b662d5c72c29903813eJake Slack            _threadPool = null;
47103928aee4356845252ac6b662d5c72c29903813eJake Slack        }
47203928aee4356845252ac6b662d5c72c29903813eJake Slack
47303928aee4356845252ac6b662d5c72c29903813eJake Slack        removeBean(_connector);
47403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
47503928aee4356845252ac6b662d5c72c29903813eJake Slack
47603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
47703928aee4356845252ac6b662d5c72c29903813eJake Slack    interface Connector extends LifeCycle
47803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
47903928aee4356845252ac6b662d5c72c29903813eJake Slack        public void startConnection(HttpDestination destination) throws IOException;
48003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
48103928aee4356845252ac6b662d5c72c29903813eJake Slack
48203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
48303928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
48403928aee4356845252ac6b662d5c72c29903813eJake Slack     * if a keystore location has been provided then client will attempt to use it as the keystore,
48503928aee4356845252ac6b662d5c72c29903813eJake Slack     * otherwise we simply ignore certificates and run with a loose ssl context.
48603928aee4356845252ac6b662d5c72c29903813eJake Slack     *
48703928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return the SSL context
48803928aee4356845252ac6b662d5c72c29903813eJake Slack     */
48903928aee4356845252ac6b662d5c72c29903813eJake Slack    protected SSLContext getSSLContext()
49003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
49103928aee4356845252ac6b662d5c72c29903813eJake Slack        return _sslContextFactory.getSslContext();
49203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
49303928aee4356845252ac6b662d5c72c29903813eJake Slack
49403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
49503928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
49603928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return the instance of SslContextFactory associated with the client
49703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
49803928aee4356845252ac6b662d5c72c29903813eJake Slack    public SslContextFactory getSslContextFactory()
49903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
50003928aee4356845252ac6b662d5c72c29903813eJake Slack        return _sslContextFactory;
50103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
50203928aee4356845252ac6b662d5c72c29903813eJake Slack
50303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
50403928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
50503928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return the period in milliseconds a {@link AbstractHttpConnection} can be idle for before it is closed.
50603928aee4356845252ac6b662d5c72c29903813eJake Slack     */
50703928aee4356845252ac6b662d5c72c29903813eJake Slack    public long getIdleTimeout()
50803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
50903928aee4356845252ac6b662d5c72c29903813eJake Slack        return _idleTimeout;
51003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
51103928aee4356845252ac6b662d5c72c29903813eJake Slack
51203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
51303928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
51403928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param ms the period in milliseconds a {@link AbstractHttpConnection} can be idle for before it is closed.
51503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
51603928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setIdleTimeout(long ms)
51703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
51803928aee4356845252ac6b662d5c72c29903813eJake Slack        _idleTimeout = ms;
51903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
52003928aee4356845252ac6b662d5c72c29903813eJake Slack
52103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
52203928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
52303928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return the period in ms that an exchange will wait for a response from the server.
52403928aee4356845252ac6b662d5c72c29903813eJake Slack     * @deprecated use {@link #getTimeout()} instead.
52503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
52603928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
52703928aee4356845252ac6b662d5c72c29903813eJake Slack    public int getSoTimeout()
52803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
52903928aee4356845252ac6b662d5c72c29903813eJake Slack        return Long.valueOf(getTimeout()).intValue();
53003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
53103928aee4356845252ac6b662d5c72c29903813eJake Slack
53203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
53303928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
53403928aee4356845252ac6b662d5c72c29903813eJake Slack     * @deprecated use {@link #setTimeout(long)} instead.
53503928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param timeout the period in ms that an exchange will wait for a response from the server.
53603928aee4356845252ac6b662d5c72c29903813eJake Slack     */
53703928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
53803928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setSoTimeout(int timeout)
53903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
54003928aee4356845252ac6b662d5c72c29903813eJake Slack        setTimeout(timeout);
54103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
54203928aee4356845252ac6b662d5c72c29903813eJake Slack
54303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
54403928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
54503928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return the period in ms that an exchange will wait for a response from the server.
54603928aee4356845252ac6b662d5c72c29903813eJake Slack     */
54703928aee4356845252ac6b662d5c72c29903813eJake Slack    public long getTimeout()
54803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
54903928aee4356845252ac6b662d5c72c29903813eJake Slack        return _timeout;
55003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
55103928aee4356845252ac6b662d5c72c29903813eJake Slack
55203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
55303928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
55403928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param timeout the period in ms that an exchange will wait for a response from the server.
55503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
55603928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setTimeout(long timeout)
55703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
55803928aee4356845252ac6b662d5c72c29903813eJake Slack        _timeout = timeout;
55903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
56003928aee4356845252ac6b662d5c72c29903813eJake Slack
56103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
56203928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
56303928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return the period in ms before timing out an attempt to connect
56403928aee4356845252ac6b662d5c72c29903813eJake Slack     */
56503928aee4356845252ac6b662d5c72c29903813eJake Slack    public int getConnectTimeout()
56603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
56703928aee4356845252ac6b662d5c72c29903813eJake Slack        return _connectTimeout;
56803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
56903928aee4356845252ac6b662d5c72c29903813eJake Slack
57003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
57103928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
57203928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param connectTimeout the period in ms before timing out an attempt to connect
57303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
57403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setConnectTimeout(int connectTimeout)
57503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
57603928aee4356845252ac6b662d5c72c29903813eJake Slack        this._connectTimeout = connectTimeout;
57703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
57803928aee4356845252ac6b662d5c72c29903813eJake Slack
57903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
58003928aee4356845252ac6b662d5c72c29903813eJake Slack    public Address getProxy()
58103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
58203928aee4356845252ac6b662d5c72c29903813eJake Slack        return _proxy;
58303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
58403928aee4356845252ac6b662d5c72c29903813eJake Slack
58503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
58603928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setProxy(Address proxy)
58703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
58803928aee4356845252ac6b662d5c72c29903813eJake Slack        this._proxy = proxy;
58903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
59003928aee4356845252ac6b662d5c72c29903813eJake Slack
59103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
59203928aee4356845252ac6b662d5c72c29903813eJake Slack    public Authentication getProxyAuthentication()
59303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
59403928aee4356845252ac6b662d5c72c29903813eJake Slack        return _proxyAuthentication;
59503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
59603928aee4356845252ac6b662d5c72c29903813eJake Slack
59703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
59803928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setProxyAuthentication(Authentication authentication)
59903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
60003928aee4356845252ac6b662d5c72c29903813eJake Slack        _proxyAuthentication = authentication;
60103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
60203928aee4356845252ac6b662d5c72c29903813eJake Slack
60303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
60403928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean isProxied()
60503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
60603928aee4356845252ac6b662d5c72c29903813eJake Slack        return this._proxy != null;
60703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
60803928aee4356845252ac6b662d5c72c29903813eJake Slack
60903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
61003928aee4356845252ac6b662d5c72c29903813eJake Slack    public Set<String> getNoProxy()
61103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
61203928aee4356845252ac6b662d5c72c29903813eJake Slack        return _noProxy;
61303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
61403928aee4356845252ac6b662d5c72c29903813eJake Slack
61503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
61603928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setNoProxy(Set<String> noProxyAddresses)
61703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
61803928aee4356845252ac6b662d5c72c29903813eJake Slack        _noProxy = noProxyAddresses;
61903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
62003928aee4356845252ac6b662d5c72c29903813eJake Slack
62103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
62203928aee4356845252ac6b662d5c72c29903813eJake Slack    public int maxRetries()
62303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
62403928aee4356845252ac6b662d5c72c29903813eJake Slack        return _maxRetries;
62503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
62603928aee4356845252ac6b662d5c72c29903813eJake Slack
62703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
62803928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setMaxRetries(int retries)
62903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
63003928aee4356845252ac6b662d5c72c29903813eJake Slack        _maxRetries = retries;
63103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
63203928aee4356845252ac6b662d5c72c29903813eJake Slack
63303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
63403928aee4356845252ac6b662d5c72c29903813eJake Slack    public int maxRedirects()
63503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
63603928aee4356845252ac6b662d5c72c29903813eJake Slack        return _maxRedirects;
63703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
63803928aee4356845252ac6b662d5c72c29903813eJake Slack
63903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
64003928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setMaxRedirects(int redirects)
64103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
64203928aee4356845252ac6b662d5c72c29903813eJake Slack        _maxRedirects = redirects;
64303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
64403928aee4356845252ac6b662d5c72c29903813eJake Slack
64503928aee4356845252ac6b662d5c72c29903813eJake Slack    public int getRequestBufferSize()
64603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
64703928aee4356845252ac6b662d5c72c29903813eJake Slack        return _buffers.getRequestBufferSize();
64803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
64903928aee4356845252ac6b662d5c72c29903813eJake Slack
65003928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setRequestBufferSize(int requestBufferSize)
65103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
65203928aee4356845252ac6b662d5c72c29903813eJake Slack        _buffers.setRequestBufferSize(requestBufferSize);
65303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
65403928aee4356845252ac6b662d5c72c29903813eJake Slack
65503928aee4356845252ac6b662d5c72c29903813eJake Slack    public int getRequestHeaderSize()
65603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
65703928aee4356845252ac6b662d5c72c29903813eJake Slack        return _buffers.getRequestHeaderSize();
65803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
65903928aee4356845252ac6b662d5c72c29903813eJake Slack
66003928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setRequestHeaderSize(int requestHeaderSize)
66103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
66203928aee4356845252ac6b662d5c72c29903813eJake Slack        _buffers.setRequestHeaderSize(requestHeaderSize);
66303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
66403928aee4356845252ac6b662d5c72c29903813eJake Slack
66503928aee4356845252ac6b662d5c72c29903813eJake Slack    public int getResponseBufferSize()
66603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
66703928aee4356845252ac6b662d5c72c29903813eJake Slack        return _buffers.getResponseBufferSize();
66803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
66903928aee4356845252ac6b662d5c72c29903813eJake Slack
67003928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setResponseBufferSize(int responseBufferSize)
67103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
67203928aee4356845252ac6b662d5c72c29903813eJake Slack        _buffers.setResponseBufferSize(responseBufferSize);
67303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
67403928aee4356845252ac6b662d5c72c29903813eJake Slack
67503928aee4356845252ac6b662d5c72c29903813eJake Slack    public int getResponseHeaderSize()
67603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
67703928aee4356845252ac6b662d5c72c29903813eJake Slack        return _buffers.getResponseHeaderSize();
67803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
67903928aee4356845252ac6b662d5c72c29903813eJake Slack
68003928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setResponseHeaderSize(int responseHeaderSize)
68103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
68203928aee4356845252ac6b662d5c72c29903813eJake Slack        _buffers.setResponseHeaderSize(responseHeaderSize);
68303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
68403928aee4356845252ac6b662d5c72c29903813eJake Slack
68503928aee4356845252ac6b662d5c72c29903813eJake Slack    public Type getRequestBufferType()
68603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
68703928aee4356845252ac6b662d5c72c29903813eJake Slack        return _buffers.getRequestBufferType();
68803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
68903928aee4356845252ac6b662d5c72c29903813eJake Slack
69003928aee4356845252ac6b662d5c72c29903813eJake Slack    public Type getRequestHeaderType()
69103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
69203928aee4356845252ac6b662d5c72c29903813eJake Slack        return _buffers.getRequestHeaderType();
69303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
69403928aee4356845252ac6b662d5c72c29903813eJake Slack
69503928aee4356845252ac6b662d5c72c29903813eJake Slack    public Type getResponseBufferType()
69603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
69703928aee4356845252ac6b662d5c72c29903813eJake Slack        return _buffers.getResponseBufferType();
69803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
69903928aee4356845252ac6b662d5c72c29903813eJake Slack
70003928aee4356845252ac6b662d5c72c29903813eJake Slack    public Type getResponseHeaderType()
70103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
70203928aee4356845252ac6b662d5c72c29903813eJake Slack        return _buffers.getResponseHeaderType();
70303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
70403928aee4356845252ac6b662d5c72c29903813eJake Slack
70503928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setRequestBuffers(Buffers requestBuffers)
70603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
70703928aee4356845252ac6b662d5c72c29903813eJake Slack        _buffers.setRequestBuffers(requestBuffers);
70803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
70903928aee4356845252ac6b662d5c72c29903813eJake Slack
71003928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setResponseBuffers(Buffers responseBuffers)
71103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
71203928aee4356845252ac6b662d5c72c29903813eJake Slack        _buffers.setResponseBuffers(responseBuffers);
71303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
71403928aee4356845252ac6b662d5c72c29903813eJake Slack
71503928aee4356845252ac6b662d5c72c29903813eJake Slack    public Buffers getRequestBuffers()
71603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
71703928aee4356845252ac6b662d5c72c29903813eJake Slack        return _buffers.getRequestBuffers();
71803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
71903928aee4356845252ac6b662d5c72c29903813eJake Slack
72003928aee4356845252ac6b662d5c72c29903813eJake Slack    public Buffers getResponseBuffers()
72103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
72203928aee4356845252ac6b662d5c72c29903813eJake Slack        return _buffers.getResponseBuffers();
72303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
72403928aee4356845252ac6b662d5c72c29903813eJake Slack
72503928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setMaxBuffers(int maxBuffers)
72603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
72703928aee4356845252ac6b662d5c72c29903813eJake Slack        _buffers.setMaxBuffers(maxBuffers);
72803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
72903928aee4356845252ac6b662d5c72c29903813eJake Slack
73003928aee4356845252ac6b662d5c72c29903813eJake Slack    public int getMaxBuffers()
73103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
73203928aee4356845252ac6b662d5c72c29903813eJake Slack        return _buffers.getMaxBuffers();
73303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
73403928aee4356845252ac6b662d5c72c29903813eJake Slack
73503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
73603928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
73703928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getTrustStoreLocation()
73803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
73903928aee4356845252ac6b662d5c72c29903813eJake Slack        return _sslContextFactory.getTrustStore();
74003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
74103928aee4356845252ac6b662d5c72c29903813eJake Slack
74203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
74303928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
74403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setTrustStoreLocation(String trustStoreLocation)
74503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
74603928aee4356845252ac6b662d5c72c29903813eJake Slack        _sslContextFactory.setTrustStore(trustStoreLocation);
74703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
74803928aee4356845252ac6b662d5c72c29903813eJake Slack
74903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
75003928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
75103928aee4356845252ac6b662d5c72c29903813eJake Slack    public InputStream getTrustStoreInputStream()
75203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
75303928aee4356845252ac6b662d5c72c29903813eJake Slack        return _sslContextFactory.getTrustStoreInputStream();
75403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
75503928aee4356845252ac6b662d5c72c29903813eJake Slack
75603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
75703928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
75803928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setTrustStoreInputStream(InputStream trustStoreInputStream)
75903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
76003928aee4356845252ac6b662d5c72c29903813eJake Slack        _sslContextFactory.setTrustStoreInputStream(trustStoreInputStream);
76103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
76203928aee4356845252ac6b662d5c72c29903813eJake Slack
76303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
76403928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
76503928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getKeyStoreLocation()
76603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
76703928aee4356845252ac6b662d5c72c29903813eJake Slack        return _sslContextFactory.getKeyStorePath();
76803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
76903928aee4356845252ac6b662d5c72c29903813eJake Slack
77003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
77103928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
77203928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setKeyStoreLocation(String keyStoreLocation)
77303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
77403928aee4356845252ac6b662d5c72c29903813eJake Slack        _sslContextFactory.setKeyStorePath(keyStoreLocation);
77503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
77603928aee4356845252ac6b662d5c72c29903813eJake Slack
77703928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
77803928aee4356845252ac6b662d5c72c29903813eJake Slack    public InputStream getKeyStoreInputStream()
77903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
78003928aee4356845252ac6b662d5c72c29903813eJake Slack        return _sslContextFactory.getKeyStoreInputStream();
78103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
78203928aee4356845252ac6b662d5c72c29903813eJake Slack
78303928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
78403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setKeyStoreInputStream(InputStream keyStoreInputStream)
78503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
78603928aee4356845252ac6b662d5c72c29903813eJake Slack        _sslContextFactory.setKeyStoreInputStream(keyStoreInputStream);
78703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
78803928aee4356845252ac6b662d5c72c29903813eJake Slack
78903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
79003928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
79103928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setKeyStorePassword(String keyStorePassword)
79203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
79303928aee4356845252ac6b662d5c72c29903813eJake Slack        _sslContextFactory.setKeyStorePassword(keyStorePassword);
79403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
79503928aee4356845252ac6b662d5c72c29903813eJake Slack
79603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
79703928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
79803928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setKeyManagerPassword(String keyManagerPassword)
79903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
80003928aee4356845252ac6b662d5c72c29903813eJake Slack        _sslContextFactory.setKeyManagerPassword(keyManagerPassword);
80103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
80203928aee4356845252ac6b662d5c72c29903813eJake Slack
80303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
80403928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
80503928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setTrustStorePassword(String trustStorePassword)
80603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
80703928aee4356845252ac6b662d5c72c29903813eJake Slack        _sslContextFactory.setTrustStorePassword(trustStorePassword);
80803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
80903928aee4356845252ac6b662d5c72c29903813eJake Slack
81003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
81103928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
81203928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getKeyStoreType()
81303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
81403928aee4356845252ac6b662d5c72c29903813eJake Slack        return _sslContextFactory.getKeyStoreType();
81503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
81603928aee4356845252ac6b662d5c72c29903813eJake Slack
81703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
81803928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
81903928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setKeyStoreType(String keyStoreType)
82003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
82103928aee4356845252ac6b662d5c72c29903813eJake Slack        _sslContextFactory.setKeyStoreType(keyStoreType);
82203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
82303928aee4356845252ac6b662d5c72c29903813eJake Slack
82403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
82503928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
82603928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getTrustStoreType()
82703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
82803928aee4356845252ac6b662d5c72c29903813eJake Slack        return _sslContextFactory.getTrustStoreType();
82903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
83003928aee4356845252ac6b662d5c72c29903813eJake Slack
83103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
83203928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
83303928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setTrustStoreType(String trustStoreType)
83403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
83503928aee4356845252ac6b662d5c72c29903813eJake Slack        _sslContextFactory.setTrustStoreType(trustStoreType);
83603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
83703928aee4356845252ac6b662d5c72c29903813eJake Slack
83803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
83903928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
84003928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getKeyManagerAlgorithm()
84103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
84203928aee4356845252ac6b662d5c72c29903813eJake Slack        return _sslContextFactory.getSslKeyManagerFactoryAlgorithm();
84303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
84403928aee4356845252ac6b662d5c72c29903813eJake Slack
84503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
84603928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
84703928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setKeyManagerAlgorithm(String keyManagerAlgorithm)
84803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
84903928aee4356845252ac6b662d5c72c29903813eJake Slack        _sslContextFactory.setSslKeyManagerFactoryAlgorithm(keyManagerAlgorithm);
85003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
85103928aee4356845252ac6b662d5c72c29903813eJake Slack
85203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
85303928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
85403928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getTrustManagerAlgorithm()
85503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
85603928aee4356845252ac6b662d5c72c29903813eJake Slack        return _sslContextFactory.getTrustManagerFactoryAlgorithm();
85703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
85803928aee4356845252ac6b662d5c72c29903813eJake Slack
85903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
86003928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
86103928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setTrustManagerAlgorithm(String trustManagerAlgorithm)
86203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
86303928aee4356845252ac6b662d5c72c29903813eJake Slack        _sslContextFactory.setTrustManagerFactoryAlgorithm(trustManagerAlgorithm);
86403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
86503928aee4356845252ac6b662d5c72c29903813eJake Slack
86603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
86703928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
86803928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getProtocol()
86903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
87003928aee4356845252ac6b662d5c72c29903813eJake Slack        return _sslContextFactory.getProtocol();
87103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
87203928aee4356845252ac6b662d5c72c29903813eJake Slack
87303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
87403928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
87503928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setProtocol(String protocol)
87603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
87703928aee4356845252ac6b662d5c72c29903813eJake Slack        _sslContextFactory.setProtocol(protocol);
87803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
87903928aee4356845252ac6b662d5c72c29903813eJake Slack
88003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
88103928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
88203928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getProvider()
88303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
88403928aee4356845252ac6b662d5c72c29903813eJake Slack        return _sslContextFactory.getProvider();
88503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
88603928aee4356845252ac6b662d5c72c29903813eJake Slack
88703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
88803928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
88903928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setProvider(String provider)
89003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
89103928aee4356845252ac6b662d5c72c29903813eJake Slack        _sslContextFactory.setProvider(provider);
89203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
89303928aee4356845252ac6b662d5c72c29903813eJake Slack
89403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
89503928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
89603928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getSecureRandomAlgorithm()
89703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
89803928aee4356845252ac6b662d5c72c29903813eJake Slack        return _sslContextFactory.getSecureRandomAlgorithm();
89903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
90003928aee4356845252ac6b662d5c72c29903813eJake Slack
90103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
90203928aee4356845252ac6b662d5c72c29903813eJake Slack    @Deprecated
90303928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setSecureRandomAlgorithm(String secureRandomAlgorithm)
90403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
90503928aee4356845252ac6b662d5c72c29903813eJake Slack        _sslContextFactory.setSecureRandomAlgorithm(secureRandomAlgorithm);
90603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
90703928aee4356845252ac6b662d5c72c29903813eJake Slack
90803928aee4356845252ac6b662d5c72c29903813eJake Slack    private static class LocalQueuedThreadPool extends QueuedThreadPool
90903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
91003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
91103928aee4356845252ac6b662d5c72c29903813eJake Slack}
912