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.core5.http.support;
29  
30  import static org.hamcrest.MatcherAssert.assertThat;
31  import static org.junit.jupiter.api.Assertions.assertEquals;
32  
33  import org.apache.hc.core5.http.HeaderMatcher;
34  import org.apache.hc.core5.http.HeadersMatcher;
35  import org.apache.hc.core5.http.HttpRequest;
36  import org.apache.hc.core5.http.HttpResponse;
37  import org.apache.hc.core5.http.HttpVersion;
38  import org.apache.hc.core5.http.Method;
39  import org.apache.hc.core5.http.message.BasicHeader;
40  import org.apache.hc.core5.http.message.BasicHttpRequest;
41  import org.apache.hc.core5.http.message.BasicHttpResponse;
42  import org.apache.hc.core5.http.message.BasicNameValuePair;
43  import org.apache.hc.core5.net.URIAuthority;
44  import org.junit.jupiter.api.Assertions;
45  import org.junit.jupiter.api.Test;
46  
47  import java.net.URI;
48  import java.nio.charset.StandardCharsets;
49  import java.util.Arrays;
50  
51  /**
52   * Simple tests for {@link BasicResponseBuilder} and {@link BasicRequestBuilder}.
53   */
54  public class TestBasicMessageBuilders {
55  
56      @Test
57      public void testResponseBasics() throws Exception {
58          final BasicResponseBuilder builder = BasicResponseBuilder.create(200);
59          Assertions.assertEquals(200, builder.getStatus());
60          Assertions.assertNull(builder.getHeaders());
61          Assertions.assertNull(builder.getVersion());
62  
63          final BasicHttpResponse r1 = builder.build();
64          Assertions.assertNotNull(r1);
65          Assertions.assertEquals(200, r1.getCode());
66          Assertions.assertNull(r1.getVersion());
67  
68          builder.setStatus(500);
69          builder.setVersion(HttpVersion.HTTP_1_0);
70          Assertions.assertEquals(500, builder.getStatus());
71          Assertions.assertEquals(HttpVersion.HTTP_1_0, builder.getVersion());
72  
73          final BasicHttpResponse r2 = builder.build();
74          Assertions.assertEquals(500, r2.getCode());
75          Assertions.assertEquals(HttpVersion.HTTP_1_0, r2.getVersion());
76  
77          builder.addHeader("h1", "v1");
78          builder.addHeader("h1", "v2");
79          builder.addHeader("h2", "v2");
80          assertThat(builder.getHeaders(), HeadersMatcher.same(
81                  new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2"), new BasicHeader("h2", "v2")));
82          assertThat(builder.getHeaders("h1"), HeadersMatcher.same(
83                  new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2")));
84          assertThat(builder.getFirstHeader("h1"), HeaderMatcher.same("h1", "v1"));
85          assertThat(builder.getLastHeader("h1"), HeaderMatcher.same("h1", "v2"));
86  
87          final BasicHttpResponse r3 = builder.build();
88          assertThat(r3.getHeaders(), HeadersMatcher.same(
89                  new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2"), new BasicHeader("h2", "v2")));
90          assertThat(r3.getHeaders("h1"), HeadersMatcher.same(
91                  new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2")));
92          assertThat(r3.getFirstHeader("h1"), HeaderMatcher.same("h1", "v1"));
93          assertThat(r3.getLastHeader("h1"), HeaderMatcher.same("h1", "v2"));
94  
95          builder.removeHeader(new BasicHeader("h1", "v2"));
96          assertThat(builder.getHeaders("h1"), HeadersMatcher.same(new BasicHeader("h1", "v1")));
97          assertThat(builder.getHeaders(), HeadersMatcher.same(
98                  new BasicHeader("h1", "v1"), new BasicHeader("h2", "v2")));
99  
100         final BasicHttpResponse r4 = builder.build();
101         assertThat(r4.getHeaders("h1"), HeadersMatcher.same(new BasicHeader("h1", "v1")));
102         assertThat(r4.getHeaders(), HeadersMatcher.same(
103                 new BasicHeader("h1", "v1"), new BasicHeader("h2", "v2")));
104 
105         builder.removeHeaders("h1");
106         assertThat(builder.getHeaders("h1"), HeadersMatcher.same());
107         assertThat(builder.getHeaders(), HeadersMatcher.same(new BasicHeader("h2", "v2")));
108 
109         final BasicHttpResponse r5 = builder.build();
110         assertThat(r5.getHeaders("h1"), HeadersMatcher.same());
111         assertThat(r5.getHeaders(), HeadersMatcher.same(new BasicHeader("h2", "v2")));
112     }
113 
114     @Test
115     public void testRequestBasics() throws Exception {
116         final BasicRequestBuilder builder = BasicRequestBuilder.get();
117         Assertions.assertEquals(URI.create("/"), builder.getUri());
118         Assertions.assertEquals("GET", builder.getMethod());
119         Assertions.assertNull(builder.getScheme());
120         Assertions.assertNull(builder.getAuthority());
121         Assertions.assertNull(builder.getPath());
122         Assertions.assertNull(builder.getHeaders());
123         Assertions.assertNull(builder.getVersion());
124         Assertions.assertNull(builder.getCharset());
125         Assertions.assertNull(builder.getParameters());
126 
127         final BasicHttpRequest r1 = builder.build();
128         Assertions.assertNotNull(r1);
129         Assertions.assertEquals("GET", r1.getMethod());
130         Assertions.assertNull(r1.getScheme());
131         Assertions.assertNull(r1.getAuthority());
132         Assertions.assertNull(r1.getPath());
133         Assertions.assertEquals(URI.create("/"), r1.getUri());
134         Assertions.assertNull(r1.getVersion());
135 
136         builder.setUri(URI.create("http://host:1234/blah?param=value"));
137         builder.setVersion(HttpVersion.HTTP_1_1);
138         Assertions.assertEquals("http", builder.getScheme());
139         Assertions.assertEquals(new URIAuthority("host", 1234), builder.getAuthority());
140         Assertions.assertEquals("/blah?param=value", builder.getPath());
141         Assertions.assertEquals(URI.create("http://host:1234/blah?param=value"), builder.getUri());
142         Assertions.assertEquals(HttpVersion.HTTP_1_1, builder.getVersion());
143 
144         final BasicHttpRequest r2 = builder.build();
145         Assertions.assertEquals("GET", r2.getMethod());
146         Assertions.assertEquals("http", r2.getScheme());
147         Assertions.assertEquals(new URIAuthority("host", 1234), r2.getAuthority());
148         Assertions.assertEquals("/blah?param=value", r2.getPath());
149         Assertions.assertEquals(URI.create("http://host:1234/blah?param=value"), r2.getUri());
150         Assertions.assertEquals(HttpVersion.HTTP_1_1, builder.getVersion());
151 
152         builder.setCharset(StandardCharsets.US_ASCII);
153         builder.addParameter("param1", "value1");
154         builder.addParameter("param2", null);
155         builder.addParameters(new BasicNameValuePair("param3", "value3"), new BasicNameValuePair("param4", null));
156 
157         Assertions.assertEquals(builder.getParameters(), Arrays.asList(
158                 new BasicNameValuePair("param1", "value1"), new BasicNameValuePair("param2", null),
159                 new BasicNameValuePair("param3", "value3"), new BasicNameValuePair("param4", null)
160         ));
161         Assertions.assertEquals(URI.create("http://host:1234/blah?param=value"), builder.getUri());
162 
163         final BasicHttpRequest r3 = builder.build();
164         Assertions.assertEquals("GET", r3.getMethod());
165         Assertions.assertEquals("http", r3.getScheme());
166         Assertions.assertEquals(new URIAuthority("host", 1234), r3.getAuthority());
167         Assertions.assertEquals("/blah?param=value&param1=value1&param2&param3=value3&param4", r3.getPath());
168         Assertions.assertEquals(URI.create("http://host:1234/blah?param=value&param1=value1&param2&param3=value3&param4"),
169                 r3.getUri());
170 
171         builder.addHeader("h1", "v1");
172         builder.addHeader("h1", "v2");
173         builder.addHeader("h2", "v2");
174         assertThat(builder.getHeaders(), HeadersMatcher.same(
175                 new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2"), new BasicHeader("h2", "v2")));
176         assertThat(builder.getHeaders("h1"), HeadersMatcher.same(
177                 new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2")));
178         assertThat(builder.getFirstHeader("h1"), HeaderMatcher.same("h1", "v1"));
179         assertThat(builder.getLastHeader("h1"), HeaderMatcher.same("h1", "v2"));
180 
181         final BasicHttpRequest r4 = builder.build();
182         assertThat(r4.getHeaders(), HeadersMatcher.same(
183                 new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2"), new BasicHeader("h2", "v2")));
184         assertThat(r4.getHeaders("h1"), HeadersMatcher.same(
185                 new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2")));
186         assertThat(r4.getFirstHeader("h1"), HeaderMatcher.same("h1", "v1"));
187         assertThat(r4.getLastHeader("h1"), HeaderMatcher.same("h1", "v2"));
188 
189         builder.removeHeader(new BasicHeader("h1", "v2"));
190         assertThat(builder.getHeaders("h1"), HeadersMatcher.same(new BasicHeader("h1", "v1")));
191         assertThat(builder.getHeaders(), HeadersMatcher.same(
192                 new BasicHeader("h1", "v1"), new BasicHeader("h2", "v2")));
193 
194         final BasicHttpRequest r5 = builder.build();
195         assertThat(r5.getHeaders("h1"), HeadersMatcher.same(new BasicHeader("h1", "v1")));
196         assertThat(r5.getHeaders(), HeadersMatcher.same(
197                 new BasicHeader("h1", "v1"), new BasicHeader("h2", "v2")));
198 
199         builder.removeHeaders("h1");
200         assertThat(builder.getHeaders("h1"), HeadersMatcher.same());
201         assertThat(builder.getHeaders(), HeadersMatcher.same(new BasicHeader("h2", "v2")));
202 
203         final BasicHttpRequest r6 = builder.build();
204         assertThat(r6.getHeaders("h1"), HeadersMatcher.same());
205         assertThat(r6.getHeaders(), HeadersMatcher.same(new BasicHeader("h2", "v2")));
206     }
207 
208     @Test
209     public void testResponseCopy() throws Exception {
210         final HttpResponse response = new BasicHttpResponse(400);
211         response.addHeader("h1", "v1");
212         response.addHeader("h1", "v2");
213         response.addHeader("h2", "v2");
214         response.setVersion(HttpVersion.HTTP_2);
215 
216         final BasicResponseBuilder builder = BasicResponseBuilder.copy(response);
217         Assertions.assertEquals(400, builder.getStatus());
218         Assertions.assertEquals(HttpVersion.HTTP_2, builder.getVersion());
219         assertThat(builder.getHeaders(), HeadersMatcher.same(
220                 new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2"), new BasicHeader("h2", "v2")));
221     }
222 
223     @Test
224     public void testRequestCopy() throws Exception {
225         final HttpRequest request = new BasicHttpRequest(Method.GET, URI.create("https://host:3456/stuff?blah")) ;
226         request.addHeader("h1", "v1");
227         request.addHeader("h1", "v2");
228         request.addHeader("h2", "v2");
229         request.setVersion(HttpVersion.HTTP_2);
230 
231         final BasicRequestBuilder builder = BasicRequestBuilder.copy(request);
232         Assertions.assertEquals("GET", builder.getMethod());
233         Assertions.assertEquals("https", builder.getScheme());
234         Assertions.assertEquals(new URIAuthority("host", 3456), builder.getAuthority());
235         Assertions.assertEquals("/stuff?blah", builder.getPath());
236         Assertions.assertEquals(HttpVersion.HTTP_2, builder.getVersion());
237         assertThat(builder.getHeaders(), HeadersMatcher.same(
238                 new BasicHeader("h1", "v1"), new BasicHeader("h1", "v2"), new BasicHeader("h2", "v2")));
239     }
240 
241     @Test
242     void testIDNIntegration() {
243         final String url = "http://müller.example.com:8080/path";
244         final HttpRequest request = new BasicHttpRequest(Method.GET, URI.create(url));
245         assertEquals(new URIAuthority("xn--mller-kva.example.com",8080), request.getAuthority());
246     }
247 
248 }