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
30
31
32 package org.apache.commons.httpclient;
33
34 import java.io.IOException;
35 import java.net.InetAddress;
36 import java.net.Socket;
37 import java.net.UnknownHostException;
38
39 import junit.framework.Test;
40 import junit.framework.TestSuite;
41
42 import org.apache.commons.httpclient.methods.GetMethod;
43 import org.apache.commons.httpclient.params.HttpConnectionParams;
44 import org.apache.commons.httpclient.protocol.Protocol;
45 import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
46 import org.apache.commons.httpclient.server.HttpService;
47 import org.apache.commons.httpclient.server.RequestLine;
48 import org.apache.commons.httpclient.server.SimpleRequest;
49 import org.apache.commons.httpclient.server.SimpleResponse;
50
51 /***
52 * HTTP protocol versioning tests.
53 *
54 * @author Oleg Kalnichevski
55 *
56 * @version $Revision$
57 */
58 public class TestVirtualHost extends HttpClientTestBase {
59
60
61 public TestVirtualHost(final String testName) throws IOException {
62 super(testName);
63 }
64
65
66 public static void main(String args[]) {
67 String[] testCaseName = { TestVirtualHost.class.getName() };
68 junit.textui.TestRunner.main(testCaseName);
69 }
70
71
72
73 public static Test suite() {
74 return new TestSuite(TestVirtualHost.class);
75 }
76
77 private class VirtualService implements HttpService {
78
79 public VirtualService() {
80 super();
81 }
82
83 public boolean process(final SimpleRequest request, final SimpleResponse response)
84 throws IOException
85 {
86 HttpVersion httpversion = request.getRequestLine().getHttpVersion();
87 Header hostheader = request.getFirstHeader("Host");
88 if (hostheader == null) {
89 response.setStatusLine(httpversion, HttpStatus.SC_BAD_REQUEST);
90 response.setBodyString("Host header missing");
91 } else {
92 response.setStatusLine(httpversion, HttpStatus.SC_OK);
93 response.setBodyString(hostheader.getValue());
94 }
95 return true;
96 }
97 }
98
99 public void testVirtualHostHeader() throws IOException {
100 this.server.setHttpService(new VirtualService());
101
102 GetMethod httpget = new GetMethod("/test/");
103
104 HostConfiguration hostconf = new HostConfiguration();
105 hostconf.setHost(this.server.getLocalAddress(), this.server.getLocalPort(), "http");
106 hostconf.getParams().setVirtualHost("somehost");
107 try {
108 this.client.executeMethod(hostconf, httpget);
109 String hostheader = "somehost:" + this.server.getLocalPort();
110 assertEquals(hostheader, httpget.getResponseBodyAsString());
111 } finally {
112 httpget.releaseConnection();
113 }
114 }
115
116 public void testNoVirtualHostHeader() throws IOException {
117 this.server.setHttpService(new VirtualService());
118
119 GetMethod httpget = new GetMethod("/test/");
120
121 HostConfiguration hostconf = new HostConfiguration();
122 hostconf.setHost(this.server.getLocalAddress(), this.server.getLocalPort(), "http");
123 hostconf.getParams().setVirtualHost(null);
124 try {
125 this.client.executeMethod(hostconf, httpget);
126 String hostheader = this.server.getLocalAddress() + ":" + this.server.getLocalPort();
127 assertEquals(hostheader, httpget.getResponseBodyAsString());
128 } finally {
129 httpget.releaseConnection();
130 }
131 }
132
133 private class VirtualHostService implements HttpService {
134
135 public VirtualHostService() {
136 super();
137 }
138
139 public boolean process(final SimpleRequest request, final SimpleResponse response)
140 throws IOException {
141 RequestLine reqline = request.getRequestLine();
142 HttpVersion ver = reqline.getHttpVersion();
143 Header header = request.getFirstHeader("Host");
144 if (header == null) {
145 response.setStatusLine(ver, HttpStatus.SC_BAD_REQUEST);
146 return true;
147 }
148 String host = header.getValue();
149 if (host.equalsIgnoreCase("whatever.com")) {
150 response.setStatusLine(ver, HttpStatus.SC_MOVED_TEMPORARILY);
151 response.setHeader(new Header("Location", "testhttp://www.whatever.com/"));
152 return true;
153 } else if (host.equalsIgnoreCase("www.whatever.com")) {
154 response.setStatusLine(ver, HttpStatus.SC_MOVED_TEMPORARILY);
155 response.setHeader(new Header("Location", "testhttp://www.whatever.co.nz/"));
156 return true;
157 } else if (host.equalsIgnoreCase("www.whatever.co.nz")) {
158 response.setStatusLine(ver, HttpStatus.SC_OK);
159 return true;
160 } else {
161 response.setStatusLine(ver, HttpStatus.SC_NOT_FOUND);
162 return true;
163 }
164 }
165 }
166
167 private class VirtualSocketFactory implements ProtocolSocketFactory {
168
169 private final String hostname;
170 private final int port;
171
172 public VirtualSocketFactory(final String hostname, int port) {
173 super();
174 this.hostname = hostname;
175 this.port = port;
176 }
177
178 public Socket createSocket(
179 final String host,
180 int port,
181 final InetAddress localAddress,
182 int localPort,
183 final HttpConnectionParams params) throws IOException, UnknownHostException, ConnectTimeoutException {
184 return new Socket(this.hostname, this.port);
185 }
186
187 public Socket createSocket(String host, int port, InetAddress localAddress, int localPort) throws IOException, UnknownHostException {
188 return new Socket(this.hostname, this.port);
189 }
190
191 public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
192 return new Socket(this.hostname, this.port);
193 }
194
195 }
196
197 public void testRedirectWithVirtualHost() throws IOException {
198 String host = this.server.getLocalAddress();
199 int port = this.server.getLocalPort();
200
201 Protocol testhttp = new Protocol("http", new VirtualSocketFactory(host, port), port);
202 Protocol.registerProtocol("testhttp", testhttp);
203 try {
204 this.server.setHttpService(new VirtualHostService());
205 this.client.getHostConfiguration().setHost(host, port, "testhttp");
206 this.client.getHostConfiguration().getParams().setVirtualHost("whatever.com");
207 GetMethod httpget = new GetMethod("/");
208 httpget.setFollowRedirects(true);
209 try {
210 this.client.executeMethod(httpget);
211 assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
212 assertEquals("http://www.whatever.co.nz/", httpget.getURI().toString());
213 } finally {
214 httpget.releaseConnection();
215 }
216 } finally {
217 Protocol.unregisterProtocol("testhttp");
218 }
219
220 }
221
222 }