< prev index next >

test/jdk/sun/misc/URLClassPath/ClassnameCharTest.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.

@@ -23,21 +23,26 @@
 
 /* @test
  * @bug 4957669 5017871
  * @summary cannot load class names containing some JSR 202 characters;
  *          plugin does not escape unicode character in http request
- * @modules java.desktop/sun.applet
+ * @modules java.base/sun.net.www
  *          jdk.httpserver
  * @compile -XDignore.symbol.file=true ClassnameCharTest.java
  * @run main ClassnameCharTest
  */
 
 import java.io.*;
 import java.net.*;
+import java.security.AccessControlContext;
+import java.security.AccessController;
+import java.security.CodeSource;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
 import java.util.jar.*;
 import com.sun.net.httpserver.*;
-import sun.applet.AppletClassLoader;
+import sun.net.www.ParseUtil;
 
 public class ClassnameCharTest {
     static String FNPrefix = System.getProperty("test.src", ".") + File.separator;
     static File classesJar = new File(FNPrefix + "testclasses.jar");
     static HttpServer server;

@@ -77,11 +82,11 @@
         });
         server.start();
         try {
             URL base = new URL("http://localhost:" + server.getAddress().getPort());
             System.out.println ("Server: listening on " + base);
-            MyAppletClassLoader acl = new MyAppletClassLoader(base);
+            MyURLClassLoader acl = new MyURLClassLoader(base);
             Class<?> class1 = acl.findClass("fo o");
             System.out.println("class1 = " + class1);
             pass();
             // can't test the following class unless platform in unicode locale
             // Class class2 = acl.findClass("\u624b\u518c");

@@ -89,18 +94,98 @@
         } finally {
             server.stop(0);
         }
     }
 
-    static class MyAppletClassLoader extends AppletClassLoader {
-        MyAppletClassLoader(URL base) {
-            super(base);
+    static class MyURLClassLoader extends URLClassLoader {
+        private URL base;   /* applet code base URL */
+        private CodeSource codesource; /* codesource for the base URL */
+        private AccessControlContext acc;
+        MyURLClassLoader(URL base) {
+            super(new URL[0]);
+            this.base = base;
+            this.codesource =
+                    new CodeSource(base, (java.security.cert.Certificate[]) null);
+            acc = AccessController.getContext();
         }
 
         @Override
         public Class<?> findClass(String name) throws ClassNotFoundException {
+            int index = name.indexOf(';');
+            String cookie = "";
+            if(index != -1) {
+                cookie = name.substring(index, name.length());
+                name = name.substring(0, index);
+            }
+
+            // check loaded JAR files
+            try {
             return super.findClass(name);
+            } catch (ClassNotFoundException e) {
+            }
+
+            // Otherwise, try loading the class from the code base URL
+            //      final String path = name.replace('.', '/').concat(".class").concat(cookie);
+            String encodedName = ParseUtil.encodePath(name.replace('.', '/'), false);
+            final String path = (new StringBuffer(encodedName)).append(".class").append(cookie).toString();
+            try {
+                byte[] b = AccessController.doPrivileged(
+                        new PrivilegedExceptionAction<byte[]>() {
+                            public byte[] run() throws IOException {
+                                try {
+                                    URL finalURL = new URL(base, path);
+
+                                    // Make sure the codebase won't be modified
+                                    if (base.getProtocol().equals(finalURL.getProtocol()) &&
+                                            base.getHost().equals(finalURL.getHost()) &&
+                                            base.getPort() == finalURL.getPort()) {
+                                        return getBytes(finalURL);
+                                    }
+                                    else {
+                                        return null;
+                                    }
+                                } catch (Exception e) {
+                                    return null;
+                                }
+                            }
+                        }, acc);
+
+                if (b != null) {
+                    return defineClass(name, b, 0, b.length, codesource);
+                } else {
+                    throw new ClassNotFoundException(name);
+                }
+            } catch (PrivilegedActionException e) {
+                throw new ClassNotFoundException(name, e.getException());
+            }
+        }
+
+        /*
+         * Returns the contents of the specified URL as an array of bytes.
+         */
+        private static byte[] getBytes(URL url) throws IOException {
+            URLConnection uc = url.openConnection();
+            if (uc instanceof java.net.HttpURLConnection) {
+                java.net.HttpURLConnection huc = (java.net.HttpURLConnection) uc;
+                int code = huc.getResponseCode();
+                if (code >= java.net.HttpURLConnection.HTTP_BAD_REQUEST) {
+                    throw new IOException("open HTTP connection failed.");
+                }
+            }
+            int len = uc.getContentLength();
+
+            InputStream in = new BufferedInputStream(uc.getInputStream());
+
+            byte[] b;
+            try {
+                b = in.readAllBytes();
+                if (len != -1 && b.length != len)
+                    throw new EOFException("Expected:" + len + ", read:" + b.length);
+            } finally {
+                in.close();
+            }
+            return b;
         }
     }
 
     //--------------------- Infrastructure ---------------------------
     static volatile int passed = 0, failed = 0;
< prev index next >