// 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;
/**
 * Copyright (C) 2012 Ness Computing, Inc.
 *
 * Licensed 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 com.nesscomputing.httpclient;







/**
 * A request to a remote server. Composed step-by-step using a builder.
 */
public class HttpClientRequest<T>
{
    private final HttpClientFactory httpClientFactory;

    private final HttpClientMethod httpMethod;
    private final URI url;
    private final HttpClientResponseHandler<T> httpHandler;
// 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;

/**
 * Copyright (C) 2012 Ness Computing, Inc.
 *
 * Licensed 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 com.nesscomputing.httpclient;







/**
 * A request to a remote server. Composed step-by-step using a builder.
 */
public class HttpClientRequest<T>
{
    private final HttpClientFactory httpClientFactory;

    private final HttpClientMethod httpMethod;
    private final URI url;
    private final HttpClientResponseHandler<T> httpHandler;
    private List<HttpClientHeader> headers = Collections.emptyList();