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

incubator-juneau git commit: Testcases.

Repository: incubator-juneau
Updated Branches:
  refs/heads/master 98a53eb31 -> b983a7f62


Testcases.

Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/b983a7f6
Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/b983a7f6
Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/b983a7f6

Branch: refs/heads/master
Commit: b983a7f620ff957a4980cfa507d82e513ce28e6b
Parents: 98a53eb
Author: JamesBognar <ja...@apache.org>
Authored: Fri May 12 10:26:09 2017 -0400
Committer: JamesBognar <ja...@apache.org>
Committed: Fri May 12 10:26:09 2017 -0400

----------------------------------------------------------------------
 juneau-core/src/main/javadoc/overview.html      |   2 +
 .../org/apache/juneau/rest/client/RestCall.java |  15 +-
 .../juneau/rest/test/HeadersResource.java       | 129 +++++++++++++-
 .../apache/juneau/rest/test/ParamsResource.java | 125 ++++++++++++-
 .../juneau/rest/test/ParamsResource.properties  |  15 ++
 .../rest/test/ParamsResource_ja_JP.properties   |  15 ++
 .../apache/juneau/rest/test/HeadersTest.java    | 175 ++++++++++++++++++-
 .../org/apache/juneau/rest/test/ParamsTest.java | 140 +++++++++++++++
 .../org/apache/juneau/rest/test/_TestSuite.java |   1 +
 .../org/apache/juneau/rest/RestCallHandler.java |   3 +
 .../apache/juneau/rest/RestParamDefaults.java   |  12 +-
 .../org/apache/juneau/rest/RestResponse.java    |  19 +-
 12 files changed, 625 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b983a7f6/juneau-core/src/main/javadoc/overview.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/javadoc/overview.html b/juneau-core/src/main/javadoc/overview.html
