This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 931eb64  Context API refactoring.
931eb64 is described below

commit 931eb6417660d8f1ca05babd29f30e326d120a27
Author: JamesBognar <[email protected]>
AuthorDate: Thu Sep 23 15:39:17 2021 -0400

    Context API refactoring.
---
 .../org/apache/juneau/rest/client/RestClient.java  |   10 +-
 .../juneau/rest/client/RestClientBuilder.java      | 1668 +++++++++-----------
 .../juneau/rest/mock/MockRestClientBuilder.java    |  109 --
 .../rest/client/RestClient_BasicCalls_Test.java    |    4 +-
 .../client/RestClient_Config_RestClient_Test.java  |    4 +-
 .../rest/client/RestClient_Headers_Test.java       |  117 +-
 6 files changed, 793 insertions(+), 1119 deletions(-)

diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
index 04ca304..72126f4 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
@@ -330,12 +330,10 @@ import org.apache.juneau.utils.*;
  * <ul class='javatree'>
  *     <li class='jc'>{@link RestClientBuilder}
  *     <ul>
- *             <li class='jm'>{@link RestClientBuilder#getHeaderData() 
getHeaderData()}
+ *             <li class='jm'>{@link RestClientBuilder#headerData() 
headerData()}
  *             <li class='jm'>{@link RestClientBuilder#header(String,String) 
header(String,Object)}
  *             <li class='jm'>{@link RestClientBuilder#header(String,Supplier) 
header(String,Supplier&lt;?&gt;)}
- *             <li class='jm'>{@link RestClientBuilder#header(Header) 
header(Header)}
  *             <li class='jm'>{@link RestClientBuilder#headers(Header...) 
headers(Header...)}
- *             <li class='jm'>{@link RestClientBuilder#headerPairs(String...) 
headerPairs(String...)}
  *             <li class='jm'>{@link 
RestClientBuilder#defaultHeaders(Header...) defaultHeaders(Header...)}
  *     </ul>
  *     <li class='jc'>{@link RestRequest}
@@ -1741,7 +1739,6 @@ public class RestClient extends BeanContextable 
implements HttpClient, Closeable
         */
        public static final String RESTCLIENT_skipEmptyQueryData = PREFIX + 
"skipEmptyQueryData.b";
 
-       static final String RESTCLIENT_INTERNAL_headerDataBuilder = PREFIX + 
"headerDataBuilder.o";
        static final String RESTCLIENT_INTERNAL_formDataBuilder = PREFIX + 
"formDataBuilder.o";
        static final String RESTCLIENT_INTERNAL_queryDataBuilder = PREFIX + 
"queryBuilder.o";
        static final String RESTCLIENT_INTERNAL_pathDataBuilder = PREFIX + 
"pathDataBuilder.o";
@@ -1811,10 +1808,11 @@ public class RestClient extends BeanContextable 
implements HttpClient, Closeable
         */
        public RestClient(RestClientBuilder builder) {
                super(builder);
-               this.httpClient = builder.getHttpClient();
+
+               httpClient = builder.getHttpClient();
+               headerData = builder.headerData().build().copy();
 
                ContextProperties cp = 
getContextProperties().copy().apply(getBeanContext().getContextProperties()).build();
-               this.headerData = 
cp.getInstance(RESTCLIENT_INTERNAL_headerDataBuilder, 
HeaderList.Builder.class).orElseGet(HeaderList.Builder::new).copy();
                this.queryData = 
cp.getInstance(RESTCLIENT_INTERNAL_queryDataBuilder, 
PartList.Builder.class).orElseGet(PartList.Builder::new).copy();
                this.formData = 
cp.getInstance(RESTCLIENT_INTERNAL_formDataBuilder, 
PartList.Builder.class).orElseGet(PartList.Builder::new).copy();
                this.pathData = 
cp.getInstance(RESTCLIENT_INTERNAL_pathDataBuilder, 
PartList.Builder.class).orElseGet(PartList.Builder::new).copy();
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
index 75b842d..3e9b565 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
@@ -20,7 +20,6 @@ import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.net.*;
 import java.net.URI;
-import java.time.*;
 import java.util.*;
 import java.util.concurrent.*;
 import java.util.function.*;
@@ -49,7 +48,6 @@ import org.apache.juneau.annotation.*;
 import org.apache.juneau.html.*;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.http.header.*;
-import org.apache.juneau.http.header.Date;
 import org.apache.juneau.http.part.*;
 import org.apache.juneau.httppart.*;
 import org.apache.juneau.internal.*;
@@ -111,7 +109,6 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         */
        protected RestClientBuilder() {
                super();
-               this.headerData = HeaderList.create();
                this.queryData = PartList.create();
                this.formData = PartList.create();
                this.pathData = PartList.create();
@@ -141,25 +138,34 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
                return (T)super.build();
        }
 
-       private ContextProperties contextProperties() {
-               set(RESTCLIENT_INTERNAL_headerDataBuilder, headerData);
-               set(RESTCLIENT_INTERNAL_formDataBuilder, formData);
-               set(RESTCLIENT_INTERNAL_queryDataBuilder, queryData);
-               set(RESTCLIENT_INTERNAL_pathDataBuilder, pathData);
-               return getContextProperties();
-       }
-
        /**
-        * Returns the builder for the header parameter list.
+        * Allows you to apply a consumer to this builder.
         *
         * <p>
-        * Allows you to perform operations on the header parameters that 
aren't otherwise exposed on this API, such
-        * as Prepend/Replace/Default operations.
+        * Typically used to allow you to execute operations on sub-builders 
without breaking the fluent flow of the client builder.
         *
-        * @return The header parameter list builder.
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .apply(<jv>x</jv> -&gt; 
<jv>x</jv>.headerData().setDefault(<js>"Foo"</js>, <js>"bar"</js>))
+        *              .build();
+        * </p>
+        *
+        * @param consumer The consumer to apply.
+        * @return This object.
         */
-       public HeaderList.Builder getHeaderData() {
-               return headerData;
+       @FluentSetter
+       public RestClientBuilder apply(Consumer<RestClientBuilder> consumer) {
+               consumer.accept(this);
+               return this;
+       }
+
+       private ContextProperties contextProperties() {
+               set(RESTCLIENT_INTERNAL_formDataBuilder, formData);
+               set(RESTCLIENT_INTERNAL_queryDataBuilder, queryData);
+               set(RESTCLIENT_INTERNAL_pathDataBuilder, pathData);
+               return getContextProperties();
        }
 
        /**
@@ -222,10 +228,10 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         *      </ul>
         * <p>
         *      <c>Accept</c> request header will be set to 
<js>"application/json"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}}.
         * <p>
         *      <c>Content-Type</c> request header will be set to 
<js>"application/json"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      Can be combined with other marshaller setters such as {@link 
#xml()} to provide support for multiple languages.
         *      <ul>
@@ -269,10 +275,10 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         *      </ul>
         * <p>
         *      <c>Accept</c> request header will be set to 
<js>"application/json"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      <c>Content-Type</c> request header will be set to 
<js>"application/json+simple"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      Can be combined with other marshaller setters such as {@link 
#xml()} to provide support for multiple languages.
         *      <ul>
@@ -312,10 +318,10 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         *      </ul>
         * <p>
         *      <c>Accept</c> request header will be set to <js>"text/xml"</js> 
unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      <c>Content-Type</c> request header will be set to 
<js>"text/xml"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      Can be combined with other marshaller setters such as {@link 
#json()} to provide support for multiple languages.
         *      <ul>
@@ -358,10 +364,10 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         *      </ul>
         * <p>
         *      <c>Accept</c> request header will be set to 
<js>"text/html"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      <c>Content-Type</c> request header will be set to 
<js>"text/html"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      Can be combined with other marshaller setters such as {@link 
#json()} to provide support for multiple languages.
         *      <ul>
@@ -404,10 +410,10 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         *      </ul>
         * <p>
         *      <c>Accept</c> request header will be set to 
<js>"text/html"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      <c>Content-Type</c> request header will be set to 
<js>"text/html"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      Can be combined with other marshaller setters such as {@link 
#json()} to provide support for multiple languages.
         *      <ul>
@@ -450,10 +456,10 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         *      </ul>
         * <p>
         *      <c>Accept</c> request header will be set to 
<js>"text/html+stripped"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      <c>Content-Type</c> request header will be set to 
<js>"text/html+stripped"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      Can be combined with other marshaller setters such as {@link 
#json()} to provide support for multiple languages.
         *      <ul>
@@ -497,10 +503,10 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         *      </ul>
         * <p>
         *      <c>Accept</c> request header will be set to 
<js>"text/plain"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      <c>Content-Type</c> request header will be set to 
<js>"text/plain"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      Can be combined with other marshaller setters such as {@link 
#json()} to provide support for multiple languages.
         *      <ul>
@@ -543,10 +549,10 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         *      </ul>
         * <p>
         *      <c>Accept</c> request header will be set to 
<js>"octal/msgpack"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      <c>Content-Type</c> request header will be set to 
<js>"octal/msgpack"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      Can be combined with other marshaller setters such as {@link 
#json()} to provide support for multiple languages.
         *      <ul>
@@ -590,10 +596,10 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         *      </ul>
         * <p>
         *      <c>Accept</c> request header will be set to <js>"text/uon"</js> 
unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      <c>Content-Type</c> request header will be set to 
<js>"text/uon"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      Can be combined with other marshaller setters such as {@link 
#json()} to provide support for multiple languages.
         *      <ul>
@@ -635,10 +641,10 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         *      </ul>
         * <p>
         *      <c>Accept</c> request header will be set to 
<js>"application/x-www-form-urlencoded"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      <c>Content-Type</c> request header will be set to 
<js>"application/x-www-form-urlencoded"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      Can be combined with other marshaller setters such as {@link 
#json()} to provide support for multiple languages.
         *      <ul>
@@ -684,10 +690,10 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         *      </ul>
         * <p>
         *      <c>Accept</c> request header will be set to 
<js>"text/openapi"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      <c>Content-Type</c> request header will be set to 
<js>"text/openapi"</js> unless overridden
-        *              by {@link #header(Header)}, or per-request via {@link 
RestRequest#header(Header)}.
+        *              via {@link #headerData()}, or per-request via {@link 
RestRequest#header(Header)}.
         * <p>
         *      Can be combined with other marshaller setters such as {@link 
#json()} to provide support for multiple languages.
         *      <ul>
@@ -726,10 +732,10 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         *                      bean context property setters (e.g. {@link 
#swaps(Object...)}), or generic property setters (e.g. {@link #set(String, 
Object)}) defined on this builder class.
         *      </ul>
         * <p>
-        *      <c>Accept</c> request header must be set by {@link 
#header(Header)}, or per-request
+        *      <c>Accept</c> request header must be set via {@link 
#headerData()}, or per-request
         *              via {@link RestRequest#header(Header)} in order for the 
correct parser to be selected.
         * <p>
-        *      <c>Content-Type</c> request header must be set by {@link 
#header(Header)},
+        *      <c>Content-Type</c> request header must be set via {@link 
#headerData()},
         *              or per-request via {@link RestRequest#header(Header)} 
in order for the correct serializer to be selected.
         * <p>
         *      Similar to calling 
<c>json().simpleJson().html().xml().uon().urlEnc().openApi().msgPack().plainText()</c>.
@@ -770,7 +776,7 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
        }
 
        
//------------------------------------------------------------------------------------------------------------------
-       // HttpClientBuilder
+       // httpClientBuilder
        
//------------------------------------------------------------------------------------------------------------------
 
        /**
@@ -836,7 +842,7 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
        }
 
        
//------------------------------------------------------------------------------------------------------------------
-       // HttpClient
+       // httpClient
        
//------------------------------------------------------------------------------------------------------------------
 
        /**
@@ -911,1451 +917,1257 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
        }
 
        
//------------------------------------------------------------------------------------------------------------------
-       // Logging.
+       // headerData
        
//------------------------------------------------------------------------------------------------------------------
 
        /**
-        * <i><l>RestClient</l> configuration property:&emsp;</i>  Logger.
-        *
-        * <p>
-        * Specifies the logger to use for logging.
+        * Returns the builder for the list of headers that get applied to all 
requests created by this builder.
         *
         * <p>
-        * If not specified, uses the following logger:
-        * <p class='bcode w800'>
-        *      
Logger.<jsm>getLogger</jsm>(RestClient.<jk>class</jk>.getName());
-        * </p>
+        * This is the primary method for accessing the request header list.
+        * On first call, the builder is created via the method {@link 
#createHeaderData()}.
         *
         * <h5 class='section'>Example:</h5>
         * <p class='bcode w800'>
-        *      <jc>// Construct a client that logs messages to a special 
logger.</jc>
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              
.logger(Logger.<jsm>getLogger</jsm>(<js>"MyLogger"</js>))  <jc>// Log to 
MyLogger logger.</jc>
-        *              .logToConsole()  <jc>// Also log to console.</jc>
-        *              .logRequests(<jsf>FULL</jsf>, <jsf>WARNING</jsf>)  
<jc>// Log requests with full detail at WARNING level.</jc>
-        *              .build();
+        *      <jc>// Create a client that adds a "Foo: bar" header on every 
request.</jc>
+        *      RestClientBuilder <jv>builder</jv> = 
RestClient.<jsm>create</jsm>();
+        *      <jv>builder</jv>.headerData().setDefault(<js>"Foo"</js>, 
<js>"bar"</js>));
+        *      RestClient <jv>client</jv> = <jv>builder</jv>.build();
         * </p>
         *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link RestClient#RESTCLIENT_logger}
+        * <p>
+        * The following convenience methods are also provided for updating the 
headers:
+        * <ul>
+        *      <li class='jm'>{@link #headers(Header...)}
+        *      <li class='jm'>{@link #defaultHeaders(Header...)}
+        *      <li class='jm'>{@link #header(String,String)}
+        *      <li class='jm'>{@link #header(String,Supplier)}
+        *      <li class='jm'>{@link #mediaType(String)}
+        *      <li class='jm'>{@link #mediaType(MediaType)}
+        *      <li class='jm'>{@link #accept(String)}
+        *      <li class='jm'>{@link #acceptCharset(String)}
+        *      <li class='jm'>{@link #acceptEncoding(String)}
+        *      <li class='jm'>{@link #acceptLanguage(String)}
+        *      <li class='jm'>{@link #authorization(String)}
+        *      <li class='jm'>{@link #cacheControl(String)}
+        *      <li class='jm'>{@link #clientVersion(String)}
+        *      <li class='jm'>{@link #connection(String)}
+        *      <li class='jm'>{@link #contentType(String)}
+        *      <li class='jm'>{@link #contentEncoding(String)}
+        *      <li class='jm'>{@link #debug()}
+        *      <li class='jm'>{@link #from(String)}
+        *      <li class='jm'>{@link #host(String)}
+        *      <li class='jm'>{@link #maxForwards(Integer)}
+        *      <li class='jm'>{@link #noTrace()}
+        *      <li class='jm'>{@link #origin(String)}
+        *      <li class='jm'>{@link #pragma(String)}
+        *      <li class='jm'>{@link #proxyAuthorization(String)}
+        *      <li class='jm'>{@link #userAgent(String)}
         * </ul>
         *
-        * @param value The logger to use for logging.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder logger(Logger value) {
-               return set(RESTCLIENT_logger, value);
-       }
-
-       /**
-        * <i><l>RestClient</l> configuration property:&emsp;</i>  Log to 
console.
-        *
         * <p>
-        * Specifies to log messages to the console.
+        * Note that the {@link #apply(Consumer)} method can be used to call 
this method without breaking fluent call chains.
         *
         * <h5 class='section'>Example:</h5>
         * <p class='bcode w800'>
-        *      <jc>// Construct a client that logs messages to a special 
logger.</jc>
         *      RestClient <jv>client</jv> = RestClient
         *              .<jsm>create</jsm>()
-        *              .logToConsole()
-        *              .logRequests(<jsf>FULL</jsf>, <jsf>INFO</jsf>)  <jc>// 
Level is ignored when logging to console.</jc>
+        *              .apply(<jv>x</jv> -&gt; 
<jv>x</jv>.headerData().setDefault(<js>"Foo"</js>, <js>"bar"</js>))
         *              .build();
         * </p>
         *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link RestClient#RESTCLIENT_logToConsole}
-        * </ul>
-        *
-        * @return This object (for method chaining).
+        * @return The header list builder.
         */
-       @FluentSetter
-       public RestClientBuilder logToConsole() {
-               return set(RESTCLIENT_logToConsole);
+       public final HeaderList.Builder headerData() {
+               if (headerData == null)
+                       headerData = createHeaderData();
+               return headerData;
        }
 
        /**
-        * <i><i><l>RestClient</l> configuration property:&emsp;</i></i>  Log 
requests.
-        *
-        * <p>
-        * Causes requests/responses to be logged at the specified log level at 
the end of the request.
-        *
-        * <p>
-        * <jsf>SIMPLE</jsf> detail produces a log message like the following:
-        * <p class='bcode w800 console'>
-        *      POST http://localhost:10000/testUrl, HTTP/1.1 200 OK
-        * </p>
+        * Creates the builder for the header list.
         *
         * <p>
-        * <jsf>FULL</jsf> detail produces a log message like the following:
-        * <p class='bcode w800 console'>
-        *      === HTTP Call (outgoing) 
=======================================================
-        *      === REQUEST ===
-        *      POST http://localhost:10000/testUrl
-        *      ---request headers---
-        *              Debug: true
-        *              No-Trace: true
-        *              Accept: application/json
-        *      ---request entity---
-        *              Content-Type: application/json
-        *      ---request content---
-        *      {"foo":"bar","baz":123}
-        *      === RESPONSE ===
-        *      HTTP/1.1 200 OK
-        *      ---response headers---
-        *              Content-Type: application/json;charset=utf-8
-        *              Content-Length: 21
-        *              Server: Jetty(8.1.0.v20120127)
-        *      ---response content---
-        *      {"message":"OK then"}
-        *      === END 
========================================================================
-        * </p>
+        * Subclasses can override this method to provide their own 
implementation.
         *
         * <p>
-        * By default, the message is logged to the default logger.  It can be 
logged to a different logger via the
-        * {@link #logger(Logger)} method or logged to the console using the
-        * {@link #logToConsole()} method.
-        *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link RestClient#RESTCLIENT_logRequests}
-        *      <li class='jf'>{@link RestClient#RESTCLIENT_logRequestsLevel}
-        *      <li class='jf'>{@link 
RestClient#RESTCLIENT_logRequestsPredicate}
-        * </ul>
+        * The default behavior creates an empty builder.
         *
-        * @param detail The detail level of logging.
-        * @param level The log level.
-        * @param test A predicate to use per-request to see if the request 
should be logged.  If <jk>null</jk>, always logs.
-        * @return This object (for method chaining).
+        * @return The header list builder.
+        * @see #headerData()
         */
-       @FluentSetter
-       public RestClientBuilder logRequests(DetailLevel detail, Level level, 
BiPredicate<RestRequest,RestResponse> test) {
-               set(RESTCLIENT_logRequests, detail);
-               set(RESTCLIENT_logRequestsLevel, level);
-               set(RESTCLIENT_logRequestsPredicate, test);
-               return this;
+       protected HeaderList.Builder createHeaderData() {
+               return HeaderList.create();
        }
 
-       
//------------------------------------------------------------------------------------------------------------------
-       // HttpClientConnectionManager methods.
-       
//------------------------------------------------------------------------------------------------------------------
-
        /**
-        * Creates the {@link HttpClientConnectionManager} returned by {@link 
#createConnectionManager()}.
-        *
-        * <p>
-        * Subclasses can override this method to provide their own connection 
manager.
-        *
-        * <p>
-        * The default implementation returns an instance of a {@link 
PoolingHttpClientConnectionManager} if {@link #pooled()}
-        * was called or {@link BasicHttpClientConnectionManager} if not..
+        * Appends multiple headers to all requests.
         *
         * <h5 class='section'>Example:</h5>
         * <p class='bcode w800'>
-        *      <jc>// A RestClientBuilder that provides it's own customized 
HttpClientConnectionManager.</jc>
-        *      <jk>public class</jk> MyRestClientBuilder <jk>extends</jk> 
RestClientBuilder {
-        *              <ja>@Override</ja>
-        *              <jk>protected</jk> HttpClientConnectionManager 
createConnectionManager() {
-        *                      <jk>return new</jk> 
PoolingHttpClientConnectionManager();
-        *              }
-        *      }
-        *
-        *      <jc>// Instantiate.</jc>
-        *      RestClient <jv>client</jv> = <jk>new</jk> 
MyRestClientBuilder().build();
-        * </p>
-        *
-        * @return The HTTP client builder to use to create the HTTP client.
-        */
-       @SuppressWarnings("resource")
-       protected HttpClientConnectionManager createConnectionManager() {
-               return (pooled ? new PoolingHttpClientConnectionManager() : new 
BasicHttpClientConnectionManager());
-       }
-
-       /**
-        * When called, the {@link #createConnectionManager()} method will 
return a {@link PoolingHttpClientConnectionManager}
-        * instead of a {@link BasicHttpClientConnectionManager}.
+        *      <jk>import static</jk> org.apache.juneau.http.HttpHeaders.*;
         *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      <jc>// Construct a client that uses pooled connections.</jc>
         *      RestClient <jv>client</jv> = RestClient
         *              .<jsm>create</jsm>()
-        *              .pooled()
+        *              .headers(
+        *                      <jsf>ACCEPT_TEXT_XML</jsf>,
+        *                      <jsm>stringHeader</jsm>(<js>"Foo"</js>, 
<js>"bar"</js>)
+        *              )
         *              .build();
         * </p>
         *
+        * <p>
+        * This is a shortcut for calling 
<c>headerData().append(<jv>parts</jv>)</c>.
+        *
+        * @param parts
+        *      The header to set.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
        @FluentSetter
-       public RestClientBuilder pooled() {
-               this.pooled = true;
+       public RestClientBuilder headers(Header...parts) {
+               headerData().append(parts);
                return this;
        }
 
        /**
-        * Set up this client to use BASIC auth.
+        * Sets default header values.
+        *
+        * <p>
+        * Uses default values for specified headers if not otherwise specified 
on the outgoing requests.
         *
         * <h5 class='section'>Example:</h5>
         * <p class='bcode w800'>
-        *      <jc>// Construct a client that uses BASIC authentication.</jc>
         *      RestClient <jv>client</jv> = RestClient
         *              .<jsm>create</jsm>()
-        *              .basicAuth(<js>"http://localhost";</js>, 80, 
<js>"me"</js>, <js>"mypassword"</js>)
+        *              .defaultHeaders(<jsm>stringHeader</jsm>(<js>"Foo"</js>, 
()-&gt;<js>"bar"</js>));
         *              .build();
         * </p>
         *
-        * @param host The auth scope hostname.
-        * @param port The auth scope port.
-        * @param user The username.
-        * @param pw The password.
+        * <p>
+        * This is a shortcut for calling 
<c>headerData().setDefault(<jv>parts</jv>)</c>.
+        *
+        * @param parts The header values.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
-       @FluentSetter
-       public RestClientBuilder basicAuth(String host, int port, String user, 
String pw) {
-               AuthScope scope = new AuthScope(host, port);
-               Credentials up = new UsernamePasswordCredentials(user, pw);
-               CredentialsProvider p = new BasicCredentialsProvider();
-               p.setCredentials(scope, up);
-               defaultCredentialsProvider(p);
+       public RestClientBuilder defaultHeaders(Header...parts) {
+               headerData().setDefault(parts);
                return this;
        }
 
-       
//-----------------------------------------------------------------------------------------------------------------
-       // HTTP parts
-       
//-----------------------------------------------------------------------------------------------------------------
-
        /**
         * Appends a header to all requests.
         *
         * <h5 class='section'>Example:</h5>
         * <p class='bcode w800'>
-        *      <jk>import static</jk> org.apache.juneau.http.HttpHeaders.*;
-        *
         *      RestClient <jv>client</jv> = RestClient
         *              .<jsm>create</jsm>()
-        *              .header(<jsf>ACCEPT_TEXT_XML</jsf>)
+        *              .header(<js>"Foo"</js>, <js>"bar"</js>);
         *              .build();
         * </p>
         *
         * <p>
-        * This is a shortcut for calling 
<c>getHeaderData().append(<jv>part</jv>)</c>.
+        * This is a shortcut for calling 
<c>headerData().append(<jv>name</jv>,<jv>value</jv>)</c>.
         *
-        * @param part
-        *      The parameter to append.
-        *      <br><jk>null</jk> values are ignored.
+        * @param name The header name.
+        * @param value The header value.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
        @FluentSetter
-       public RestClientBuilder header(Header part) {
-               getHeaderData().append(part);
+       public RestClientBuilder header(String name, String value) {
+               headerData().append(name, value);
                return this;
        }
 
        /**
-        * Appends a query parameter to the URI of all requests.
+        * Appends a header to all requests using a dynamic value.
         *
         * <h5 class='section'>Example:</h5>
         * <p class='bcode w800'>
-        *      <jk>import static</jk> org.apache.juneau.http.HttpParts.*;
-        *
         *      RestClient <jv>client</jv> = RestClient
         *              .<jsm>create</jsm>()
-        *              .queryData(<jsm>stringPart</jsm>(<js>"foo"</js>, 
<js>"bar"</js>))
+        *              .header(<js>"Foo"</js>, ()-&gt;<js>"bar"</js>);
         *              .build();
         * </p>
         *
         * <p>
-        * This is a shortcut for calling 
<c>getQueryData().append(<jv>part</jv>)</c>.
+        * This is a shortcut for calling 
<c>headerData().append(<jv>name</jv>,<jv>value</jv>)</c>.
         *
-        * @param part
-        *      The parameter to append.
-        *      <br><jk>null</jk> values are ignored.
+        * @param name The header name.
+        * @param value The header value supplier.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
        @FluentSetter
-       public RestClientBuilder queryData(NameValuePair part) {
-               getQueryData().append(part);
+       public RestClientBuilder header(String name, Supplier<String> value) {
+               headerData().append(name, value);
                return this;
        }
 
        /**
-        * Appends a form-data parameter to the request bodies of all form 
posts.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      <jk>import static</jk> org.apache.juneau.http.HttpParts.*;
+        * Appends the <c>Accept</c> and <c>Content-Type</c> headers on all 
requests made by this client.
         *
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .formData(<jsm>stringPart</jsm>(<js>"foo"</js>, 
<js>"bar"</js>))
-        *              .build();
-        * </p>
+        * <p>
+        * Headers are appended to the end of the current header list.
         *
         * <p>
-        * This is a shortcut for calling 
<c>getFormData().append(<jv>part</jv>)</c>.
+        * This is a shortcut for calling 
<c>headerData().append(Accept.<jsm>of</jsm>(<jv>value</jv>), 
ContentType.<jsm>of</jsm>(<jv>value</jv>))</c>.
         *
-        * @param part
-        *      The parameter to append.
-        *      <br><jk>null</jk> values are ignored.
+        * @param value The new header values.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
        @FluentSetter
-       public RestClientBuilder formData(NameValuePair part) {
-               getFormData().append(part);
-               return this;
+       public RestClientBuilder mediaType(String value) {
+               super.mediaType(MediaType.of(value));
+               return headers(Accept.of(value), ContentType.of(value));
        }
 
        /**
-        * Sets a path parameter on all requests.
+        * Appends the <c>Accept</c> and <c>Content-Type</c> headers on all 
requests made by this client.
         *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      <jk>import static</jk> org.apache.juneau.http.HttpParts.*;
-        *
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .pathData(<jsm>stringPart</jsm>(<js>"foo"</js>, 
<js>"bar"</js>))
-        *              .build();
-        * </p>
+        * <p>
+        * Headers are appended to the end of the current header list.
         *
         * <p>
-        * This is a shortcut for calling 
<c>getPathData().set(<jv>part</jv>)</c>.
+        * This is a shortcut for calling 
<c>headerData().append(Accept.<jsm>of</jsm>(<jv>value</jv>), 
ContentType.<jsm>of</jsm>(<jv>value</jv>))</c>.
         *
-        * @param part
-        *      The parameter to set.
-        *      <br><jk>null</jk> values are ignored.
+        * @param value The new header values.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
+       @Override
        @FluentSetter
-       public RestClientBuilder pathData(NameValuePair part) {
-               getPathData().set(part);
-               return this;
+       public RestClientBuilder mediaType(MediaType value) {
+               super.mediaType(value);
+               return headers(Accept.of(value), ContentType.of(value));
        }
 
        /**
-        * Appends multiple headers to all requests.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      <jk>import static</jk> org.apache.juneau.http.HttpHeaders.*;
-        *
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .headers(
-        *                      <jsf>ACCEPT_TEXT_XML</jsf>,
-        *                      <jsm>stringHeader</jsm>(<js>"Foo"</js>, 
<js>"bar"</js>)
-        *              )
-        *              .build();
-        * </p>
+        * Appends an <c>Accept</c> header on this request.
         *
         * <p>
-        * This is a shortcut for calling 
<c>getHeaderData().append(<jv>parts</jv>)</c>.
+        * This is a shortcut for calling 
<c>headerData().append(Accept.<jsm>of</jsm>(<jv>value</jv>))</c>.
         *
-        * @param parts
-        *      The header to set.
+        * @param value
+        *      The new header value.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
        @FluentSetter
-       public RestClientBuilder headers(Header...parts) {
-               getHeaderData().append(parts);
-               return this;
+       public RestClientBuilder accept(String value) {
+               return headers(Accept.of(value));
        }
 
        /**
-        * Appends multiple query parameters to the URI of all requests.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      <jk>import static</jk> org.apache.juneau.http.HttpParts.*;
-        *
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .queryData(
-        *                      <jsm>stringPart</jsm>(<js>"foo"</js>, 
<js>"bar"</js>),
-        *                      <jsm>booleanPart</jsm>(<js>"baz"</js>, 
<jk>true</jk>)
-        *              )
-        *              .build();
-        * </p>
+        * Sets the value for the <c>Accept-Charset</c> request header on all 
requests.
         *
         * <p>
-        * This is a shortcut for calling 
<c>getQueryData().append(<jv>parts</jv>)</c>.
+        * This is a shortcut for calling 
<c>headerData().append(AcceptCharset.<jsm>of</jsm>(<jv>value</jv>))</c>.
         *
-        * @param parts
-        *      The query parameters.
+        * @param value The new header value.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
        @FluentSetter
-       public RestClientBuilder queryData(NameValuePair...parts) {
-               getQueryData().append(parts);
-               return this;
+       public RestClientBuilder acceptCharset(String value) {
+               return headers(AcceptCharset.of(value));
        }
 
        /**
-        * Appends multiple form-data parameters to the request bodies of all 
URL-encoded form posts.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      <jk>import static</jk> org.apache.juneau.http.HttpParts.*;
-        *
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .formData(
-        *                      <jsm>stringPart</jsm>(<js>"foo"</js>, 
<js>"bar"</js>),
-        *                      <jsm>booleanPart</jsm>(<js>"baz"</js>, 
<jk>true</jk>)
-        *              )
-        *              .build();
-        * </p>
+        * Sets the value for the <c>Accept-Encoding</c> request header on all 
requests.
         *
         * <p>
-        * This is a shortcut for calling 
<c>getFormData().append(<jv>parts</jv>)</c>.
+        * This is a shortcut for calling 
<c>headerData().append(AcceptEncoding.<jsm>of</jsm>(<jv>value</jv>))</c>.
         *
-        * @param parts
-        *      The form-data parameters.
+        * @param value The new header value.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
        @FluentSetter
-       public RestClientBuilder formData(NameValuePair...parts) {
-               getFormData().append(parts);
-               return this;
+       public RestClientBuilder acceptEncoding(String value) {
+               return headers(AcceptEncoding.of(value));
        }
 
        /**
-        * Sets multiple path parameters on all requests.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      <jk>import static</jk> org.apache.juneau.http.HttpParts.*;
-        *
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .pathData(
-        *                      <jsm>stringPart</jsm>(<js>"foo"</js>, 
<js>"bar"</js>),
-        *                      <jsm>booleanPart</jsm>(<js>"baz"</js>, 
<jk>true</jk>)
-        *              )
-        *              .build();
-        * </p>
+        * Sets the value for the <c>Accept-Language</c> request header on all 
requests.
         *
         * <p>
-        * This is a shortcut for calling 
<c>getPathData().append(<jv>parts</jv>)</c>.
+        * This is a shortcut for calling 
<c>headerData().append(AcceptLanguage.<jsm>of</jsm>(<jv>value</jv>))</c>.
         *
-        * @param parts
-        *      The path parameters.
+        * @param value The new header value.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
        @FluentSetter
-       public RestClientBuilder pathData(NameValuePair...parts) {
-               getPathData().append(parts);
-               return this;
+       public RestClientBuilder acceptLanguage(String value) {
+               return headers(AcceptLanguage.of(value));
        }
 
        /**
-        * Appends multiple headers to all requests.
+        * Sets the value for the <c>Authorization</c> request header on all 
requests.
         *
         * <p>
-        * This is a shortcut for calling 
<c>getHeaderData().append(<jv>parts</jv>)</c>.
+        * This is a shortcut for calling 
<c>headerData().append(Authorization.<jsm>of</jsm>(<jv>value</jv>))</c>.
         *
-        * @param parts
-        *      The header parts set.
+        * @param value The new header value.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
        @FluentSetter
-       public RestClientBuilder headers(HeaderList parts) {
-               getHeaderData().append(parts);
-               return this;
+       public RestClientBuilder authorization(String value) {
+               return headers(Authorization.of(value));
        }
 
        /**
-        * Appends multiple query parameters to all requests.
+        * Sets the value for the <c>Cache-Control</c> request header on all 
requests.
         *
         * <p>
-        * This is a shortcut for calling 
<c>getQueryData().append(<jv>parts</jv>)</c>.
+        * This is a shortcut for calling 
<c>headerData().append(CacheControl.<jsm>of</jsm>(<jv>value</jv>))</c>.
         *
-        * @param parts
-        *      The parts to set.
+        * @param value The new header value.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
        @FluentSetter
-       public RestClientBuilder queryData(PartList parts) {
-               getQueryData().append(parts);
-               return this;
+       public RestClientBuilder cacheControl(String value) {
+               return headers(CacheControl.of(value));
        }
 
        /**
-        * Appends multiple form-data parameters to all requests.
+        * Sets the client version by setting the value for the 
<js>"Client-Version"</js> header.
         *
         * <p>
-        * This is a shortcut for calling 
<c>getFormData().append(<jv>parts</jv>)</c>.
+        * This is a shortcut for calling 
<c>headerData().append(ClientVersion.<jsm>of</jsm>(<jv>value</jv>))</c>.
         *
-        * @param parts
-        *      The parts to set.
+        * @param value The version string (e.g. <js>"1.2.3"</js>)
         * @return This object (for method chaining).
+        * @see #headerData()
         */
        @FluentSetter
-       public RestClientBuilder formData(PartList parts) {
-               getFormData().append(parts);
-               return this;
+       public RestClientBuilder clientVersion(String value) {
+               return headers(ClientVersion.of(value));
        }
 
        /**
-        * Appends multiple path parameters to all requests.
+        * Sets the value for the <c>Connection</c> request header on all 
requests.
         *
         * <p>
-        * This is a shortcut for calling 
<c>getPathData().append(<jv>parts</jv>)</c>.
+        * This is a shortcut for calling 
<c>headerData().append(Connection.<jsm>of</jsm>(<jv>value</jv>))</c>.
         *
-        * @param parts
-        *      The parts to set.
+        * @param value The new header value.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
        @FluentSetter
-       public RestClientBuilder pathData(PartList parts) {
-               getPathData().append(parts);
-               return this;
+       public RestClientBuilder connection(String value) {
+               return headers(Connection.of(value));
        }
 
        /**
-        * Appends a header to all requests.
+        * Sets the value for the <c>Content-Type</c> request header on all 
requests.
         *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .header(<js>"Foo"</js>, <js>"bar"</js>);
-        *              .build();
-        * </p>
+        * <p>
+        * This is a shortcut for calling 
<c>headerData().append(ContentType.<jsm>of</jsm>(<jv>value</jv>))</c>.
         *
         * <p>
-        * This is a shortcut for calling 
<c>getHeaderData().append(<jv>name</jv>,<jv>value</jv>)</c>.
+        * This overrides the media type specified on the serializer.
         *
-        * @param name The header name.
-        * @param value The header value.
+        * @param value The new header value.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
        @FluentSetter
-       public RestClientBuilder header(String name, String value) {
-               getHeaderData().append(name, value);
-               return this;
+       public RestClientBuilder contentType(String value) {
+               return headers(ContentType.of(value));
        }
 
        /**
-        * Appends a query parameter to the URI.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .queryData(<js>"foo"</js>, <js>"bar"</js>)
-        *              .build();
-        * </p>
+        * Sets the value for the <c>Content-Encoding</c> request header on all 
requests.
         *
         * <p>
-        * This is a shortcut for calling 
<c>getQueryData().append(<jv>name</jv>,<jv>value</jv>)</c>.
+        * This is a shortcut for calling 
<c>headerData().append(ContentEncoding.<jsm>of</jsm>(<jv>value</jv>))</c>.
         *
-        * @param name The parameter name.
-        * @param value The parameter value.
+        * @param value The new header value.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
        @FluentSetter
-       public RestClientBuilder queryData(String name, String value) {
-               getQueryData().append(name, value);
-               return this;
+       public RestClientBuilder contentEncoding(String value) {
+               return headers(ContentEncoding.of(value));
        }
 
        /**
-        * Appends a form-data parameter to all request bodies.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .formData(<js>"foo"</js>, <js>"bar"</js>)
-        *              .build();
-        * </p>
+        * Sets the value for the <c>Debug</c> request header on all requests.
         *
         * <p>
-        * This is a shortcut for calling 
<c>getFormData().append(<jv>name</jv>,<jv>value</jv>)</c>.
+        * This is a shortcut for calling 
<c>headerData().append(Debug.<jsm>of</jsm>(<jv>value</jv>))</c>.
         *
-        * @param name The parameter name.
-        * @param value The parameter value.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
+       @Override
        @FluentSetter
-       public RestClientBuilder formData(String name, String value) {
-               getFormData().append(name, value);
-               return this;
+       public RestClientBuilder debug() {
+               super.debug();
+               return headers(Debug.TRUE);
        }
 
        /**
-        * Appends a path parameter to all request bodies.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .pathData(<js>"foo"</js>, <js>"bar"</js>)
-        *              .build();
-        * </p>
+        * Sets the value for the <c>From</c> request header on all requests.
         *
         * <p>
-        * This is a shortcut for calling 
<c>getPathData().append(<jv>name</jv>,<jv>value</jv>)</c>.
+        * This is a shortcut for calling 
<c>headerData().append(From.<jsm>of</jsm>(<jv>value</jv>))</c>.
         *
-        * @param name The parameter name.
-        * @param value The parameter value.
+        * @param value The new header value.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
        @FluentSetter
-       public RestClientBuilder pathData(String name, String value) {
-               getPathData().append(name, value);
-               return this;
+       public RestClientBuilder from(String value) {
+               return headers(From.of(value));
        }
 
        /**
-        * Appends a header to all requests using a dynamic value.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .header(<js>"Foo"</js>, ()-&gt;<js>"bar"</js>);
-        *              .build();
-        * </p>
+        * Sets the value for the <c>Host</c> request header on all requests.
         *
         * <p>
-        * This is a shortcut for calling 
<c>getHeaderData().append(<jv>name</jv>,<jv>value</jv>)</c>.
+        * This is a shortcut for calling 
<c>headerData().append(Host.<jsm>of</jsm>(<jv>value</jv>))</c>.
         *
-        * @param name The header name.
-        * @param value The header value supplier.
+        * @param value The new header value.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
        @FluentSetter
-       public RestClientBuilder header(String name, Supplier<String> value) {
-               getHeaderData().append(name, value);
-               return this;
+       public RestClientBuilder host(String value) {
+               return headers(Host.of(value));
        }
 
        /**
-        * Appends a query parameter with a dynamic value to the URI.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .queryData(<js>"foo"</js>, ()-&gt;<js>"bar"</js>)
-        *              .build();
-        * </p>
+        * Sets the value for the <c>Max-Forwards</c> request header on all 
requests.
         *
         * <p>
-        * This is a shortcut for calling 
<c>getQueryData().append(<jv>name</jv>,<jv>value</jv>)</c>.
+        * This is a shortcut for calling 
<c>headerData().append(MaxForwards.<jsm>of</jsm>(<jv>value</jv>))</c>.
         *
-        * @param name The parameter name.
-        * @param value The parameter value supplier.
+        * @param value The new header value.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
        @FluentSetter
-       public RestClientBuilder queryData(String name, Supplier<String> value) 
{
-               getQueryData().append(name, value);
-               return this;
+       public RestClientBuilder maxForwards(Integer value) {
+               return headers(MaxForwards.of(value));
        }
 
        /**
-        * Appends a form-data parameter with a dynamic value to all request 
bodies.
+        * When called, <c>No-Trace: true</c> is added to requests.
         *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .formData(<js>"foo"</js>, ()-&gt;<js>"bar"</js>)
-        *              .build();
-        * </p>
+        * <p>
+        * This gives the opportunity for the servlet to not log errors on 
invalid requests.
+        * This is useful for testing purposes when you don't want your log 
file to show lots of errors that are simply the
+        * results of testing.
         *
         * <p>
-        * This is a shortcut for calling 
<c>getFormData().append(<jv>name</jv>,<jv>value</jv>)</c>.
+        * It's up to the server to decide whether to allow for this.
+        * The <c>BasicTestRestLogger</c> class watches for this header and 
prevents logging of status 400+ responses to
+        * prevent needless logging of test scenarios.
         *
-        * @param name The parameter name.
-        * @param value The parameter value supplier.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
        @FluentSetter
-       public RestClientBuilder formData(String name, Supplier<String> value) {
-               getFormData().append(name, value);
-               return this;
+       public RestClientBuilder noTrace() {
+               return headers(NoTrace.of(true));
        }
 
        /**
-        * Sets a path parameter with a dynamic value to all request bodies.
+        * Sets the value for the <c>Origin</c> request header on all requests.
         *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .pathData(<js>"foo"</js>, ()-&gt;<js>"bar"</js>)
-        *              .build();
-        * </p>
+        * <p>
+        * This is a shortcut for calling 
<c>headerData().append(Origin.<jsm>of</jsm>(<jv>value</jv>))</c>.
+        *
+        * @param value The new header value.
+        * @return This object (for method chaining).
+        * @see #headerData()
+        */
+       @FluentSetter
+       public RestClientBuilder origin(String value) {
+               return headers(Origin.of(value));
+       }
+
+       /**
+        * Sets the value for the <c>Pragma</c> request header on all requests.
         *
         * <p>
-        * This is a shortcut for calling 
<c>pathData().append(<jv>name</jv>,<jv>value</jv>)</c>.
+        * This is a shortcut for calling 
<c>headerData().append(Pragma.<jsm>of</jsm>(<jv>value</jv>))</c>.
         *
-        * @param name The parameter name.
-        * @param value The parameter value supplier.
+        * @param value The new header value.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
        @FluentSetter
-       public RestClientBuilder pathData(String name, Supplier<String> value) {
-               getPathData().set(name, value);
-               return this;
+       public RestClientBuilder pragma(String value) {
+               return headers(Pragma.of(value));
        }
 
        /**
-        * Sets default header values.
+        * Sets the value for the <c>Proxy-Authorization</c> request header on 
all requests.
         *
         * <p>
-        * Uses default values for specified headers if not otherwise specified 
on the outgoing requests.
+        * This is a shortcut for calling 
<c>headerData().append(ProxyAuthorization.<jsm>of</jsm>(<jv>value</jv>))</c>.
         *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .defaultHeaders(<jsm>stringHeader</jsm>(<js>"Foo"</js>, 
()-&gt;<js>"bar"</js>));
-        *              .build();
-        * </p>
+        * @param value The new header value.
+        * @return This object (for method chaining).
+        * @see #headerData()
+        */
+       @FluentSetter
+       public RestClientBuilder proxyAuthorization(String value) {
+               return headers(ProxyAuthorization.of(value));
+       }
+
+       /**
+        * Sets the value for the <c>User-Agent</c> request header on all 
requests.
         *
         * <p>
-        * This is a shortcut for calling 
<c>getHeaderData().setDefault(<jv>parts</jv>)</c>.
+        * This is a shortcut for calling 
<c>headerData().append(UserAgent.<jsm>of</jsm>(<jv>value</jv>))</c>.
         *
-        * @param parts The header values.
+        * @param value The new header value.
         * @return This object (for method chaining).
+        * @see #headerData()
         */
-       public RestClientBuilder defaultHeaders(Header...parts) {
-               getHeaderData().setDefault(parts);
-               return this;
+       @FluentSetter
+       public RestClientBuilder userAgent(String value) {
+               return headers(UserAgent.of(value));
        }
 
+       
//------------------------------------------------------------------------------------------------------------------
+       // Logging.
+       
//------------------------------------------------------------------------------------------------------------------
+
        /**
-        * Sets default query parameter values.
+        * <i><l>RestClient</l> configuration property:&emsp;</i>  Logger.
         *
         * <p>
-        * Uses default values for specified parameters if not otherwise 
specified on the outgoing requests.
+        * Specifies the logger to use for logging.
+        *
+        * <p>
+        * If not specified, uses the following logger:
+        * <p class='bcode w800'>
+        *      
Logger.<jsm>getLogger</jsm>(RestClient.<jk>class</jk>.getName());
+        * </p>
         *
         * <h5 class='section'>Example:</h5>
         * <p class='bcode w800'>
+        *      <jc>// Construct a client that logs messages to a special 
logger.</jc>
         *      RestClient <jv>client</jv> = RestClient
         *              .<jsm>create</jsm>()
-        *              .defaultQueryData(<jsm>stringPart</jsm>(<js>"foo"</js>, 
()-&gt;<js>"bar"</js>));
+        *              
.logger(Logger.<jsm>getLogger</jsm>(<js>"MyLogger"</js>))  <jc>// Log to 
MyLogger logger.</jc>
+        *              .logToConsole()  <jc>// Also log to console.</jc>
+        *              .logRequests(<jsf>FULL</jsf>, <jsf>WARNING</jsf>)  
<jc>// Log requests with full detail at WARNING level.</jc>
         *              .build();
         * </p>
         *
-        * <p>
-        * This is a shortcut for calling 
<c>getQueryData().setDefault(<jv>parts</jv>)</c>.
+        * <ul class='seealso'>
+        *      <li class='jf'>{@link RestClient#RESTCLIENT_logger}
+        * </ul>
         *
-        * @param parts The parts.
+        * @param value The logger to use for logging.
         * @return This object (for method chaining).
         */
-       public RestClientBuilder defaultQueryData(NameValuePair...parts) {
-               getQueryData().setDefault(parts);
-               return this;
+       @FluentSetter
+       public RestClientBuilder logger(Logger value) {
+               return set(RESTCLIENT_logger, value);
        }
 
        /**
-        * Sets default form-data parameter values.
+        * <i><l>RestClient</l> configuration property:&emsp;</i>  Log to 
console.
         *
         * <p>
-        * Uses default values for specified parameters if not otherwise 
specified on the outgoing requests.
+        * Specifies to log messages to the console.
         *
         * <h5 class='section'>Example:</h5>
         * <p class='bcode w800'>
+        *      <jc>// Construct a client that logs messages to a special 
logger.</jc>
         *      RestClient <jv>client</jv> = RestClient
         *              .<jsm>create</jsm>()
-        *              .defaultFormData(<jsm>stringPart</jsm>(<js>"foo"</js>, 
()-&gt;<js>"bar"</js>));
+        *              .logToConsole()
+        *              .logRequests(<jsf>FULL</jsf>, <jsf>INFO</jsf>)  <jc>// 
Level is ignored when logging to console.</jc>
         *              .build();
         * </p>
         *
-        * <p>
-        * This is a shortcut for calling 
<c>getFormData().setDefault(<jv>parts</jv>)</c>.
+        * <ul class='seealso'>
+        *      <li class='jf'>{@link RestClient#RESTCLIENT_logToConsole}
+        * </ul>
         *
-        * @param parts The parts.
         * @return This object (for method chaining).
         */
-       public RestClientBuilder defaultFormData(NameValuePair...parts) {
-               getFormData().setDefault(parts);
-               return this;
+       @FluentSetter
+       public RestClientBuilder logToConsole() {
+               return set(RESTCLIENT_logToConsole);
        }
 
        /**
-        * Sets default path parameter values.
+        * <i><i><l>RestClient</l> configuration property:&emsp;</i></i>  Log 
requests.
         *
         * <p>
-        * Uses default values for specified parameters if not otherwise 
specified on the outgoing requests.
+        * Causes requests/responses to be logged at the specified log level at 
the end of the request.
         *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              .defaultPathData(<jsm>stringPart</jsm>(<js>"foo"</js>, 
()-&gt;<js>"bar"</js>));
-        *              .build();
+        * <p>
+        * <jsf>SIMPLE</jsf> detail produces a log message like the following:
+        * <p class='bcode w800 console'>
+        *      POST http://localhost:10000/testUrl, HTTP/1.1 200 OK
         * </p>
         *
         * <p>
-        * This is a shortcut for calling 
<c>getPathData().setDefault(<jv>parts</jv>)</c>.
+        * <jsf>FULL</jsf> detail produces a log message like the following:
+        * <p class='bcode w800 console'>
+        *      === HTTP Call (outgoing) 
=======================================================
+        *      === REQUEST ===
+        *      POST http://localhost:10000/testUrl
+        *      ---request headers---
+        *              Debug: true
+        *              No-Trace: true
+        *              Accept: application/json
+        *      ---request entity---
+        *              Content-Type: application/json
+        *      ---request content---
+        *      {"foo":"bar","baz":123}
+        *      === RESPONSE ===
+        *      HTTP/1.1 200 OK
+        *      ---response headers---
+        *              Content-Type: application/json;charset=utf-8
+        *              Content-Length: 21
+        *              Server: Jetty(8.1.0.v20120127)
+        *      ---response content---
+        *      {"message":"OK then"}
+        *      === END 
========================================================================
+        * </p>
         *
-        * @param parts The parts.
+        * <p>
+        * By default, the message is logged to the default logger.  It can be 
logged to a different logger via the
+        * {@link #logger(Logger)} method or logged to the console using the
+        * {@link #logToConsole()} method.
+        *
+        * <ul class='seealso'>
+        *      <li class='jf'>{@link RestClient#RESTCLIENT_logRequests}
+        *      <li class='jf'>{@link RestClient#RESTCLIENT_logRequestsLevel}
+        *      <li class='jf'>{@link 
RestClient#RESTCLIENT_logRequestsPredicate}
+        * </ul>
+        *
+        * @param detail The detail level of logging.
+        * @param level The log level.
+        * @param test A predicate to use per-request to see if the request 
should be logged.  If <jk>null</jk>, always logs.
         * @return This object (for method chaining).
         */
-       public RestClientBuilder defaultPathData(NameValuePair...parts) {
-               getPathData().setDefault(parts);
+       @FluentSetter
+       public RestClientBuilder logRequests(DetailLevel detail, Level level, 
BiPredicate<RestRequest,RestResponse> test) {
+               set(RESTCLIENT_logRequests, detail);
+               set(RESTCLIENT_logRequestsLevel, level);
+               set(RESTCLIENT_logRequestsPredicate, test);
                return this;
        }
 
+       
//------------------------------------------------------------------------------------------------------------------
+       // HttpClientConnectionManager methods.
+       
//------------------------------------------------------------------------------------------------------------------
+
        /**
-        * Appends headers to all requests using freeform key/value pairs.
+        * Creates the {@link HttpClientConnectionManager} returned by {@link 
#createConnectionManager()}.
+        *
+        * <p>
+        * Subclasses can override this method to provide their own connection 
manager.
+        *
+        * <p>
+        * The default implementation returns an instance of a {@link 
PoolingHttpClientConnectionManager} if {@link #pooled()}
+        * was called or {@link BasicHttpClientConnectionManager} if not..
         *
         * <h5 class='section'>Example:</h5>
         * <p class='bcode w800'>
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              
.headerPairs(<js>"Header1"</js>,<js>"val1"</js>,<js>"Header2"</js>,<js>"val2"</js>)
-        *              .build();
+        *      <jc>// A RestClientBuilder that provides it's own customized 
HttpClientConnectionManager.</jc>
+        *      <jk>public class</jk> MyRestClientBuilder <jk>extends</jk> 
RestClientBuilder {
+        *              <ja>@Override</ja>
+        *              <jk>protected</jk> HttpClientConnectionManager 
createConnectionManager() {
+        *                      <jk>return new</jk> 
PoolingHttpClientConnectionManager();
+        *              }
+        *      }
+        *
+        *      <jc>// Instantiate.</jc>
+        *      RestClient <jv>client</jv> = <jk>new</jk> 
MyRestClientBuilder().build();
         * </p>
         *
-        * @param pairs The header key/value pairs.
-        * @return This object (for method chaining).
+        * @return The HTTP client builder to use to create the HTTP client.
         */
-       @FluentSetter
-       public RestClientBuilder headerPairs(String...pairs) {
-               if (pairs.length % 2 != 0)
-                       throw new RuntimeException("Odd number of parameters 
passed into headerPairs(String...)");
-               HeaderList.Builder b  = getHeaderData();
-               for (int i = 0; i < pairs.length; i+=2)
-                       b.append(pairs[i], pairs[i+1]);
-               return this;
+       @SuppressWarnings("resource")
+       protected HttpClientConnectionManager createConnectionManager() {
+               return (pooled ? new PoolingHttpClientConnectionManager() : new 
BasicHttpClientConnectionManager());
        }
 
        /**
-        * Appends query parameters to the URI query using free-form key/value 
pairs.
+        * When called, the {@link #createConnectionManager()} method will 
return a {@link PoolingHttpClientConnectionManager}
+        * instead of a {@link BasicHttpClientConnectionManager}.
         *
         * <h5 class='section'>Example:</h5>
         * <p class='bcode w800'>
+        *      <jc>// Construct a client that uses pooled connections.</jc>
         *      RestClient <jv>client</jv> = RestClient
         *              .<jsm>create</jsm>()
-        *              
.queryDataPairs(<js>"key1"</js>,<js>"val1"</js>,<js>"key2"</js>,<js>"val2"</js>)
+        *              .pooled()
         *              .build();
         * </p>
         *
-        * @param pairs The query key/value pairs.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestClientBuilder queryDataPairs(String...pairs) {
-               if (pairs.length % 2 != 0)
-                       throw new RuntimeException("Odd number of parameters 
passed into queryDataPairs(String...)");
-               PartList.Builder b  = getQueryData();
-               for (int i = 0; i < pairs.length; i+=2)
-                       b.append(pairs[i], pairs[i+1]);
+       public RestClientBuilder pooled() {
+               this.pooled = true;
                return this;
        }
 
        /**
-        * Appends form-data parameters to all request bodies using free-form 
key/value pairs.
+        * Set up this client to use BASIC auth.
         *
         * <h5 class='section'>Example:</h5>
         * <p class='bcode w800'>
+        *      <jc>// Construct a client that uses BASIC authentication.</jc>
         *      RestClient <jv>client</jv> = RestClient
         *              .<jsm>create</jsm>()
-        *              
.formDataPairs(<js>"key1"</js>,<js>"val1"</js>,<js>"key2"</js>,<js>"val2"</js>)
+        *              .basicAuth(<js>"http://localhost";</js>, 80, 
<js>"me"</js>, <js>"mypassword"</js>)
         *              .build();
         * </p>
         *
-        * @param pairs The form-data key/value pairs.
+        * @param host The auth scope hostname.
+        * @param port The auth scope port.
+        * @param user The username.
+        * @param pw The password.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestClientBuilder formDataPairs(String...pairs) {
-               if (pairs.length % 2 != 0)
-                       throw new RuntimeException("Odd number of parameters 
passed into formDataPairs(String...)");
-               PartList.Builder b  = getFormData();
-               for (int i = 0; i < pairs.length; i+=2)
-                       b.append(pairs[i], pairs[i+1]);
-               return this;
-       }
-
-       /**
-        * Sets path parameters to all request URLs using free-form key/value 
pairs.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode w800'>
-        *      RestClient <jv>client</jv> = RestClient
-        *              .<jsm>create</jsm>()
-        *              
.pathDataPairs(<js>"key1"</js>,<js>"val1"</js>,<js>"key2"</js>,<js>"val2"</js>)
-        *              .build();
-        * </p>
-        *
-        * @param pairs The form-data key/value pairs.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder pathDataPairs(String...pairs) {
-               if (pairs.length % 2 != 0)
-                       throw new RuntimeException("Odd number of parameters 
passed into pathDataPairs(String...)");
-               PartList.Builder b  = getPathData();
-               for (int i = 0; i < pairs.length; i+=2)
-                       b.append(pairs[i], pairs[i+1]);
+       public RestClientBuilder basicAuth(String host, int port, String user, 
String pw) {
+               AuthScope scope = new AuthScope(host, port);
+               Credentials up = new UsernamePasswordCredentials(user, pw);
+               CredentialsProvider p = new BasicCredentialsProvider();
+               p.setCredentials(scope, up);
+               defaultCredentialsProvider(p);
                return this;
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
-       // Standard headers.
+       // HTTP parts
        
//-----------------------------------------------------------------------------------------------------------------
 
        /**
-        * Appends the <c>Accept</c> and <c>Content-Type</c> headers on all 
requests made by this client.
-        *
-        * <p>
-        * Headers are appended to the end of the current header list.
-        *
-        * @param value The new header values.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder mediaType(String value) {
-               super.mediaType(MediaType.of(value));
-               return headers(Accept.of(value), ContentType.of(value));
-       }
-
-       /**
-        * Appends the <c>Accept</c> and <c>Content-Type</c> headers on all 
requests made by this client.
-        *
-        * <p>
-        * Headers are appended to the end of the current header list.
-        *
-        * @param value The new header values.
-        * @return This object (for method chaining).
-        */
-       @Override
-       @FluentSetter
-       public RestClientBuilder mediaType(MediaType value) {
-               super.mediaType(value);
-               return headers(Accept.of(value), ContentType.of(value));
-       }
-
-       /**
-        * Appends an <c>Accept</c> header on this request.
-        *
-        * <p>
-        * This is equivalent to calling <code>header(<js>"Accept"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(Accept.<jsm>of</jsm>(<jv>value</jv>));</code>
-        *
-        * @param value
-        *      The new header value.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder accept(String value) {
-               return header(Accept.of(value));
-       }
-
-       /**
-        * Sets the value for the <c>Accept-Charset</c> request header on all 
requests.
-        *
-        * <p>
-        * This is equivalent to calling 
<code>header(<js>"Accept-Charset"</js>, <jv>value</jv>);</code>
-        * or <code>header(AcceptCharset.<jsm>of</jsm>(<jv>value</jv>));</code>
-        *
-        * @param value The new header value.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder acceptCharset(String value) {
-               return header(AcceptCharset.of(value));
-       }
-
-       /**
-        * Sets the value for the <c>Accept-Encoding</c> request header on all 
requests.
-        *
-        * <p>
-        * This is equivalent to calling 
<code>header(<js>"Accept-Encoding"</js>, <jv>value</jv>);</code>
-        * or <code>header(AcceptEncoding.<jsm>of</jsm>(<jv>value</jv>));</code>
-        *
-        * @param value The new header value.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder acceptEncoding(String value) {
-               return header(AcceptEncoding.of(value));
-       }
-
-       /**
-        * Sets the value for the <c>Accept-Language</c> request header on all 
requests.
-        *
-        * <p>
-        * This is equivalent to calling 
<code>header(<js>"Accept-Language"</js>, <jv>value</jv>);</code>
-        * or <code>header(AcceptLanguage.<jsm>of</jsm>(<jv>value</jv>));</code>
-        *
-        * @param value The new header value.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder acceptLanguage(String value) {
-               return header(AcceptLanguage.of(value));
-       }
-
-       /**
-        * Sets the value for the <c>Authorization</c> request header on all 
requests.
-        *
-        * <p>
-        * This is equivalent to calling <code>header(<js>"Authorization"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(Authorization.<jsm>of</jsm>(<jv>value</jv>));</code>
-        *
-        * @param value The new header value.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder authorization(String value) {
-               return header(Authorization.of(value));
-       }
-
-       /**
-        * Sets the value for the <c>Cache-Control</c> request header on all 
requests.
-        *
-        * <p>
-        * This is equivalent to calling <code>header(<js>"Cache-Control"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(CacheControl.<jsm>of</jsm>(<jv>value</jv>));</code>
-        *
-        * @param value The new header value.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder cacheControl(String value) {
-               return header(CacheControl.of(value));
-       }
-
-       /**
-        * Sets the client version by setting the value for the 
<js>"Client-Version"</js> header.
-        *
-        * <p>
-        * This is equivalent to calling 
<code>header(<js>"Client-Version"</js>, <jv>value</jv>);</code>
-        * or <code>header(ClientVersion.<jsm>of</jsm>(<jv>value</jv>));</code>
-        *
-        * @param value The version string (e.g. <js>"1.2.3"</js>)
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder clientVersion(String value) {
-               return header(ClientVersion.of(value));
-       }
-
-       /**
-        * Sets the value for the <c>Connection</c> request header on all 
requests.
+        * Appends a query parameter to the URI of all requests.
         *
-        * <p>
-        * This is equivalent to calling <code>header(<js>"Connection"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(Connection.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      <jk>import static</jk> org.apache.juneau.http.HttpParts.*;
         *
-        * @param value The new header value.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder connection(String value) {
-               return header(Connection.of(value));
-       }
-
-       /**
-        * Sets the value for the <c>Content-Length</c> request header on all 
requests.
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .queryData(<jsm>stringPart</jsm>(<js>"foo"</js>, 
<js>"bar"</js>))
+        *              .build();
+        * </p>
         *
         * <p>
-        * This is equivalent to calling 
<code>header(<js>"Content-Length"</js>, <jv>value</jv>);</code>
-        * or <code>header(ContentLength.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * This is a shortcut for calling 
<c>getQueryData().append(<jv>part</jv>)</c>.
         *
-        * @param value The new header value.
+        * @param part
+        *      The parameter to append.
+        *      <br><jk>null</jk> values are ignored.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestClientBuilder contentLength(Long value) {
-               return header(ContentLength.of(value));
+       public RestClientBuilder queryData(NameValuePair part) {
+               getQueryData().append(part);
+               return this;
        }
 
        /**
-        * Sets the value for the <c>Content-Type</c> request header on all 
requests.
-        *
-        * <p>
-        * This is equivalent to calling <code>header(<js>"Content-Type"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(ContentType.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * Appends a form-data parameter to the request bodies of all form 
posts.
         *
-        * <p>
-        * This overrides the media type specified on the serializer.
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      <jk>import static</jk> org.apache.juneau.http.HttpParts.*;
         *
-        * @param value The new header value.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder contentType(String value) {
-               return header(ContentType.of(value));
-       }
-
-       /**
-        * Sets the value for the <c>Content-Encoding</c> request header on all 
requests.
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .formData(<jsm>stringPart</jsm>(<js>"foo"</js>, 
<js>"bar"</js>))
+        *              .build();
+        * </p>
         *
         * <p>
-        * This is equivalent to calling 
<code>header(<js>"Content-Encoding"</js>, <jv>value</jv>);</code>
-        * or 
<code>header(ContentEncoding.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * This is a shortcut for calling 
<c>getFormData().append(<jv>part</jv>)</c>.
         *
-        * @param value The new header value.
+        * @param part
+        *      The parameter to append.
+        *      <br><jk>null</jk> values are ignored.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestClientBuilder contentEncoding(String value) {
-               return header(ContentEncoding.of(value));
+       public RestClientBuilder formData(NameValuePair part) {
+               getFormData().append(part);
+               return this;
        }
 
        /**
-        * Sets the value for the <c>Date</c> request header on all requests.
+        * Sets a path parameter on all requests.
         *
-        * <p>
-        * This is equivalent to calling <code>header(<js>"Date"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(Date.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      <jk>import static</jk> org.apache.juneau.http.HttpParts.*;
         *
-        * @param value The new header value.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder date(ZonedDateTime value) {
-               return header(Date.of(value));
-       }
-
-       /**
-        * Sets the value for the <c>Debug</c> request header on all requests.
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .pathData(<jsm>stringPart</jsm>(<js>"foo"</js>, 
<js>"bar"</js>))
+        *              .build();
+        * </p>
         *
         * <p>
-        * This is equivalent to calling <code>header(<js>"Debug"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(Debug.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * This is a shortcut for calling 
<c>getPathData().set(<jv>part</jv>)</c>.
         *
+        * @param part
+        *      The parameter to set.
+        *      <br><jk>null</jk> values are ignored.
         * @return This object (for method chaining).
         */
-       @Override
        @FluentSetter
-       public RestClientBuilder debug() {
-               super.debug();
-               return header(Debug.TRUE);
+       public RestClientBuilder pathData(NameValuePair part) {
+               getPathData().set(part);
+               return this;
        }
 
        /**
-        * Sets the value for the <c>Expect</c> request header on all requests.
+        * Appends multiple query parameters to the URI of all requests.
         *
-        * <p>
-        * This is equivalent to calling <code>header(<js>"Expect"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(Expect.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      <jk>import static</jk> org.apache.juneau.http.HttpParts.*;
         *
-        * @param value The new header value.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder expect(String value) {
-               return header(Expect.of(value));
-       }
-
-       /**
-        * Sets the value for the <c>Forwarded</c> request header on all 
requests.
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .queryData(
+        *                      <jsm>stringPart</jsm>(<js>"foo"</js>, 
<js>"bar"</js>),
+        *                      <jsm>booleanPart</jsm>(<js>"baz"</js>, 
<jk>true</jk>)
+        *              )
+        *              .build();
+        * </p>
         *
         * <p>
-        * This is equivalent to calling <code>header(<js>"Forwarded"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(Forwarded.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * This is a shortcut for calling 
<c>getQueryData().append(<jv>parts</jv>)</c>.
         *
-        * @param value The new header value.
+        * @param parts
+        *      The query parameters.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestClientBuilder forwarded(String value) {
-               return header(Forwarded.of(value));
+       public RestClientBuilder queryData(NameValuePair...parts) {
+               getQueryData().append(parts);
+               return this;
        }
 
        /**
-        * Sets the value for the <c>From</c> request header on all requests.
+        * Appends multiple form-data parameters to the request bodies of all 
URL-encoded form posts.
         *
-        * <p>
-        * This is equivalent to calling <code>header(<js>"From"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(From.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      <jk>import static</jk> org.apache.juneau.http.HttpParts.*;
         *
-        * @param value The new header value.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder from(String value) {
-               return header(From.of(value));
-       }
-
-       /**
-        * Sets the value for the <c>Host</c> request header on all requests.
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .formData(
+        *                      <jsm>stringPart</jsm>(<js>"foo"</js>, 
<js>"bar"</js>),
+        *                      <jsm>booleanPart</jsm>(<js>"baz"</js>, 
<jk>true</jk>)
+        *              )
+        *              .build();
+        * </p>
         *
         * <p>
-        * This is equivalent to calling <code>header(<js>"Host"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(Host.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * This is a shortcut for calling 
<c>getFormData().append(<jv>parts</jv>)</c>.
         *
-        * @param value The new header value.
+        * @param parts
+        *      The form-data parameters.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestClientBuilder host(String value) {
-               return header(Host.of(value));
+       public RestClientBuilder formData(NameValuePair...parts) {
+               getFormData().append(parts);
+               return this;
        }
 
        /**
-        * Sets the value for the <c>If-Match</c> request header on all 
requests.
+        * Sets multiple path parameters on all requests.
         *
-        * <p>
-        * This is equivalent to calling <code>header(<js>"If-Match"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(IfMatch.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      <jk>import static</jk> org.apache.juneau.http.HttpParts.*;
         *
-        * @param value The new header value.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestClientBuilder ifMatch(String value) {
-               return header(IfMatch.of(value));
-       }
-
-       /**
-        * Sets the value for the <c>If-Modified-Since</c> request header on 
all requests.
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .pathData(
+        *                      <jsm>stringPart</jsm>(<js>"foo"</js>, 
<js>"bar"</js>),
+        *                      <jsm>booleanPart</jsm>(<js>"baz"</js>, 
<jk>true</jk>)
+        *              )
+        *              .build();
+        * </p>
         *
         * <p>
-        * This is equivalent to calling 
<code>header(<js>"If-Modified-Since"</js>, <jv>value</jv>);</code>
-        * or 
<code>header(IfModifiedSince.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * This is a shortcut for calling 
<c>getPathData().append(<jv>parts</jv>)</c>.
         *
-        * @param value The new header value.
+        * @param parts
+        *      The path parameters.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestClientBuilder ifModifiedSince(ZonedDateTime value) {
-               return header(IfModifiedSince.of(value));
+       public RestClientBuilder pathData(NameValuePair...parts) {
+               getPathData().append(parts);
+               return this;
        }
 
        /**
-        * Sets the value for the <c>If-None-Match</c> request header on all 
requests.
+        * Appends multiple query parameters to all requests.
         *
         * <p>
-        * This is equivalent to calling <code>header(<js>"If-None-Match"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(IfNoneMatch.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * This is a shortcut for calling 
<c>getQueryData().append(<jv>parts</jv>)</c>.
         *
-        * @param value The new header value.
+        * @param parts
+        *      The parts to set.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestClientBuilder ifNoneMatch(String value) {
-               return header(IfNoneMatch.of(value));
+       public RestClientBuilder queryData(PartList parts) {
+               getQueryData().append(parts);
+               return this;
        }
 
        /**
-        * Sets the value for the <c>If-Range</c> request header on all 
requests.
+        * Appends multiple form-data parameters to all requests.
         *
         * <p>
-        * This is equivalent to calling <code>header(<js>"If-Range"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(IfRange.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * This is a shortcut for calling 
<c>getFormData().append(<jv>parts</jv>)</c>.
         *
-        * @param value The new header value.
+        * @param parts
+        *      The parts to set.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestClientBuilder ifRange(String value) {
-               return header(IfRange.of(value));
+       public RestClientBuilder formData(PartList parts) {
+               getFormData().append(parts);
+               return this;
        }
 
        /**
-        * Sets the value for the <c>If-Unmodified-Since</c> request header on 
all requests.
+        * Appends multiple path parameters to all requests.
         *
         * <p>
-        * This is equivalent to calling 
<code>header(<js>"If-Unmodified-Since"</js>, <jv>value</jv>);</code>
-        * or 
<code>header(IfUnmodifiedSince.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * This is a shortcut for calling 
<c>getPathData().append(<jv>parts</jv>)</c>.
         *
-        * @param value The new header value.
+        * @param parts
+        *      The parts to set.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestClientBuilder ifUnmodifiedSince(ZonedDateTime value) {
-               return header(IfUnmodifiedSince.of(value));
+       public RestClientBuilder pathData(PartList parts) {
+               getPathData().append(parts);
+               return this;
        }
 
        /**
-        * Sets the value for the <c>Max-Forwards</c> request header on all 
requests.
+        * Appends a query parameter to the URI.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .queryData(<js>"foo"</js>, <js>"bar"</js>)
+        *              .build();
+        * </p>
         *
         * <p>
-        * This is equivalent to calling <code>header(<js>"MaxForwards"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(MaxForwards.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * This is a shortcut for calling 
<c>getQueryData().append(<jv>name</jv>,<jv>value</jv>)</c>.
         *
-        * @param value The new header value.
+        * @param name The parameter name.
+        * @param value The parameter value.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestClientBuilder maxForwards(Integer value) {
-               return header(MaxForwards.of(value));
+       public RestClientBuilder queryData(String name, String value) {
+               getQueryData().append(name, value);
+               return this;
        }
 
        /**
-        * When called, <c>No-Trace: true</c> is added to requests.
+        * Appends a form-data parameter to all request bodies.
         *
-        * <p>
-        * This gives the opportunity for the servlet to not log errors on 
invalid requests.
-        * This is useful for testing purposes when you don't want your log 
file to show lots of errors that are simply the
-        * results of testing.
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .formData(<js>"foo"</js>, <js>"bar"</js>)
+        *              .build();
+        * </p>
         *
         * <p>
-        * It's up to the server to decide whether to allow for this.
-        * The <c>BasicTestRestLogger</c> class watches for this header and 
prevents logging of status 400+ responses to
-        * prevent needless logging of test scenarios.
+        * This is a shortcut for calling 
<c>getFormData().append(<jv>name</jv>,<jv>value</jv>)</c>.
         *
+        * @param name The parameter name.
+        * @param value The parameter value.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestClientBuilder noTrace() {
-               return header(NoTrace.of(true));
+       public RestClientBuilder formData(String name, String value) {
+               getFormData().append(name, value);
+               return this;
        }
 
        /**
-        * Sets the value for the <c>Origin</c> request header on all requests.
+        * Appends a path parameter to all request bodies.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .pathData(<js>"foo"</js>, <js>"bar"</js>)
+        *              .build();
+        * </p>
         *
         * <p>
-        * This is equivalent to calling <code>header(<js>"Origin"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(Origin.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * This is a shortcut for calling 
<c>getPathData().append(<jv>name</jv>,<jv>value</jv>)</c>.
         *
-        * @param value The new header value.
+        * @param name The parameter name.
+        * @param value The parameter value.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestClientBuilder origin(String value) {
-               return header(Origin.of(value));
+       public RestClientBuilder pathData(String name, String value) {
+               getPathData().append(name, value);
+               return this;
        }
 
        /**
-        * Sets the value for the <c>Pragma</c> request header on all requests.
+        * Appends a query parameter with a dynamic value to the URI.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .queryData(<js>"foo"</js>, ()-&gt;<js>"bar"</js>)
+        *              .build();
+        * </p>
         *
         * <p>
-        * This is equivalent to calling <code>header(<js>"Pragma"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(Pragma.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * This is a shortcut for calling 
<c>getQueryData().append(<jv>name</jv>,<jv>value</jv>)</c>.
         *
-        * @param value The new header value.
+        * @param name The parameter name.
+        * @param value The parameter value supplier.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestClientBuilder pragma(String value) {
-               return header(Pragma.of(value));
+       public RestClientBuilder queryData(String name, Supplier<String> value) 
{
+               getQueryData().append(name, value);
+               return this;
        }
 
        /**
-        * Sets the value for the <c>Proxy-Authorization</c> request header on 
all requests.
+        * Appends a form-data parameter with a dynamic value to all request 
bodies.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .formData(<js>"foo"</js>, ()-&gt;<js>"bar"</js>)
+        *              .build();
+        * </p>
         *
         * <p>
-        * This is equivalent to calling 
<code>header(<js>"ProxyAuthorization"</js>, <jv>value</jv>);</code>
-        * or 
<code>header(ProxyAuthorization.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * This is a shortcut for calling 
<c>getFormData().append(<jv>name</jv>,<jv>value</jv>)</c>.
         *
-        * @param value The new header value.
+        * @param name The parameter name.
+        * @param value The parameter value supplier.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestClientBuilder proxyAuthorization(String value) {
-               return header(ProxyAuthorization.of(value));
+       public RestClientBuilder formData(String name, Supplier<String> value) {
+               getFormData().append(name, value);
+               return this;
        }
 
        /**
-        * Sets the value for the <c>Range</c> request header on all requests.
+        * Sets a path parameter with a dynamic value to all request bodies.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .pathData(<js>"foo"</js>, ()-&gt;<js>"bar"</js>)
+        *              .build();
+        * </p>
         *
         * <p>
-        * This is equivalent to calling <code>header(<js>"Range"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(Range.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * This is a shortcut for calling 
<c>pathData().append(<jv>name</jv>,<jv>value</jv>)</c>.
         *
-        * @param value The new header value.
+        * @param name The parameter name.
+        * @param value The parameter value supplier.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestClientBuilder range(String value) {
-               return header(Range.of(value));
+       public RestClientBuilder pathData(String name, Supplier<String> value) {
+               getPathData().set(name, value);
+               return this;
        }
 
        /**
-        * Sets the value for the <c>Referer</c> request header on all requests.
+        * Sets default query parameter values.
         *
         * <p>
-        * This is a shortcut for calling <code>header(<js>"Referer"</js>, 
value);</code>
+        * Uses default values for specified parameters if not otherwise 
specified on the outgoing requests.
         *
-        * @param value The new header value.
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .defaultQueryData(<jsm>stringPart</jsm>(<js>"foo"</js>, 
()-&gt;<js>"bar"</js>));
+        *              .build();
+        * </p>
+        *
+        * <p>
+        * This is a shortcut for calling 
<c>getQueryData().setDefault(<jv>parts</jv>)</c>.
+        *
+        * @param parts The parts.
         * @return This object (for method chaining).
         */
-       @FluentSetter
-       public RestClientBuilder referer(String value) {
-               return header(Referer.of(value));
+       public RestClientBuilder defaultQueryData(NameValuePair...parts) {
+               getQueryData().setDefault(parts);
+               return this;
        }
 
        /**
-        * Sets the value for the <c>TE</c> request header on all requests.
+        * Sets default form-data parameter values.
+        *
+        * <p>
+        * Uses default values for specified parameters if not otherwise 
specified on the outgoing requests.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .defaultFormData(<jsm>stringPart</jsm>(<js>"foo"</js>, 
()-&gt;<js>"bar"</js>));
+        *              .build();
+        * </p>
         *
         * <p>
-        * This is equivalent to calling <code>header(<js>"TE"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(TE.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * This is a shortcut for calling 
<c>getFormData().setDefault(<jv>parts</jv>)</c>.
         *
-        * @param value The new header value.
+        * @param parts The parts.
         * @return This object (for method chaining).
         */
-       @FluentSetter
-       public RestClientBuilder te(String value) {
-               return header(TE.of(value));
+       public RestClientBuilder defaultFormData(NameValuePair...parts) {
+               getFormData().setDefault(parts);
+               return this;
        }
 
        /**
-        * Sets the value for the <c>User-Agent</c> request header on all 
requests.
+        * Sets default path parameter values.
         *
         * <p>
-        * This is equivalent to calling <code>header(<js>"User-Agent"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(UserAgent.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * Uses default values for specified parameters if not otherwise 
specified on the outgoing requests.
         *
-        * @param value The new header value.
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              .defaultPathData(<jsm>stringPart</jsm>(<js>"foo"</js>, 
()-&gt;<js>"bar"</js>));
+        *              .build();
+        * </p>
+        *
+        * <p>
+        * This is a shortcut for calling 
<c>getPathData().setDefault(<jv>parts</jv>)</c>.
+        *
+        * @param parts The parts.
         * @return This object (for method chaining).
         */
-       @FluentSetter
-       public RestClientBuilder userAgent(String value) {
-               return header(UserAgent.of(value));
+       public RestClientBuilder defaultPathData(NameValuePair...parts) {
+               getPathData().setDefault(parts);
+               return this;
        }
 
        /**
-        * Sets the value for the <c>Upgrade</c> request header on all requests.
+        * Appends query parameters to the URI query using free-form key/value 
pairs.
         *
-        * <p>
-        * This is equivalent to calling <code>header(<js>"Upgrade"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(Upgrade.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              
.queryDataPairs(<js>"key1"</js>,<js>"val1"</js>,<js>"key2"</js>,<js>"val2"</js>)
+        *              .build();
+        * </p>
         *
-        * @param value The new header value.
+        * @param pairs The query key/value pairs.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestClientBuilder upgrade(String value) {
-               return header(Upgrade.of(value));
+       public RestClientBuilder queryDataPairs(String...pairs) {
+               if (pairs.length % 2 != 0)
+                       throw new RuntimeException("Odd number of parameters 
passed into queryDataPairs(String...)");
+               PartList.Builder b  = getQueryData();
+               for (int i = 0; i < pairs.length; i+=2)
+                       b.append(pairs[i], pairs[i+1]);
+               return this;
        }
 
        /**
-        * Sets the value for the <c>Via</c> request header on all requests.
+        * Appends form-data parameters to all request bodies using free-form 
key/value pairs.
         *
-        * <p>
-        * This is equivalent to calling <code>header(<js>"Via"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(Via.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              
.formDataPairs(<js>"key1"</js>,<js>"val1"</js>,<js>"key2"</js>,<js>"val2"</js>)
+        *              .build();
+        * </p>
         *
-        * @param value The new header value.
+        * @param pairs The form-data key/value pairs.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestClientBuilder via(String value) {
-               return header(Via.of(value));
+       public RestClientBuilder formDataPairs(String...pairs) {
+               if (pairs.length % 2 != 0)
+                       throw new RuntimeException("Odd number of parameters 
passed into formDataPairs(String...)");
+               PartList.Builder b  = getFormData();
+               for (int i = 0; i < pairs.length; i+=2)
+                       b.append(pairs[i], pairs[i+1]);
+               return this;
        }
 
        /**
-        * Sets the value for the <c>Warning</c> request header on all requests.
+        * Sets path parameters to all request URLs using free-form key/value 
pairs.
         *
-        * <p>
-        * This is equivalent to calling <code>header(<js>"Warning"</js>, 
<jv>value</jv>);</code>
-        * or <code>header(Warning.<jsm>of</jsm>(<jv>value</jv>));</code>
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      RestClient <jv>client</jv> = RestClient
+        *              .<jsm>create</jsm>()
+        *              
.pathDataPairs(<js>"key1"</js>,<js>"val1"</js>,<js>"key2"</js>,<js>"val2"</js>)
+        *              .build();
+        * </p>
         *
-        * @param value The new header value.
+        * @param pairs The form-data key/value pairs.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestClientBuilder warning(String value) {
-               return header(Warning.of(value));
+       public RestClientBuilder pathDataPairs(String...pairs) {
+               if (pairs.length % 2 != 0)
+                       throw new RuntimeException("Odd number of parameters 
passed into pathDataPairs(String...)");
+               PartList.Builder b  = getPathData();
+               for (int i = 0; i < pairs.length; i+=2)
+                       b.append(pairs[i], pairs[i+1]);
+               return this;
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
+       // Standard headers.
+       
//-----------------------------------------------------------------------------------------------------------------
+
+       
//-----------------------------------------------------------------------------------------------------------------
        // Properties
        
//-----------------------------------------------------------------------------------------------------------------
 
diff --git 
a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockRestClientBuilder.java
 
b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockRestClientBuilder.java
index c46635a..7bd36d8 100644
--- 
a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockRestClientBuilder.java
+++ 
b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockRestClientBuilder.java
@@ -23,7 +23,6 @@ import static org.apache.juneau.rest.util.RestUtils.*;
 import java.io.*;
 import java.lang.annotation.*;
 import java.lang.reflect.Method;
-import java.time.*;
 
 import org.apache.http.*;
 import org.apache.http.client.*;
@@ -799,24 +798,12 @@ public class MockRestClientBuilder extends 
RestClientBuilder {
        }
 
        @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder contentLength(Long value) {
-               super.contentLength(value);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
        public MockRestClientBuilder contentType(String value) {
                super.contentType(value);
                return this;
        }
 
        @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder date(ZonedDateTime value) {
-               super.date(value);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
        public MockRestClientBuilder debugOutputLines(int value) {
                super.debugOutputLines(value);
                return this;
@@ -931,12 +918,6 @@ public class MockRestClientBuilder extends 
RestClientBuilder {
        }
 
        @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder expect(String value) {
-               super.expect(value);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
        public MockRestClientBuilder formData(NameValuePair...parts) {
                super.formData(parts);
                return this;
@@ -973,24 +954,12 @@ public class MockRestClientBuilder extends 
RestClientBuilder {
        }
 
        @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder forwarded(String value) {
-               super.forwarded(value);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
        public MockRestClientBuilder from(String value) {
                super.from(value);
                return this;
        }
 
        @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder header(Header part) {
-               super.header(part);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
        public MockRestClientBuilder header(String name, String value) {
                super.header(name, value);
                return this;
@@ -1003,24 +972,12 @@ public class MockRestClientBuilder extends 
RestClientBuilder {
        }
 
        @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder headerPairs(String...pairs) {
-               super.headerPairs(pairs);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
        public MockRestClientBuilder headers(Header...parts) {
                super.headers(parts);
                return this;
        }
 
        @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder headers(HeaderList parts) {
-               super.headers(parts);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
        public MockRestClientBuilder host(String value) {
                super.host(value);
                return this;
@@ -1063,36 +1020,6 @@ public class MockRestClientBuilder extends 
RestClientBuilder {
        }
 
        @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder ifMatch(String value) {
-               super.ifMatch(value);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder ifModifiedSince(ZonedDateTime value) {
-               super.ifModifiedSince(value);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder ifNoneMatch(String value) {
-               super.ifNoneMatch(value);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder ifRange(String value) {
-               super.ifRange(value);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder ifUnmodifiedSince(ZonedDateTime value) {
-               super.ifUnmodifiedSince(value);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
        public MockRestClientBuilder ignoreErrors() {
                super.ignoreErrors();
                return this;
@@ -1448,24 +1375,12 @@ public class MockRestClientBuilder extends 
RestClientBuilder {
        }
 
        @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder range(String value) {
-               super.range(value);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
        public MockRestClientBuilder redirectStrategy(RedirectStrategy 
redirectStrategy) {
                super.redirectStrategy(redirectStrategy);
                return this;
        }
 
        @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder referer(String value) {
-               super.referer(value);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
        public MockRestClientBuilder requestExecutor(HttpRequestExecutor 
requestExec) {
                super.requestExecutor(requestExec);
                return this;
@@ -1617,12 +1532,6 @@ public class MockRestClientBuilder extends 
RestClientBuilder {
        }
 
        @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder te(String value) {
-               super.te(value);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
        public MockRestClientBuilder trimEmptyCollections() {
                super.trimEmptyCollections();
                return this;
@@ -1653,12 +1562,6 @@ public class MockRestClientBuilder extends 
RestClientBuilder {
        }
 
        @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder upgrade(String value) {
-               super.upgrade(value);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
        public MockRestClientBuilder uriContext(UriContext value) {
                super.uriContext(value);
                return this;
@@ -1707,18 +1610,6 @@ public class MockRestClientBuilder extends 
RestClientBuilder {
        }
 
        @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder via(String value) {
-               super.via(value);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
-       public MockRestClientBuilder warning(String value) {
-               super.warning(value);
-               return this;
-       }
-
-       @Override /* GENERATED - RestClientBuilder */
        public MockRestClientBuilder ws() {
                super.ws();
                return this;
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_BasicCalls_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_BasicCalls_Test.java
index ace2c5e..b9a8875 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_BasicCalls_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_BasicCalls_Test.java
@@ -174,7 +174,7 @@ public class RestClient_BasicCalls_Test {
                        parts("f",1)
                );
                for (Object body : bodies) {
-                       client().header(body instanceof PartList ? 
APPLICATION_FORM_URLENCODED : 
APPLICATION_JSON).build().put("/bean",body).run().assertBody().is("{f:1}");
+                       client().headers(body instanceof PartList ? 
APPLICATION_FORM_URLENCODED : 
APPLICATION_JSON).build().put("/bean",body).run().assertBody().is("{f:1}");
                }
        }
 
@@ -217,7 +217,7 @@ public class RestClient_BasicCalls_Test {
                        parts("f",1)
                );
                for (Object body : bodies) {
-                       client().header(body instanceof PartList ? 
APPLICATION_FORM_URLENCODED : 
APPLICATION_JSON).build().post("/bean",body).run().assertBody().is("{f:1}");
+                       client().headers(body instanceof PartList ? 
APPLICATION_FORM_URLENCODED : 
APPLICATION_JSON).build().post("/bean",body).run().assertBody().is("{f:1}");
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Config_RestClient_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Config_RestClient_Test.java
index d8d4502..7a49824 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Config_RestClient_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Config_RestClient_Test.java
@@ -475,13 +475,13 @@ public class RestClient_Config_RestClient_Test {
 
        @Test
        public void a12_partSerializer_partParser() throws Exception {
-               RestClient x = client(A12.class).header(serializedHeader("Foo", 
bean)).partSerializer(A12a.class).partParser(A12b.class).build();
+               RestClient x = 
client(A12.class).headers(serializedHeader("Foo", 
bean)).partSerializer(A12a.class).partParser(A12b.class).build();
                ABean b = 
x.get("/").header("Foo",bean).run().assertHeader("Foo").is("x{f:1}").getHeader("Foo").asType(ABean.class).get();
                assertEquals("{f:1}",b.toString());
                b = 
x.get().header("Foo",bean).run().assertHeader("Foo").is("x{f:1}").getHeader("Foo").asType(ABean.class).get();
                assertEquals("{f:1}",b.toString());
 
-               x = client(A12.class).header(serializedHeader("Foo", 
bean)).partSerializer(new A12a(MockWriterSerializer.create())).partParser(new 
A12b(MockReaderParser.create())).build();
+               x = client(A12.class).headers(serializedHeader("Foo", 
bean)).partSerializer(new A12a(MockWriterSerializer.create())).partParser(new 
A12b(MockReaderParser.create())).build();
                b = 
x.get("/").header("Foo",bean).run().assertHeader("Foo").is("x{f:1}").getHeader("Foo").asType(ABean.class).get();
                assertEquals("{f:1}",b.toString());
        }
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Headers_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Headers_Test.java
index 2336406..50d58c9 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Headers_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Headers_Test.java
@@ -84,8 +84,8 @@ public class RestClient_Headers_Test {
                
checkFooClient().header("Foo","bar").build().get("/headers").run().assertBody().is("['bar']");
                
checkFooClient().build().get("/headers").header("Foo","baz").run().assertBody().is("['baz']");
                
checkFooClient().header("Foo","bar").build().get("/headers").header("Foo","baz").run().assertBody().is("['bar','baz']");
-               
checkFooClient().header(header("Foo",bean,null)).build().get("/headers").header("Foo",bean).run().assertBody().is("['f=1','f=1']");
-               
checkFooClient().header(header("Foo",null,null)).build().get("/headers").header("Foo",null).run().assertBody().is("[]");
+               
checkFooClient().headers(header("Foo",bean,null)).build().get("/headers").header("Foo",bean).run().assertBody().is("['f=1','f=1']");
+               
checkFooClient().headers(header("Foo",null,null)).build().get("/headers").header("Foo",null).run().assertBody().is("[]");
 
                
checkClient("null").header(null,"bar").build().get("/headers").header(null,"Foo").run().assertBody().is("[]");
                
checkClient("null").header(null,(String)null).build().get("/headers").header((String)null,null).run().assertBody().is("[]");
@@ -94,21 +94,13 @@ public class RestClient_Headers_Test {
        @Test
        public void a02_header_String_Object_Schema() throws Exception {
                List<String> l1 = AList.of("bar","baz"), l2 = 
AList.of("qux","quux");
-               
checkFooClient().header(header("Foo",l1,T_ARRAY_PIPES)).build().get("/headers").header(header("Foo",l2,T_ARRAY_PIPES)).run().assertBody().is("['bar|baz','qux|quux']");
+               
checkFooClient().headers(header("Foo",l1,T_ARRAY_PIPES)).build().get("/headers").header(header("Foo",l2,T_ARRAY_PIPES)).run().assertBody().is("['bar|baz','qux|quux']");
        }
 
        @Test
        public void a03_header_Header() throws Exception {
-               
checkFooClient().header(header("Foo","bar")).build().get("/headers").header(header("Foo","baz")).run().assertBody().is("['bar','baz']");
-               
checkFooClient().header(stringHeader("Foo","bar")).build().get("/headers").header(stringHeader("Foo","baz")).run().assertBody().is("['bar','baz']");
-       }
-
-       @Test
-       public void a05_headerPairs_Objects() throws Exception {
-               
checkFooClient().headerPairs("Foo","bar").build().get("/headers").headerPairs("Foo","baz").run().assertBody().is("['bar','baz']");
-               
checkFooClient().headerPairs("Foo","bar","Foo","baz").header("Foo","qux").build().get("/headers").headerPairs("Foo","q1x","Foo","q2x").run().assertBody().is("['bar','baz','qux','q1x','q2x']");
-               assertThrown(()->client().headerPairs("Foo")).message().is("Odd 
number of parameters passed into headerPairs(String...)");
-               
assertThrown(()->client().build().get("").headerPairs("Foo")).message().is("Odd 
number of parameters passed into headerPairs(String...)");
+               
checkFooClient().headers(header("Foo","bar")).build().get("/headers").header(header("Foo","baz")).run().assertBody().is("['bar','baz']");
+               
checkFooClient().headers(stringHeader("Foo","bar")).build().get("/headers").header(stringHeader("Foo","baz")).run().assertBody().is("['bar','baz']");
        }
 
        @Test
@@ -147,7 +139,7 @@ public class RestClient_Headers_Test {
        @Test
        public void a08_header_String_Supplier() throws Exception {
                TestSupplier s = TestSupplier.of("foo");
-               RestClient x = 
checkFooClient().header(header("Foo",s,null)).build();
+               RestClient x = 
checkFooClient().headers(header("Foo",s,null)).build();
                
x.get("/headers").header("Foo",s).run().assertBody().is("['foo','foo']");
                s.set("bar");
                
x.get("/headers").header("Foo",s).run().assertBody().is("['bar','bar']");
@@ -155,13 +147,13 @@ public class RestClient_Headers_Test {
 
        @Test
        public void a09_headers_String_Object_Schema_Serializer() throws 
Exception {
-               
checkFooClient().header(header("Foo",bean,null).serializer(MockWriterSerializer.X)).build().get("/headers").run().assertBody().is("['x{f:1}x']");
+               
checkFooClient().headers(header("Foo",bean,null).serializer(MockWriterSerializer.X)).build().get("/headers").run().assertBody().is("['x{f:1}x']");
        }
 
        @Test
        public void a10_headers_String_Supplier_Schema() throws Exception {
                TestSupplier s = TestSupplier.of(new String[]{"foo","bar"});
-               RestClient x = 
checkFooClient().header(header("Foo",s,T_ARRAY_PIPES)).build();
+               RestClient x = 
checkFooClient().headers(header("Foo",s,T_ARRAY_PIPES)).build();
                
x.get("/headers").header(header("Foo",s,T_ARRAY_PIPES)).run().assertBody().is("['foo|bar','foo|bar']");
                s.set(new String[]{"bar","baz"});
                
x.get("/headers").header(header("Foo",s,T_ARRAY_PIPES)).run().assertBody().is("['bar|baz','bar|baz']");
@@ -170,7 +162,7 @@ public class RestClient_Headers_Test {
        @Test
        public void a11_headers_String_Supplier_Schema_Serializer() throws 
Exception {
                TestSupplier s = TestSupplier.of(new String[]{"foo","bar"});
-               
checkFooClient().header(header("Foo",s,T_ARRAY_PIPES).serializer(UonSerializer.DEFAULT)).build().get("/headers").run().assertBody().is("['@(foo,bar)']");
+               
checkFooClient().headers(header("Foo",s,T_ARRAY_PIPES).serializer(UonSerializer.DEFAULT)).build().get("/headers").run().assertBody().is("['@(foo,bar)']");
        }
 
        public static class A12 implements HttpPartSerializer {
@@ -187,7 +179,7 @@ public class RestClient_Headers_Test {
 
        @Test
        public void a12_badSerialization() throws Exception {
-               
assertThrown(()->checkFooClient().header(header("Foo","bar",null).serializer(new
 A12())).build().get().run()).messages().contains("bad");
+               
assertThrown(()->checkFooClient().headers(header("Foo","bar",null).serializer(new
 A12())).build().get().run()).messages().contains("bad");
        }
 
        
//------------------------------------------------------------------------------------------------------------------
@@ -204,31 +196,16 @@ public class RestClient_Headers_Test {
                
checkClient("Cache-Control").cacheControl("none").build().get("/headers").run().assertBody().is("['none']");
                
checkClient("Client-Version").clientVersion("1").build().get("/headers").run().assertBody().is("['1']");
                
checkClient("Connection").connection("foo").build().get("/headers").run().assertBody().is("['foo']");
-               
checkClient("Content-Length").contentLength(123l).build().get("/headers").run().assertBody().is("['123']");
                
checkClient("Content-Type").contentType("foo").build().get("/headers").run().assertBody().is("['foo']");
                
checkClient("Content-Encoding").contentEncoding("identity").build().get("/headers").run().assertBody().is("['identity']");
-               
checkClient("Date").date(ZONEDDATETIME).build().get("/headers").run().assertBody().is("['"+PARSEDZONEDDATETIME+"']");
-               
checkClient("Expect").expect("foo").build().get("/headers").run().assertBody().is("['foo']");
-               
checkClient("Forwarded").forwarded("foo").build().get("/headers").run().assertBody().is("['foo']");
                
checkClient("From").from("foo").build().get("/headers").run().assertBody().is("['foo']");
                
checkClient("Host").host("foo").build().get("/headers").run().assertBody().is("['foo']");
-               
checkClient("If-Match").ifMatch("\"foo\"").build().get("/headers").run().assertBody().is("['\"foo\"']");
-               
checkClient("If-Modified-Since").ifModifiedSince(ZONEDDATETIME).build().get("/headers").run().assertBody().is("['"+PARSEDZONEDDATETIME+"']");
-               
checkClient("If-None-Match").ifNoneMatch("\"foo\"").build().get("/headers").run().assertBody().is("['\"foo\"']");
-               
checkClient("If-Range").ifRange("\"foo\"").build().get("/headers").run().assertBody().is("['\"foo\"']");
-               
checkClient("If-Unmodified-Since").ifUnmodifiedSince(ZONEDDATETIME).build().get("/headers").run().assertBody().is("['"+PARSEDZONEDDATETIME+"']");
                
checkClient("Max-Forwards").maxForwards(10).build().get("/headers").run().assertBody().is("['10']");
                
checkClient("No-Trace").noTrace().build().get("/headers").run().assertBody().is("['true','true']");
                
checkClient("Origin").origin("foo").build().get("/headers").run().assertBody().is("['foo']");
                
checkClient("Pragma").pragma("foo").build().get("/headers").run().assertBody().is("['foo']");
                
checkClient("Proxy-Authorization").proxyAuthorization("foo").build().get("/headers").run().assertBody().is("['foo']");
-               
checkClient("Range").range("foo").build().get("/headers").run().assertBody().is("['foo']");
-               
checkClient("Referer").referer("foo").build().get("/headers").run().assertBody().is("['foo']");
-               
checkClient("TE").te("foo").build().get("/headers").run().assertBody().is("['foo']");
                
checkClient("User-Agent").userAgent("foo").build().get("/headers").run().assertBody().is("['foo']");
-               
checkClient("Upgrade").upgrade("foo").build().get("/headers").run().assertBody().is("['foo']");
-               
checkClient("Via").via("foo").build().get("/headers").run().assertBody().is("['foo']");
-               
checkClient("Warning").warning("foo").build().get("/headers").run().assertBody().is("['foo']");
 
                
checkClient("Accept").build().get("/headers").accept("text/plain").run().assertBody().is("['text/plain']");
                
checkClient("Accept-Charset").build().get("/headers").acceptCharset("UTF-8").run().assertBody().is("['UTF-8']");
@@ -267,41 +244,41 @@ public class RestClient_Headers_Test {
 
        @Test
        public void b02_headerBeans() throws Exception {
-               checkClient("Accept").header(new 
Accept("text/plain")).build().get("/headers").run().assertBody().is("['text/plain']");
-               checkClient("Accept-Charset").header(new 
AcceptCharset("UTF-8")).build().get("/headers").run().assertBody().is("['UTF-8']");
-               checkClient("Accept-Encoding").header(new 
AcceptEncoding("identity")).build().get("/headers").run().assertBody().is("['identity']");
-               checkClient("Accept-Language").header(new 
AcceptLanguage("en")).build().get("/headers").run().assertBody().is("['en']");
-               checkClient("Authorization").header(new 
Authorization("foo")).build().get("/headers").run().assertBody().is("['foo']");
-               checkClient("Cache-Control").header(new 
CacheControl("none")).header("X-Expect","none").build().get("/headers").run().assertBody().is("['none']");
-               checkClient("Client-Version").header(new 
ClientVersion("1")).build().get("/headers").run().assertBody().is("['1']");
-               checkClient("Connection").header(new 
Connection("foo")).build().get("/headers").run().assertBody().is("['foo']");
-               checkClient("Content-Length").header(new 
ContentLength(123l)).build().get("/headers").run().assertBody().is("['123']");
-               checkClient("Content-Type").header(new 
ContentType("foo")).build().get("/headers").run().assertBody().is("['foo']");
-               checkClient("Date").header(new 
org.apache.juneau.http.header.Date(PARSEDZONEDDATETIME)).build().get("/headers").run().assertBody().is("['"+PARSEDZONEDDATETIME+"']");
-               checkClient("Date").header(new 
org.apache.juneau.http.header.Date(ZONEDDATETIME)).build().get("/headers").run().assertBody().is("['"+PARSEDZONEDDATETIME+"']");
-               checkClient("Expect").header(new 
Expect("foo")).build().get("/headers").run().assertBody().is("['foo']");
-               checkClient("Forwarded").header(new 
Forwarded("foo")).build().get("/headers").run().assertBody().is("['foo']");
-               checkClient("From").header(new 
From("foo")).build().get("/headers").run().assertBody().is("['foo']");
-               checkClient("Host").header(new 
Host("foo")).build().get("/headers").run().assertBody().is("['foo']");
-               checkClient("If-Match").header(new 
IfMatch("\"foo\"")).build().get("/headers").run().assertBody().is("['\"foo\"']");
-               checkClient("If-Modified-Since").header(new 
IfModifiedSince(ZONEDDATETIME)).build().get("/headers").run().assertBody().is("['"+PARSEDZONEDDATETIME+"']");
-               checkClient("If-Modified-Since").header(new 
IfModifiedSince(PARSEDZONEDDATETIME)).build().get("/headers").run().assertBody().is("['"+PARSEDZONEDDATETIME+"']");
-               checkClient("If-None-Match").header(new 
IfNoneMatch("\"foo\"")).build().get("/headers").run().assertBody().is("['\"foo\"']");
-               checkClient("If-Range").header(new 
IfRange("\"foo\"")).build().get("/headers").run().assertBody().is("['\"foo\"']");
-               checkClient("If-Unmodified-Since").header(new 
IfUnmodifiedSince(ZONEDDATETIME)).build().get("/headers").run().assertBody().is("['"+PARSEDZONEDDATETIME+"']");
-               checkClient("If-Unmodified-Since").header(new 
IfUnmodifiedSince(PARSEDZONEDDATETIME)).build().get("/headers").run().assertBody().is("['"+PARSEDZONEDDATETIME+"']");
-               checkClient("Max-Forwards").header(new 
MaxForwards(10)).build().get("/headers").run().assertBody().is("['10']");
-               checkClient("No-Trace").header(new 
NoTrace("true")).build().get("/headers").run().assertBody().is("['true','true']");
-               checkClient("Origin").header(new 
Origin("foo")).build().get("/headers").run().assertBody().is("['foo']");
-               checkClient("Pragma").header(new 
Pragma("foo")).build().get("/headers").run().assertBody().is("['foo']");
-               checkClient("Proxy-Authorization").header(new 
ProxyAuthorization("foo")).build().get("/headers").run().assertBody().is("['foo']");
-               checkClient("Range").header(new 
Range("foo")).build().get("/headers").run().assertBody().is("['foo']");
-               checkClient("Referer").header(new 
Referer("foo")).build().get("/headers").run().assertBody().is("['foo']");
-               checkClient("TE").header(new 
TE("foo")).build().get("/headers").run().assertBody().is("['foo']");
-               checkClient("User-Agent").header(new 
UserAgent("foo")).build().get("/headers").run().assertBody().is("['foo']");
-               checkClient("Upgrade").header(new 
Upgrade("foo")).build().get("/headers").run().assertBody().is("['foo']");
-               checkClient("Via").header(new 
Via("foo")).build().get("/headers").run().assertBody().is("['foo']");
-               checkClient("Warning").header(new 
Warning("foo")).build().get("/headers").run().assertBody().is("['foo']");
+               checkClient("Accept").headers(new 
Accept("text/plain")).build().get("/headers").run().assertBody().is("['text/plain']");
+               checkClient("Accept-Charset").headers(new 
AcceptCharset("UTF-8")).build().get("/headers").run().assertBody().is("['UTF-8']");
+               checkClient("Accept-Encoding").headers(new 
AcceptEncoding("identity")).build().get("/headers").run().assertBody().is("['identity']");
+               checkClient("Accept-Language").headers(new 
AcceptLanguage("en")).build().get("/headers").run().assertBody().is("['en']");
+               checkClient("Authorization").headers(new 
Authorization("foo")).build().get("/headers").run().assertBody().is("['foo']");
+               checkClient("Cache-Control").headers(new 
CacheControl("none")).header("X-Expect","none").build().get("/headers").run().assertBody().is("['none']");
+               checkClient("Client-Version").headers(new 
ClientVersion("1")).build().get("/headers").run().assertBody().is("['1']");
+               checkClient("Connection").headers(new 
Connection("foo")).build().get("/headers").run().assertBody().is("['foo']");
+               checkClient("Content-Length").headers(new 
ContentLength(123l)).build().get("/headers").run().assertBody().is("['123']");
+               checkClient("Content-Type").headers(new 
ContentType("foo")).build().get("/headers").run().assertBody().is("['foo']");
+               checkClient("Date").headers(new 
org.apache.juneau.http.header.Date(PARSEDZONEDDATETIME)).build().get("/headers").run().assertBody().is("['"+PARSEDZONEDDATETIME+"']");
+               checkClient("Date").headers(new 
org.apache.juneau.http.header.Date(ZONEDDATETIME)).build().get("/headers").run().assertBody().is("['"+PARSEDZONEDDATETIME+"']");
+               checkClient("Expect").headers(new 
Expect("foo")).build().get("/headers").run().assertBody().is("['foo']");
+               checkClient("Forwarded").headers(new 
Forwarded("foo")).build().get("/headers").run().assertBody().is("['foo']");
+               checkClient("From").headers(new 
From("foo")).build().get("/headers").run().assertBody().is("['foo']");
+               checkClient("Host").headers(new 
Host("foo")).build().get("/headers").run().assertBody().is("['foo']");
+               checkClient("If-Match").headers(new 
IfMatch("\"foo\"")).build().get("/headers").run().assertBody().is("['\"foo\"']");
+               checkClient("If-Modified-Since").headers(new 
IfModifiedSince(ZONEDDATETIME)).build().get("/headers").run().assertBody().is("['"+PARSEDZONEDDATETIME+"']");
+               checkClient("If-Modified-Since").headers(new 
IfModifiedSince(PARSEDZONEDDATETIME)).build().get("/headers").run().assertBody().is("['"+PARSEDZONEDDATETIME+"']");
+               checkClient("If-None-Match").headers(new 
IfNoneMatch("\"foo\"")).build().get("/headers").run().assertBody().is("['\"foo\"']");
+               checkClient("If-Range").headers(new 
IfRange("\"foo\"")).build().get("/headers").run().assertBody().is("['\"foo\"']");
+               checkClient("If-Unmodified-Since").headers(new 
IfUnmodifiedSince(ZONEDDATETIME)).build().get("/headers").run().assertBody().is("['"+PARSEDZONEDDATETIME+"']");
+               checkClient("If-Unmodified-Since").headers(new 
IfUnmodifiedSince(PARSEDZONEDDATETIME)).build().get("/headers").run().assertBody().is("['"+PARSEDZONEDDATETIME+"']");
+               checkClient("Max-Forwards").headers(new 
MaxForwards(10)).build().get("/headers").run().assertBody().is("['10']");
+               checkClient("No-Trace").headers(new 
NoTrace("true")).build().get("/headers").run().assertBody().is("['true','true']");
+               checkClient("Origin").headers(new 
Origin("foo")).build().get("/headers").run().assertBody().is("['foo']");
+               checkClient("Pragma").headers(new 
Pragma("foo")).build().get("/headers").run().assertBody().is("['foo']");
+               checkClient("Proxy-Authorization").headers(new 
ProxyAuthorization("foo")).build().get("/headers").run().assertBody().is("['foo']");
+               checkClient("Range").headers(new 
Range("foo")).build().get("/headers").run().assertBody().is("['foo']");
+               checkClient("Referer").headers(new 
Referer("foo")).build().get("/headers").run().assertBody().is("['foo']");
+               checkClient("TE").headers(new 
TE("foo")).build().get("/headers").run().assertBody().is("['foo']");
+               checkClient("User-Agent").headers(new 
UserAgent("foo")).build().get("/headers").run().assertBody().is("['foo']");
+               checkClient("Upgrade").headers(new 
Upgrade("foo")).build().get("/headers").run().assertBody().is("['foo']");
+               checkClient("Via").headers(new 
Via("foo")).build().get("/headers").run().assertBody().is("['foo']");
+               checkClient("Warning").headers(new 
Warning("foo")).build().get("/headers").run().assertBody().is("['foo']");
        }
 
        @Test
@@ -337,10 +314,6 @@ public class RestClient_Headers_Test {
                return serializedHeader(name, val).schema(schema);
        }
 
-       private static RestClientBuilder client() {
-               return MockRestClient.create(A.class).simpleJson();
-       }
-
        private static RestClientBuilder checkFooClient() {
                return 
MockRestClient.create(A.class).simpleJson().header("Check","Foo");
        }

Reply via email to