// Path: client/src/main/java/com/nesscomputing/httpclient/internal/HttpClientBodySource.java
// public interface HttpClientBodySource
// {
//     void setContentType(String contentType);
// 
//     void setContentEncoding(String contentEncoding);
// 
//     InputStream getContent() throws IOException;
// }
// 
// Path: client/src/main/java/com/nesscomputing/httpclient/internal/HttpClientFactory.java
// public interface HttpClientFactory
// {
//     /**
//      * Start the Factory. Must be called before any other method can be used.
//      */
//     void start();
// 
//     /**
//      * Stop the Factory. Should free all resources and shut down all connections. After stop() has been called,
//      * the factory should throw exceptions on all related method calls.
//      */
// 	void stop();
// 
// 	/**
// 	 * True if the start() method was invoked successfully.
// 	 */
// 	boolean isStarted();
// 
//     /**
//      * True if the stop() method was invoked successfully.
//      */
// 	boolean isStopped();
// 
//     /**
//      * @return a {@link HttpClientConnectionContext} object to modify settings for this factory.
//      */
//     HttpClientConnectionContext getConnectionContext();
// 
//     /**
//      * For requests that accept a body, generate a {@link HttpClientBodySource} object that wraps
//      * the content object. Can return null if no appropriate body source is available.
//      */
// 	@CheckForNull
//     HttpClientBodySource getHttpBodySourceFor(Object content);
// 
//     /**
//      * Execute a request to a remote server.
//      */
//     <T> T performRequest(HttpClientRequest<T> request) throws IOException;
// }
// 
// Path: client/src/main/java/com/nesscomputing/httpclient/internal/HttpClientHeader.java
// @Immutable
// public class HttpClientHeader
// {
//     private final String name;
//     private final String value;
// 
//     /**
//      * Create a new header.
// 	 * @param name header name
// 	 * @param value header value
// 	 */
//     public HttpClientHeader(final String name, final String value)
//     {
//         this.name = name;
//         this.value = value;
//     }
// 
//     /**
//      * @return the header name.
//      */
//     public String getName()
//     {
//         return name;
//     }
// 
//     /**
//      * @return the header value.
//      */
//     public String getValue()
//     {
//         return value;
//     }
// }
// 
// Path: client/src/main/java/com/nesscomputing/httpclient/internal/HttpClientMethod.java
// public enum HttpClientMethod
// {
//     GET, POST, PUT, DELETE, HEAD, OPTIONS;
// }


import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLEncoder;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.annotation.Nonnull;
import javax.servlet.http.Cookie;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.nesscomputing.httpclient.internal.HttpClientBodySource;
import com.nesscomputing.httpclient.internal.HttpClientFactory;
import com.nesscomputing.httpclient.internal.HttpClientHeader;
import com.nesscomputing.httpclient.internal.HttpClientMethod;
        return httpClientFactory;
    }

    public static final class Builder<Type>
    {
        private final List<HttpClientHeader> headers = Lists.newArrayList();
        private final List<Cookie> cookies = Lists.newArrayList();
        private final Map<String, Object> parameters = Maps.newHashMap();

        private final HttpClientFactory httpClientFactory;
        private final HttpClientResponseHandler<Type> httpHandler;

        private URI url;
        private final HttpClientMethod httpMethod;
        private String virtualHost;
        private int virtualPort;

        private Object content;
        private String contentType;
        private String contentEncoding;

        private Boolean followRedirects;

        private final List<HttpClientAuthProvider> authProviders = Lists.newArrayList();

        public static <T> Builder<T> fromRequest(final HttpClientRequest<T> request)
        {
            return new Builder<T>(request);
        }

// Path: client/src/main/java/com/nesscomputing/httpclient/internal/HttpClientBodySource.java
// public interface HttpClientBodySource
// {
//     void setContentType(String contentType);
// 
//     void setContentEncoding(String contentEncoding);
// 
//     InputStream getContent() throws IOException;
// }
// 
// Path: client/src/main/java/com/nesscomputing/httpclient/internal/HttpClientFactory.java
// public interface HttpClientFactory
// {
//     /**
//      * Start the Factory. Must be called before any other method can be used.
//      */
//     void start();
// 
//     /**
//      * Stop the Factory. Should free all resources and shut down all connections. After stop() has been called,
//      * the factory should throw exceptions on all related method calls.
//      */
// 	void stop();
// 
// 	/**
// 	 * True if the start() method was invoked successfully.
// 	 */
// 	boolean isStarted();
// 
//     /**
//      * True if the stop() method was invoked successfully.
//      */
// 	boolean isStopped();
// 
//     /**
//      * @return a {@link HttpClientConnectionContext} object to modify settings for this factory.
//      */
//     HttpClientConnectionContext getConnectionContext();
// 
//     /**
//      * For requests that accept a body, generate a {@link HttpClientBodySource} object that wraps
//      * the content object. Can return null if no appropriate body source is available.
//      */
// 	@CheckForNull
//     HttpClientBodySource getHttpBodySourceFor(Object content);
// 
//     /**
//      * Execute a request to a remote server.
//      */
//     <T> T performRequest(HttpClientRequest<T> request) throws IOException;
// }
// 
// Path: client/src/main/java/com/nesscomputing/httpclient/internal/HttpClientHeader.java
// @Immutable
// public class HttpClientHeader
// {
//     private final String name;
//     private final String value;
// 
//     /**
//      * Create a new header.
// 	 * @param name header name
// 	 * @param value header value
// 	 */
//     public HttpClientHeader(final String name, final String value)
//     {
//         this.name = name;
//         this.value = value;
//     }
// 
//     /**
//      * @return the header name.
//      */
//     public String getName()
//     {
//         return name;
//     }
// 
//     /**
//      * @return the header value.
//      */
//     public String getValue()
//     {
//         return value;
//     }
// }
// 
// Path: client/src/main/java/com/nesscomputing/httpclient/internal/HttpClientMethod.java
// public enum HttpClientMethod
// {
//     GET, POST, PUT, DELETE, HEAD, OPTIONS;
// }


// Path: client/src/main/java/com/nesscomputing/httpclient/HttpClientRequest.java
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLEncoder;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.annotation.Nonnull;
import javax.servlet.http.Cookie;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.nesscomputing.httpclient.internal.HttpClientBodySource;
import com.nesscomputing.httpclient.internal.HttpClientFactory;
import com.nesscomputing.httpclient.internal.HttpClientHeader;
import com.nesscomputing.httpclient.internal.HttpClientMethod;

        return httpClientFactory;
    }

    public static final class Builder<Type>
    {
        private final List<HttpClientHeader> headers = Lists.newArrayList();
        private final List<Cookie> cookies = Lists.newArrayList();
        private final Map<String, Object> parameters = Maps.newHashMap();

        private final HttpClientFactory httpClientFactory;
        private final HttpClientResponseHandler<Type> httpHandler;

        private URI url;
        private final HttpClientMethod httpMethod;
        private String virtualHost;
        private int virtualPort;

        private Object content;
        private String contentType;
        private String contentEncoding;

        private Boolean followRedirects;

        private final List<HttpClientAuthProvider> authProviders = Lists.newArrayList();

        public static <T> Builder<T> fromRequest(final HttpClientRequest<T> request)
        {
            return new Builder<T>(request);
        }

        <T> Builder(final HttpClientFactory httpClientFactory, final HttpClientMethod httpMethod, final URI url, final HttpClientResponseHandler<Type> httpHandler)