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.net.UnknownHostException;
33
34 import junit.framework.Test;
35 import junit.framework.TestSuite;
36
37 import org.apache.commons.httpclient.methods.GetMethod;
38 import org.apache.commons.httpclient.protocol.Protocol;
39 import org.apache.commons.httpclient.server.SimpleProxy;
40
41 /***
42 * Tests basic HostConfiguration functionality.
43 *
44 * @author Oleg Kalnichevski
45 *
46 * @version $Id: TestHostConfiguration.java 509577 2007-02-20 14:28:18Z rolandw $
47 */
48 public class TestHostConfiguration extends HttpClientTestBase {
49
50 public TestHostConfiguration(final String testName) throws IOException {
51 super(testName);
52 }
53
54 public static Test suite() {
55 return new TestSuite(TestHostConfiguration.class);
56 }
57
58 public static void main(String args[]) {
59 String[] testCaseName = { TestHostConfiguration.class.getName() };
60 junit.textui.TestRunner.main(testCaseName);
61 }
62
63 public void testRelativeURLHitWithDefaultHost() throws IOException {
64 this.server.setHttpService(new EchoService());
65
66 this.client.getHostConfiguration().setHost(
67 this.server.getLocalAddress(),
68 this.server.getLocalPort(),
69 Protocol.getProtocol("http"));
70
71 GetMethod httpget = new GetMethod("/test/");
72 try {
73 this.client.executeMethod(httpget);
74 assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
75 } finally {
76 httpget.releaseConnection();
77 }
78 }
79
80 public void testRelativeURLHitWithoutDefaultHost() throws IOException {
81 this.server.setHttpService(new EchoService());
82
83 this.client.setHostConfiguration(new HostConfiguration());
84
85 GetMethod httpget = new GetMethod("/test/");
86 try {
87 this.client.executeMethod(httpget);
88 fail("IllegalArgumentException should have been thrown");
89 } catch (IllegalArgumentException expected) {
90 } finally {
91 httpget.releaseConnection();
92 }
93 }
94
95 public void testAbsoluteURLHitWithoutDefaultHost() throws IOException {
96 this.server.setHttpService(new EchoService());
97
98 this.client.setHostConfiguration(new HostConfiguration());
99
100 GetMethod httpget = new GetMethod("http://" +
101 this.server.getLocalAddress() + ":" + this.server.getLocalPort() + "/test/");
102 try {
103 this.client.executeMethod(httpget);
104 assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
105 } finally {
106 httpget.releaseConnection();
107 }
108 }
109
110 public void testAbsoluteURLOverridesClientDefaultHost() throws IOException {
111 this.server.setHttpService(new EchoService());
112
113 this.client.getHostConfiguration().setHost("somewhere.outthere.in.pampa", 9999);
114
115 GetMethod httpget = new GetMethod("http://" +
116 this.server.getLocalAddress() + ":" + this.server.getLocalPort() + "/test/");
117 try {
118 this.client.executeMethod(httpget);
119 assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
120 } finally {
121 httpget.releaseConnection();
122 }
123 httpget = new GetMethod("/test/");
124 try {
125 this.client.executeMethod(httpget);
126 fail("UnknownHostException should have been thrown");
127 } catch (UnknownHostException expected) {
128 } finally {
129 httpget.releaseConnection();
130 }
131 }
132
133 public void testAbsoluteURLOverridesDefaultHostParam() throws IOException {
134
135 this.proxy = new SimpleProxy();
136
137 this.server.setHttpService(new EchoService());
138
139 HostConfiguration hostconfig = new HostConfiguration();
140 hostconfig.setHost("somehwere.outthere.in.pampa", 9999);
141 hostconfig.setProxy(
142 this.proxy.getLocalAddress(),
143 this.proxy.getLocalPort());
144
145 GetMethod httpget = new GetMethod("http://" +
146 this.server.getLocalAddress() + ":" + this.server.getLocalPort() + "/test/");
147 try {
148 this.client.executeMethod(hostconfig, httpget);
149 assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
150 assertNotNull(httpget.getResponseHeader("Via"));
151 } finally {
152 httpget.releaseConnection();
153 }
154 httpget = new GetMethod("/test/");
155 try {
156 this.client.executeMethod(hostconfig, httpget);
157 assertEquals(HttpStatus.SC_NOT_FOUND, httpget.getStatusCode());
158 } finally {
159 httpget.releaseConnection();
160 }
161 }
162
163 /***
164 * Test that HttpClient uses HostConfiguration.clone (not the copy
165 * constructor) to copy its default HostConfiguration when preparing to
166 * execute a method. This behavior is required to support specialized
167 * Protocols; for example, HostConfigurationWithStickyProtocol.
168 *
169 * @see org.apache.commons.httpclient.contrib.ssl.HostConfigurationWithStickyProtocol
170 */
171 public void testClientClonesHostConfiguration() throws IOException {
172 this.server.setHttpService(new EchoService());
173 SpecialHostConfiguration configuration = new SpecialHostConfiguration(this.client
174 .getHostConfiguration());
175 configuration.setHost(this.server.getLocalAddress(), this.server.getLocalPort(),
176 new String(HttpURL.DEFAULT_SCHEME));
177 this.client.setHostConfiguration(configuration);
178
179 HttpMethod method = new GetMethod(configuration.getHostURL() + "/test/");
180 try {
181 this.client.executeMethod(method);
182 fail("HostConfiguration wasn't cloned");
183 } catch (ExpectedError e) {
184 assertNotSame("ExpectedError.configuration", configuration, e.configuration);
185 } finally {
186 method.releaseConnection();
187 }
188
189 method = new GetMethod("/test/");
190 try {
191 this.client.executeMethod(method);
192 fail("HostConfiguration wasn't cloned");
193 } catch (ExpectedError e) {
194 assertNotSame("ExpectedError.configuration", configuration, e.configuration);
195 } finally {
196 method.releaseConnection();
197 }
198 }
199
200 /*** A HostConfiguration that refuses to provide a protocol. */
201 private class SpecialHostConfiguration extends HostConfiguration
202 {
203 SpecialHostConfiguration(HostConfiguration hostConfiguration)
204 {
205 super(hostConfiguration);
206 }
207
208 public Object clone()
209 {
210 return new SpecialHostConfiguration(this);
211 }
212
213 public synchronized Protocol getProtocol()
214 {
215 throw new ExpectedError(this);
216 }
217 }
218
219 private class ExpectedError extends Error
220 {
221 ExpectedError(SpecialHostConfiguration c)
222 {
223 configuration = c;
224 }
225
226 SpecialHostConfiguration configuration;
227
228 private static final long serialVersionUID = 1L;
229
230 }
231
232 }