# HG changeset patch # User chegar # Date 1346245537 -3600 # Node ID 3ee2f6e24dbb23ca9397bb12143ab33b8838c27a # Parent aa16457b32df2789e720a38276c21f093ffaa2c1 7189567: java net obselete protocol Reviewed-by: alanb, ahgross diff -r aa16457b32df -r 3ee2f6e24dbb jdk/make/sun/net/FILES_java.gmk --- a/jdk/make/sun/net/FILES_java.gmk Thu Aug 16 15:02:34 2012 +0100 +++ b/jdk/make/sun/net/FILES_java.gmk Wed Aug 29 14:05:37 2012 +0100 @@ -128,8 +128,6 @@ sun/net/www/content/audio/x_wav.java \ sun/net/www/protocol/ftp/Handler.java \ sun/net/www/protocol/ftp/FtpURLConnection.java \ - sun/net/www/protocol/gopher/GopherClient.java \ - sun/net/www/protocol/gopher/Handler.java \ sun/net/www/protocol/mailto/Handler.java \ sun/net/www/protocol/mailto/MailToURLConnection.java \ sun/net/idn/Punycode.java \ diff -r aa16457b32df -r 3ee2f6e24dbb jdk/src/share/classes/sun/net/www/protocol/gopher/GopherClient.java --- a/jdk/src/share/classes/sun/net/www/protocol/gopher/GopherClient.java Thu Aug 16 15:02:34 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,357 +0,0 @@ -/* - * Copyright (c) 1996, 2004, 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. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package sun.net.www.protocol.gopher; - -import java.io.*; -import java.util.*; -import java.net.*; -import sun.net.www.*; -import sun.net.NetworkClient; -import java.net.URL; -import java.net.URLStreamHandler; - -import sun.security.action.GetBooleanAction; - -/** Class to maintain the state of a gopher fetch and handle the protocol */ -public class GopherClient extends NetworkClient implements Runnable { - - /* The following three data members are left in for binary - * backwards-compatibility. Unfortunately, HotJava sets them directly - * when it wants to change the settings. The new design has us not - * cache these, so this is unnecessary, but eliminating the data members - * would break HJB 1.1 under JDK 1.2. - * - * These data members are not used, and their values are meaningless. - * REMIND: Take them out for JDK 2.0! - */ - - /** - * @deprecated - */ - @Deprecated - public static boolean useGopherProxy; - - /** - * @deprecated - */ - @Deprecated - public static String gopherProxyHost; - - /** - * @deprecated - */ - @Deprecated - public static int gopherProxyPort; - - - static { - useGopherProxy = java.security.AccessController.doPrivileged( - new sun.security.action.GetBooleanAction("gopherProxySet")) - .booleanValue(); - - gopherProxyHost = java.security.AccessController.doPrivileged( - new sun.security.action.GetPropertyAction("gopherProxyHost")); - - gopherProxyPort = java.security.AccessController.doPrivileged( - new sun.security.action.GetIntegerAction("gopherProxyPort", 80)) - .intValue(); - } - - PipedOutputStream os; - URL u; - int gtype; - String gkey; - sun.net.www.URLConnection connection; - - GopherClient(sun.net.www.URLConnection connection) { - this.connection = connection; - } - - /** - * @return true if gopher connections should go through a proxy, according - * to system properties. - */ - public static boolean getUseGopherProxy() { - return java.security.AccessController.doPrivileged( - new GetBooleanAction("gopherProxySet")).booleanValue(); - } - - /** - * @return the proxy host to use, or null if nothing is set. - */ - public static String getGopherProxyHost() { - String host = java.security.AccessController.doPrivileged( - new sun.security.action.GetPropertyAction("gopherProxyHost")); - if ("".equals(host)) { - host = null; - } - return host; - } - - /** - * @return the proxy port to use. Will default reasonably. - */ - public static int getGopherProxyPort() { - return java.security.AccessController.doPrivileged( - new sun.security.action.GetIntegerAction("gopherProxyPort", 80)) - .intValue(); - } - - /** Given a url, setup to fetch the gopher document it refers to */ - InputStream openStream(URL u) throws IOException { - this.u = u; - this.os = os; - int i = 0; - String s = u.getFile(); - int limit = s.length(); - int c = '1'; - while (i < limit && (c = s.charAt(i)) == '/') - i++; - gtype = c == '/' ? '1' : c; - if (i < limit) - i++; - gkey = s.substring(i); - - openServer(u.getHost(), u.getPort() <= 0 ? 70 : u.getPort()); - - MessageHeader msgh = new MessageHeader(); - - switch (gtype) { - case '0': - case '7': - msgh.add("content-type", "text/plain"); - break; - case '1': - msgh.add("content-type", "text/html"); - break; - case 'g': - case 'I': - msgh.add("content-type", "image/gif"); - break; - default: - msgh.add("content-type", "content/unknown"); - break; - } - if (gtype != '7') { - serverOutput.print(decodePercent(gkey) + "\r\n"); - serverOutput.flush(); - } else if ((i = gkey.indexOf('?')) >= 0) { - serverOutput.print(decodePercent(gkey.substring(0, i) + "\t" + - gkey.substring(i + 1) + "\r\n")); - serverOutput.flush(); - msgh.add("content-type", "text/html"); - } else { - msgh.add("content-type", "text/html"); - } - connection.setProperties(msgh); - if (msgh.findValue("content-type") == "text/html") { - os = new PipedOutputStream(); - PipedInputStream ret = new PipedInputStream(); - ret.connect(os); - new Thread(this).start(); - return ret; - } - return new GopherInputStream(this, serverInput); - } - - /** Translate all the instances of %NN into the character they represent */ - private String decodePercent(String s) { - if (s == null || s.indexOf('%') < 0) - return s; - int limit = s.length(); - char d[] = new char[limit]; - int dp = 0; - for (int sp = 0; sp < limit; sp++) { - int c = s.charAt(sp); - if (c == '%' && sp + 2 < limit) { - int s1 = s.charAt(sp + 1); - int s2 = s.charAt(sp + 2); - if ('0' <= s1 && s1 <= '9') - s1 = s1 - '0'; - else if ('a' <= s1 && s1 <= 'f') - s1 = s1 - 'a' + 10; - else if ('A' <= s1 && s1 <= 'F') - s1 = s1 - 'A' + 10; - else - s1 = -1; - if ('0' <= s2 && s2 <= '9') - s2 = s2 - '0'; - else if ('a' <= s2 && s2 <= 'f') - s2 = s2 - 'a' + 10; - else if ('A' <= s2 && s2 <= 'F') - s2 = s2 - 'A' + 10; - else - s2 = -1; - if (s1 >= 0 && s2 >= 0) { - c = (s1 << 4) | s2; - sp += 2; - } - } - d[dp++] = (char) c; - } - return new String(d, 0, dp); - } - - /** Turn special characters into the %NN form */ - private String encodePercent(String s) { - if (s == null) - return s; - int limit = s.length(); - char d[] = null; - int dp = 0; - for (int sp = 0; sp < limit; sp++) { - int c = s.charAt(sp); - if (c <= ' ' || c == '"' || c == '%') { - if (d == null) - d = s.toCharArray(); - if (dp + 3 >= d.length) { - char nd[] = new char[dp + 10]; - System.arraycopy(d, 0, nd, 0, dp); - d = nd; - } - d[dp] = '%'; - int dig = (c >> 4) & 0xF; - d[dp + 1] = (char) (dig < 10 ? '0' + dig : 'A' - 10 + dig); - dig = c & 0xF; - d[dp + 2] = (char) (dig < 10 ? '0' + dig : 'A' - 10 + dig); - dp += 3; - } else { - if (d != null) { - if (dp >= d.length) { - char nd[] = new char[dp + 10]; - System.arraycopy(d, 0, nd, 0, dp); - d = nd; - } - d[dp] = (char) c; - } - dp++; - } - } - return d == null ? s : new String(d, 0, dp); - } - - /** This method is run as a seperate thread when an incoming gopher - document requires translation to html */ - public void run() { - int qpos = -1; - try { - if (gtype == '7' && (qpos = gkey.indexOf('?')) < 0) { - PrintStream ps = new PrintStream(os, false, encoding); - ps.print("Searchable Gopher Index\n

