You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2021/06/07 14:13:38 UTC

[juneau] branch master updated: RestClient API improvements.

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 ee710a0  RestClient API improvements.
ee710a0 is described below

commit ee710a0d302b783b1b34d7febce24f17cf52149d
Author: JamesBognar <ja...@salesforce.com>
AuthorDate: Mon Jun 7 10:12:57 2021 -0400

    RestClient API improvements.
---
 .../33.RestLoggingAndDebugging.html                |   2 +-
 .../org/apache/juneau/rest/client/RestClient.java  |  63 ++--
 .../juneau/rest/client/RestClientBuilder.java      | 368 ++++++++++++---------
 .../apache/juneau/rest/mock/MockRestClient.java    |   2 +-
 .../juneau/rest/mock/MockRestClientBuilder.java    |  93 +++---
 .../juneau/rest/mock/MockServletRequest.java       |   4 +-
 .../java/org/apache/juneau/rest/RestRequest.java   |  12 +-
 .../java/org/apache/juneau/rest/RestResponse.java  |  14 +-
 .../juneau/rest/logging/BasicTestRestLogger.java   |  18 +-
 .../rest/client/RestClient_Headers_Test.java       |  23 +-
 10 files changed, 335 insertions(+), 264 deletions(-)

diff --git a/juneau-doc/docs/Topics/06.juneau-rest-server/33.RestLoggingAndDebugging.html b/juneau-doc/docs/Topics/06.juneau-rest-server/33.RestLoggingAndDebugging.html
index 0d02030..f626d79 100644
--- a/juneau-doc/docs/Topics/06.juneau-rest-server/33.RestLoggingAndDebugging.html
+++ b/juneau-doc/docs/Topics/06.juneau-rest-server/33.RestLoggingAndDebugging.html
@@ -273,7 +273,7 @@ Logging / Debugging
 <ul>
 	<li><js>"true"</js> - Logging disabled.
 	<li><js>"false"</js> (default) - Logging not disabled.
-	<li><js>"per-request"</js> - Logging is disabled only on requests containing a <c class='snippet'>X-NoTrace: true</c> header.
+	<li><js>"per-request"</js> - Logging is disabled only on requests containing a <c class='snippet'>No-Trace: true</c> header.
 </ul>
 <p>
 	Disabled logging is particularly useful when running testcases that are expected to throw exceptions or cause
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 e5551fe..f4e5ff0 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
@@ -33,6 +33,7 @@ import java.net.*;
 import java.net.URI;
 import java.nio.charset.*;
 import java.text.*;
+import java.time.*;
 import java.util.*;
 import java.util.concurrent.*;
 import java.util.function.*;
@@ -1289,37 +1290,37 @@ public class RestClient extends BeanContext implements HttpClient, Closeable, Re
 	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#header(Header) header(Header)}
 	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#headers(Object...) headers(Object...)}
 	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#headerPairs(Object...) headerPairs(Object...)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#accept(Object) accept(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#acceptCharset(Object) acceptCharset(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#acceptEncoding(Object) acceptEncoding(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#acceptLanguage(Object) acceptLanguage(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#authorization(Object) authorization(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#cacheControl(Object) cacheControl(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#clientVersion(Object) clientVersion(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#connection(Object) connection(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#contentLength(Object) contentLength(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#contentType(Object) contentType(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#date(Object) date(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#expect(Object) expect(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#forwarded(Object) forwarded(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#from(Object) from(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#host(Object) host(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#ifMatch(Object) ifMatch(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#ifModifiedSince(Object) ifModifiedSince(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#ifNoneMatch(Object) ifNoneMatch(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#ifRange(Object) ifRange(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#ifUnmodifiedSince(Object) ifUnmodifiedSince(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#maxForwards(Object) maxForwards(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#origin(Object) origin(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#pragma(Object) pragma(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#proxyAuthorization(Object) proxyAuthorization(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#range(Object) proxyAuthorization(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#referer(Object) referer(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#te(Object) te(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#userAgent(Object) userAgent(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#upgrade(Object) upgrade(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#via(Object) via(Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#warning(Object) warning(Object)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#accept(String) accept(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#acceptCharset(String) acceptCharset(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#acceptEncoding(String) acceptEncoding(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#acceptLanguage(String) acceptLanguage(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#authorization(String) authorization(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#cacheControl(String) cacheControl(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#clientVersion(String) clientVersion(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#connection(String) connection(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#contentLength(Long) contentLength(Long)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#contentType(String) contentType(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#date(ZonedDateTime) date(ZonedDateTime)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#expect(String) expect(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#forwarded(String) forwarded(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#from(String) from(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#host(String) host(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#ifMatch(String) ifMatch(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#ifModifiedSince(String) ifModifiedSince(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#ifNoneMatch(String) ifNoneMatch(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#ifRange(String) ifRange(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#ifUnmodifiedSince(String) ifUnmodifiedSince(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#maxForwards(Integer) maxForwards(Integer)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#origin(String) origin(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#pragma(String) pragma(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#proxyAuthorization(String) proxyAuthorization(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#range(String) proxyAuthorization(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#referer(String) referer(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#te(String) te(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#userAgent(String) userAgent(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#upgrade(String) upgrade(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#via(String) via(String)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client.RestClientBuilder#warning(String) warning(String)}
 	 * 			</ul>
 	 * 			<li class='jc'>{@link org.apache.juneau.rest.client.RestRequest}
 	 * 			<ul>
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 3e20ccf..a3cbfa0 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
@@ -28,6 +28,7 @@ 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.*;
@@ -55,6 +56,7 @@ import org.apache.juneau.annotation.*;
 import org.apache.juneau.html.*;
 import org.apache.juneau.http.HttpHeaders;
 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.*;
