View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.juneau.rest.client;
18  
19  import static org.apache.juneau.TestUtils.*;
20  import static org.apache.juneau.http.HttpEntities.*;
21  import static org.apache.juneau.http.HttpHeaders.*;
22  import static org.apache.juneau.http.HttpResources.*;
23  
24  import java.io.*;
25  
26  import org.apache.http.*;
27  import org.apache.juneau.*;
28  import org.apache.juneau.json.*;
29  import org.apache.juneau.rest.annotation.*;
30  import org.apache.juneau.rest.httppart.*;
31  import org.apache.juneau.rest.mock.*;
32  import org.apache.juneau.rest.servlet.*;
33  import org.apache.juneau.testutils.pojos.*;
34  import org.junit.jupiter.api.*;
35  
36  class RestClient_Body_Test extends TestBase {
37  
38  	@Rest
39  	public static class A extends BasicRestObject {
40  		@RestPost
41  		public Reader post(org.apache.juneau.rest.RestRequest req, org.apache.juneau.rest.RestResponse res) throws IOException {
42  			for (RequestHeader e : req.getHeaders())
43  				res.addHeader("X-" + e.getName(), e.getValue());
44  			return req.getReader();
45  		}
46  	}
47  
48  	//------------------------------------------------------------------------------------------------------------------
49  	// Method tests
50  	//------------------------------------------------------------------------------------------------------------------
51  
52  	@Test void a01_BasicHttpResource() throws Exception {
53  		var x1 = stringResource("foo");
54  		client().build().post("/", x1).run()
55  			.assertHeader("X-Content-Length").asInteger().is(3)
56  			.assertHeader("X-Content-Encoding").isNull()
57  			.assertHeader("X-Content-Type").isNull()
58  			.assertHeader("X-Transfer-Encoding").isNull()
59  		;
60  
61  		var x2 = stringResource("foo").setContentType("text/plain").setContentEncoding("identity");
62  		client().build().post("/",x2).run()
63  			.assertHeader("X-Content-Length").asInteger().is(3)
64  			.assertHeader("X-Content-Encoding").is("identity")
65  			.assertHeader("X-Content-Type").is("text/plain")
66  			.assertHeader("X-Transfer-Encoding").isNull()
67  		;
68  
69  		var x3 = stringResource("foo").setContentType(contentType("text/plain")).setContentEncoding(contentEncoding("identity")).setChunked();
70  		client().build().post("/",x3).run()
71  			.assertHeader("X-Content-Length").isNull()  // Missing when chunked.
72  			.assertHeader("X-Content-Encoding").is("identity")
73  			.assertHeader("X-Content-Type").is("text/plain")
74  			.assertHeader("X-Transfer-Encoding").is("chunked")
75  		;
76  
77  		var x4 = stringResource("foo", contentType("text/plain")).setContentEncoding("identity");
78  		client().build().post("/",x4).run()
79  			.assertHeader("X-Content-Length").asInteger().is(3)
80  			.assertHeader("X-Content-Encoding").is("identity")
81  			.assertHeader("X-Content-Type").is("text/plain")
82  			.assertHeader("X-Transfer-Encoding").isNull()
83  		;
84  
85  		var x5 = stringResource("foo").setHeader("Foo","bar").setHeaders(header("Baz","qux"));
86  		client().build().post("/",x5).run()
87  			.assertHeader("X-Foo").is("bar")
88  			.assertHeader("X-Baz").is("qux")
89  		;
90  
91  		var x6 = stringResource("foo").addHeaders(header("Foo","bar"),header("Baz","qux"));
92  		client().build().post("/",x6).run()
93  			.assertHeader("X-Foo").is("bar")
94  			.assertHeader("X-Baz").is("qux")
95  		;
96  
97  		var x7 = readerResource(reader("foo"));
98  		client().build().post("/",x7).run().assertContent("foo");
99  
100 		var x8 = readerResource(reader("foo")).setCached();
101 		client().build().post("/",x8).run().assertContent("foo");
102 		client().build().post("/",x8).run().assertContent("foo");
103 	}
104 
105 	@Test void a02_StringEntity() throws Exception {
106 		var x1 = stringEntity("foo");
107 		client().build().post("/", x1).run()
108 			.assertHeader("X-Content-Length").asInteger().is(3)
109 			.assertHeader("X-Content-Encoding").isNull()
110 			.assertHeader("X-Content-Type").isNull()
111 			.assertHeader("X-Transfer-Encoding").isNull()
112 		;
113 
114 		var x2 = stringEntity("foo").setContentType("text/plain").setContentEncoding("identity");
115 		client().build().post("/",x2).run()
116 			.assertHeader("X-Content-Length").asInteger().is(3)
117 			.assertHeader("X-Content-Encoding").is("identity")
118 			.assertHeader("X-Content-Type").is("text/plain")
119 			.assertHeader("X-Transfer-Encoding").isNull()
120 		;
121 
122 		var x3 = stringEntity("foo").setContentType(contentType("text/plain")).setContentEncoding(contentEncoding("identity")).setChunked();
123 		client().build().post("/",x3).run()
124 			.assertHeader("X-Content-Length").isNull()  // Missing when chunked.
125 			.assertHeader("X-Content-Encoding").is("identity")
126 			.assertHeader("X-Content-Type").is("text/plain")
127 			.assertHeader("X-Transfer-Encoding").is("chunked")
128 		;
129 
130 		var x4 = stringEntity("foo", contentType("text/plain")).setContentEncoding("identity");
131 		client().build().post("/",x4).run()
132 			.assertHeader("X-Content-Length").asInteger().is(3)
133 			.assertHeader("X-Content-Encoding").is("identity")
134 			.assertHeader("X-Content-Type").is("text/plain")
135 			.assertHeader("X-Transfer-Encoding").isNull()
136 		;
137 
138 		var x7 = readerEntity(reader("foo"));
139 		client().build().post("/",x7).run().assertContent("foo");
140 
141 		var x8 = readerEntity(reader("foo")).setCached();
142 		client().build().post("/",x8).run().assertContent("foo");
143 		client().build().post("/",x8).run().assertContent("foo");
144 
145 		var x12 = stringEntity("foo");
146 		x12.assertString().is("foo");
147 		x12.assertBytes().asString().is("foo");
148 	}
149 
150 	@Test void a03_SerializedHttpEntity() throws Exception {
151 		var js = JsonSerializer.DEFAULT;
152 
153 		var x1 = serializedEntity(ABean.get(),null,null);
154 		client().build().post("/",x1).run()
155 			.assertHeader("X-Content-Length").isNull()
156 			.assertHeader("X-Content-Encoding").isNull()
157 			.assertHeader("X-Content-Type").is("application/json5")
158 			.assertHeader("X-Transfer-Encoding").is("chunked")  // Because content length is -1.
159 		;
160 
161 		var x2 = serializedEntity(ABean.get(),js,null);
162 		client().build().post("/",x2).run()
163 			.assertHeader("X-Content-Length").isNull()
164 			.assertHeader("X-Content-Encoding").isNull()
165 			.assertHeader("X-Content-Type").is("application/json")
166 			.assertContent().as(ABean.class).asJson().is("{a:1,b:'foo'}");
167 
168 		var x3 = serializedEntity(ABean::get,js,null);
169 		client().build().post("/",x3).run()
170 			.assertHeader("X-Content-Length").isNull()
171 			.assertHeader("X-Content-Encoding").isNull()
172 			.assertHeader("X-Content-Type").is("application/json")
173 			.assertContent().as(ABean.class).asJson().is("{a:1,b:'foo'}");
174 	}
175 
176 	//------------------------------------------------------------------------------------------------------------------
177 	// Helper methods.
178 	//------------------------------------------------------------------------------------------------------------------
179 
180 	private static RestClient.Builder client() {
181 		return MockRestClient.create(A.class).json5();
182 	}
183 
184 	private static Header header(String name, Object val) {
185 		return basicHeader(name, val);
186 	}
187 }