1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 package org.apache.commons.httpclient;
30
31 import java.io.IOException;
32 import java.io.InputStreamReader;
33 import java.io.Reader;
34
35 import org.apache.commons.httpclient.methods.GetMethod;
36 import org.apache.commons.httpclient.server.HttpService;
37 import org.apache.commons.httpclient.server.SimpleRequest;
38 import org.apache.commons.httpclient.server.SimpleResponse;
39
40 import junit.framework.Test;
41 import junit.framework.TestSuite;
42
43 /***
44 * Tests basic method functionality.
45 *
46 * @author Remy Maucherat
47 * @author Rodney Waldhoff
48 * @author Oleg Kalnichevski
49 *
50 * @version $Id: TestHttpMethodFundamentals.java 608014 2008-01-02 05:48:53Z rolandw $
51 */
52 public class TestHttpMethodFundamentals extends HttpClientTestBase {
53
54 public TestHttpMethodFundamentals(final String testName) throws IOException {
55 super(testName);
56 }
57
58 public static Test suite() {
59 TestSuite suite = new TestSuite(TestHttpMethodFundamentals.class);
60 ProxyTestDecorator.addTests(suite);
61 return suite;
62 }
63
64 public static void main(String args[]) {
65 String[] testCaseName = { TestHttpMethodFundamentals.class.getName() };
66 junit.textui.TestRunner.main(testCaseName);
67 }
68
69 class ManyAService implements HttpService {
70
71 public ManyAService() {
72 super();
73 }
74
75 public boolean process(final SimpleRequest request, final SimpleResponse response)
76 throws IOException
77 {
78 HttpVersion httpversion = request.getRequestLine().getHttpVersion();
79 response.setStatusLine(httpversion, HttpStatus.SC_OK);
80 response.addHeader(new Header("Content-Type", "text/plain"));
81 response.addHeader(new Header("Connection", "close"));
82 StringBuffer buffer = new StringBuffer(1024);
83 for (int i = 0; i < 1024; i++) {
84 buffer.append('A');
85 }
86 response.setBodyString(buffer.toString());
87 return true;
88 }
89 }
90
91 class SimpleChunkedService implements HttpService {
92
93 public SimpleChunkedService() {
94 super();
95 }
96
97 public boolean process(final SimpleRequest request, final SimpleResponse response)
98 throws IOException
99 {
100 HttpVersion httpversion = request.getRequestLine().getHttpVersion();
101 response.setStatusLine(httpversion, HttpStatus.SC_OK);
102 response.addHeader(new Header("Content-Type", "text/plain"));
103 response.addHeader(new Header("Content-Length", "garbage"));
104 response.addHeader(new Header("Transfer-Encoding", "chunked"));
105 response.addHeader(new Header("Connection", "close"));
106 response.setBodyString("1234567890123");
107 return true;
108 }
109 }
110
111 class EmptyResponseService implements HttpService {
112
113 public EmptyResponseService() {
114 super();
115 }
116
117 public boolean process(final SimpleRequest request, final SimpleResponse response)
118 throws IOException
119 {
120 HttpVersion httpversion = request.getRequestLine().getHttpVersion();
121 response.setStatusLine(httpversion, HttpStatus.SC_OK);
122 response.addHeader(new Header("Content-Type", "text/plain"));
123 response.addHeader(new Header("Transfer-Encoding", "chunked"));
124 response.addHeader(new Header("Connection", "close"));
125 return true;
126 }
127 }
128
129 public void testHttpMethodBasePaths() throws Exception {
130 HttpMethod simple = new FakeHttpMethod();
131 String[] paths = {
132 "/some/absolute/path",
133 "../some/relative/path",
134 "/",
135 "/some/path/with?query=string"
136 };
137
138 for (int i=0; i<paths.length; i++){
139 simple.setPath(paths[i]);
140 assertEquals(paths[i], simple.getPath());
141 }
142 }
143
144 public void testHttpMethodBaseDefaultPath() throws Exception {
145 HttpMethod simple = new FakeHttpMethod();
146 assertEquals("/", simple.getPath());
147
148 simple.setPath("");
149 assertEquals("/", simple.getPath());
150
151 simple.setPath(null);
152 assertEquals("/", simple.getPath());
153 }
154
155 public void testHttpMethodBasePathConstructor() throws Exception {
156 HttpMethod simple = new FakeHttpMethod();
157 assertEquals("/", simple.getPath());
158
159 simple = new FakeHttpMethod("");
160 assertEquals("/", simple.getPath());
161
162 simple = new FakeHttpMethod("/some/path/");
163 assertEquals("/some/path/", simple.getPath());
164 }
165
166 /***
167 * Tests response with a Trasfer-Encoding and Content-Length
168 */
169 public void testHttpMethodBaseTEandCL() throws Exception {
170 this.server.setHttpService(new SimpleChunkedService());
171
172 GetMethod httpget = new GetMethod("/test/");
173 try {
174 this.client.executeMethod(httpget);
175 assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
176 assertEquals("1234567890123", httpget.getResponseBodyAsString());
177 assertTrue(this.client.getHttpConnectionManager() instanceof SimpleHttpConnectionManager);
178 HttpConnection conn = this.client.getHttpConnectionManager().
179 getConnection(this.client.getHostConfiguration());
180 assertNotNull(conn);
181 conn.assertNotOpen();
182 } finally {
183 httpget.releaseConnection();
184 }
185 }
186
187 public void testConnectionAutoClose() throws Exception {
188 this.server.setHttpService(new ManyAService());
189
190 GetMethod httpget = new GetMethod("/test/");
191 try {
192 this.client.executeMethod(httpget);
193 assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
194 Reader response = new InputStreamReader(httpget.getResponseBodyAsStream());
195 int c;
196 while ((c = response.read()) != -1) {
197 assertEquals((int) 'A', c);
198 }
199 assertTrue(this.client.getHttpConnectionManager() instanceof SimpleHttpConnectionManager);
200 HttpConnection conn = this.client.getHttpConnectionManager().
201 getConnection(this.client.getHostConfiguration());
202 assertNotNull(conn);
203 conn.assertNotOpen();
204 } finally {
205 httpget.releaseConnection();
206 }
207 }
208
209 public void testSetGetQueryString1() {
210 HttpMethod method = new GetMethod();
211 String qs1 = "name1=value1&name2=value2";
212 method.setQueryString(qs1);
213 assertEquals(qs1, method.getQueryString());
214 }
215
216 public void testQueryURIEncoding() {
217 HttpMethod method = new GetMethod("http://server/servlet?foo=bar&baz=schmoo");
218 assertEquals("foo=bar&baz=schmoo", method.getQueryString());
219 }
220
221 public void testSetGetQueryString2() {
222 HttpMethod method = new GetMethod();
223 NameValuePair[] q1 = new NameValuePair[] {
224 new NameValuePair("name1", "value1"),
225 new NameValuePair("name2", "value2")
226 };
227 method.setQueryString(q1);
228 String qs1 = "name1=value1&name2=value2";
229 assertEquals(qs1, method.getQueryString());
230 }
231
232 /***
233 * Make sure that its OK to call releaseConnection if the connection has not been.
234 */
235 public void testReleaseConnection() {
236 HttpMethod method = new GetMethod("http://bogus.url/path/");
237 method.releaseConnection();
238 }
239
240 /***
241 * Tests empty body response
242 */
243 public void testEmptyBodyAsString() throws Exception {
244 this.server.setHttpService(new EmptyResponseService());
245
246 GetMethod httpget = new GetMethod("/test/");
247 try {
248 this.client.executeMethod(httpget);
249 assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
250 String response = httpget.getResponseBodyAsString();
251 assertNull(response);
252
253 this.client.executeMethod(httpget);
254 assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
255 response = httpget.getResponseBodyAsString(1);
256 assertNull(response);
257 } finally {
258 httpget.releaseConnection();
259 }
260 }
261
262
263 public void testEmptyBodyAsByteArray() throws Exception {
264 this.server.setHttpService(new EmptyResponseService());
265
266 GetMethod httpget = new GetMethod("/test/");
267 try {
268 this.client.executeMethod(httpget);
269 assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
270 byte[] response = httpget.getResponseBody();
271 assertNull(response);
272 } finally {
273 httpget.releaseConnection();
274 }
275 }
276
277 public void testLongBodyAsString() throws Exception {
278 this.server.setHttpService(new SimpleChunkedService());
279
280 GetMethod httpget = new GetMethod("/test/");
281 try {
282 this.client.executeMethod(httpget);
283 assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
284 try {
285 httpget.getResponseBodyAsString(5);
286 } catch(HttpContentTooLargeException e) {
287
288 assertEquals(5, e.getMaxLength());
289 }
290
291 this.client.executeMethod(httpget);
292 assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
293 String response = httpget.getResponseBodyAsString(13);
294 assertEquals("1234567890123", response);
295
296 this.client.executeMethod(httpget);
297 assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
298 response = httpget.getResponseBodyAsString(128);
299 assertEquals("1234567890123", response);
300 } finally {
301 httpget.releaseConnection();
302 }
303 }
304
305 public void testUrlGetMethodWithPathQuery() {
306 GetMethod method = new GetMethod("http://www.fubar.com/path1/path2?query=string");
307 try {
308 assertEquals(
309 "Get URL",
310 "http://www.fubar.com/path1/path2?query=string",
311 method.getURI().toString()
312 );
313 } catch ( URIException e ) {
314 fail( "trouble getting URI: " + e );
315 }
316 assertEquals("Get Path", "/path1/path2", method.getPath());
317 assertEquals("Get query string", "query=string", method.getQueryString());
318
319 }
320
321 public void testUrlGetMethodWithPath() {
322 GetMethod method = new GetMethod("http://www.fubar.com/path1/path2");
323 try {
324 assertEquals(
325 "Get URL",
326 "http://www.fubar.com/path1/path2",
327 method.getURI().toString()
328 );
329 } catch ( URIException e ) {
330 fail( "trouble getting URI: " + e );
331 }
332 assertEquals("Get Path", "/path1/path2", method.getPath());
333 assertEquals("Get query string", null, method.getQueryString());
334 }
335
336 public void testUrlGetMethod() {
337 GetMethod method = new GetMethod("http://www.fubar.com/");
338 try {
339 assertEquals(
340 "Get URL",
341 "http://www.fubar.com/",
342 method.getURI().toString()
343 );
344 } catch ( URIException e ) {
345 fail( "trouble getting URI: " + e );
346 }
347 assertEquals("Get Path", "/", method.getPath());
348 assertEquals("Get query string", null, method.getQueryString());
349
350 }
351
352
353 public void testUrlGetMethodWithInvalidProtocol() {
354 try {
355 GetMethod method = new GetMethod("crap://www.fubar.com/");
356 fail("The use of invalid protocol must have resulted in an IllegalStateException");
357 }
358 catch(IllegalStateException expected) {
359 }
360 }
361 }