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 ceacf70  RestClient tests.
ceacf70 is described below

commit ceacf70e220d7e6e8645a7ea830fb49489ebbc55
Author: JamesBognar <[email protected]>
AuthorDate: Wed Jul 1 14:00:33 2020 -0400

    RestClient tests.
---
 .../org/apache/juneau/http/HeaderSupplier.java     | 155 +++++++++++++-
 .../apache/juneau/http/NameValuePairSupplier.java  | 159 ++++++++++++++-
 .../org/apache/juneau/http/NameValuePairs.java     | 224 ---------------------
 .../rest/test/client/ThirdPartyProxyTest.java      |  12 +-
 .../rest/client2/Remote_BodyAnnotation_Test.java   |  12 +-
 .../client2/Remote_FormDataAnnotation_Test.java    |  22 +-
 .../rest/client2/Remote_HeaderAnnotation_Test.java |  37 ++--
 .../rest/client2/Remote_PathAnnotation_Test.java   |  16 +-
 .../rest/client2/Remote_QueryAnnotation_Test.java  |  16 +-
 .../rest/client2/RestClient_BasicCalls_Test.java   |  12 +-
 .../rest/client2/RestClient_FormData_Test.java     |   4 +-
 .../rest/client2/RestClient_Headers_Test.java      |  11 -
 .../juneau/rest/client2/RestClient_Paths_Test.java |   4 +-
 .../juneau/rest/client2/RestClient_Query_Test.java |   4 +-
 .../apache/juneau/rest/client/NameValuePairs.java  |   2 +-
 .../org/apache/juneau/rest/client2/RestClient.java |  22 +-
 .../juneau/rest/client2/RestClientBuilder.java     |   5 -
 .../apache/juneau/rest/client2/RestRequest.java    |  78 ++++---
 18 files changed, 425 insertions(+), 370 deletions(-)

diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HeaderSupplier.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HeaderSupplier.java
index e78861f..3094642 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HeaderSupplier.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HeaderSupplier.java
@@ -12,12 +12,19 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.http;
 
+import static org.apache.juneau.internal.StringUtils.*;
+
 import java.util.*;
 import java.util.concurrent.*;
+import java.util.function.*;
+import java.util.stream.*;
 
 import org.apache.http.*;
 import org.apache.juneau.*;
+import org.apache.juneau.http.header.*;
+import org.apache.juneau.httppart.*;
 import org.apache.juneau.internal.*;
+import org.apache.juneau.oapi.*;
 
 /**
  * Specifies a dynamic supplier of {@link Header} objects.
@@ -29,6 +36,8 @@ public class HeaderSupplier implements Iterable<Header> {
        /** Represents no header supplier */
        public final class Null extends HeaderSupplier {}
 
+       private final List<Iterable<Header>> headers = new 
CopyOnWriteArrayList<>();
+
        /**
         * Convenience creator.
         *
@@ -39,6 +48,43 @@ public class HeaderSupplier implements Iterable<Header> {
        }
 
        /**
+        * Creates an empty instance.
+        *
+        * @return A new empty instance.
+        */
+       public static HeaderSupplier of() {
+               return new HeaderSupplier();
+       }
+
+       /**
+        * Creates an instance initialized with the specified headers.
+        *
+        * @param headers The headers to add to this list.
+        * @return A new instance.
+        */
+       public static HeaderSupplier of(Collection<Header> headers) {
+               return new HeaderSupplier().addAll(headers);
+       }
+
+       /**
+        * Creates an instance initialized with the specified name/value pairs.
+        *
+        * @param parameters
+        *      Initial list of parameters.
+        *      <br>Must be an even number of parameters representing key/value 
pairs.
+        * @throws RuntimeException If odd number of parameters were specified.
+        * @return A new instance.
+        */
+       public static HeaderSupplier ofPairs(Object...parameters) {
+               List<Header> l = new ArrayList<>();
+               if (parameters.length % 2 != 0)
+                       throw new BasicRuntimeException("Odd number of 
parameters passed into HeaderSupplier.ofPairs()");
+               for (int i = 0; i < parameters.length; i+=2)
+                       l.add(new BasicHeader(stringify(parameters[i]), 
parameters[i+1]));
+               return HeaderSupplier.of(l);
+       }
+
+       /**
         * Convenience creator.
         *
         * @param values
@@ -63,8 +109,6 @@ public class HeaderSupplier implements Iterable<Header> {
                return s;
        }
 
-       private final List<Iterable<Header>> headers = new 
CopyOnWriteArrayList<>();
-
        /**
         * Add a header to this supplier.
         *
@@ -89,8 +133,115 @@ public class HeaderSupplier implements Iterable<Header> {
                return this;
        }
 
+       /**
+        * Adds all the specified headers to this supplier.
+        *
+        * @param headers The headers to add to this supplier.
+        * @return This object(for method chaining).
+        */
+       private HeaderSupplier addAll(Collection<Header> headers) {
+               
this.headers.addAll(headers.stream().map(x->Collections.singleton(x)).collect(Collectors.toList()));
+               return this;
+       }
+
+       
//------------------------------------------------------------------------------------------------------------------
+       // Appenders
+       
//------------------------------------------------------------------------------------------------------------------
+
+       /**
+        * Appends the specified header to the end of this list.
+        *
+        * <p>
+        * The header is added as a {@link BasicHeader}.
+        *
+        * @param name The header name.
+        * @param value The header value.
+        * @return This object (for method chaining).
+        */
+       public HeaderSupplier add(String name, Object value) {
+               return add(new BasicHeader(name, value));
+       }
+
+       /**
+        * Appends the specifiedheader to the end of this list using a value 
supplier.
+        *
+        * <p>
+        * The header is added as a {@link BasicHeader}.
+        *
+        * <p>
+        * Value is re-evaluated on each call to {@link BasicHeader#getValue()}.
+        *
+        * @param name The header name.
+        * @param value The header value supplier.
+        * @return This object (for method chaining).
+        */
+       public HeaderSupplier add(String name, Supplier<?> value) {
+               return add(new BasicHeader(name, value));
+       }
+
+       /**
+        * Appends the specified header to the end of this list.
+        *
+        * @param name The header name.
+        * @param value The header value.
+        * @param serializer
+        *      The serializer to use for serializing the value to a string 
value.
+        * @param schema
+        *      The schema object that defines the format of the output.
+        *      <br>If <jk>null</jk>, defaults to the schema defined on the 
parser.
+        *      <br>If that's also <jk>null</jk>, defaults to {@link 
HttpPartSchema#DEFAULT}.
+        *      <br>Only used if serializer is schema-aware (e.g. {@link 
OpenApiSerializer}).
+        * @param skipIfEmpty If value is a blank string, the value should 
return as <jk>null</jk>.
+        * @return This object (for method chaining).
+        */
+       public HeaderSupplier add(String name, Object value, 
HttpPartSerializerSession serializer, HttpPartSchema schema, boolean 
skipIfEmpty) {
+               return add(new SerializedHeader(name, value, serializer, 
schema, skipIfEmpty));
+       }
+
+       /**
+        * Returns this list as a URL-encoded custom query.
+        */
+       @Override /* Object */
+       public String toString() {
+               StringBuilder sb = new StringBuilder();
+               for (Header h : this) {
+                       String v = h.getValue();
+                       if (v != null) {
+                               if (sb.length() > 0)
+                                       sb.append("&");
+                               
sb.append(urlEncode(h.getName())).append('=').append(urlEncode(h.getValue()));
+                       }
+               }
+               return sb.toString();
+       }
+
        @Override
        public Iterator<Header> iterator() {
                return CollectionUtils.iterator(headers);
        }
+
+       /**
+        * Returns these headers as an array.
+        *
+        * @return These headers as an array.
+        */
+       public Header[] toArray() {
+               ArrayList<Header> l = new ArrayList<>();
+               for (Header p : this)
+                       l.add(p);
+               return l.toArray(new Header[l.size()]);
+       }
+
+       /**
+        * Returns these headers as an array.
+        *
+        * @param array The array to copy in to.
+        * @return These headers as an array.
+        */
+       public <T extends Header> T[] toArray(T[] array) {
+               ArrayList<Header> l = new ArrayList<>();
+               for (Header p : this)
+                       l.add(p);
+               return l.toArray(array);
+       }
 }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/NameValuePairSupplier.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/NameValuePairSupplier.java
index 55fc012..21be3a5 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/NameValuePairSupplier.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/NameValuePairSupplier.java
@@ -12,12 +12,19 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.http;
 
+import static org.apache.juneau.internal.StringUtils.*;
+
 import java.util.*;
 import java.util.concurrent.*;
+import java.util.function.*;
+import java.util.stream.*;
 
 import org.apache.http.*;
 import org.apache.juneau.*;
+import org.apache.juneau.httppart.*;
 import org.apache.juneau.internal.*;