index f0bd247..f47b431 100644
--- a/juneau-core/src/main/javadoc/overview.html
+++ b/juneau-core/src/main/javadoc/overview.html
@@ -6083,6 +6083,8 @@
 				</p>
 			<li>A new annotation {@link org.apache.juneau.rest.annotation.RestResource#paramResolvers() @RestResource.paramResolvers()}
 				that allows you to define your own custom Java method parameter resolvers.
+			<li>Fixed bug where Writer returned by {@link org.apache.juneau.rest.RestResponse#getWriter()} was not being flushed automatically
+				at the end of the HTTP call.
 		</ul>
 
 		<h6 class='topic'>org.apache.juneau.rest.client</h6>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b983a7f6/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCall.java
----------------------------------------------------------------------
diff --git a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCall.java b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCall.java
index 7bc9449..5cdcd84 100644
--- a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCall.java
+++ b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCall.java
@@ -739,7 +739,7 @@ public final class RestCall {
 	 * @return This object (for method chaining).
 	 */
 	public RestCall maxForwards(Object value) {
-		return header("If-Unmodified-Since", value);
+		return header("Max-Forwards", value);
 	}
 
 	/**
@@ -751,7 +751,7 @@ public final class RestCall {
 	 * @return This object (for method chaining).
 	 */
 	public RestCall origin(Object value) {
-		return header("If-Unmodified-Since", value);
+		return header("Origin", value);
 	}
 
 	/**
@@ -1821,4 +1821,15 @@ public final class RestCall {
 		interceptor(new RestCallLogger(level, log));
 		return this;
 	}
+
+	/**
+	 * Sets <code>Debug: value</code> header on this request.
+	 *
+	 * @param value The debug value.
+	 * @return This object (for method chaining).
+	 */
+	public RestCall debug(boolean value) {
+		header("Debug", value);
+		return this;
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b983a7f6/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/HeadersResource.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/HeadersResource.java b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/HeadersResource.java
index e5a6265..0a03469 100644
--- a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/HeadersResource.java
+++ b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/HeadersResource.java
@@ -27,9 +27,10 @@ import org.apache.juneau.rest.annotation.*;
 	path="/testHeaders",
 	serializers=HeadersResource.PlainTextAnythingSerializer.class,
 	parsers=HeadersResource.PlainTextAnythingParser.class,
-	encoders=HeadersResource.IdentityAnythingEncoder.class
+	encoders=HeadersResource.IdentityAnythingEncoder.class,
+	paramResolvers=HeadersResource.CustomHeaderParam.class
 )
-public class HeadersResource extends RestServletDefault {
+public class HeadersResource extends RestServlet {
 	private static final long serialVersionUID = 1L;
 
 	//====================================================================================================
@@ -39,17 +40,135 @@ public class HeadersResource extends RestServletDefault {
 	public String accept(Accept accept) {
 		return accept.toString();
 	}
-
+	@RestMethod(name="GET", path="/acceptCharset")
+	public String acceptCharset(AcceptCharset acceptCharset) {
+		return acceptCharset.toString();
+	}
 	@RestMethod(name="GET", path="/acceptEncoding")
 	public String acceptEncoding(AcceptEncoding acceptEncoding) {
-		System.err.println(acceptEncoding);
 		return acceptEncoding.toString();
 	}
-
+	@RestMethod(name="GET", path="/acceptLanguage")
+	public String acceptLanguage(AcceptLanguage acceptLanguage) {
+		return acceptLanguage.toString();
+	}
+	@RestMethod(name="GET", path="/authorization")
+	public String authorization(Authorization authorization) {
+		return authorization.toString();
+	}
+	@RestMethod(name="GET", path="/cacheControl")
+	public String cacheControl(CacheControl cacheControl) {
+		return cacheControl.toString();
+	}
+	@RestMethod(name="GET", path="/connection")
+	public String connection(Connection connection) {
+		return connection.toString();
+	}
+	@RestMethod(name="GET", path="/contentLength")
+	public String contentLength(ContentLength contentLength) {
+		return contentLength.toString();
+	}
 	@RestMethod(name="GET", path="/contentType")
 	public String contentType(ContentType contentType) {
 		return contentType.toString();
 	}
+	@RestMethod(name="GET", path="/date")
+	public String date(org.apache.juneau.http.Date date) {
+		return date.toString();
+	}
+	@RestMethod(name="GET", path="/expect")
+	public String expect(Expect expect) {
+		return expect.toString();
+	}
+	@RestMethod(name="GET", path="/from")
+	public String from(From from) {
+		return from.toString();
+	}
+	@RestMethod(name="GET", path="/host")
+	public String host(Host host) {
+		return host.toString();
+	}
+	@RestMethod(name="GET", path="/ifMatch")
+	public String IfMatch(IfMatch ifMatch) {
+		return ifMatch.toString();
+	}
+	@RestMethod(name="GET", path="/ifModifiedSince")
+	public String ifModifiedSince(IfModifiedSince ifModifiedSince) {
+		return ifModifiedSince.toString();
+	}
+	@RestMethod(name="GET", path="/ifNoneMatch")
+	public String ifNoneMatch(IfNoneMatch ifNoneMatch) {
+		return ifNoneMatch.toString();
+	}
+	@RestMethod(name="GET", path="/ifRange")
+	public String ifRange(IfRange ifRange) {
+		return ifRange.toString();
+	}
+	@RestMethod(name="GET", path="/ifUnmodifiedSince")
+	public String ifUnmodifiedSince(IfUnmodifiedSince ifUnmodifiedSince) {
+		return ifUnmodifiedSince.toString();
+	}
+	@RestMethod(name="GET", path="/maxForwards")
+	public String maxForwards(MaxForwards maxForwards) {
+		return maxForwards.toString();
+	}
+	@RestMethod(name="GET", path="/pragma")
+	public String pragma(Pragma pragma) {
+		return pragma.toString();
+	}
+	@RestMethod(name="GET", path="/proxyAuthorization")
+	public String proxyAuthorization(ProxyAuthorization proxyAuthorization) {
+		return proxyAuthorization.toString();
+	}
+	@RestMethod(name="GET", path="/range")
+	public String range(Range range) {
+		return range.toString();
+	}
+	@RestMethod(name="GET", path="/referer")
+	public String referer(Referer referer) {
+		return referer.toString();
+	}
+	@RestMethod(name="GET", path="/te")
+	public String te(TE te) {
+		return te.toString();
+	}
+	@RestMethod(name="GET", path="/upgrade")
+	public String upgrade(Upgrade upgrade) {
+		return upgrade.toString();
+	}
+	@RestMethod(name="GET", path="/userAgent")
+	public String userAgent(UserAgent userAgent) {
+		return userAgent.toString();
+	}
+	@RestMethod(name="GET", path="/warning")
+	public String warning(Warning warning) {
+		return warning.toString();
+	}
+	@RestMethod(name="GET", path="/customHeader")
+	public String customHeader(CustomHeader customHeader) {
+		return customHeader.toString();
+	}
+
+	public static class CustomHeaderParam extends RestParam {
+		public CustomHeaderParam() {
+			super(RestParamType.HEADER, "Custom", CustomHeader.class);
+		}
+		@Override
+		public Object resolve(RestRequest req, RestResponse res) throws Exception {
+			return new CustomHeader(req.getHeader("Custom"));
+		}
+	}
+
+	public static class CustomHeader {
+		public String value;
+		public CustomHeader(String value) {
+			this.value = value;
+		}
+		@Override
+		public String toString() {
+			return value;
+		}
+	}
 
 	@Produces("*/*")
 	public static class PlainTextAnythingSerializer extends PlainTextSerializer {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b983a7f6/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ParamsResource.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ParamsResource.java b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ParamsResource.java
index cfd7f15..706b97f 100644
--- a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ParamsResource.java
+++ b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/ParamsResource.java
@@ -14,18 +14,27 @@ package org.apache.juneau.rest.test;
 
 import static org.apache.juneau.rest.RestContext.*;
 
+import java.io.*;
 import java.util.*;
+import java.util.logging.*;
 
+import javax.servlet.*;
 import javax.servlet.http.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.dto.swagger.*;
 import org.apache.juneau.examples.addressbook.*;
+import org.apache.juneau.http.*;
+import org.apache.juneau.ini.*;
+import org.apache.juneau.internal.*;
 import org.apache.juneau.json.*;
+import org.apache.juneau.parser.*;
 import org.apache.juneau.plaintext.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.transforms.*;
 import org.apache.juneau.urlencoding.*;
+import org.apache.juneau.utils.*;
 
 /**
  * JUnit automated testcase resource.
@@ -36,7 +45,8 @@ import org.apache.juneau.urlencoding.*;
 	properties={
 		@Property(name=REST_allowMethodParam, value="*")
 	},
-	pojoSwaps={CalendarSwap.DateMedium.class}
+	pojoSwaps={CalendarSwap.DateMedium.class},
+	messages="ParamsResource"
 )
 public class ParamsResource extends RestServletDefault {
 	private static final long serialVersionUID = 1L;
@@ -292,4 +302,117 @@ public class ParamsResource extends RestServletDefault {
 	public DTO2s.C testFormPostsWithMultiParamsUsingAnnotation(@Body DTO2s.C content) throws Exception {
 		return content;
 	}
+
+	//====================================================================================================
+	// Test other available object types as parameters.
+	//====================================================================================================
+
+	@RestMethod(name="GET", path="/otherObjects/ResourceBundle")
+	public String testOtherResourceBundle(ResourceBundle t) {
+		if (t != null)
+			return t.getString("foo");
+		return null;
+	}
+
+	@RestMethod(name="GET", path="/otherObjects/MessageBundle")
+	public String testOtherMessages(MessageBundle t) {
+		if (t != null)
+			return t.getString("foo");
+		return null;
+	}
+
+	@RestMethod(name="POST", path="/otherObjects/InputStream")
+	public String testOtherInputStream(InputStream t) throws IOException {
+		return IOUtils.read(t);
+	}
+
+	@RestMethod(name="POST", path="/otherObjects/ServletInputStream")
+	public String testOtherServletInputStream(ServletInputStream t) throws IOException {
+		return IOUtils.read(t);
+	}
+
+	@RestMethod(name="POST", path="/otherObjects/Reader")
+	public String testOtherReader(Reader t) throws IOException {
+		return IOUtils.read(t);
+	}
+
+	@RestMethod(name="GET", path="/otherObjects/OutputStream")
+	public void testOtherOutputStream(OutputStream t) throws IOException {
+		t.write("OK".getBytes());
+	}
+
+	@RestMethod(name="GET", path="/otherObjects/ServletOutputStream")
+	public void testOtherServletOutputStream(ServletOutputStream t) throws IOException {
+		t.write("OK".getBytes());
+	}
+
+	@RestMethod(name="GET", path="/otherObjects/Writer")
+	public void testOtherWriter(Writer t) throws IOException {
+		t.write("OK");
+	}
+
+	@RestMethod(name="GET", path="/otherObjects/RequestHeaders")
+	public boolean testOtherRequestHeaders(RequestHeaders t) {
+		return t != null;
+	}
+
+	@RestMethod(name="GET", path="/otherObjects/RequestQuery")
+	public boolean testOtherRequestQueryParams(RequestQuery t) {
+		return t != null;
+	}
+
+	@RestMethod(name="GET", path="/otherObjects/RequestFormData")
+	public boolean testOtherRequestFormData(RequestFormData t) {
+		return t != null;
+	}
+
+	@RestMethod(name="GET", path="/otherObjects/HttpMethod")
+	public String testOtherHttpMethod(HttpMethod t) {
+		return t.toString();
+	}
+
+	@RestMethod(name="GET", path="/otherObjects/Logger")
+	public boolean testOtherLogger(Logger t) {
+		return t != null;
+	}
+
+	@RestMethod(name="GET", path="/otherObjects/JuneauLogger")
+	public boolean testOtherJuneauLogger(JuneauLogger t) {
+		return t != null;
+	}
+
+	@RestMethod(name="GET", path="/otherObjects/RestContext")
+	public boolean testOtherRestContext(RestContext t) {
+		return t != null;
+	}
+
+	@RestMethod(name="GET", path="/otherObjects/Parser")
+	public String testOtherParser(Parser t) {
+		return t.getClass().getName();
+	}
+
+	@RestMethod(name="GET", path="/otherObjects/Locale")
+	public String testOtherLocale(Locale t) {
+		return t.toString();
+	}
+
+	@RestMethod(name="GET", path="/otherObjects/Swagger")
+	public boolean testOtherSwagger(Swagger t) {
+		return t != null;
+	}
+
+	@RestMethod(name="GET", path="/otherObjects/RequestPathMatch")
+	public boolean testOtherRequestPathMatch(RequestPathMatch t) {
+		return t != null;
+	}
+
+	@RestMethod(name="GET", path="/otherObjects/RequestBody")
+	public boolean testOtherRequestBody(RequestBody t) {
+		return t != null;
+	}
+
+	@RestMethod(name="GET", path="/otherObjects/ConfigFile")
+	public boolean testOtherConfigFile(ConfigFile t) {
+		return t != null;
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b983a7f6/juneau-rest-test/src/main/resources/org/apache/juneau/rest/test/ParamsResource.properties
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/main/resources/org/apache/juneau/rest/test/ParamsResource.properties b/juneau-rest-test/src/main/resources/org/apache/juneau/rest/test/ParamsResource.properties
new file mode 100644
index 0000000..73add61
--- /dev/null
+++ b/juneau-rest-test/src/main/resources/org/apache/juneau/rest/test/ParamsResource.properties
@@ -0,0 +1,15 @@
+# ***************************************************************************************************************************
+# * 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.                                              *
+# *                                                                                                                         *
+# ***************************************************************************************************************************
+
+foo = bar
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b983a7f6/juneau-rest-test/src/main/resources/org/apache/juneau/rest/test/ParamsResource_ja_JP.properties
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/main/resources/org/apache/juneau/rest/test/ParamsResource_ja_JP.properties b/juneau-rest-test/src/main/resources/org/apache/juneau/rest/test/ParamsResource_ja_JP.properties
new file mode 100644
index 0000000..336741e
--- /dev/null
+++ b/juneau-rest-test/src/main/resources/org/apache/juneau/rest/test/ParamsResource_ja_JP.properties
@@ -0,0 +1,15 @@
+# ***************************************************************************************************************************
+# * 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.                                              *
+# *                                                                                                                         *
+# ***************************************************************************************************************************
+
+foo = baz
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b983a7f6/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/HeadersTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/HeadersTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/HeadersTest.java
index 1a96e47..a834210 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/HeadersTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/HeadersTest.java
@@ -19,6 +19,8 @@ import org.junit.*;
 
 public class HeadersTest extends RestTestcase {
 
+	RestClient client = TestMicroservice.DEFAULT_CLIENT;
+
 	private static String URL = "/testHeaders";
 
 	//====================================================================================================
@@ -26,9 +28,7 @@ public class HeadersTest extends RestTestcase {
 	//====================================================================================================
 
 	@Test
-	public void testAccept() throws Exception {
-		RestClient client = TestMicroservice.DEFAULT_CLIENT;
-
+	public void accept() throws Exception {
 		assertEquals("text/foo", client.doGet(URL + "/accept").accept("text/foo").getResponseAsString());
 		assertEquals("text/foo+bar", client.doGet(URL + "/accept").accept("text/foo+bar").getResponseAsString());
 		assertEquals("text/*", client.doGet(URL + "/accept").accept("text/*").getResponseAsString());
@@ -37,20 +37,177 @@ public class HeadersTest extends RestTestcase {
 		assertEquals("text/foo", client.doGet(URL + "/accept").accept("text/foo;q=1.0").getResponseAsString());
 		assertEquals("text/foo;q=0.9", client.doGet(URL + "/accept").accept("text/foo;q=0.9").getResponseAsString());
 		assertEquals("text/foo;x=X;q=0.9;y=Y", client.doGet(URL + "/accept").accept("text/foo;x=X;q=0.9;y=Y").getResponseAsString());
+
+		assertEquals("text/foo", client.doGet(URL + "/accept").query("Accept", "text/foo").getResponseAsString());
 	}
 
 	@Test
-	public void testAcceptEncoding() throws Exception {
-		RestClient client = TestMicroservice.DEFAULT_CLIENT;
+	public void acceptCharset() throws Exception {
+		assertEquals("UTF-8", client.doGet(URL + "/acceptCharset").acceptCharset("UTF-8").getResponseAsString());
+		assertEquals("UTF-8", client.doGet(URL + "/acceptCharset").query("Accept-Charset", "UTF-8").getResponseAsString());
+	}
+
+	@Test
+	public void acceptEncoding() throws Exception {
+		assertEquals("foo", client.doGet(URL + "/acceptEncoding").acceptEncoding("foo").getResponseAsString());
+		assertEquals("*", client.doGet(URL + "/acceptEncoding").acceptEncoding("*").getResponseAsString());
+		assertEquals("*", client.doGet(URL + "/acceptEncoding").query("Accept-Encoding", "*").getResponseAsString());
+	}
+
+	@Test
+	public void acceptLanguage() throws Exception {
+		assertEquals("foo", client.doGet(URL + "/acceptLanguage").acceptLanguage("foo").getResponseAsString());
+		assertEquals("foo", client.doGet(URL + "/acceptLanguage").query("Accept-Language", "foo").getResponseAsString());
+	}
+
+	@Test
+	public void authorization() throws Exception {
+		assertEquals("foo", client.doGet(URL + "/authorization").authorization("foo").getResponseAsString());
+		assertEquals("foo", client.doGet(URL + "/authorization").query("Authorization", "foo").getResponseAsString());
+	}
 
-		assertEquals("foo", client.doGet(URL + "/acceptEncoding").accept("text/plain").acceptEncoding("foo").getResponseAsString());
-		assertEquals("*", client.doGet(URL + "/acceptEncoding").accept("text/plain").acceptEncoding("*").getResponseAsString());
+	@Test
+	public void cacheControl() throws Exception {
+		assertEquals("foo", client.doGet(URL + "/cacheControl").cacheControl("foo").getResponseAsString());
+		assertEquals("foo", client.doGet(URL + "/cacheControl").query("Cache-Control", "foo").getResponseAsString());
 	}
 
 	@Test
-	public void testContentType() throws Exception {
+	public void connection() throws Exception {
+		assertEquals("foo", client.doGet(URL + "/connection").connection("foo").getResponseAsString());
+		assertEquals("foo", client.doGet(URL + "/connection").query("Connection", "foo").getResponseAsString());
+	}
+
+	@Test
+	public void contentLength() throws Exception {
+		assertEquals("0", client.doGet(URL + "/contentLength").contentLength(0).getResponseAsString());
+		assertEquals("0", client.doGet(URL + "/contentLength").query("Content-Length", 0).getResponseAsString());
+	}
+
+	@Test
+	public void contentType() throws Exception {
+		assertEquals("text/foo", client.doGet(URL + "/contentType").contentType("text/foo").getResponseAsString());
+		assertEquals("text/foo", client.doGet(URL + "/contentType").query("Content-Type", "text/foo").getResponseAsString());
+	}
+
+	@Test
+	public void date() throws Exception {
+		assertEquals("foo", client.doGet(URL + "/date").date("foo").getResponseAsString());
+		assertEquals("foo", client.doGet(URL + "/date").query("Date", "foo").getResponseAsString());
+	}
+
+	@Test
+	public void expect() throws Exception {
+		assertEquals("100-continue", client.doGet(URL + "/expect").expect("100-continue").getResponseAsString());
+		assertEquals("100-continue", client.doGet(URL + "/expect").query("Expect", "100-continue").getResponseAsString());
+	}
+
+	@Test
+	public void from() throws Exception {
+		assertEquals("foo", client.doGet(URL + "/from").from("foo").getResponseAsString());
+		assertEquals("foo", client.doGet(URL + "/from").query("From", "foo").getResponseAsString());
+	}
+
+	@Test
+	public void host() throws Exception {
+		assertTrue(client.doGet(URL + "/host").host("localhost").getResponseAsString().startsWith("localhost"));
+		assertTrue(client.doGet(URL + "/host").query("Host", "localhost").getResponseAsString().startsWith("localhost"));
+	}
+
+	@Test
+	public void ifMatch() throws Exception {
 		RestClient client = TestMicroservice.DEFAULT_CLIENT;
+		assertEquals("\"foo\"", client.doGet(URL + "/ifMatch").ifMatch("foo").getResponseAsString());
+		assertEquals("\"foo\"", client.doGet(URL + "/ifMatch").ifMatch("\"foo\"").getResponseAsString());
+		assertEquals("W/\"foo\"", client.doGet(URL + "/ifMatch").ifMatch("W/\"foo\"").getResponseAsString());
+		assertEquals("W/\"foo\", \"bar\"", client.doGet(URL + "/ifMatch").ifMatch("W/\"foo\",\"bar\"").getResponseAsString());
+		assertEquals("\"foo\"", client.doGet(URL + "/ifMatch").query("If-Match", "foo").getResponseAsString());
+	}
+
+	@Test
+	public void ifModifiedSince() throws Exception {
+		assertEquals("foo", client.doGet(URL + "/ifModifiedSince").ifModifiedSince("foo").getResponseAsString());
+		assertEquals("foo", client.doGet(URL + "/ifModifiedSince").query("If-Modified-Since", "foo").getResponseAsString());
+	}
+
+	@Test
+	public void ifNoneMatch() throws Exception {
+		assertEquals("\"foo\"", client.doGet(URL + "/ifNoneMatch").ifNoneMatch("foo").getResponseAsString());
+		assertEquals("\"foo\"", client.doGet(URL + "/ifNoneMatch").ifNoneMatch("\"foo\"").getResponseAsString());
+		assertEquals("W/\"foo\"", client.doGet(URL + "/ifNoneMatch").ifNoneMatch("W/\"foo\"").getResponseAsString());
+		assertEquals("W/\"foo\", \"bar\"", client.doGet(URL + "/ifNoneMatch").ifNoneMatch("W/\"foo\",\"bar\"").getResponseAsString());
+		assertEquals("\"foo\"", client.doGet(URL + "/ifNoneMatch").query("If-None-Match", "foo").getResponseAsString());
+	}
+
+	@Test
+	public void ifRange() throws Exception {
+		assertEquals("foo", client.doGet(URL + "/ifRange").ifRange("foo").getResponseAsString());
+		assertEquals("foo", client.doGet(URL + "/ifRange").query("If-Range", "foo").getResponseAsString());
+	}
+
+	@Test
+	public void ifUnmodifiedSince() throws Exception {
+		assertEquals("foo", client.doGet(URL + "/ifUnmodifiedSince").ifUnmodifiedSince("foo").getResponseAsString());
+		assertEquals("foo", client.doGet(URL + "/ifUnmodifiedSince").query("If-Unmodified-Since", "foo").getResponseAsString());
+	}
+
+	@Test
+	public void maxForwards() throws Exception {
+		assertEquals("123", client.doGet(URL + "/maxForwards").maxForwards(123).getResponseAsString());
+		assertEquals("123", client.doGet(URL + "/maxForwards").query("Max-Forwards", 123).getResponseAsString());
+	}
+
+	@Test
+	public void pragma() throws Exception {
+		assertEquals("foo", client.doGet(URL + "/pragma").pragma("foo").getResponseAsString());
+		assertEquals("foo", client.doGet(URL + "/pragma").query("Pragma", "foo").getResponseAsString());
+	}
+
+	@Test
+	public void proxyAuthorization() throws Exception {
+		assertEquals("foo", client.doGet(URL + "/proxyAuthorization").proxyAuthorization("foo").getResponseAsString());
+		assertEquals("foo", client.doGet(URL + "/proxyAuthorization").query("Proxy-Authorization", "foo").getResponseAsString());
+	}
 
-		assertEquals("text/foo", client.doGet(URL + "/contentType").accept("text/plain").contentType("text/foo").getResponseAsString());
+	@Test
+	public void range() throws Exception {
+		assertEquals("foo", client.doGet(URL + "/range").range("foo").getResponseAsString());
+		assertEquals("foo", client.doGet(URL + "/range").query("Range", "foo").getResponseAsString());
+	}
+
+	@Test
+	public void referer() throws Exception {
+		assertEquals("foo", client.doGet(URL + "/referer").referer("foo").getResponseAsString());
+		assertEquals("foo", client.doGet(URL + "/referer").query("Referer", "foo").getResponseAsString());
+	}
+
+	@Test
+	public void te() throws Exception {
+		assertEquals("foo", client.doGet(URL + "/te").te("foo").getResponseAsString());
+		assertEquals("foo", client.doGet(URL + "/te").query("TE", "foo").getResponseAsString());
+	}
+
+	@Test
+	public void upgrade() throws Exception {
+		assertEquals("foo", client.doGet(URL + "/upgrade").upgrade("foo").getResponseAsString());
+		assertEquals("foo", client.doGet(URL + "/upgrade").query("Upgrade", "foo").getResponseAsString());
+	}
+
+	@Test
+	public void userAgent() throws Exception {
+		assertEquals("foo", client.doGet(URL + "/userAgent").userAgent("foo").getResponseAsString());
+		assertEquals("foo", client.doGet(URL + "/userAgent").query("User-Agent", "foo").getResponseAsString());
+	}
+
+	@Test
+	public void warning() throws Exception {
+		assertEquals("foo", client.doGet(URL + "/warning").warning("foo").getResponseAsString());
+		assertEquals("foo", client.doGet(URL + "/warning").query("Warning", "foo").getResponseAsString());
+	}
+
+	@Test
+	public void customHeader() throws Exception {
+		assertEquals("foo", client.doGet(URL + "/customHeader").header("Custom", "foo").getResponseAsString());
+		assertEquals("foo", client.doGet(URL + "/customHeader").query("Custom", "foo").getResponseAsString());
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b983a7f6/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ParamsTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ParamsTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ParamsTest.java
index 77bc2c0..f59295d 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ParamsTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/ParamsTest.java
@@ -16,6 +16,7 @@ import static javax.servlet.http.HttpServletResponse.*;
 import static org.apache.juneau.rest.test.TestUtils.*;
 import static org.junit.Assert.*;
 
+import java.io.*;
 import java.util.*;
 
 import org.apache.http.*;
@@ -31,6 +32,8 @@ public class ParamsTest extends RestTestcase {
 	private static String URL = "/testParams";
 	private static boolean debug = false;
 
+	private static RestClient CLIENT = TestMicroservice.DEFAULT_CLIENT;
+
 	//====================================================================================================
 	// Basic tests
 	//====================================================================================================
@@ -712,4 +715,141 @@ public class ParamsTest extends RestTestcase {
 
 		client.closeQuietly();
 	}
+
+
+	//====================================================================================================
+	// Test other available object types as parameters.
+	//====================================================================================================
+
+	@Test
+	public void testOtherResourceBundle() throws Exception {
+		String r = CLIENT.doGet(URL + "/otherObjects/ResourceBundle").acceptLanguage("en-US").getResponseAsString();
+		assertEquals("\"bar\"", r);
+		r = CLIENT.doGet(URL + "/otherObjects/ResourceBundle").acceptLanguage("ja-JP").getResponseAsString();
+		assertEquals("\"baz\"", r);
+	}
+
+	@Test
+	public void testOtherMessages() throws Exception {
+		String r = CLIENT.doGet(URL + "/otherObjects/MessageBundle").acceptLanguage("en-US").getResponseAsString();
+		assertEquals("\"bar\"", r);
+		r = CLIENT.doGet(URL + "/otherObjects/MessageBundle").acceptLanguage("ja-JP").getResponseAsString();
+		assertEquals("\"baz\"", r);
+	}
+
+	@Test
+	public void testOtherInputStream() throws IOException {
+		String r = CLIENT.doPost(URL + "/otherObjects/InputStream").input(new StringReader("foo")).getResponseAsString();
+		assertEquals("\"foo\"", r);
+	}
+
+	@Test
+	public void testOtherServletInputStream() throws Exception {
+		String r = CLIENT.doPost(URL + "/otherObjects/ServletInputStream").input(new StringReader("foo")).getResponseAsString();
+		assertEquals("\"foo\"", r);
+	}
+
+	@Test
+	public void testOtherReader() throws Exception {
+		String r = CLIENT.doPost(URL + "/otherObjects/Reader").input(new StringReader("foo")).getResponseAsString();
+		assertEquals("\"foo\"", r);
+	}
+
+	@Test
+	public void testOtherOutputStream() throws Exception {
+		String r = CLIENT.doGet(URL + "/otherObjects/OutputStream").getResponseAsString();
+		assertEquals("OK", r);
+	}
+
+	@Test
+	public void testOtherServletOutputStream() throws Exception {
+		String r = CLIENT.doGet(URL + "/otherObjects/ServletOutputStream").getResponseAsString();
+		assertEquals("OK", r);
+	}
+
+	@Test
+	public void testOtherWriter() throws Exception {
+		String r = CLIENT.doGet(URL + "/otherObjects/Writer").getResponseAsString();
+		assertEquals("OK", r);
+	}
+
+	@Test
+	public void testOtherRequestHeaders() throws Exception {
+		String r = CLIENT.doGet(URL + "/otherObjects/RequestHeaders").getResponseAsString();
+		assertEquals("true", r);
+	}
+
+	@Test
+	public void testOtherRequestQuery() throws Exception {
+		String r = CLIENT.doGet(URL + "/otherObjects/RequestQuery").getResponseAsString();
+		assertEquals("true", r);
+	}
+
+	@Test
+	public void testOtherRequestFormData() throws Exception {
+		String r = CLIENT.doGet(URL + "/otherObjects/RequestFormData").getResponseAsString();
+		assertEquals("true", r);
+	}
+
+	@Test
+	public void testOtherHttpMethod() throws Exception {
+		String r = CLIENT.doGet(URL + "/otherObjects/HttpMethod").getResponseAsString();
+		assertEquals("\"GET\"", r);
+	}
+
+	@Test
+	public void testOtherLogger() throws Exception {
+		String r = CLIENT.doGet(URL + "/otherObjects/Logger").getResponseAsString();
+		assertEquals("true", r);
+	}
+
+	@Test
+	public void testOtherJuneauLogger() throws Exception {
+		String r = CLIENT.doGet(URL + "/otherObjects/JuneauLogger").getResponseAsString();
+		assertEquals("true", r);
+	}
+
+	@Test
+	public void testOtherRestContext() throws Exception {
+		String r = CLIENT.doGet(URL + "/otherObjects/RestContext").getResponseAsString();
+		assertEquals("true", r);
+	}
+
+	@Test
+	public void testOtherParser() throws Exception {
+		String r = CLIENT.doGet(URL + "/otherObjects/Parser").getResponseAsString();
+		assertEquals("\"org.apache.juneau.json.JsonParser\"", r);
+	}
+
+	@Test
+	public void testOtherLocale() throws Exception {
+		String r = CLIENT.doGet(URL + "/otherObjects/Locale").acceptLanguage("en-US").getResponseAsString();
+		assertEquals("\"en_US\"", r);
+		r = CLIENT.doGet(URL + "/otherObjects/Locale").acceptLanguage("ja-JP").getResponseAsString();
+		assertEquals("\"ja_JP\"", r);
+	}
+
+	@Test
+	public void testOtherSwagger() throws Exception {
+		String r = CLIENT.doGet(URL + "/otherObjects/Swagger").getResponseAsString();
+		assertEquals("true", r);
+	}
+
+	@Test
+	public void testOtherRequestPathMatch() throws Exception {
+		String r = CLIENT.doGet(URL + "/otherObjects/RequestPathMatch").getResponseAsString();
+		assertEquals("true", r);
+	}
+
+	@Test
+	public void testOtherRequestBody() throws Exception {
+		String r = CLIENT.doGet(URL + "/otherObjects/RequestBody").getResponseAsString();
+		assertEquals("true", r);
+	}
+
+	@Test
+	public void testOtherConfigFile() throws Exception {
+		String r = CLIENT.doGet(URL + "/otherObjects/ConfigFile").getResponseAsString();
+		assertEquals("true", r);
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b983a7f6/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/_TestSuite.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/_TestSuite.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/_TestSuite.java
index 985c115..dfb0c54 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/_TestSuite.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/_TestSuite.java
@@ -37,6 +37,7 @@ import org.junit.runners.Suite.*;
 	FormDataTest.class,
 	GroupsTest.class,
 	GzipTest.class,
+	HeadersTest.class,
 	InheritanceTest.class,
 	InterfaceProxyTest.class,
 	JacocoDummyTest.class,

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b983a7f6/juneau-rest/src/main/java/org/apache/juneau/rest/RestCallHandler.java
----------------------------------------------------------------------
diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestCallHandler.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RestCallHandler.java
index 676e9ae..99a051c 100644
--- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestCallHandler.java
+++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestCallHandler.java
@@ -176,6 +176,9 @@ public class RestCallHandler {
 
 			onSuccess(req, res, System.currentTimeMillis() - startTime);
 
+			// Make sure our writer in RestResponse gets written.
+			res.flushBuffer();
+
 		} catch (RestException e) {
 			handleError(r1, r2, e);
 		} catch (Throwable e) {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b983a7f6/juneau-rest/src/main/java/org/apache/juneau/rest/RestParamDefaults.java
----------------------------------------------------------------------
diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestParamDefaults.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RestParamDefaults.java
index 18d0e2f..d75e613 100644
--- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestParamDefaults.java
+++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestParamDefaults.java
@@ -96,7 +96,7 @@ class RestParamDefaults {
 			ServletOutputStreamObject.class,
 			WriterObject.class,
 			RequestHeadersObject.class,
-			RequestQueryParamsObject.class,
+			RequestQueryObject.class,
 			RequestFormDataObject.class,
 			HttpMethodObject.class,
 			LoggerObject.class,
@@ -105,7 +105,7 @@ class RestParamDefaults {
 			ParserObject.class,
 			LocaleObject.class,
 			SwaggerObject.class,
-			RequestPathParamsObject.class,
+			RequestPathMatchObject.class,
 			RequestBodyObject.class,
 			ConfigFileObject.class,
 		};
@@ -794,9 +794,9 @@ class RestParamDefaults {
 		}
 	}
 
-	static final class RequestQueryParamsObject extends RestParam {
+	static final class RequestQueryObject extends RestParam {
 
-		protected RequestQueryParamsObject() {
+		protected RequestQueryObject() {
 			super(OTHER, null, RequestQuery.class);
 		}
 
@@ -902,9 +902,9 @@ class RestParamDefaults {
 		}
 	}
 
-	static final class RequestPathParamsObject extends RestParam {
+	static final class RequestPathMatchObject extends RestParam {
 
-		protected RequestPathParamsObject() {
+		protected RequestPathMatchObject() {
 			super(OTHER, null, RequestPathMatch.class);
 		}
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b983a7f6/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java
----------------------------------------------------------------------
diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java
index 2bde785..524c8f3 100644
--- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java
+++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java
@@ -61,6 +61,7 @@ public final class RestResponse extends HttpServletResponseWrapper {
 	UrlEncodingSerializer urlEncodingSerializer;         // The serializer used to convert arguments passed into Redirect objects.
 	private EncoderGroup encoders;
 	private ServletOutputStream os;
+	private PrintWriter w;
 
 	/**
 	 * Constructor.
@@ -361,14 +362,17 @@ public final class RestResponse extends HttpServletResponseWrapper {
 	}
 
 	private PrintWriter getWriter(boolean raw) throws IOException {
+		if (w != null)
+			return w;
+
 		// If plain text requested, override it now.
-		if (request.isPlainText()) {
+		if (request.isPlainText()) 
 			setHeader("Content-Type", "text/plain");
-		}
 
 		try {
 			OutputStream out = (raw ? getOutputStream() : getNegotiatedOutputStream());
-			return new PrintWriter(new OutputStreamWriter(out, getCharacterEncoding()));
+			w = new PrintWriter(new OutputStreamWriter(out, getCharacterEncoding()));
+			return w;
 		} catch (UnsupportedEncodingException e) {
 			String ce = getCharacterEncoding();
 			setCharacterEncoding("UTF-8");
@@ -477,4 +481,13 @@ public final class RestResponse extends HttpServletResponseWrapper {
 		properties.put(HtmlDocSerializerContext.HTMLDOC_links, links);
 		return this;
 	}
+
+	@Override /* ServletResponse */
+	public void flushBuffer() throws IOException {
+		if (w != null)
+			w.flush();
+		if (os != null)
+			os.flush();
+		super.flushBuffer();
+	}
 }
\ No newline at end of file