Searchable Gopher Index

\n\n"); - } else if (gtype != '1' && gtype != '7') { - byte buf[] = new byte[2048]; - try { - int n; - while ((n = serverInput.read(buf)) >= 0) - os.write(buf, 0, n); - } catch(Exception e) { - } - } else { - PrintStream ps = new PrintStream(os, false, encoding); - String title = null; - if (gtype == '7') - title = "Results of searching for \"" + gkey.substring(qpos + 1) - + "\" on " + u.getHost(); - else - title = "Gopher directory " + gkey + " from " + u.getHost(); - ps.print(""); - ps.print(title); - ps.print("\n\n

"); - ps.print(title); - ps.print("

\n"); - BufferedReader ds = new BufferedReader(new InputStreamReader(serverInput)); - String s; - while ((s = ds.readLine()) != null) { - int len = s.length(); - while (len > 0 && s.charAt(len - 1) <= ' ') - len--; - if (len <= 0) - continue; - int key = s.charAt(0); - int t1 = s.indexOf('\t'); - int t2 = t1 > 0 ? s.indexOf('\t', t1 + 1) : -1; - int t3 = t2 > 0 ? s.indexOf('\t', t2 + 1) : -1; - if (t3 < 0) { - // ps.print("
"+s+"\n"); - continue; - } - String port = t3 + 1 < len ? ":" + s.substring(t3 + 1, len) : ""; - String host = t2 + 1 < t3 ? s.substring(t2 + 1, t3) : u.getHost(); - ps.print("
\n"); - ps.print("
\n"); - ps.print(s.substring(1, t1) + "\n"); - } - ps.print("
\n"); - ps.close(); - } - - } catch (UnsupportedEncodingException e) { - throw new InternalError(encoding+ " encoding not found", e); - } catch (IOException e) { - } finally { - try { - closeServer(); - os.close(); - } catch (IOException e2) { - } - } - } -} - -/** An input stream that does nothing more than hold on to the NetworkClient - that created it. This is used when only the input stream is needed, and - the network client needs to be closed when the input stream is closed. */ -class GopherInputStream extends FilterInputStream { - NetworkClient parent; - - GopherInputStream(NetworkClient o, InputStream fd) { - super(fd); - parent = o; - } - - public void close() { - try { - parent.closeServer(); - super.close(); - } catch (IOException e) { - } - } -} diff -r aa16457b32df -r 3ee2f6e24dbb jdk/src/share/classes/sun/net/www/protocol/gopher/Handler.java --- a/jdk/src/share/classes/sun/net/www/protocol/gopher/Handler.java Thu Aug 16 15:02:34 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ -/* - * Copyright (c) 1995, 2003, 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. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.net.www.protocol.gopher; - -import java.io.*; -import java.util.*; -import sun.net.NetworkClient; -import java.net.URL; -import java.net.URLStreamHandler; -import java.net.Proxy; -import java.net.InetSocketAddress; -import java.net.SocketPermission; -import java.security.Permission; -import sun.net.www.protocol.http.HttpURLConnection; - -/** - * A class to handle the gopher protocol. - */ - -public class Handler extends java.net.URLStreamHandler { - - protected int getDefaultPort() { - return 70; - } - - public java.net.URLConnection openConnection(URL u) - throws IOException { - return openConnection(u, null); - } - - public java.net.URLConnection openConnection(URL u, Proxy p) - throws IOException { - - - /* if set for proxy usage then go through the http code to get */ - /* the url connection. */ - if (p == null && GopherClient.getUseGopherProxy()) { - String host = GopherClient.getGopherProxyHost(); - if (host != null) { - InetSocketAddress saddr = InetSocketAddress.createUnresolved(host, GopherClient.getGopherProxyPort()); - - p = new Proxy(Proxy.Type.HTTP, saddr); - } - } - if (p != null) { - return new HttpURLConnection(u, p); - } - - return new GopherURLConnection(u); - } -} - -class GopherURLConnection extends sun.net.www.URLConnection { - - Permission permission; - - GopherURLConnection(URL u) { - super(u); - } - - public void connect() throws IOException { - } - - public InputStream getInputStream() throws IOException { - return new GopherClient(this).openStream(url); - } - - public Permission getPermission() { - if (permission == null) { - int port = url.getPort(); - port = port < 0 ? 70 : port; - String host = url.getHost() + ":" + url.getPort(); - permission = new SocketPermission(host, "connect"); - } - return permission; - } -} diff -r aa16457b32df -r 3ee2f6e24dbb jdk/test/java/net/URL/Test.java --- a/jdk/test/java/net/URL/Test.java Thu Aug 16 15:02:34 2012 +0100 +++ b/jdk/test/java/net/URL/Test.java Wed Aug 29 14:05:37 2012 +0100 @@ -322,10 +322,6 @@ test("ftp://ftp.is.co.za/rfc/rfc1808.txt") .s("ftp").h("ftp.is.co.za").p("/rfc/rfc1808.txt").z(); - test("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles") - .s("gopher").h("spinaltap.micro.umn.edu") - .p("/00/Weather/California/Los%20Angeles").z(); - test("http://www.math.uio.no/faq/compression-faq/part1.html") .s("http").h("www.math.uio.no").p("/faq/compression-faq/part1.html").z();