+import org.apache.juneau.oapi.*;
+import org.apache.juneau.urlencoding.*;
 
 /**
  * Specifies a dynamic supplier of {@link NameValuePair} objects.
@@ -29,6 +36,8 @@ public class NameValuePairSupplier implements 
Iterable<NameValuePair> {
        /** Represents no header supplier */
        public final class Null extends NameValuePairSupplier {}
 
+       private final List<Iterable<NameValuePair>> pairs = new 
CopyOnWriteArrayList<>();
+
        /**
         * Convenience creator.
         *
@@ -39,6 +48,43 @@ public class NameValuePairSupplier implements 
Iterable<NameValuePair> {
        }
 
        /**
+        * Creates an empty instance.
+        *
+        * @return A new empty instance.
+        */
+       public static NameValuePairSupplier of() {
+               return new NameValuePairSupplier();
+       }
+
+       /**
+        * Creates an instance initialized with the specified pairs.
+        *
+        * @param pairs The pairs to add to this list.
+        * @return A new instance.
+        */
+       public static NameValuePairSupplier of(Collection<NameValuePair> pairs) 
{
+               return new NameValuePairSupplier().addAll(pairs);
+       }
+
+       /**
+        * Creates an instance initialized with the specified pairs.
+        *
+        * @param parameters
+        *      Initial list of parameters.
+        *      <br>Must be an even number of parameters representing key/value 
pairs.
+        * @throws RuntimeException If odd number of parameters were specified.
+        * @return A new instance.
+        */
+       public static NameValuePairSupplier ofPairs(Object...parameters) {
+               List<NameValuePair> l = new ArrayList<>();
+               if (parameters.length % 2 != 0)
+                       throw new BasicRuntimeException("Odd number of 
parameters passed into NameValuePairSupplier.ofPairs()");
+               for (int i = 0; i < parameters.length; i+=2)
+                       l.add(new BasicNameValuePair(stringify(parameters[i]), 
parameters[i+1]));
+               return NameValuePairSupplier.of(l);
+       }
+
+       /**
         * Convenience creator.
         *
         * @param values
@@ -63,8 +109,6 @@ public class NameValuePairSupplier implements 
Iterable<NameValuePair> {
                return s;
        }
 
-       private final List<Iterable<NameValuePair>> pairs = new 
CopyOnWriteArrayList<>();
-
        /**
         * Add a name-value pair to this supplier.
         *
@@ -89,8 +133,119 @@ public class NameValuePairSupplier implements 
Iterable<NameValuePair> {
                return this;
        }
 
+       /**
+        * Adds all the specified name-value pairs to this supplier.
+        *
+        * @param pairs The pairs to add to this supplier.
+        * @return This object(for method chaining).
+        */
+       private NameValuePairSupplier addAll(Collection<NameValuePair> pairs) {
+               
this.pairs.addAll(pairs.stream().map(x->Collections.singleton(x)).collect(Collectors.toList()));
+               return this;
+       }
+
+       
//------------------------------------------------------------------------------------------------------------------
+       // Appenders
+       
//------------------------------------------------------------------------------------------------------------------
+
+       /**
+        * Appends the specified name/value pair to the end of this list.
+        *
+        * <p>
+        * The pair is added as a {@link BasicNameValuePair}.
+        *
+        * @param name The pair name.
+        * @param value The pair value.
+        * @return This object (for method chaining).
+        */
+       public NameValuePairSupplier add(String name, Object value) {
+               return add(new BasicNameValuePair(name, value));
+       }
+
+       /**
+        * Appends the specified name/value pair to the end of this list using 
a value supplier.
+        *
+        * <p>
+        * The pair is added as a {@link BasicNameValuePair}.
+        *
+        * <p>
+        * Value is re-evaluated on each call to {@link 
BasicNameValuePair#getValue()}.
+        *
+        * @param name The pair name.
+        * @param value The pair value supplier.
+        * @return This object (for method chaining).
+        */
+       public NameValuePairSupplier add(String name, Supplier<?> value) {
+               return add(new BasicNameValuePair(name, value));
+       }
+
+       /**
+        * Appends the specified name/value pair to the end of this list.
+        *
+        * <p>
+        * The value is converted to UON notation using the {@link 
UrlEncodingSerializer} defined on the client.
+        *
+        * @param name The pair name.
+        * @param value The pair value.
+        * @param partType The HTTP part type.
+        * @param serializer
+        *      The serializer to use for serializing the value to a string 
value.
+        * @param schema
+        *      The schema object that defines the format of the output.
+        *      <br>If <jk>null</jk>, defaults to the schema defined on the 
parser.
+        *      <br>If that's also <jk>null</jk>, defaults to {@link 
HttpPartSchema#DEFAULT}.
+        *      <br>Only used if serializer is schema-aware (e.g. {@link 
OpenApiSerializer}).
+        * @param skipIfEmpty If value is a blank string, the value should 
return as <jk>null</jk>.
+        * @return This object (for method chaining).
+        */
+       public NameValuePairSupplier add(String name, Object value, 
HttpPartType partType, HttpPartSerializerSession serializer, HttpPartSchema 
schema, boolean skipIfEmpty) {
+               return add(new SerializedNameValuePair(name, value, partType, 
serializer, schema, skipIfEmpty));
+       }
+
+       /**
+        * Returns this list as a URL-encoded custom query.
+        */
+       @Override /* Object */
+       public String toString() {
+               StringBuilder sb = new StringBuilder();
+               for (NameValuePair p : this) {
+                       String v = p.getValue();
+                       if (v != null) {
+                               if (sb.length() > 0)
+                                       sb.append("&");
+                               
sb.append(urlEncode(p.getName())).append('=').append(urlEncode(p.getValue()));
+                       }
+               }
+               return sb.toString();
+       }
+
        @Override
        public Iterator<NameValuePair> iterator() {
                return CollectionUtils.iterator(pairs);
        }
+
+       /**
+        * Returns these pairs as an array.
+        *
+        * @return These pairs as an array.
+        */
+       public NameValuePair[] toArray() {
+               ArrayList<NameValuePair> l = new ArrayList<>();
+               for (NameValuePair p : this)
+                       l.add(p);
+               return l.toArray(new NameValuePair[l.size()]);
+       }
+
+       /**
+        * Returns these pairs as an array.
+        *
+        * @param array The array to copy in to.
+        * @return These pairs as an array.
+        */
+       public <T extends NameValuePair> T[] toArray(T[] array) {
+               ArrayList<NameValuePair> l = new ArrayList<>();
+               for (NameValuePair p : this)
+                       l.add(p);
+               return l.toArray(array);
+       }
 }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/NameValuePairs.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/NameValuePairs.java
deleted file mode 100644
index 642365d..0000000
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/NameValuePairs.java
+++ /dev/null
@@ -1,224 +0,0 @@
-// 
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                
                                              *
-// *                                                                           
                                              *
-// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
-// *                                                                           
                                              *
-// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the 
License.                                              *
-// 
***************************************************************************************************************************
-package org.apache.juneau.http;
-
-import static org.apache.juneau.internal.StringUtils.*;
-
-import java.util.*;
-import java.util.function.*;
-
-import org.apache.http.*;
-import org.apache.juneau.*;
-import org.apache.juneau.httppart.*;
-import org.apache.juneau.oapi.*;
-import org.apache.juneau.urlencoding.*;
-
-/**
- * Convenience class for constructing instances of 
<c>List&lt;NameValuePair&gt;</c>.
- *
- * <p>
- * Instances of this method can be passed directly to the 
<c>RestClient.post(Object, Object)</c> method or
- * <c>RestRequest.body(Object)</c> methods to perform URL-encoded form posts.
- *
- * <h5 class='section'>Example:</h5>
- * <p class='bcode w800'>
- *     NameValuePairs params = <jk>new</jk> 
NameValuePairs(<js>"j_username"</js>, user, <js>"j_password"</js>, pw);
- *     client.post(<jsf>URL</jsf>, params).execute();
- * </p>
- */
-public class NameValuePairs extends LinkedList<NameValuePair> {
-
-       private static final long serialVersionUID = 1L;
-
-       
//------------------------------------------------------------------------------------------------------------------
-       // Constructors
-       
//------------------------------------------------------------------------------------------------------------------
-
-       /**
-        * Empty constructor.
-        */
-       public NameValuePairs() {}
-
-       /**
-        * Constructor.
-        *
-        * @param parameters Initial list of parameters.
-        */
-       public NameValuePairs(NameValuePair...parameters) {
-               Collections.addAll(this, parameters);
-       }
-
-       /**
-        * Constructor.
-        *
-        * @param parameters Initial list of parameters.
-        */
-       public NameValuePairs(Collection<? extends NameValuePair> parameters) {
-               addAll(parameters);
-       }
-
-       /**
-        * Constructor.
-        *
-        * <p>
-        * Constructs a set of {@link BasicNameValuePair} objects from a list 
of key/value pairs.
-        *
-        * @param parameters
-        *      Initial list of parameters.
-        *      <br>Must be an even number of parameters representing key/value 
pairs.
-        * @throws RuntimeException If odd number of parameters were specified.
-        */
-       public NameValuePairs(Object...parameters) {
-               if (parameters.length % 2 != 0)
-                       throw new BasicRuntimeException("Odd number of 
parameters passed into NameValuePairs(Object...)");
-               for (int i = 0; i < parameters.length; i+=2)
-                       add(new BasicNameValuePair(stringify(parameters[i]), 
parameters[i+1]));
-       }
-
-       
//------------------------------------------------------------------------------------------------------------------
-       // Creators
-       
//------------------------------------------------------------------------------------------------------------------
-
-       /**
-        * Creates an empty instance.
-        *
-        * @return A new empty instance.
-        */
-       public static NameValuePairs of() {
-               return new NameValuePairs();
-       }
-
-       /**
-        * Creates an instance initialized with the specified pairs.
-        *
-        * @param pairs The pairs to add to this list.
-        * @return A new instance.
-        */
-       public static NameValuePairs of(NameValuePair...pairs) {
-               return new NameValuePairs(pairs);
-       }
-
-       /**
-        * Creates an instance initialized with the specified pairs.
-        *
-        * @param pairs The pairs to add to this list.
-        * @return A new instance.
-        */
-       public static NameValuePairs of(Collection<? extends NameValuePair> 
pairs) {
-               return new NameValuePairs(pairs);
-       }
-
-       /**
-        * Creates an instance initialized with the specified pairs.
-        *
-        * @param parameters
-        *      Initial list of parameters.
-        *      <br>Must be an even number of parameters representing key/value 
pairs.
-        * @throws RuntimeException If odd number of parameters were specified.
-        * @return A new instance.
-        */
-       public static NameValuePairs of(Object...parameters) {
-               return new NameValuePairs(parameters);
-       }
-
-       
//------------------------------------------------------------------------------------------------------------------
-       // Appenders
-       
//------------------------------------------------------------------------------------------------------------------
-
-       /**
-        * Appends the specified pair to the end of this list.
-        *
-        * @param pair The pair to append to this list.
-        * @return This object (for method chaining).
-        */
-       public NameValuePairs append(NameValuePair pair) {
-               super.add(pair);
-               return this;
-       }
-
-       /**
-        * Appends the specified name/value pair to the end of this list.
-        *
-        * <p>
-        * The pair is added as a {@link BasicNameValuePair}.
-        *
-        * @param name The pair name.
-        * @param value The pair value.
-        * @return This object (for method chaining).
-        */
-       public NameValuePairs append(String name, Object value) {
-               super.add(new BasicNameValuePair(name, value));
-               return this;
-       }
-
-       /**
-        * Appends the specified name/value pair to the end of this list using 
a value supplier.
-        *
-        * <p>
-        * The pair is added as a {@link BasicNameValuePair}.
-        *
-        * <p>
-        * Value is re-evaluated on each call to {@link 
BasicNameValuePair#getValue()}.
-        *
-        * @param name The pair name.
-        * @param value The pair value supplier.
-        * @return This object (for method chaining).
-        */
-       public NameValuePairs append(String name, Supplier<?> value) {
-               super.add(new BasicNameValuePair(name, value));
-               return this;
-       }
-
-       /**
-        * Appends the specified name/value pair to the end of this list.
-        *
-        * <p>
-        * The value is converted to UON notation using the {@link 
UrlEncodingSerializer} defined on the client.
-        *
-        * @param name The pair name.
-        * @param value The pair value.
-        * @param partType The HTTP part type.
-        * @param serializer
-        *      The serializer to use for serializing the value to a string 
value.
-        * @param schema
-        *      The schema object that defines the format of the output.
-        *      <br>If <jk>null</jk>, defaults to the schema defined on the 
parser.
-        *      <br>If that's also <jk>null</jk>, defaults to {@link 
HttpPartSchema#DEFAULT}.
-        *      <br>Only used if serializer is schema-aware (e.g. {@link 
OpenApiSerializer}).
-        * @param skipIfEmpty If value is a blank string, the value should 
return as <jk>null</jk>.
-        * @return This object (for method chaining).
-        */
-       public NameValuePairs append(String name, Object value, HttpPartType 
partType, HttpPartSerializerSession serializer, HttpPartSchema schema, boolean 
skipIfEmpty) {
-               super.add(new SerializedNameValuePair(name, value, partType, 
serializer, schema, skipIfEmpty));
-               return this;
-       }
-
-       /**
-        * Returns this list as a URL-encoded custom query.
-        */
-       @Override /* Object */
-       public String toString() {
-               if (isEmpty())
-                       return null;
-               StringBuilder sb = new StringBuilder();
-               for (NameValuePair p : this) {
-                       String v = p.getValue();
-                       if (v != null) {
-                               if (sb.length() > 0)
-                                       sb.append("&");
-                               
sb.append(urlEncode(p.getName())).append('=').append(urlEncode(p.getValue()));
-                       }
-               }
-               return sb.toString();
-       }
-}
diff --git 
a/juneau-microservice/juneau-microservice-ftest/src/test/java/org/apache/juneau/rest/test/client/ThirdPartyProxyTest.java
 
b/juneau-microservice/juneau-microservice-ftest/src/test/java/org/apache/juneau/rest/test/client/ThirdPartyProxyTest.java
index 349ff0d..e1c6990 100644
--- 
a/juneau-microservice/juneau-microservice-ftest/src/test/java/org/apache/juneau/rest/test/client/ThirdPartyProxyTest.java
+++ 
b/juneau-microservice/juneau-microservice-ftest/src/test/java/org/apache/juneau/rest/test/client/ThirdPartyProxyTest.java
@@ -233,7 +233,7 @@ public class ThirdPartyProxyTest extends RestTestcase {
        @Test
        public void a10_nameValuePairsHeader() throws Exception {
                String r = proxy.nameValuePairsHeader(
-                       new NameValuePairs().append("a", "foo").append("b", 
"").append("c", null)
+                       HeaderSupplier.ofPairs("a","foo","b","","c",null)
                );
                assertEquals("OK", r);
        }
@@ -374,7 +374,7 @@ public class ThirdPartyProxyTest extends RestTestcase {
        @Test
        public void b12_nameValuePairsQuery() throws Exception {
                String r = proxy.nameValuePairsQuery(
-                       new NameValuePairs().append("a", "foo").append("b", 
"").append("c", null)
+                       NameValuePairSupplier.ofPairs("a","foo","b","","c",null)
                );
                assertEquals("OK", r);
        }
@@ -503,7 +503,7 @@ public class ThirdPartyProxyTest extends RestTestcase {
        @Test
        public void c10_nameValuePairsFormData() throws Exception {
                String r = proxy.nameValuePairsFormData(
-                       new NameValuePairs().append("a", "foo").append("b", 
"").append("c", null)
+                       NameValuePairSupplier.ofPairs("a","foo","b","","c",null)
                );
                assertEquals("OK", r);
        }
@@ -1618,7 +1618,7 @@ public class ThirdPartyProxyTest extends RestTestcase {
 
                @RemoteMethod(method="GET", path="/nameValuePairsHeader")
                String nameValuePairsHeader(
-                       @Header(value="*", allowEmptyValue=true) NameValuePairs 
a
+                       @Header(value="*", allowEmptyValue=true) HeaderSupplier 
a
                );
 
                
//-------------------------------------------------------------------------------------------------------------
@@ -1726,7 +1726,7 @@ public class ThirdPartyProxyTest extends RestTestcase {
 
                @RemoteMethod(method="GET", path="/nameValuePairsQuery")
                String nameValuePairsQuery(
-                       @Query("*") NameValuePairs a
+                       @Query("*") NameValuePairSupplier a
                );
 
                
//-------------------------------------------------------------------------------------------------------------
@@ -1824,7 +1824,7 @@ public class ThirdPartyProxyTest extends RestTestcase {
 
                @RemoteMethod(method="POST", path="/nameValuePairsFormData")
                String nameValuePairsFormData(
-                       @FormData("*") NameValuePairs a
+                       @FormData("*") NameValuePairSupplier a
                );
 
                
//-------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_BodyAnnotation_Test.java
 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_BodyAnnotation_Test.java
index 6e2a6ca..9880ba7 100644
--- 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_BodyAnnotation_Test.java
+++ 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_BodyAnnotation_Test.java
@@ -133,7 +133,7 @@ public class Remote_BodyAnnotation_Test {
                String postX7(@Body Reader b);
                String postX8(@Body InputStream b);
                String postX9(@Body HttpEntity b);
-               String postX10(@Body NameValuePairs b);
+               String postX10(@Body NameValuePairSupplier b);
        }
 
        @Test
@@ -148,7 +148,7 @@ public class Remote_BodyAnnotation_Test {
                assertEquals("xxx",x.postX7(new StringReader("xxx")));
                assertEquals("xxx",x.postX8(new StringInputStream("xxx")));
                assertEquals("xxx",x.postX9(new StringEntity("xxx")));
-               assertEquals("foo=bar",x.postX10(new 
NameValuePairs().append("foo","bar")));
+               
assertEquals("foo=bar",x.postX10(NameValuePairSupplier.ofPairs("foo","bar")));
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
@@ -228,7 +228,7 @@ public class Remote_BodyAnnotation_Test {
                String postX7(@Body Reader b);
                String postX8(@Body InputStream b);
                String postX9(@Body HttpEntity b);
-               String postX10(@Body NameValuePairs b);
+               String postX10(@Body NameValuePairSupplier b);
        }
 
        @Test
@@ -243,7 +243,7 @@ public class Remote_BodyAnnotation_Test {
                assertEquals("xxx",x.postX7(new StringReader("xxx")));
                assertEquals("xxx",x.postX8(new StringInputStream("xxx")));
                assertEquals("xxx",x.postX9(new 
StringEntity("xxx",org.apache.http.entity.ContentType.create("text/plain"))));
-               assertEquals("foo=bar",x.postX10(new 
NameValuePairs().append("foo","bar")));
+               
assertEquals("foo=bar",x.postX10(NameValuePairSupplier.ofPairs("foo","bar")));
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
@@ -309,7 +309,7 @@ public class Remote_BodyAnnotation_Test {
                String postX7(@Body Reader b);
                String postX8(@Body InputStream b);
                String postX9(@Body HttpEntity b);
-               String postX10(@Body NameValuePairs b);
+               String postX10(@Body NameValuePairSupplier b);
        }
 
        @Test
@@ -323,6 +323,6 @@ public class Remote_BodyAnnotation_Test {
                assertEquals("xxx",x.postX7(new StringReader("xxx")));
                assertEquals("xxx",x.postX8(new StringInputStream("xxx")));
                assertEquals("xxx",x.postX9(new 
StringEntity("xxx",org.apache.http.entity.ContentType.create("text/plain"))));
-               assertEquals("foo=bar",x.postX10(new 
NameValuePairs().append("foo","bar")));
+               
assertEquals("foo=bar",x.postX10(NameValuePairSupplier.ofPairs("foo","bar")));
        }
 }
\ No newline at end of file
diff --git 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_FormDataAnnotation_Test.java
 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_FormDataAnnotation_Test.java
index a059d6b..cefd38b 100644
--- 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_FormDataAnnotation_Test.java
+++ 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_FormDataAnnotation_Test.java
@@ -94,8 +94,8 @@ public class Remote_FormDataAnnotation_Test {
                @RemoteMethod(path="a") String postX16(@FormData Reader b);
                @RemoteMethod(path="a") String postX17(@FormData("*") 
InputStream b);
                @RemoteMethod(path="a") String postX18(@FormData InputStream b);
-               @RemoteMethod(path="a") String postX19(@FormData("*") 
NameValuePairs b);
-               @RemoteMethod(path="a") String postX20(@FormData NameValuePairs 
b);
+               @RemoteMethod(path="a") String postX19(@FormData("*") 
NameValuePairSupplier b);
+               @RemoteMethod(path="a") String postX20(@FormData 
NameValuePairSupplier b);
                @RemoteMethod(path="a") String postX21(@FormData NameValuePair 
b);
                @RemoteMethod(path="a") String postX22(@FormData String b);
                @RemoteMethod(path="a") String postX23(@FormData InputStream b);
@@ -827,24 +827,24 @@ public class Remote_FormDataAnnotation_Test {
 
        public static class K3a {
                @FormData
-               public NameValuePairs getA() {
-                       return 
pairs("a1","v1").append("a2",123).append("a3",null).append("a4","");
+               public NameValuePairSupplier getA() {
+                       return pairs("a1","v1","a2",123,"a3",null,"a4","");
                }
                @FormData("*")
-               public NameValuePairs getB() {
-                       return 
pairs("b1","true").append("b2","123").append("b3","null");
+               public NameValuePairSupplier getB() {
+                       return pairs("b1","true","b2","123","b3","null");
                }
                @FormData(n="*")
-               public NameValuePairs getC() {
+               public NameValuePairSupplier getC() {
                        return pairs("c1","v1","c2",123,"c3",null,"c4","");
                }
                @FormData("*")
-               public NameValuePairs getD() {
+               public NameValuePairSupplier getD() {
                        return null;
                }
                @FormData
                public NameValuePair[] getE() {
-                       return 
pairs("e1","v1","e2",123,"e3",null,"e4","").toArray(new NameValuePair[0]);
+                       return 
pairs("e1","v1","e2",123,"e3",null,"e4","").toArray();
                }
                @FormData
                public BasicNameValuePair[] getF() {
@@ -971,8 +971,8 @@ public class Remote_FormDataAnnotation_Test {
                return BasicNameValuePair.of(name,val);
        }
 
-       private static NameValuePairs pairs(Object...pairs) {
-               return NameValuePairs.of(pairs);
+       private static NameValuePairSupplier pairs(Object...pairs) {
+               return NameValuePairSupplier.ofPairs(pairs);
        }
 
        private static RestClientBuilder client(Class<?> c) {
diff --git 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_HeaderAnnotation_Test.java
 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_HeaderAnnotation_Test.java
index 708ff71..7bc8337 100644
--- 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_HeaderAnnotation_Test.java
+++ 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_HeaderAnnotation_Test.java
@@ -21,7 +21,6 @@ import java.math.*;
 import java.util.*;
 import java.util.concurrent.atomic.*;
 
-import org.apache.http.*;
 import org.apache.juneau.collections.*;
 import org.apache.juneau.http.*;
 import org.apache.juneau.http.annotation.*;
@@ -78,8 +77,8 @@ public class Remote_HeaderAnnotation_Test {
                @RemoteMethod(path="a") String getX12(@Header Map<String,Bean> 
b);
                @RemoteMethod(path="a") String getX13(@Header(n="x",f="uon") 
Map<String,Bean> b);
                @RemoteMethod(path="a") String getX14(@Header(format="uon") 
Map<String,Bean> b);
-               @RemoteMethod(path="a") String getX15(@Header("*") 
NameValuePairs b);
-               @RemoteMethod(path="a") String getX16(@Header NameValuePairs b);
+               @RemoteMethod(path="a") String getX15(@Header("*") 
HeaderSupplier b);
+               @RemoteMethod(path="a") String getX16(@Header HeaderSupplier b);
                @RemoteMethod(path="a") String getX17(@Header 
org.apache.http.Header b);
                @RemoteMethod(path="a") String getX18(@Header 
org.apache.http.Header[] b);
                @RemoteMethod(path="a") String getX19(@Header String b);
@@ -102,8 +101,8 @@ public class Remote_HeaderAnnotation_Test {
                
assertEquals("{k1:'f=1'}",x.getX12(AMap.of("k1",Bean.create())));
                
assertEquals("{x:'k1=f\\\\=1'}",x.getX13(AMap.of("k1",Bean.create())));
                
assertEquals("{k1:'f=1'}",x.getX14(AMap.of("k1",Bean.create())));
-               assertEquals("{foo:'bar'}",x.getX15(pairs("foo","bar")));
-               assertEquals("{foo:'bar'}",x.getX16(pairs("foo","bar")));
+               assertEquals("{foo:'bar'}",x.getX15(headers("foo","bar")));
+               assertEquals("{foo:'bar'}",x.getX16(headers("foo","bar")));
                assertEquals("{foo:'bar'}",x.getX17(header("foo","bar")));
                assertEquals("{foo:'bar'}",x.getX18(new 
org.apache.http.Header[]{header("foo","bar")}));
                assertThrown(()->x.getX19("Foo")).contains("Invalid value 
type");
@@ -793,33 +792,33 @@ public class Remote_HeaderAnnotation_Test {
 
        public static class K3a {
                @Header(aev=true)
-               public NameValuePairs getA() {
-                       return pairs("a1","v1","a2",123,"a3",null,"a4","");
+               public HeaderSupplier getA() {
+                       return headers("a1","v1","a2",123,"a3",null,"a4","");
                }
                @Header(value="*",aev=true)
-               public NameValuePairs getB() {
-                       return pairs("b1","true","b2","123","b3","null");
+               public HeaderSupplier getB() {
+                       return headers("b1","true","b2","123","b3","null");
                }
                @Header(n="*",aev=true)
-               public NameValuePairs getC() {
-                       return pairs("c1","v1","c2",123,"c3",null,"c4","");
+               public HeaderSupplier getC() {
+                       return headers("c1","v1","c2",123,"c3",null,"c4","");
                }
                @Header(value="*",aev=true)
-               public NameValuePairs getD() {
+               public HeaderSupplier getD() {
                        return null;
                }
                @Header(aev=true)
-               public NameValuePair[] getE() {
-                       return 
pairs("e1","v1","e2",123,"e3",null,"e4","").toArray(new NameValuePair[0]);
+               public org.apache.http.Header[] getE() {
+                       return 
headers("e1","v1","e2",123,"e3",null,"e4","").toArray();
                }
                @Header(aev=true)
-               public BasicNameValuePair[] getF() {
-                       return 
pairs("f1","v1","f2",123,"f3",null,"f4","").toArray(new BasicNameValuePair[0]);
+               public BasicHeader[] getF() {
+                       return 
headers("f1","v1","f2",123,"f3",null,"f4","").toArray(new BasicHeader[0]);
                }
        }
 
        @Test
-       public void k03_requestBean_nameValuePairs() throws Exception {
+       public void k03_requestBean_headers() throws Exception {
                K3 x1 = remote(K.class,K3.class);
                K3 x2 = 
client(K.class).partSerializer(UonSerializer.class).build().getRemote(K3.class);
                
assertEquals("{a1:'v1',a2:'123',a4:'',b1:'true',b2:'123',b3:'null',c1:'v1',c2:'123',c4:'',e1:'v1',e2:'123',e4:'',f1:'v1',f2:'123',f4:''}",x1.getX1(new
 K3a()));
@@ -889,8 +888,8 @@ public class Remote_HeaderAnnotation_Test {
        // Helper methods.
        
//------------------------------------------------------------------------------------------------------------------
 
-       private static NameValuePairs pairs(Object...pairs) {
-               return NameValuePairs.of(pairs);
+       private static HeaderSupplier headers(Object...pairs) {
+               return HeaderSupplier.ofPairs(pairs);
        }
 
        private static org.apache.http.Header header(String key,Object val) {
diff --git 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_PathAnnotation_Test.java
 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_PathAnnotation_Test.java
index f7e2304..f3757b6 100644
--- 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_PathAnnotation_Test.java
+++ 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_PathAnnotation_Test.java
@@ -75,8 +75,8 @@ public class Remote_PathAnnotation_Test {
                @RemoteMethod(path="a/{x}") String getX12(@Path 
Map<String,Bean> b);
                @RemoteMethod(path="a/{x}") String getX13(@Path(n="x",cf="uon") 
Map<String,Bean> b);
                @RemoteMethod(path="a/{x}") String getX14(@Path(f="uon") 
Map<String,Bean> b);
-               @RemoteMethod(path="a/{x}") String getX15(@Path("*") 
NameValuePairs b);
-               @RemoteMethod(path="a/{x}") String getX16(@Path NameValuePairs 
b);
+               @RemoteMethod(path="a/{x}") String getX15(@Path("*") 
NameValuePairSupplier b);
+               @RemoteMethod(path="a/{x}") String getX16(@Path 
NameValuePairSupplier b);
                @RemoteMethod(path="a/{x}") String 
getX17(@Path(n="x",serializer=UonSerializer.class) Map<String,Bean> b);
                @RemoteMethod(path="a/{x}") String getX18(@Path(n="*") 
NameValuePair b);
                @RemoteMethod(path="a/{x}") String getX19(@Path NameValuePair 
b);
@@ -684,19 +684,19 @@ public class Remote_PathAnnotation_Test {
 
        public static class K3a {
                @Path(n="*",aev=true)
-               public NameValuePairs getA() {
+               public NameValuePairSupplier getA() {
                        return pairs("a1","v1","a2",123,"a3",null,"a4","");
                }
                @Path("/*")
-               public NameValuePairs getB() {
+               public NameValuePairSupplier getB() {
                        return pairs("b1","true","b2","123","b3","null");
                }
                @Path(n="*",aev=true)
-               public NameValuePairs getC() {
+               public NameValuePairSupplier getC() {
                        return pairs("c1","v1","c2",123,"c3",null,"c4","");
                }
                @Path("/*")
-               public NameValuePairs getD() {
+               public NameValuePairSupplier getD() {
                        return null;
                }
                @Path(aev=true)
@@ -772,8 +772,8 @@ public class Remote_PathAnnotation_Test {
        // Helper methods.
        
//------------------------------------------------------------------------------------------------------------------
 
-       private static NameValuePairs pairs(Object...pairs) {
-               return NameValuePairs.of(pairs);
+       private static NameValuePairSupplier pairs(Object...pairs) {
+               return NameValuePairSupplier.ofPairs(pairs);
        }
 
        private static NameValuePair pair(String key, Object val) {
diff --git 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_QueryAnnotation_Test.java
 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_QueryAnnotation_Test.java
index c802790..aac3729 100644
--- 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_QueryAnnotation_Test.java
+++ 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/Remote_QueryAnnotation_Test.java
@@ -82,8 +82,8 @@ public class Remote_QueryAnnotation_Test {
                @RemoteMethod(path="a") String getX16(@Query Reader b);
                @RemoteMethod(path="a") String getX17(@Query("*") InputStream 
b);
                @RemoteMethod(path="a") String getX18(@Query InputStream b);
-               @RemoteMethod(path="a") String getX19(@Query("*") 
NameValuePairs b);
-               @RemoteMethod(path="a") String getX20(@Query NameValuePairs b);
+               @RemoteMethod(path="a") String getX19(@Query("*") 
NameValuePairSupplier b);
+               @RemoteMethod(path="a") String getX20(@Query 
NameValuePairSupplier b);
                @RemoteMethod(path="a") String getX21(@Query NameValuePair b);
                @RemoteMethod(path="a") String getX22(@Query NameValuePair[] b);
                @RemoteMethod(path="a") String getX23(@Query 
BasicNameValuePair[] b);
@@ -795,19 +795,19 @@ public class Remote_QueryAnnotation_Test {
 
        public static class K3a {
                @Query(aev=true)
-               public NameValuePairs getA() {
+               public NameValuePairSupplier getA() {
                        return pairs("a1","v1","a2",123,"a3",null,"a4","");
                }
                @Query("*")
-               public NameValuePairs getB() {
+               public NameValuePairSupplier getB() {
                        return pairs("b1","true","b2","123","b3","null");
                }
                @Query(n="*",aev=true)
-               public NameValuePairs getC() {
+               public NameValuePairSupplier getC() {
                        return pairs("c1","v1","c2",123,"c3",null,"c4","");
                }
                @Query("*")
-               public NameValuePairs getD() {
+               public NameValuePairSupplier getD() {
                        return null;
                }
                @Query(aev=true)
@@ -935,8 +935,8 @@ public class Remote_QueryAnnotation_Test {
        // Helper methods.
        
//------------------------------------------------------------------------------------------------------------------
 
-       private static NameValuePairs pairs(Object...pairs) {
-               return NameValuePairs.of(pairs);
+       private static NameValuePairSupplier pairs(Object...pairs) {
+               return NameValuePairSupplier.ofPairs(pairs);
        }
 
        private static NameValuePair pair(String key,Object val) {
diff --git 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_BasicCalls_Test.java
 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_BasicCalls_Test.java
index c75762a..1badc57 100644
--- 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_BasicCalls_Test.java
+++ 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_BasicCalls_Test.java
@@ -172,7 +172,7 @@ public class RestClient_BasicCalls_Test {
                        pairs("f",1)
                );
                for (Object body : bodies) {
-                       client().contentType(body instanceof NameValuePairs ? 
"application/x-www-form-urlencoded" : 
"application/json").build().put("/bean",body).run().assertBody().is("{f:1}");
+                       client().contentType(body instanceof 
NameValuePairSupplier ? "application/x-www-form-urlencoded" : 
"application/json").build().put("/bean",body).run().assertBody().is("{f:1}");
                }
        }
 
@@ -216,7 +216,7 @@ public class RestClient_BasicCalls_Test {
                        pairs("f",1)
                );
                for (Object body : bodies) {
-                       client().contentType(body instanceof NameValuePairs ? 
"application/x-www-form-urlencoded" : 
"application/json").build().post("/bean",body).run().assertBody().is("{f:1}");
+                       client().contentType(body instanceof 
NameValuePairSupplier ? "application/x-www-form-urlencoded" : 
"application/json").build().post("/bean",body).run().assertBody().is("{f:1}");
                }
        }
 
@@ -362,7 +362,7 @@ public class RestClient_BasicCalls_Test {
                );
                RestClient x = client().build();
                for (Object body : bodies) {
-                       x.patch("/bean",body).contentType(body instanceof 
NameValuePairs ? "application/x-www-form-urlencoded" : 
"application/json").run().assertBody().is("{f:1}");
+                       x.patch("/bean",body).contentType(body instanceof 
NameValuePairSupplier ? "application/x-www-form-urlencoded" : 
"application/json").run().assertBody().is("{f:1}");
                }
        }
 
@@ -400,7 +400,7 @@ public class RestClient_BasicCalls_Test {
                );
                RestClient x = client().build();
                for (Object body : bodies) {
-                       
x.request(HttpMethod.PATCH,"/bean",body).contentType(body instanceof 
NameValuePairs ? "application/x-www-form-urlencoded" : 
"application/json").run().assertBody().is("{f:1}");
+                       
x.request(HttpMethod.PATCH,"/bean",body).contentType(body instanceof 
NameValuePairSupplier ? "application/x-www-form-urlencoded" : 
"application/json").run().assertBody().is("{f:1}");
                }
        }
 
@@ -448,8 +448,8 @@ public class RestClient_BasicCalls_Test {
                return BasicNameValuePair.of(name, val);
        }
 
-       private static NameValuePairs pairs(Object...pairs) {
-               return NameValuePairs.of(pairs);
+       private static NameValuePairSupplier pairs(Object...pairs) {
+               return NameValuePairSupplier.ofPairs(pairs);
        }
 
        private static RestClientBuilder client() {
diff --git 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_FormData_Test.java
 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_FormData_Test.java
index 1fe43b9..3acccf0 100644
--- 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_FormData_Test.java
+++ 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_FormData_Test.java
@@ -203,8 +203,8 @@ public class RestClient_FormData_Test {
                return BasicNameValuePair.of(name, val);
        }
 
-       private static NameValuePairs pairs(Object...pairs) {
-               return NameValuePairs.of(pairs);
+       private static NameValuePairSupplier pairs(Object...pairs) {
+               return NameValuePairSupplier.ofPairs(pairs);
        }
 
        private static RestClientBuilder client() {
diff --git 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_Headers_Test.java
 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_Headers_Test.java
index b99f4f0..ba7e5e5 100644
--- 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_Headers_Test.java
+++ 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_Headers_Test.java
@@ -96,11 +96,6 @@ public class RestClient_Headers_Test {
        }
 
        @Test
-       public void a04_header_NameValuePair() throws Exception {
-               
checkFooClient().header(pair("Foo","bar")).build().get("/headers").header(pair("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']");
@@ -114,8 +109,6 @@ public class RestClient_Headers_Test {
                
checkFooClient().headers(header("Foo","bar"),header("Baz","baz")).build().get("/headers").headers(header("Foo","baz"),header("Baz","quux")).run().assertBody().is("['bar','baz']");
                
checkFooClient().headers(OMap.of("Foo","bar")).build().get("/headers").headers(OMap.of("Foo","baz")).run().assertBody().is("['bar','baz']");
                
checkFooClient().headers(AMap.of("Foo","bar")).build().get("/headers").headers(AMap.of("Foo","baz")).run().assertBody().is("['bar','baz']");
-               
checkFooClient().headers(pairs("Foo","bar")).build().get("/headers").headers(pairs("Foo","baz")).run().assertBody().is("['bar','baz']");
-               checkFooClient().headers((Object)new 
NameValuePair[]{pair("Foo","bar")}).build().get("/headers").headers(pairs("Foo","baz")).run().assertBody().is("['bar','baz']");
                
checkFooClient().headers(pair("Foo","bar")).build().get("/headers").headers(pair("Foo","baz")).run().assertBody().is("['bar','baz']");
                
checkFooClient().headers(SerializedNameValuePair.create().name("Foo").value("Bar").serializer(OpenApiSerializer.DEFAULT)).build().get("/headers").headers(SerializedNameValuePair.create().name("Foo").value("Baz").serializer(OpenApiSerializer.DEFAULT)).debug().run().assertBody().is("['Bar','Baz']");
                
checkFooClient().headers(SerializedHeader.create().name("Foo").value("Bar").serializer(OpenApiSerializer.DEFAULT)).build().get("/headers").headers(SerializedHeader.create().name("Foo").value("Baz").serializer(OpenApiSerializer.DEFAULT)).debug().run().assertBody().is("['Bar','Baz']");
@@ -337,10 +330,6 @@ public class RestClient_Headers_Test {
                return BasicNameValuePair.of(name, val);
        }
 
-       private static NameValuePairs pairs(Object...pairs) {
-               return NameValuePairs.of(pairs);
-       }
-
        private static RestClientBuilder client() {
                return MockRestClient.create(A.class).simpleJson();
        }
diff --git 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_Paths_Test.java
 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_Paths_Test.java
index 728b7ac..db996c2 100644
--- 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_Paths_Test.java
+++ 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_Paths_Test.java
@@ -94,8 +94,8 @@ public class RestClient_Paths_Test {
                return BasicNameValuePair.of(name, val);
        }
 
-       private static NameValuePairs pairs(Object...pairs) {
-               return NameValuePairs.of(pairs);
+       private static NameValuePairSupplier pairs(Object...pairs) {
+               return NameValuePairSupplier.ofPairs(pairs);
        }
 
        private static RestClientBuilder client() {
diff --git 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_Query_Test.java
 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_Query_Test.java
index 66fdb65..2e9202a 100644
--- 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_Query_Test.java
+++ 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClient_Query_Test.java
@@ -194,8 +194,8 @@ public class RestClient_Query_Test {
                return BasicNameValuePair.of(name, val);
        }
 
-       private static NameValuePairs pairs(Object...pairs) {
-               return NameValuePairs.of(pairs);
+       private static NameValuePairSupplier pairs(Object...pairs) {
+               return NameValuePairSupplier.ofPairs(pairs);
        }
 
        private static RestClientBuilder client() {
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/NameValuePairs.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/NameValuePairs.java
index 212f11f..1870f1d 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/NameValuePairs.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/NameValuePairs.java
@@ -39,7 +39,7 @@ import org.apache.juneau.urlencoding.*;
  *     restClient.doPost(url, params).run();
  * </p>
  *
- * @deprecated Use {@link org.apache.juneau.http.NameValuePairs}
+ * @deprecated Use {@link org.apache.juneau.http.NameValuePairSupplier}
  */
 @Deprecated
 public final class NameValuePairs extends LinkedList<NameValuePair> {
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClient.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClient.java
index 39f017b..3caf7eb 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClient.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClient.java
@@ -321,7 +321,6 @@ import org.apache.http.client.CookieStore;
  *             <li class='jm'>{@link RestRequest#header(String,Object) 
header(String,Object)}
  *             <li class='jm'>{@link RestRequest#header(AddFlag,String,Object) 
header(EnumSet&gt;AddFlag&gt;,String,Object)}
  *             <li class='jm'>{@link RestRequest#header(Header) header(Header)}
- *             <li class='jm'>{@link RestRequest#header(NameValuePair) 
header(NameValuePair)}
  *             <li class='jm'>{@link RestRequest#headers(Object...) 
headers(Object...)}
  *             <li class='jm'>{@link RestRequest#headers(AddFlag,Object...) 
headers(EnumSet&gt;AddFlag&gt;Object...)}
  *             <li class='jm'>{@link RestRequest#headerPairs(Object...) 
headers(Object...)}
@@ -493,7 +492,7 @@ import org.apache.http.client.CookieStore;
  *             <li class='jc'>
  *                     {@link HttpEntity} - Bypass Juneau serialization and 
pass HttpEntity directly to HttpClient.
  *             <li class='jc'>
- *                     {@link NameValuePairs} - Converted to a URL-encoded 
FORM post.
+ *                     {@link NameValuePairSupplier} - Converted to a 
URL-encoded FORM post.
  *     </ul>
  *
  * <ul class='notes'>
@@ -1235,7 +1234,6 @@ public class RestClient extends BeanContext implements 
HttpClient, Closeable, Re
         *                              <li class='jm'>{@link 
org.apache.juneau.rest.client2.RestRequest#header(String,Object) 
header(String,Object)}
         *                              <li class='jm'>{@link 
org.apache.juneau.rest.client2.RestRequest#header(AddFlag,String,Object) 
header(EnumSet&gt;AddFlag&gt;,String,Object)}
         *                              <li class='jm'>{@link 
org.apache.juneau.rest.client2.RestRequest#header(Header) header(Header)}
-        *                              <li class='jm'>{@link 
org.apache.juneau.rest.client2.RestRequest#header(NameValuePair) 
header(NameValuePair)}
         *                              <li class='jm'>{@link 
org.apache.juneau.rest.client2.RestRequest#headers(Object...) 
headers(Object...)}
         *                              <li class='jm'>{@link 
org.apache.juneau.rest.client2.RestRequest#headers(AddFlag,Object...) 
headers(EnumSet&gt;AddFlag&gt;,Object...)}
         *                              <li class='jm'>{@link 
org.apache.juneau.rest.client2.RestRequest#headerPairs(Object...) 
headerPairs(Object...)}
@@ -2201,7 +2199,7 @@ public class RestClient extends BeanContext implements 
HttpClient, Closeable, Re
         *              <li class='jc'>
         *                      {@link HttpEntity} - Bypass Juneau 
serialization and pass HttpEntity directly to HttpClient.
         *              <li class='jc'>
-        *                      {@link NameValuePairs} - Converted to a 
URL-encoded FORM post.
+        *                      {@link NameValuePairSupplier} - Converted to a 
URL-encoded FORM post.
         *              <li class='jc'>
         *                      {@link Supplier} - A supplier of anything on 
this list.
         *      </ul>
@@ -2300,7 +2298,7 @@ public class RestClient extends BeanContext implements 
HttpClient, Closeable, Re
         *              <li class='jc'>
         *                      {@link HttpEntity} - Bypass Juneau 
serialization and pass HttpEntity directly to HttpClient.
         *              <li class='jc'>
-        *                      {@link NameValuePairs} - Converted to a 
URL-encoded FORM post.
+        *                      {@link NameValuePairSupplier} - Converted to a 
URL-encoded FORM post.
         *              <li class='jc'>
         *                      {@link Supplier} - A supplier of anything on 
this list.
         *      </ul>
@@ -2454,7 +2452,7 @@ public class RestClient extends BeanContext implements 
HttpClient, Closeable, Re
         *      <ul class='spaced-list'>
         *              <li class='jc'>{@link NameValuePair} - URL-encoded as a 
single name-value pair.
         *              <li class='jc'>{@link NameValuePair} array - 
URL-encoded as name value pairs.
-        *              <li class='jc'>{@link NameValuePairs} - URL-encoded as 
name value pairs.
+        *              <li class='jc'>{@link NameValuePairSupplier} - 
URL-encoded as name value pairs.
         *              <li class='jc'>{@link Reader}/{@link InputStream}- 
Streamed directly and <l>Content-Type</l> set to 
<js>"application/x-www-form-urlencoded"</js>
         *              <li class='jc'>{@link ReaderResource}/{@link 
ReaderResourceBuilder}/{@link StreamResource}/{@link 
StreamResourceBuilder}/{@link HttpEntity}- Streamed directly and 
<l>Content-Type</l> set to <js>"application/x-www-form-urlencoded"</js> if not 
already specified on the entity.
         *              <li class='jc'>{@link Object} - Converted to a {@link 
SerializedHttpEntity} using {@link UrlEncodingSerializer} to serialize.
@@ -2474,8 +2472,8 @@ public class RestClient extends BeanContext implements 
HttpClient, Closeable, Re
                                return req.body(new 
UrlEncodedFormEntity(AList.of((NameValuePair)body)));
                        if (body instanceof NameValuePair[])
                                return req.body(new 
UrlEncodedFormEntity(Arrays.asList((NameValuePair[])body)));
-                       if (body instanceof NameValuePairs)
-                               return req.body(new 
UrlEncodedFormEntity((NameValuePairs)body));
+                       if (body instanceof NameValuePairSupplier)
+                               return req.body(new 
UrlEncodedFormEntity((NameValuePairSupplier)body));
                        if (body instanceof HttpEntity) {
                                HttpEntity e = (HttpEntity)body;
                                if (e.getContentType() == null)
@@ -2552,7 +2550,7 @@ public class RestClient extends BeanContext implements 
HttpClient, Closeable, Re
         * @throws RestCallException If any authentication errors occurred.
         */
        public RestRequest formPostPairs(Object url, Object...parameters) 
throws RestCallException {
-               return formPost(url, new NameValuePairs(parameters));
+               return formPost(url, NameValuePairSupplier.ofPairs(parameters));
        }
 
        /**
@@ -2586,7 +2584,7 @@ public class RestClient extends BeanContext implements 
HttpClient, Closeable, Re
         *              <li class='jc'>
         *                      {@link HttpEntity} - Bypass Juneau 
serialization and pass HttpEntity directly to HttpClient.
         *              <li class='jc'>
-        *                      {@link NameValuePairs} - Converted to a 
URL-encoded FORM post.
+        *                      {@link NameValuePairSupplier} - Converted to a 
URL-encoded FORM post.
         *              <li class='jc'>
         *                      {@link Supplier} - A supplier of anything on 
this list.
         *      </ul>
@@ -2731,7 +2729,7 @@ public class RestClient extends BeanContext implements 
HttpClient, Closeable, Re
                        RestRequest req = request(method, uri, 
isNotEmpty(content));
                        if (headers != null)
                                for (Map.Entry<String,Object> e : 
OMap.ofJson(headers).entrySet())
-                                       
req.header(BasicNameValuePair.of(e.getKey(), e.getValue()));
+                                       req.header(BasicHeader.of(e.getKey(), 
e.getValue()));
                        if (isNotEmpty(content))
                                req.bodyString(content);
                        return req;
@@ -2772,7 +2770,7 @@ public class RestClient extends BeanContext implements 
HttpClient, Closeable, Re
         *              <li class='jc'>
         *                      {@link HttpEntity} - Bypass Juneau 
serialization and pass HttpEntity directly to HttpClient.
         *              <li class='jc'>
-        *                      {@link NameValuePairs} - Converted to a 
URL-encoded FORM post.
+        *                      {@link NameValuePairSupplier} - Converted to a 
URL-encoded FORM post.
         *              <li class='jc'>
         *                      {@link Supplier} - A supplier of anything on 
this list.
         *      </ul>
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClientBuilder.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClientBuilder.java
index 668c170..0c9aff8 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClientBuilder.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClientBuilder.java
@@ -1304,11 +1304,8 @@ public class RestClientBuilder extends 
BeanContextBuilder {
         *      <br>Can be any of the following types:
         *      <ul>
         *              <li>{@link Header} (including any subclasses such as 
{@link Accept})
-        *              <li>{@link NameValuePair}
         *              <li>{@link Headerable}
-        *              <li>{@link NameValuePairable}
         *              <li>{@link java.util.Map.Entry}
-        *              <li>{@link NameValuePairs}
         *              <li>{@link HeaderSupplier}
         *              <li>{@link Map}
         *              <ul>
@@ -2058,7 +2055,6 @@ public class RestClientBuilder extends BeanContextBuilder 
{
         *              <li>{@link NameValuePair}
         *              <li>{@link NameValuePairable}
         *              <li>{@link java.util.Map.Entry}
-        *              <li>{@link NameValuePairs}
         *              <li>{@link NameValuePairSupplier}
         *              <li>{@link Map}
         *              <ul>
@@ -2346,7 +2342,6 @@ public class RestClientBuilder extends BeanContextBuilder 
{
         *              <li>{@link NameValuePair}
         *              <li>{@link NameValuePairable}
         *              <li>{@link java.util.Map.Entry}
-        *              <li>{@link NameValuePairs}
         *              <li>{@link NameValuePairSupplier}
         *              <li>{@link Map}
         *              <ul>
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestRequest.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestRequest.java
index a9d31a3..b05e1f8 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestRequest.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestRequest.java
@@ -81,7 +81,7 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
        private HttpPartSerializerSession partSerializer;
        private HttpPartSchema requestBodySchema;
        private URIBuilder uriBuilder;
-       private NameValuePairs formData;
+       private List<NameValuePair> formData;
        private Predicate<Integer> errorCodes;
        private HttpHost target;
        private HttpContext context;
@@ -939,7 +939,6 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
         *              <li>{@link NameValuePair}
         *              <li>{@link NameValuePairable}
         *              <li>{@link java.util.Map.Entry}
-        *              <li>{@link NameValuePairs}
         *              <li>{@link NameValuePairSupplier}
         *              <li>{@link Map}
         *              <ul>
@@ -1011,13 +1010,16 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
        }
 
        RestRequest pathArg(String name, Object value, HttpPartSchema schema, 
HttpPartSerializerSession serializer) throws RestCallException {
-               boolean isMulti = isEmpty(name) || "*".equals(name) || value 
instanceof NameValuePairs || isNameValuePairArray(value);
+               boolean isMulti = isEmpty(name) || "*".equals(name) || value 
instanceof NameValuePairSupplier || isNameValuePairArray(value);
 
                if (! isMulti)
                        return innerPath(serializedNameValuePair(name, value, 
PATH, serializer, schema, null));
 
                if (BasicNameValuePair.canCast(value)) {
                        innerPath(BasicNameValuePair.cast(value));
+               } else if (value instanceof NameValuePairSupplier) {
+                       for (Object o : (NameValuePairSupplier)value)
+                               innerPath(BasicNameValuePair.cast(o));
                } else if (value instanceof Collection) {
                        for (Object o : (Collection<?>)value)
                                innerPath(BasicNameValuePair.cast(o));
@@ -1228,7 +1230,7 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
         *              <li>{@link NameValuePair}
         *              <li>{@link NameValuePairable}
         *              <li>{@link java.util.Map.Entry}
-        *              <li>{@link NameValuePairs}
+        *              <li>{@link NameValuePairSupplier}
         *              <li>{@link Map}
         *              <ul>
         *                      <li>Values can be any POJO.
@@ -1273,7 +1275,6 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
         *              <li>{@link NameValuePair}
         *              <li>{@link NameValuePairable}
         *              <li>{@link java.util.Map.Entry}
-        *              <li>{@link NameValuePairs}
         *              <li>{@link NameValuePairSupplier}
         *              <li>{@link Map}
         *              <ul>
@@ -1363,7 +1364,7 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
         *              <li class='jc'>
         *                      {@link InputStream} - Raw contents of {@code 
InputStream} will be serialized to remote resource.
         *              <li class='jc'>
-        *                      {@link NameValuePairs} - Converted to a 
URL-encoded query.
+        *                      {@link NameValuePairSupplier} - Converted to a 
URL-encoded query.
         *      </ul>
         * @return This object (for method chaining).
         * @throws RestCallException Invalid input.
@@ -1386,7 +1387,7 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
 
        RestRequest queryArg(EnumSet<AddFlag> flags, String name, Object value, 
HttpPartSchema schema, HttpPartSerializerSession serializer) throws 
RestCallException {
                flags = AddFlag.orDefault(flags);
-               boolean isMulti = isEmpty(name) || "*".equals(name) || value 
instanceof NameValuePairs || isNameValuePairArray(value);
+               boolean isMulti = isEmpty(name) || "*".equals(name) || value 
instanceof NameValuePairSupplier || isNameValuePairArray(value);
 
                if (! isMulti)
                        return innerQuery(flags, 
AList.of(serializedNameValuePair(name, value, QUERY, serializer, schema, 
flags)));
@@ -1395,6 +1396,9 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
 
                if (BasicNameValuePair.canCast(value)) {
                        l.add(BasicNameValuePair.cast(value));
+               } else if (value instanceof NameValuePairSupplier) {
+                       for (Object o : (NameValuePairSupplier)value)
+                               l.add(BasicNameValuePair.cast(o));
                } else if (value instanceof Collection) {
                        for (Object o : (Collection<?>)value)
                                l.add(BasicNameValuePair.cast(o));
@@ -1613,7 +1617,7 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
         *              <li>{@link NameValuePair}
         *              <li>{@link NameValuePairable}
         *              <li>{@link java.util.Map.Entry}
-        *              <li>{@link NameValuePairs}
+        *              <li>{@link NameValuePairSupplier}
         *              <li>{@link Map}
         *              <ul>
         *                      <li>Values can be any POJO.
@@ -1658,7 +1662,6 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
         *              <li>{@link NameValuePair}
         *              <li>{@link NameValuePairable}
         *              <li>{@link java.util.Map.Entry}
-        *              <li>{@link NameValuePairs}
         *              <li>{@link NameValuePairSupplier}
         *              <li>{@link Map}
         *              <ul>
@@ -1769,7 +1772,7 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
         *              <li class='jc'>
         *                      {@link HttpEntity} - Bypass Juneau 
serialization and pass HttpEntity directly to HttpClient.
         *              <li class='jc'>
-        *                      {@link NameValuePairs} - Converted to a 
URL-encoded FORM post.
+        *                      {@link NameValuePairSupplier} - Converted to a 
URL-encoded FORM post.
         *      </ul>
         * @return This object (for method chaining).
         * @throws RestCallException Invalid input.
@@ -1782,7 +1785,7 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
 
        RestRequest formDataArg(EnumSet<AddFlag> flags, String name, Object 
value, HttpPartSchema schema, HttpPartSerializerSession serializer) throws 
RestCallException {
                flags = AddFlag.orDefault(flags);
-               boolean isMulti = isEmpty(name) || "*".equals(name) || value 
instanceof NameValuePairs || isNameValuePairArray(value);
+               boolean isMulti = isEmpty(name) || "*".equals(name) || value 
instanceof NameValuePairSupplier || isNameValuePairArray(value);
 
                if (! isMulti)
                        return innerFormData(flags, 
AList.of(serializedNameValuePair(name, value, FORMDATA, serializer, schema, 
flags)));
@@ -1791,6 +1794,9 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
 
                if (BasicNameValuePair.canCast(value)) {
                        l.add(BasicNameValuePair.cast(value));
+               } else if (value instanceof NameValuePairSupplier) {
+                       for (Object o : (NameValuePairSupplier)value)
+                               l.add(BasicNameValuePair.cast(o));
                } else if (value instanceof Collection) {
                        for (Object o : (Collection<?>)value)
                                l.add(BasicNameValuePair.cast(o));
@@ -1817,7 +1823,7 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
                if (flags.contains(SKIP_IF_EMPTY))
                        params.removeIf(x -> isEmpty(x.getValue()));
                if (formData == null)
-                       formData = new NameValuePairs();
+                       formData = new ArrayList<>();
                if (flags.contains(REPLACE)) {
                        for (NameValuePair p : params)
                                for (Iterator<NameValuePair> i = 
formData.iterator(); i.hasNext();)
@@ -1858,7 +1864,7 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
         *              <li class='jc'>
         *                      {@link HttpEntity} - Bypass Juneau 
serialization and pass HttpEntity directly to HttpClient.
         *              <li class='jc'>
-        *                      {@link NameValuePairs} - Converted to a 
URL-encoded FORM post.
+        *                      {@link NameValuePairSupplier} - Converted to a 
URL-encoded FORM post.
         *              <li>
         *                      A {@link Supplier} of anything on this list.
         *      </ul>
@@ -1925,7 +1931,7 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
         *              <li class='jc'>
         *                      {@link HttpEntity} - Bypass Juneau 
serialization and pass HttpEntity directly to HttpClient.
         *              <li class='jc'>
-        *                      {@link NameValuePairs} - Converted to a 
URL-encoded FORM post.
+        *                      {@link NameValuePairSupplier} - Converted to a 
URL-encoded FORM post.
         *              <li>
         *                      A {@link Supplier} of anything on this list.
         *      </ul>
@@ -2101,26 +2107,6 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
        }
 
        /**
-        * Appends a header on the request.
-        *
-        * <h5 class='section'>Example:</h5>
-        *      <jc>// Adds header "Foo: bar".</jc>
-        * <p class='bcode w800'>
-        *      client
-        *              .get(<jsf>URL</jsf>)
-        *              
.header(BasicNameValuePair.<jsm>of</jsm>(<js>"Foo"</js>, <js>"bar"</js>))
-        *              .run();
-        * </p>
-        *
-        * @param header The header to set.
-        * @return This object (for method chaining).
-        * @throws RestCallException Invalid input.
-        */
-       public RestRequest header(NameValuePair header) throws 
RestCallException {
-               return headers(header);
-       }
-
-       /**
         * Appends multiple headers to the request.
         *
         * <h5 class='section'>Example:</h5>
@@ -2140,11 +2126,9 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
         *      <br>Can be any of the following types:
         *      <ul>
         *              <li>{@link Header} (including any subclasses such as 
{@link Accept})
-        *              <li>{@link NameValuePair}
         *              <li>{@link Headerable}
-        *              <li>{@link NameValuePairable}
         *              <li>{@link java.util.Map.Entry}
-        *              <li>{@link NameValuePairs}
+        *              <li>{@link HeaderSupplier}
         *              <li>{@link Map}
         *              <ul>
         *                      <li>Values can be any POJO.
@@ -2187,11 +2171,8 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
         *      <br>Can be any of the following types:
         *      <ul>
         *              <li>{@link Header} (including any subclasses such as 
{@link Accept})
-        *              <li>{@link NameValuePair}
         *              <li>{@link Headerable}
-        *              <li>{@link NameValuePairable}
         *              <li>{@link java.util.Map.Entry}
-        *              <li>{@link NameValuePairs}
         *              <li>{@link HeaderSupplier}
         *              <li>{@link Map}
         *              <ul>
@@ -2262,7 +2243,7 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
 
        RestRequest headerArg(EnumSet<AddFlag> flags, String name, Object 
value, HttpPartSchema schema, HttpPartSerializerSession serializer) throws 
RestCallException {
                flags = AddFlag.orDefault(flags);
-               boolean isMulti = isEmpty(name) || "*".equals(name) || value 
instanceof NameValuePairs || isNameValuePairArray(value);
+               boolean isMulti = isEmpty(name) || "*".equals(name) || value 
instanceof HeaderSupplier || isHeaderArray(value);
 
                if (! isMulti)
                        return innerHeaders(flags, 
AList.of(serializedHeader(name, value, serializer, schema, flags)));
@@ -2271,6 +2252,9 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
 
                if (BasicHeader.canCast(value)) {
                        l.add(BasicHeader.cast(value));
+               } else if (value instanceof HeaderSupplier) {
+                       for (Object o : (HeaderSupplier)value)
+                               l.add(BasicHeader.cast(o));
                } else if (value instanceof Collection) {
                        for (Object o : (Collection<?>)value)
                                l.add(BasicHeader.cast(o));
@@ -2844,8 +2828,8 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
                                HttpEntity entity = null;
                                if (formData != null)
                                        entity = new 
UrlEncodedFormEntity(formData);
-                               else if (input2 instanceof NameValuePairs)
-                                       entity = new 
UrlEncodedFormEntity((NameValuePairs)input2);
+                               else if (input2 instanceof 
NameValuePairSupplier)
+                                       entity = new 
UrlEncodedFormEntity((NameValuePairSupplier)input2);
                                else if (input2 instanceof HttpEntity)
                                        entity = (HttpEntity)input2;
                                else if (input2 instanceof Reader)
@@ -3415,6 +3399,14 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
                return false;
        }
 
+       private static boolean isHeaderArray(Object o) {
+               if (o == null || ! o.getClass().isArray())
+                       return false;
+               if 
(Header.class.isAssignableFrom(o.getClass().getComponentType()))
+                       return true;
+               return false;
+       }
+
        
//-----------------------------------------------------------------------------------------------------------------
        // Other methods
        
//-----------------------------------------------------------------------------------------------------------------

Reply via email to