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<?>)}
- * <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> ->
<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: </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: </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> ->
<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: </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>,
()-><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>, ()-><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>, ()-><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>, ()-><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>, ()-><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>, ()-><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>,
()-><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: </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>,
()-><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: </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>,
()-><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: </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>,
()-><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>, ()-><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>, ()-><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>, ()-><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>,
()-><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>,
()-><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>,
()-><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");
}