blob: 8aef8a1f59b9c7ebfa126e1572e65dd3058a1ae1 [file] [log] [blame]
michaelm23db53c2013-05-15 15:01:59 +01001/*
2 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24import java.net.HttpURLPermission;
25/*
26 * Run the tests once without security manager and once with
27 *
28 * @test
29 * @bug 8010464
30 * @compile ../../../com/sun/net/httpserver/SimpleSSLContext.java
31 * @run main/othervm/policy=policy.1 URLTest one
32 * @run main/othervm URLTest one
33 * @run main/othervm/policy=policy.2 URLTest two
34 * @run main/othervm URLTest two
35 * @run main/othervm/policy=policy.3 URLTest three
36 * @run main/othervm URLTest three
37 */
38
39import java.net.*;
40import java.io.*;
41import java.util.*;
42import java.util.concurrent.*;
43import java.util.logging.*;
44import com.sun.net.httpserver.*;
45import javax.net.ssl.*;
46
47public class URLTest {
48 static boolean failed = false;
49
50 public static void main (String[] args) throws Exception {
51 boolean no = false, yes = true;
52
53 if (System.getSecurityManager() == null) {
54 yes = false;
55 }
56 createServers();
57 InetSocketAddress addr1 = httpServer.getAddress();
58 int port1 = addr1.getPort();
59 InetSocketAddress addr2 = httpsServer.getAddress();
60 int port2 = addr2.getPort();
61
62 // each of the following cases is run with a different policy file
63
64 switch (args[0]) {
65 case "one":
66 String url1 = "http://127.0.0.1:"+ port1 + "/foo.html";
67 String url2 = "https://127.0.0.1:"+ port2 + "/foo.html";
68 String url3 = "http://127.0.0.1:"+ port1 + "/bar.html";
69 String url4 = "https://127.0.0.1:"+ port2 + "/bar.html";
70
71 // simple positive test. Should succceed
72 test(url1, "GET", "X-Foo", no);
73 test(url1, "GET", "Z-Bar", "X-Foo", no);
74 test(url1, "GET", "X-Foo", "Z-Bar", no);
75 test(url1, "GET", "Z-Bar", no);
76 test(url2, "POST", "X-Fob", no);
77
78 // reverse the methods, should fail
79 test(url1, "POST", "X-Foo", yes);
80 test(url2, "GET", "X-Fob", yes);
81
82 // different URLs, should fail
83 test(url3, "GET", "X-Foo", yes);
84 test(url4, "POST", "X-Fob", yes);
85 break;
86
87 case "two":
88 url1 = "http://127.0.0.1:"+ port1 + "/foo.html";
89 url2 = "https://127.0.0.1:"+ port2 + "/foo.html";
90 url3 = "http://127.0.0.1:"+ port1 + "/bar.html";
91 url4 = "https://127.0.0.1:"+ port2 + "/bar.html";
92
93 // simple positive test. Should succceed
94 test(url1, "GET", "X-Foo", no);
95 test(url2, "POST", "X-Fob", no);
96 test(url3, "GET", "X-Foo", no);
97 test(url4, "POST", "X-Fob", no);
98 break;
99
100 case "three":
101 url1 = "http://127.0.0.1:"+ port1 + "/foo.html";
102 url2 = "https://127.0.0.1:"+ port2 + "/a/c/d/e/foo.html";
103 url3 = "http://127.0.0.1:"+ port1 + "/a/b/c";
104 url4 = "https://127.0.0.1:"+ port2 + "/a/b/c";
105
106 test(url1, "GET", "X-Foo", yes);
107 test(url2, "POST", "X-Zxc", no);
108 test(url3, "DELETE", "Y-Foo", no);
109 test(url4, "POST", "Y-Foo", yes);
110 break;
111 }
112 shutdown();
113 if (failed) {
114 throw new RuntimeException("Test failed");
115 }
116 }
117
118 public static void test (
119 String u, String method,
120 String header, boolean exceptionExpected
121 )
122 throws Exception
123 {
124 test(u, method, header, null, exceptionExpected);
125 }
126
127 public static void test (
128 String u, String method,
129 String header1, String header2, boolean exceptionExpected
130 )
131 throws Exception
132 {
133 URL url = new URL(u);
134 System.out.println ("url=" + u + " method="+method + " header1="+header1
135 +" header2 = " + header2
136 +" exceptionExpected="+exceptionExpected);
137 HttpURLConnection urlc = (HttpURLConnection)url.openConnection();
138 if (urlc instanceof HttpsURLConnection) {
139 HttpsURLConnection ssl = (HttpsURLConnection)urlc;
140 ssl.setHostnameVerifier(new HostnameVerifier() {
141 public boolean verify(String host, SSLSession sess) {
142 return true;
143 }
144 });
145 ssl.setSSLSocketFactory (ctx.getSocketFactory());
146 }
147 urlc.setRequestMethod(method);
148 if (header1 != null) {
149 urlc.addRequestProperty(header1, "foo");
150 }
151 if (header2 != null) {
152 urlc.addRequestProperty(header2, "bar");
153 }
154 try {
155 int g = urlc.getResponseCode();
156 if (exceptionExpected) {
157 failed = true;
158 System.out.println ("FAIL");
159 return;
160 }
161 if (g != 200) {
162 String s = Integer.toString(g);
163 throw new RuntimeException("unexpected response "+ s);
164 }
165 InputStream is = urlc.getInputStream();
166 int c,count=0;
167 byte[] buf = new byte[1024];
168 while ((c=is.read(buf)) != -1) {
169 count += c;
170 }
171 is.close();
172 } catch (RuntimeException e) {
173 if (! (e instanceof SecurityException) &&
174 !(e.getCause() instanceof SecurityException) ||
175 !exceptionExpected)
176 {
177 System.out.println ("FAIL");
178 //e.printStackTrace();
179 failed = true;
180 }
181 }
182 System.out.println ("OK");
183 }
184
185 static HttpServer httpServer;
186 static HttpsServer httpsServer;
187 static HttpContext c, cs;
188 static ExecutorService e, es;
189 static SSLContext ctx;
190
191 // These ports need to be hard-coded until we support port number
192 // ranges in the permission class
193
194 static final int PORT1 = 12567;
195 static final int PORT2 = 12568;
196
197 static void createServers() throws Exception {
198 InetSocketAddress addr1 = new InetSocketAddress (PORT1);
199 InetSocketAddress addr2 = new InetSocketAddress (PORT2);
200 httpServer = HttpServer.create (addr1, 0);
201 httpsServer = HttpsServer.create (addr2, 0);
202
203 MyHandler h = new MyHandler();
204
205 c = httpServer.createContext ("/", h);
206 cs = httpsServer.createContext ("/", h);
207 e = Executors.newCachedThreadPool();
208 es = Executors.newCachedThreadPool();
209 httpServer.setExecutor (e);
210 httpsServer.setExecutor (es);
211
212 // take the keystore from elsewhere in test hierarchy
213 String keysdir = System.getProperty("test.src")
214 + "/../../../com/sun/net/httpserver/";
215 ctx = new SimpleSSLContext(keysdir).get();
216 httpsServer.setHttpsConfigurator(new HttpsConfigurator (ctx));
217
218 httpServer.start();
219 httpsServer.start();
220 }
221
222 static void shutdown() {
223 httpServer.stop(1);
224 httpsServer.stop(1);
225 e.shutdown();
226 es.shutdown();
227 }
228
229 static class MyHandler implements HttpHandler {
230
231 MyHandler() {
232 }
233
234 public void handle(HttpExchange x) throws IOException {
235 x.sendResponseHeaders(200, -1);
236 x.close();
237 }
238 }
239
240}