View Javadoc
1   /*
2    * ====================================================================
3    * Licensed to the Apache Software Foundation (ASF) under one
4    * or more contributor license agreements.  See the NOTICE file
5    * distributed with this work for additional information
6    * regarding copyright ownership.  The ASF licenses this file
7    * to you under the Apache License, Version 2.0 (the
8    * "License"); you may not use this file except in compliance
9    * with the License.  You may obtain a copy of the License at
10   *
11   *   http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing,
14   * software distributed under the License is distributed on an
15   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16   * KIND, either express or implied.  See the License for the
17   * specific language governing permissions and limitations
18   * under the License.
19   * ====================================================================
20   *
21   * This software consists of voluntary contributions made by many
22   * individuals on behalf of the Apache Software Foundation.  For more
23   * information on the Apache Software Foundation, please see
24   * <http://www.apache.org/>.
25   *
26   */
27  
28  package org.apache.hc.client5.http.async.methods;
29  
30  import java.net.URI;
31  import java.nio.charset.StandardCharsets;
32  import java.util.Arrays;
33  
34  import org.apache.hc.client5.http.ContentTypeMatcher;
35  import org.apache.hc.client5.http.HeaderMatcher;
36  import org.apache.hc.client5.http.HeadersMatcher;
37  import org.apache.hc.client5.http.NameValuePairsMatcher;
38  import org.apache.hc.core5.http.ContentType;
39  import org.apache.hc.core5.http.HttpVersion;
40  import org.apache.hc.core5.http.Method;
41  import org.apache.hc.core5.http.message.BasicHeader;
42  import org.apache.hc.core5.http.message.BasicNameValuePair;
43  import org.apache.hc.core5.net.URIAuthority;
44  import org.hamcrest.CoreMatchers;
45  import org.hamcrest.MatcherAssert;
46  import org.junit.Assert;
47  import org.junit.Test;
48  
49  /**
50   * Simple tests for {@link SimpleResponseBuilder} and {@link SimpleRequestBuilder}.
51   */
52  public class TestSimpleMessageBuilders {
53  
54      @Test
55      public void testResponseBasics() throws Exception {
56          final SimpleResponseBuilder builder = SimpleResponseBuilder.create(200);
57          Assert.assertEquals(200, builder.getStatus());
58          Assert.assertNull(builder.getHeaders());
59          Assert.assertNull(builder.getVersion());
60  
61          final SimpleHttpResponse r1 = builder.build();
62          Assert.assertNotNull(r1);
63          Assert.assertEquals(200, r1.getCode());
64          Assert.assertNull(r1.getVersion());
65  
66          builder.setStatus(500);
67          builder.setVersion(HttpVersion.HTTP_1_0);
68          Assert.assertEquals(500, builder.getStatus());
69          Assert.assertEquals(HttpVersion.HTTP_1_0, builder.getVersion());
70  
71          final SimpleHttpResponse r2 = builder.build();
72          Assert.assertEquals(500, r2.getCode());
73          Assert.assertEquals(HttpVersion.HTTP_1_0, r2.getVersion());
74  
75          builder.addHeader("h1", "v1");
76          builder.addHeader("h1", "v2");
77          builder.addHeader("h2", "v2");
78          MatcherAssert.assertThat(builder.getHeaders(), HeadersMatcher.same(
79                  new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2"), new BasicHeader("h2", "v2")));
80          MatcherAssert.assertThat(builder.getHeaders("h1"), HeadersMatcher.same(
81                  new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2")));
82          MatcherAssert.assertThat(builder.getFirstHeader("h1"), HeaderMatcher.same("h1", "v1"));
83          MatcherAssert.assertThat(builder.getLastHeader("h1"), HeaderMatcher.same("h1", "v2"));
84  
85          final SimpleHttpResponse r3 = builder.build();
86          MatcherAssert.assertThat(r3.getHeaders(), HeadersMatcher.same(
87                  new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2"), new BasicHeader("h2", "v2")));
88          MatcherAssert.assertThat(r3.getHeaders("h1"), HeadersMatcher.same(
89                  new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2")));
90          MatcherAssert.assertThat(r3.getFirstHeader("h1"), HeaderMatcher.same("h1", "v1"));
91          MatcherAssert.assertThat(r3.getLastHeader("h1"), HeaderMatcher.same("h1", "v2"));
92  
93          builder.removeHeader(new BasicHeader("h1", "v2"));
94          MatcherAssert.assertThat(builder.getHeaders("h1"), HeadersMatcher.same(new BasicHeader("h1", "v1")));
95          MatcherAssert.assertThat(builder.getHeaders(), HeadersMatcher.same(
96                  new BasicHeader("h1", "v1"), new BasicHeader("h2", "v2")));
97  
98          final SimpleHttpResponse r4 = builder.build();
99          MatcherAssert.assertThat(r4.getHeaders("h1"), HeadersMatcher.same(new BasicHeader("h1", "v1")));
100         MatcherAssert.assertThat(r4.getHeaders(), HeadersMatcher.same(
101                 new BasicHeader("h1", "v1"), new BasicHeader("h2", "v2")));
102 
103         builder.removeHeaders("h1");
104         MatcherAssert.assertThat(builder.getHeaders("h1"), HeadersMatcher.same());
105         MatcherAssert.assertThat(builder.getHeaders(), HeadersMatcher.same(new BasicHeader("h2", "v2")));
106 
107         final SimpleHttpResponse r5 = builder.build();
108         MatcherAssert.assertThat(r5.getHeaders("h1"), HeadersMatcher.same());
109         MatcherAssert.assertThat(r5.getHeaders(), HeadersMatcher.same(new BasicHeader("h2", "v2")));
110     }
111 
112     @Test
113     public void testRequestBasics() throws Exception {
114         final SimpleRequestBuilder builder = SimpleRequestBuilder.get();
115         Assert.assertEquals(URI.create("/"), builder.getUri());
116         Assert.assertEquals("GET", builder.getMethod());
117         Assert.assertNull(builder.getScheme());
118         Assert.assertNull(builder.getAuthority());
119         Assert.assertNull(builder.getPath());
120         Assert.assertNull(builder.getHeaders());
121         Assert.assertNull(builder.getVersion());
122         Assert.assertNull(builder.getCharset());
123         Assert.assertNull(builder.getParameters());
124 
125         final SimpleHttpRequest r1 = builder.build();
126         Assert.assertNotNull(r1);
127         Assert.assertEquals("GET", r1.getMethod());
128         Assert.assertNull(r1.getScheme());
129         Assert.assertNull(r1.getAuthority());
130         Assert.assertNull(r1.getPath());
131         Assert.assertEquals(URI.create("/"), r1.getUri());
132         Assert.assertNull(r1.getVersion());
133 
134         builder.setUri(URI.create("http://host:1234/blah?param=value"));
135         builder.setVersion(HttpVersion.HTTP_1_1);
136         Assert.assertEquals("http", builder.getScheme());
137         Assert.assertEquals(new URIAuthority("host", 1234), builder.getAuthority());
138         Assert.assertEquals("/blah?param=value", builder.getPath());
139         Assert.assertEquals(URI.create("http://host:1234/blah?param=value"), builder.getUri());
140         Assert.assertEquals(HttpVersion.HTTP_1_1, builder.getVersion());
141 
142         final SimpleHttpRequest r2 = builder.build();
143         Assert.assertEquals("GET", r2.getMethod());
144         Assert.assertEquals("http", r2.getScheme());
145         Assert.assertEquals(new URIAuthority("host", 1234), r2.getAuthority());
146         Assert.assertEquals("/blah?param=value", r2.getPath());
147         Assert.assertEquals(URI.create("http://host:1234/blah?param=value"), r2.getUri());
148         Assert.assertEquals(HttpVersion.HTTP_1_1, builder.getVersion());
149 
150         builder.setCharset(StandardCharsets.US_ASCII);
151         builder.addParameter("param1", "value1");
152         builder.addParameter("param2", null);
153         builder.addParameters(new BasicNameValuePair("param3", "value3"), new BasicNameValuePair("param4", null));
154 
155         Assert.assertEquals(builder.getParameters(), Arrays.asList(
156                 new BasicNameValuePair("param1", "value1"), new BasicNameValuePair("param2", null),
157                 new BasicNameValuePair("param3", "value3"), new BasicNameValuePair("param4", null)
158         ));
159         Assert.assertEquals(URI.create("http://host:1234/blah?param=value"), builder.getUri());
160 
161         final SimpleHttpRequest r3 = builder.build();
162         Assert.assertEquals("GET", r3.getMethod());
163         Assert.assertEquals("http", r3.getScheme());
164         Assert.assertEquals(new URIAuthority("host", 1234), r3.getAuthority());
165         Assert.assertEquals("/blah?param=value&param1=value1&param2&param3=value3&param4", r3.getPath());
166         Assert.assertEquals(URI.create("http://host:1234/blah?param=value&param1=value1&param2&param3=value3&param4"),
167                 r3.getUri());
168 
169         builder.addHeader("h1", "v1");
170         builder.addHeader("h1", "v2");
171         builder.addHeader("h2", "v2");
172         MatcherAssert.assertThat(builder.getHeaders(), HeadersMatcher.same(
173                 new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2"), new BasicHeader("h2", "v2")));
174         MatcherAssert.assertThat(builder.getHeaders("h1"), HeadersMatcher.same(
175                 new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2")));
176         MatcherAssert.assertThat(builder.getFirstHeader("h1"), HeaderMatcher.same("h1", "v1"));
177         MatcherAssert.assertThat(builder.getLastHeader("h1"), HeaderMatcher.same("h1", "v2"));
178 
179         final SimpleHttpRequest r4 = builder.build();
180         MatcherAssert.assertThat(r4.getHeaders(), HeadersMatcher.same(
181                 new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2"), new BasicHeader("h2", "v2")));
182         MatcherAssert.assertThat(r4.getHeaders("h1"), HeadersMatcher.same(
183                 new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2")));
184         MatcherAssert.assertThat(r4.getFirstHeader("h1"), HeaderMatcher.same("h1", "v1"));
185         MatcherAssert.assertThat(r4.getLastHeader("h1"), HeaderMatcher.same("h1", "v2"));
186 
187         builder.removeHeader(new BasicHeader("h1", "v2"));
188         MatcherAssert.assertThat(builder.getHeaders("h1"), HeadersMatcher.same(new BasicHeader("h1", "v1")));
189         MatcherAssert.assertThat(builder.getHeaders(), HeadersMatcher.same(
190                 new BasicHeader("h1", "v1"), new BasicHeader("h2", "v2")));
191 
192         final SimpleHttpRequest r5 = builder.build();
193         MatcherAssert.assertThat(r5.getHeaders("h1"), HeadersMatcher.same(new BasicHeader("h1", "v1")));
194         MatcherAssert.assertThat(r5.getHeaders(), HeadersMatcher.same(
195                 new BasicHeader("h1", "v1"), new BasicHeader("h2", "v2")));
196 
197         builder.removeHeaders("h1");
198         MatcherAssert.assertThat(builder.getHeaders("h1"), HeadersMatcher.same());
199         MatcherAssert.assertThat(builder.getHeaders(), HeadersMatcher.same(new BasicHeader("h2", "v2")));
200 
201         final SimpleHttpRequest r6 = builder.build();
202         MatcherAssert.assertThat(r6.getHeaders("h1"), HeadersMatcher.same());
203         MatcherAssert.assertThat(r6.getHeaders(), HeadersMatcher.same(new BasicHeader("h2", "v2")));
204     }
205 
206     @Test
207     public void testResponseCopy() throws Exception {
208         final SimpleHttpResponse response = SimpleHttpResponse.create(400);
209         response.addHeader("h1", "v1");
210         response.addHeader("h1", "v2");
211         response.addHeader("h2", "v2");
212         response.setVersion(HttpVersion.HTTP_2);
213 
214         final SimpleResponseBuilder builder = SimpleResponseBuilder.copy(response);
215         Assert.assertEquals(400, builder.getStatus());
216         Assert.assertEquals(HttpVersion.HTTP_2, builder.getVersion());
217         MatcherAssert.assertThat(builder.getHeaders(), HeadersMatcher.same(
218                 new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2"), new BasicHeader("h2", "v2")));
219     }
220 
221     @Test
222     public void testRequestCopy() throws Exception {
223         final SimpleHttpRequest request = SimpleHttpRequest.create(Method.GET, URI.create("https://host:3456/stuff?blah")) ;
224         request.addHeader("h1", "v1");
225         request.addHeader("h1", "v2");
226         request.addHeader("h2", "v2");
227         request.setVersion(HttpVersion.HTTP_2);
228 
229         final SimpleRequestBuilder builder = SimpleRequestBuilder.copy(request);
230         Assert.assertEquals("GET", builder.getMethod());
231         Assert.assertEquals("https", builder.getScheme());
232         Assert.assertEquals(new URIAuthority("host", 3456), builder.getAuthority());
233         Assert.assertEquals("/stuff?blah", builder.getPath());
234         Assert.assertEquals(HttpVersion.HTTP_2, builder.getVersion());
235         MatcherAssert.assertThat(builder.getHeaders(), HeadersMatcher.same(
236                 new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2"), new BasicHeader("h2", "v2")));
237     }
238 
239     @Test
240     public void testGetParameters() throws Exception {
241         final SimpleRequestBuilder builder = SimpleRequestBuilder.get(URI.create("https://host:3456/stuff?p0=p0"));
242         builder.addParameter("p1", "v1");
243         builder.addParameters(new BasicNameValuePair("p2", "v2"), new BasicNameValuePair("p3", "v3"));
244         builder.addParameter(new BasicNameValuePair("p3", "v3.1"));
245         Assert.assertEquals("GET", builder.getMethod());
246         Assert.assertEquals("https", builder.getScheme());
247         Assert.assertEquals(new URIAuthority("host", 3456), builder.getAuthority());
248         Assert.assertEquals("/stuff?p0=p0", builder.getPath());
249         MatcherAssert.assertThat(builder.getParameters(), NameValuePairsMatcher.same(
250                 new BasicNameValuePair("p1", "v1"), new BasicNameValuePair("p2", "v2"),
251                 new BasicNameValuePair("p3", "v3"), new BasicNameValuePair("p3", "v3.1")));
252         final SimpleHttpRequest request = builder.build();
253         MatcherAssert.assertThat(request.getPath(), CoreMatchers.equalTo("/stuff?p0=p0&p1=v1&p2=v2&p3=v3&p3=v3.1"));
254         Assert.assertNull(request.getBody());
255     }
256 
257     @Test
258     public void testPostParameters() throws Exception {
259         final SimpleRequestBuilder builder = SimpleRequestBuilder.post(URI.create("https://host:3456/stuff?p0=p0"));
260         builder.addParameter("p1", "v1");
261         builder.addParameters(new BasicNameValuePair("p2", "v2"), new BasicNameValuePair("p3", "v3"));
262         builder.addParameter(new BasicNameValuePair("p3", "v3.1"));
263         Assert.assertEquals("POST", builder.getMethod());
264         Assert.assertEquals("https", builder.getScheme());
265         Assert.assertEquals(new URIAuthority("host", 3456), builder.getAuthority());
266         Assert.assertEquals("/stuff?p0=p0", builder.getPath());
267         MatcherAssert.assertThat(builder.getParameters(), NameValuePairsMatcher.same(
268                 new BasicNameValuePair("p1", "v1"), new BasicNameValuePair("p2", "v2"),
269                 new BasicNameValuePair("p3", "v3"), new BasicNameValuePair("p3", "v3.1")));
270         final SimpleHttpRequest request = builder.build();
271         MatcherAssert.assertThat(request.getPath(), CoreMatchers.equalTo("/stuff?p0=p0"));
272         Assert.assertNotNull(request.getBody());
273         MatcherAssert.assertThat(request.getBody().getContentType(),
274                 ContentTypeMatcher.sameMimeType(ContentType.APPLICATION_FORM_URLENCODED));
275         MatcherAssert.assertThat(request.getBody().getBodyText(),
276                 CoreMatchers.equalTo("p1=v1&p2=v2&p3=v3&p3=v3.1"));
277     }
278 
279 }