@@ -155,10 +157,10 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 * 	</ul>
 	 * <p>
 	 * 	<c>Accept</c> request header will be set to <js>"application/json"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #accept(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #accept(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
 	 * <p>
 	 * 	<c>Content-Type</c> request header will be set to <js>"application/json"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #contentType(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #contentType(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
 	 * <p>
 	 * 	Can be combined with other marshaller setters such as {@link #xml()} to provide support for multiple languages.
 	 * 	<ul>
@@ -202,10 +204,10 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 * 	</ul>
 	 * <p>
 	 * 	<c>Accept</c> request header will be set to <js>"application/json"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #accept(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #accept(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
 	 * <p>
 	 * 	<c>Content-Type</c> request header will be set to <js>"application/json+simple"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #contentType(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #contentType(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
 	 * <p>
 	 * 	Can be combined with other marshaller setters such as {@link #xml()} to provide support for multiple languages.
 	 * 	<ul>
@@ -245,10 +247,10 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 * 	</ul>
 	 * <p>
 	 * 	<c>Accept</c> request header will be set to <js>"text/xml"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #accept(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #accept(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
 	 * <p>
 	 * 	<c>Content-Type</c> request header will be set to <js>"text/xml"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #contentType(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #contentType(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
 	 * <p>
 	 * 	Can be combined with other marshaller setters such as {@link #json()} to provide support for multiple languages.
 	 * 	<ul>
@@ -291,10 +293,10 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 * 	</ul>
 	 * <p>
 	 * 	<c>Accept</c> request header will be set to <js>"text/html"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #accept(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #accept(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
 	 * <p>
 	 * 	<c>Content-Type</c> request header will be set to <js>"text/html"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #contentType(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #contentType(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
 	 * <p>
 	 * 	Can be combined with other marshaller setters such as {@link #json()} to provide support for multiple languages.
 	 * 	<ul>
@@ -337,10 +339,10 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 * 	</ul>
 	 * <p>
 	 * 	<c>Accept</c> request header will be set to <js>"text/html"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #accept(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #accept(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
 	 * <p>
 	 * 	<c>Content-Type</c> request header will be set to <js>"text/html"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #contentType(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #contentType(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
 	 * <p>
 	 * 	Can be combined with other marshaller setters such as {@link #json()} to provide support for multiple languages.
 	 * 	<ul>
@@ -383,10 +385,10 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 * 	</ul>
 	 * <p>
 	 * 	<c>Accept</c> request header will be set to <js>"text/html+stripped"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #accept(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #accept(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
 	 * <p>
 	 * 	<c>Content-Type</c> request header will be set to <js>"text/html+stripped"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #contentType(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #contentType(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
 	 * <p>
 	 * 	Can be combined with other marshaller setters such as {@link #json()} to provide support for multiple languages.
 	 * 	<ul>
@@ -430,10 +432,10 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 * 	</ul>
 	 * <p>
 	 * 	<c>Accept</c> request header will be set to <js>"text/plain"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #accept(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #accept(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
 	 * <p>
 	 * 	<c>Content-Type</c> request header will be set to <js>"text/plain"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #contentType(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #contentType(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
 	 * <p>
 	 * 	Can be combined with other marshaller setters such as {@link #json()} to provide support for multiple languages.
 	 * 	<ul>
@@ -476,10 +478,10 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 * 	</ul>
 	 * <p>
 	 * 	<c>Accept</c> request header will be set to <js>"octal/msgpack"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #accept(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #accept(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
 	 * <p>
 	 * 	<c>Content-Type</c> request header will be set to <js>"octal/msgpack"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #contentType(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #contentType(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
 	 * <p>
 	 * 	Can be combined with other marshaller setters such as {@link #json()} to provide support for multiple languages.
 	 * 	<ul>
@@ -523,10 +525,10 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 * 	</ul>
 	 * <p>
 	 * 	<c>Accept</c> request header will be set to <js>"text/uon"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #accept(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #accept(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
 	 * <p>
 	 * 	<c>Content-Type</c> request header will be set to <js>"text/uon"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #contentType(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #contentType(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
 	 * <p>
 	 * 	Can be combined with other marshaller setters such as {@link #json()} to provide support for multiple languages.
 	 * 	<ul>
@@ -568,10 +570,10 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 * 	</ul>
 	 * <p>
 	 * 	<c>Accept</c> request header will be set to <js>"application/x-www-form-urlencoded"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #accept(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #accept(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
 	 * <p>
 	 * 	<c>Content-Type</c> request header will be set to <js>"application/x-www-form-urlencoded"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #contentType(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #contentType(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
 	 * <p>
 	 * 	Can be combined with other marshaller setters such as {@link #json()} to provide support for multiple languages.
 	 * 	<ul>
@@ -617,10 +619,10 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 * 	</ul>
 	 * <p>
 	 * 	<c>Accept</c> request header will be set to <js>"text/openapi"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #accept(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #accept(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)}.
 	 * <p>
 	 * 	<c>Content-Type</c> request header will be set to <js>"text/openapi"</js> unless overridden
-	 * 		by {@link #header(String,Object)} or {@link #contentType(Object)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
+	 * 		by {@link #header(String,Object)} or {@link #contentType(String)}, or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)}.
 	 * <p>
 	 * 	Can be combined with other marshaller setters such as {@link #json()} to provide support for multiple languages.
 	 * 	<ul>
@@ -659,10 +661,10 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 * 			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(String,Object)} or {@link #accept(Object)}, or per-request
+	 * 	<c>Accept</c> request header must be set by {@link #header(String,Object)} or {@link #accept(String)}, or per-request
 	 * 		via {@link RestRequest#header(String,Object)} or {@link RestRequest#accept(Object)} in order for the correct parser to be selected.
 	 * <p>
-	 * 	<c>Content-Type</c> request header must be set by {@link #header(String,Object)} or {@link #contentType(Object)},
+	 * 	<c>Content-Type</c> request header must be set by {@link #header(String,Object)} or {@link #contentType(String)},
 	 * 		or per-request via {@link RestRequest#header(String,Object)} or {@link RestRequest#contentType(Object)} in order for the correct serializer to be selected.
 	 * <p>
 	 * 	Similar to calling <c>json().simpleJson().html().xml().uon().urlEnc().openApi().msgPack().plainText()</c>.
@@ -1340,315 +1342,395 @@ public class RestClientBuilder extends BeanContextBuilder {
 		return this;
 	}
 
+	//-----------------------------------------------------------------------------------------------------------------
+	// Standard headers.
+	//-----------------------------------------------------------------------------------------------------------------
+
 	/**
-	 * Sets the value for the <c>Accept</c> request header on all requests.
+	 * Appends the <c>Accept</c> and <c>Content-Type</c> headers on all requests made by this client.
 	 *
 	 * <p>
-	 * This overrides the media type specified on the parser, but is overridden by calling
-	 * <code>header(<js>"Accept"</js>, value);</code>
+	 * Headers are appended to the end of the current header list.
 	 *
-	 * @param value The new header value.
+	 * @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 an <c>Accept</c> header on this request.
+	 *
+	 * <p>
+	 * Header is appended to the end of the current header list.
+	 *
+	 * <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(Object value) {
-		return header("Accept", value);
+	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 a shortcut for calling <code>header(<js>"Accept-Charset"</js>, value);</code>
+	 * 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(Object value) {
-		return header("Accept-Charset", value);
+	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 a shortcut for calling <code>header(<js>"Accept-Encoding"</js>, value);</code>
+	 * 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(Object value) {
-		return header("Accept-Encoding", value);
+	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 a shortcut for calling <code>header(<js>"Accept-Language"</js>, value);</code>
+	 * 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(Object value) {
-		return header("Accept-Language", value);
+	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 a shortcut for calling <code>header(<js>"Authorization"</js>, value);</code>
+	 * 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(Object value) {
-		return header("Authorization", value);
+	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 a shortcut for calling <code>header(<js>"Cache-Control"</js>, value);</code>
+	 * 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(Object value) {
-		return header("Cache-Control", value);
+	public RestClientBuilder cacheControl(String value) {
+		return header(CacheControl.of(value));
 	}
 
 	/**
-	 * Sets the client version by setting the value for the <js>"X-Client-Version"</js> header.
+	 * 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(Object value) {
-		return header("X-Client-Version", value);
+	public RestClientBuilder clientVersion(String value) {
+		return header(ClientVersion.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>Connection</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"Connection"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder connection(Object value) {
-		return header("Connection", value);
+	public RestClientBuilder connection(String value) {
+		return header(Connection.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>Content-Length</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"Content-Length"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder contentLength(Object value) {
-		return header("Content-Length", value);
+	public RestClientBuilder contentLength(Long value) {
+		return header(ContentLength.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>Content-Type</c> request header on all requests.
 	 *
 	 * <p>
-	 * This overrides the media type specified on the serializer, but is overridden by calling
-	 * <code>header(<js>"Content-Type"</js>, value);</code>
+	 * 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>
+	 *
+	 * <p>
+	 * This overrides the media type specified on the serializer.
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder contentType(Object value) {
-		return header("Content-Type", value);
+	public RestClientBuilder contentType(String value) {
+		return header(ContentType.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>Content-Encoding</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"Content-Encoding"</js>, value);</code>
+	 * 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>
+	 *
+	 * @param value The new header value.
+	 * @return This object (for method chaining).
+	 */
+	@FluentSetter
+	public RestClientBuilder contentEncoding(String value) {
+		return header(ContentEncoding.of(value));
+	}
+
+	/**
+	 * Sets the value for the <c>Date</c> request header 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder contentEncoding(Object value) {
-		return header("Content-Encoding", value);
+	public RestClientBuilder date(ZonedDateTime value) {
+		return header(Date.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>Date</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"Date"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder date(Object value) {
-		return header("Date", value);
+	public RestClientBuilder date(Date value) {
+		return header(value);
+	}
+
+	/**
+	 * Sets the value for the <c>Debug</c> request header on all requests.
+	 *
+	 * <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>
+	 *
+	 * @return This object (for method chaining).
+	 */
+	@Override
+	@FluentSetter
+	public RestClientBuilder debug() {
+		super.debug();
+		return header(Debug.TRUE);
 	}
 
 	/**
 	 * Sets the value for the <c>Expect</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"Expect"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder expect(Object value) {
-		return header("Expect", value);
+	public RestClientBuilder expect(String value) {
+		return header(Expect.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>Forwarded</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"Forwarded"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder forwarded(Object value) {
-		return header("Forwarded", value);
+	public RestClientBuilder forwarded(String value) {
+		return header(Forwarded.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>From</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"From"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder from(Object value) {
-		return header("From", value);
+	public RestClientBuilder from(String value) {
+		return header(From.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>Host</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"Host"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder host(Object value) {
-		return header("Host", value);
+	public RestClientBuilder host(String value) {
+		return header(Host.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>If-Match</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"If-Match"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder ifMatch(Object value) {
-		return header("If-Match", value);
+	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.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"If-Modified-Since"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder ifModifiedSince(Object value) {
-		return header("If-Modified-Since", value);
+	public RestClientBuilder ifModifiedSince(String value) {
+		return header(IfModifiedSince.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>If-None-Match</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"If-None-Match"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder ifNoneMatch(Object value) {
-		return header("If-None-Match", value);
+	public RestClientBuilder ifNoneMatch(String value) {
+		return header(IfNoneMatch.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>If-Range</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"If-Range"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder ifRange(Object value) {
-		return header("If-Range", value);
+	public RestClientBuilder ifRange(String value) {
+		return header(IfRange.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>If-Unmodified-Since</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"If-Unmodified-Since"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder ifUnmodifiedSince(Object value) {
-		return header("If-Unmodified-Since", value);
+	public RestClientBuilder ifUnmodifiedSince(String value) {
+		return header(IfUnmodifiedSince.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>Max-Forwards</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"Max-Forwards"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder maxForwards(Object value) {
-		return header("Max-Forwards", value);
+	public RestClientBuilder maxForwards(Integer value) {
+		return header(MaxForwards.of(value));
 	}
 
 	/**
-	 * When called, <c>X-No-Log: true</c> is added to requests.
+	 * When called, <c>No-Trace: true</c> is added to requests.
 	 *
 	 * <p>
 	 * This gives the opportunity for the servlet to not log errors on invalid requests.
@@ -1664,147 +1746,157 @@ public class RestClientBuilder extends BeanContextBuilder {
 	 */
 	@FluentSetter
 	public RestClientBuilder noTrace() {
-		return header("X-No-Log", true);
+		return header(NoTrace.of(true));
 	}
 
 	/**
 	 * Sets the value for the <c>Origin</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"Origin"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder origin(Object value) {
-		return header("Origin", value);
+	public RestClientBuilder origin(String value) {
+		return header(Origin.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>Pragma</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"Pragma"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder pragma(Object value) {
-		return header("Pragma", value);
+	public RestClientBuilder pragma(String value) {
+		return header(Pragma.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>Proxy-Authorization</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"Proxy-Authorization"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder proxyAuthorization(Object value) {
-		return header("Proxy-Authorization", value);
+	public RestClientBuilder proxyAuthorization(String value) {
+		return header(ProxyAuthorization.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>Range</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"Range"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder range(Object value) {
-		return header("Range", value);
+	public RestClientBuilder range(String value) {
+		return header(Range.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>Referer</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"Referer"</js>, value);</code>
+	 * This is equivalent to calling <code>header(<js>"Referer"</js>, <jv>value</jv>);</code>
+	 * or <code>header(Referer.<jsm>of</jsm>(<jv>value</jv>));</code>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder referer(Object value) {
-		return header("Referer", value);
+	public RestClientBuilder referer(String value) {
+		return header(Referer.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>TE</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"TE"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder te(Object value) {
-		return header("TE", value);
+	public RestClientBuilder te(String value) {
+		return header(TE.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>User-Agent</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"User-Agent"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder userAgent(Object value) {
-		return header("User-Agent", value);
+	public RestClientBuilder userAgent(String value) {
+		return header(UserAgent.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>Upgrade</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"Upgrade"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder upgrade(Object value) {
-		return header("Upgrade", value);
+	public RestClientBuilder upgrade(String value) {
+		return header(Upgrade.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>Via</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"Via"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder via(Object value) {
-		return header("Via", value);
+	public RestClientBuilder via(String value) {
+		return header(Via.of(value));
 	}
 
 	/**
 	 * Sets the value for the <c>Warning</c> request header on all requests.
 	 *
 	 * <p>
-	 * This is a shortcut for calling <code>header(<js>"Warning"</js>, value);</code>
+	 * 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>
 	 *
 	 * @param value The new header value.
 	 * @return This object (for method chaining).
 	 */
 	@FluentSetter
-	public RestClientBuilder warning(Object value) {
-		return header("Warning", value);
+	public RestClientBuilder warning(String value) {
+		return header(Warning.of(value));
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -4695,12 +4787,6 @@ public class RestClientBuilder extends BeanContextBuilder {
 	}
 
 	@Override /* GENERATED - ContextBuilder */
-	public RestClientBuilder debug() {
-		super.debug();
-		return this;
-	}
-
-	@Override /* GENERATED - ContextBuilder */
 	public RestClientBuilder locale(Locale value) {
 		super.locale(value);
 		return this;
@@ -5409,24 +5495,6 @@ public class RestClientBuilder extends BeanContextBuilder {
 	}
 
 	/**
-	 * Assigns <c>User-Agent</c> value.
-	 *
-	 * <ul class='notes'>
-	 * 	<li>This value can be overridden by the {@link #httpProcessor(HttpProcessor)} method.
-	 * 	<li>{@link #userAgent(Object)} is an equivalent method.
-	 * </ul>
-	 *
-	 * @param userAgent New property value.
-	 * @return This object (for method chaining).
-	 * @see HttpClientBuilder#setUserAgent(String)
-	 */
-	@FluentSetter
-	public RestClientBuilder userAgent(String userAgent) {
-		httpClientBuilder.setUserAgent(userAgent);
-		return this;
-	}
-
-	/**
 	 * Assigns default request header values.
 	 *
 	 * <ul class='notes'>
diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockRestClient.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockRestClient.java
index c14c67c..f178b70 100644
--- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockRestClient.java
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockRestClient.java
@@ -359,7 +359,7 @@ public class MockRestClient extends RestClient implements HttpClientConnection {
 	 * <p>
 	 * Equivalent to calling:
 	 * <p class='bcode w800'>
-	 * 	MockRestClient.<jsm>create</jsm>(<jv>impl</jv>).ignoreErrors().noLog().build();
+	 * 	MockRestClient.<jsm>create</jsm>(<jv>impl</jv>).ignoreErrors().noTrace().build();
 	 * </p>
 	 *
 	 * @param impl
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 895acec..34a00dc 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,6 +23,7 @@ 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.*;
@@ -277,12 +278,6 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - ContextBuilder */
-	public MockRestClientBuilder mediaType(MediaType value) {
-		super.mediaType(value);
-		return this;
-	}
-
-	@Override /* GENERATED - ContextBuilder */
 	public MockRestClientBuilder prependTo(String name, Object value) {
 		super.prependTo(name, value);
 		return this;
@@ -637,25 +632,25 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder accept(Object value) {
+	public MockRestClientBuilder accept(String value) {
 		super.accept(value);
 		return this;
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder acceptCharset(Object value) {
+	public MockRestClientBuilder acceptCharset(String value) {
 		super.acceptCharset(value);
 		return this;
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder acceptEncoding(Object value) {
+	public MockRestClientBuilder acceptEncoding(String value) {
 		super.acceptEncoding(value);
 		return this;
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder acceptLanguage(Object value) {
+	public MockRestClientBuilder acceptLanguage(String value) {
 		super.acceptLanguage(value);
 		return this;
 	}
@@ -697,7 +692,7 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder authorization(Object value) {
+	public MockRestClientBuilder authorization(String value) {
 		super.authorization(value);
 		return this;
 	}
@@ -715,7 +710,7 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder cacheControl(Object value) {
+	public MockRestClientBuilder cacheControl(String value) {
 		super.cacheControl(value);
 		return this;
 	}
@@ -733,13 +728,13 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder clientVersion(Object value) {
+	public MockRestClientBuilder clientVersion(String value) {
 		super.clientVersion(value);
 		return this;
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder connection(Object value) {
+	public MockRestClientBuilder connection(String value) {
 		super.connection(value);
 		return this;
 	}
@@ -793,25 +788,25 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder contentEncoding(Object value) {
+	public MockRestClientBuilder contentEncoding(String value) {
 		super.contentEncoding(value);
 		return this;
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder contentLength(Object value) {
+	public MockRestClientBuilder contentLength(Long value) {
 		super.contentLength(value);
 		return this;
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder contentType(Object value) {
+	public MockRestClientBuilder contentType(String value) {
 		super.contentType(value);
 		return this;
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder date(Object value) {
+	public MockRestClientBuilder date(ZonedDateTime value) {
 		super.date(value);
 		return this;
 	}
@@ -937,7 +932,7 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder expect(Object value) {
+	public MockRestClientBuilder expect(String value) {
 		super.expect(value);
 		return this;
 	}
@@ -997,20 +992,20 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder forwarded(Object value) {
+	public MockRestClientBuilder forwarded(String value) {
 		super.forwarded(value);
 		return this;
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder from(Object value) {
+	public MockRestClientBuilder from(String value) {
 		super.from(value);
 		return this;
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder header(Header header) {
-		super.header(header);
+	public MockRestClientBuilder header(Header value) {
+		super.header(value);
 		return this;
 	}
 
@@ -1063,7 +1058,7 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder host(Object value) {
+	public MockRestClientBuilder host(String value) {
 		super.host(value);
 		return this;
 	}
@@ -1105,31 +1100,31 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder ifMatch(Object value) {
+	public MockRestClientBuilder ifMatch(String value) {
 		super.ifMatch(value);
 		return this;
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder ifModifiedSince(Object value) {
+	public MockRestClientBuilder ifModifiedSince(String value) {
 		super.ifModifiedSince(value);
 		return this;
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder ifNoneMatch(Object value) {
+	public MockRestClientBuilder ifNoneMatch(String value) {
 		super.ifNoneMatch(value);
 		return this;
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder ifRange(Object value) {
+	public MockRestClientBuilder ifRange(String value) {
 		super.ifRange(value);
 		return this;
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder ifUnmodifiedSince(Object value) {
+	public MockRestClientBuilder ifUnmodifiedSince(String value) {
 		super.ifUnmodifiedSince(value);
 		return this;
 	}
@@ -1249,7 +1244,7 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder maxForwards(Object value) {
+	public MockRestClientBuilder maxForwards(Integer value) {
 		super.maxForwards(value);
 		return this;
 	}
@@ -1261,6 +1256,18 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
+	public MockRestClientBuilder mediaType(String value) {
+		super.mediaType(value);
+		return this;
+	}
+
+	@Override /* GENERATED - RestClientBuilder */
+	public MockRestClientBuilder mediaType(MediaType value) {
+		super.mediaType(value);
+		return this;
+	}
+
+	@Override /* GENERATED - RestClientBuilder */
 	public MockRestClientBuilder msgPack() {
 		super.msgPack();
 		return this;
@@ -1291,7 +1298,7 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder origin(Object value) {
+	public MockRestClientBuilder origin(String value) {
 		super.origin(value);
 		return this;
 	}
@@ -1370,7 +1377,7 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder pragma(Object value) {
+	public MockRestClientBuilder pragma(String value) {
 		super.pragma(value);
 		return this;
 	}
@@ -1388,7 +1395,7 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder proxyAuthorization(Object value) {
+	public MockRestClientBuilder proxyAuthorization(String value) {
 		super.proxyAuthorization(value);
 		return this;
 	}
@@ -1460,7 +1467,7 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder range(Object value) {
+	public MockRestClientBuilder range(String value) {
 		super.range(value);
 		return this;
 	}
@@ -1472,7 +1479,7 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder referer(Object value) {
+	public MockRestClientBuilder referer(String value) {
 		super.referer(value);
 		return this;
 	}
@@ -1593,7 +1600,7 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder te(Object value) {
+	public MockRestClientBuilder te(String value) {
 		super.te(value);
 		return this;
 	}
@@ -1629,7 +1636,7 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder upgrade(Object value) {
+	public MockRestClientBuilder upgrade(String value) {
 		super.upgrade(value);
 		return this;
 	}
@@ -1671,31 +1678,25 @@ public class MockRestClientBuilder extends RestClientBuilder {
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder userAgent(Object value) {
+	public MockRestClientBuilder userAgent(String value) {
 		super.userAgent(value);
 		return this;
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder userAgent(String userAgent) {
-		super.userAgent(userAgent);
-		return this;
-	}
-
-	@Override /* GENERATED - RestClientBuilder */
 	public MockRestClientBuilder userTokenHandler(UserTokenHandler userTokenHandler) {
 		super.userTokenHandler(userTokenHandler);
 		return this;
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder via(Object value) {
+	public MockRestClientBuilder via(String value) {
 		super.via(value);
 		return this;
 	}
 
 	@Override /* GENERATED - RestClientBuilder */
-	public MockRestClientBuilder warning(Object value) {
+	public MockRestClientBuilder warning(String value) {
 		super.warning(value);
 		return this;
 	}
diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockServletRequest.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockServletRequest.java
index f8e9793..4d0ca3a 100644
--- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockServletRequest.java
+++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockServletRequest.java
@@ -958,7 +958,7 @@ public class MockServletRequest implements HttpServletRequest {
 	 */
 	protected MockServletRequest debug(boolean value) {
 		if (value)
-			header("X-Debug", true);
+			header("Debug", true);
 		return this;
 	}
 
@@ -973,7 +973,7 @@ public class MockServletRequest implements HttpServletRequest {
 	 */
 	public MockServletRequest noTrace(boolean value) {
 		if (value)
-			header("X-NoTrace", true);
+			header("No-Trace", true);
 		return this;
 	}
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
index 7df7af3..b842a27 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
@@ -1698,7 +1698,7 @@ public final class RestRequest {
 	}
 
 	/**
-	 * Sets the <js>"NoLog"</js> attribute to the specified boolean.
+	 * Sets the <js>"NoTrace"</js> attribute to the specified boolean.
 	 *
 	 * <p>
 	 * This flag is used by {@link BasicRestLogger} and tells it not to log the current request.
@@ -1706,18 +1706,18 @@ public final class RestRequest {
 	 * @param b The attribute value.
 	 * @return This object (for method chaining).
 	 */
-	public RestRequest setNoLog(Boolean b) {
-		setAttribute("NoLog", b);
+	public RestRequest setNoTrace(Boolean b) {
+		setAttribute("NoTrace", b);
 		return this;
 	}
 
 	/**
-	 * Shortcut for calling <c>setNoLog(<jk>true</jk>)</c>.
+	 * Shortcut for calling <c>setNoTrace(<jk>true</jk>)</c>.
 	 *
 	 * @return This object (for method chaining).
 	 */
-	public RestRequest setNoLog() {
-		return setNoLog(true);
+	public RestRequest setNoTrace() {
+		return setNoTrace(true);
 	}
 
 	/**
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
index 4f4bee4..191f4a6 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
@@ -118,7 +118,7 @@ public final class RestResponse {
 		}
 
 		request.getContext().getDefaultResponseHeaders().forEach(x->addHeader(x.getValue(), resolveUris(x.getValue())));  // Done this way to avoid list/array copy.
-		
+
 		opContext.getDefaultResponseHeaders().forEach(x->addHeader(x.getName(), resolveUris(x.getValue())));
 
 		if (charset == null)
@@ -646,7 +646,7 @@ public final class RestResponse {
 	}
 
 	/**
-	 * Sets the <js>"NoLog"</js> attribute to the specified boolean.
+	 * Sets the <js>"NoTrace"</js> attribute to the specified boolean.
 	 *
 	 * <p>
 	 * This flag is used by {@link BasicRestLogger} and tells it not to log the current request.
@@ -654,18 +654,18 @@ public final class RestResponse {
 	 * @param b The attribute value.
 	 * @return This object (for method chaining).
 	 */
-	public RestResponse setNoLog(Boolean b) {
-		request.setNoLog(b);
+	public RestResponse setNoTrace(Boolean b) {
+		request.setNoTrace(b);
 		return this;
 	}
 
 	/**
-	 * Shortcut for calling <c>setNoLog(<jk>true</jk>)</c>.
+	 * Shortcut for calling <c>setNoTrace(<jk>true</jk>)</c>.
 	 *
 	 * @return This object (for method chaining).
 	 */
-	public RestResponse setNoLog() {
-		return setNoLog(true);
+	public RestResponse setNoTrace() {
+		return setNoTrace(true);
 	}
 
 	/**
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logging/BasicTestRestLogger.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logging/BasicTestRestLogger.java
index 31f4d27..e4836d2 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logging/BasicTestRestLogger.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/logging/BasicTestRestLogger.java
@@ -31,9 +31,9 @@ import org.apache.juneau.rest.*;
  * <p>
  * Requests can be tagged as no-log (meaning don't log if there's an error) in any of the following ways:
  * <ul>
- * 	<li>A <js>"X-No-Log: true"</js> header.
- * 	<li>A <js>"noLog=true"</js> query parameter.
- * 	<li>A <js>"NoLog"</js> request attribute with a string value of <js>"true"</js>.
+ * 	<li>A <js>"No-Trace: true"</js> header.
+ * 	<li>A <js>"noTrace=true"</js> query parameter.
+ * 	<li>A <js>"NoTrace"</js> request attribute with a string value of <js>"true"</js>.
  * </ul>
  *
  * <h5 class='section'>Configured Settings:</h5>
@@ -67,7 +67,7 @@ public class BasicTestRestLogger extends BasicRestLogger {
 					.requestDetail(HEADER)
 					.responseDetail(HEADER)
 					.enabled(CONDITIONAL)
-					.enabledTest(x -> ! isNoLog(x))  // Only log if it's not a no-trace request.
+					.enabledTest(x -> ! isNoTrace(x))  // Only log if it's not a no-trace request.
 					.logStackTrace()
 					.build(),
 				RestLoggerRule.create()  // Log 400-500 errors with just status-line information.
@@ -76,7 +76,7 @@ public class BasicTestRestLogger extends BasicRestLogger {
 					.requestDetail(STATUS_LINE)
 					.responseDetail(STATUS_LINE)
 					.enabled(CONDITIONAL)
-					.enabledTest(x -> ! isNoLog(x))  // Only log if it's not a no-trace request.
+					.enabledTest(x -> ! isNoTrace(x))  // Only log if it's not a no-trace request.
 					.logStackTrace()
 					.build()
 			)
@@ -91,13 +91,13 @@ public class BasicTestRestLogger extends BasicRestLogger {
 		;
 	}
 
-	private static boolean isNoLog(HttpServletRequest req) {
-		Object o = req.getAttribute("NoLog");
+	private static boolean isNoTrace(HttpServletRequest req) {
+		Object o = req.getAttribute("NoTrace");
 		if (o != null)
 			return "true".equalsIgnoreCase(o.toString());
-		String s = req.getHeader("X-No-Log");
+		String s = req.getHeader("No-Trace");
 		if (s != null)
 			return "true".equalsIgnoreCase(s);
-		return emptyIfNull(req.getQueryString()).contains("noLog=true");
+		return emptyIfNull(req.getQueryString()).contains("noTrace=true");
 	}
 }
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 fabe096..742df2c 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
@@ -27,6 +27,7 @@ import java.util.*;
 import org.apache.http.Header;
 import org.apache.juneau.collections.*;
 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.marshall.*;
@@ -217,30 +218,30 @@ public class RestClient_Headers_Test {
 		checkClient("Accept-Language").acceptLanguage("en").build().get("/headers").run().assertBody().is("['en']");
 		checkClient("Authorization").authorization("foo").build().get("/headers").run().assertBody().is("['foo']");
 		checkClient("Cache-Control").cacheControl("none").build().get("/headers").run().assertBody().is("['none']");
-		checkClient("X-Client-Version").clientVersion("1").build().get("/headers").run().assertBody().is("['1']");
+		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("123").build().get("/headers").run().assertBody().is("['123']");
+		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("123").build().get("/headers").run().assertBody().is("['123']");
+		checkClient("Date").date(Date.of("Sat, 29 Oct 1994 19:43:31 GMT")).build().get("/headers").run().assertBody().is("['Sat, 29 Oct 1994 19:43:31 GMT']");
 		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("foo").build().get("/headers").run().assertBody().is("['foo']");
-		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("foo").build().get("/headers").run().assertBody().is("['foo']");
-		checkClient("Max-Forwards").maxForwards("10").build().get("/headers").run().assertBody().is("['10']");
-		checkClient("X-No-Log").noTrace().build().get("/headers").run().assertBody().is("['true']");
+		checkClient("If-Match").ifMatch("\"foo\"").build().get("/headers").run().assertBody().is("['\"foo\"']");
+		checkClient("If-Modified-Since").ifModifiedSince("Sat, 29 Oct 1994 19:43:31 GMT").build().get("/headers").run().assertBody().is("['Sat, 29 Oct 1994 19:43:31 GMT']");
+		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("Sat, 29 Oct 1994 19:43:31 GMT").build().get("/headers").run().assertBody().is("['Sat, 29 Oct 1994 19:43:31 GMT']");
+		checkClient("Max-Forwards").maxForwards(10).build().get("/headers").run().assertBody().is("['10']");
+		checkClient("No-Trace").noTrace().build().get("/headers").run().assertBody().is("['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(new StringBuilder("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']");